Sponsored Link:   PAVOCOIN - IoT blockchain for the AgTech ecosystem. Bringing together IoT, blockchain, and agriculture. Join now!
Contract Overview | EnvionToken
Balance: 12,284.670957359648584628 Ether
Ether Value: $8,696,564.26 (@ $707.92/ETH)
Transactions: 96771 txns
Token Contract: Envion (EVN)
Misc
Address Watch: Add To Watch List
Contract Creator: 0xc068ead86c8f732753d6959a5a4b58b354280480at txn 0x8f25b982c38ac299d5f9edfeefb722df7bbe4dbaf35490b54492c1472431aee0
Token Balances:
 Latest 25 txns from a total Of 96771 transactions (+4 PendingTxns)
View All

TxHash Age From To Value [TxFee]
0x6382cf80ea62b187f3f1d926dd9ebcee184edc6c0354a048dbf18e6b7e86a0eb(pending)0xfb7925bc7cc080a6b25e39df6d84e06628874117  IN  0xd780ae2bf04cd96e577d3d014762f831d97129d00 Ether(pending)
0x87fd0244fe43510c3b1d1ceb4b927cd541f13795249ef123d0a7bec6997f33d0(pending)0xc319ce16e39828097481b1bbaf837bb0d78b72ff  IN  0xd780ae2bf04cd96e577d3d014762f831d97129d00 Ether(pending)
0x7dbc1519f7abda978408a2c50d803cb7319703b5d6eecc04c4875e5dad9e7492(pending)0x06745f0a5e472e24640e63390be666a8f6062b8c  IN  0xd780ae2bf04cd96e577d3d014762f831d97129d00 Ether(pending)
0x6f9781b440b16c322096b4a8a74f52b2b29751dc3a91b6ebe0039112b8ed2783(pending)0xa5a56d0210507c56e4181b9fe633ec516ec2a09c  IN  0xd780ae2bf04cd96e577d3d014762f831d97129d00 Ether(pending)
0x4711bd6a813a676e22ee7c4d8e563baab2c99807727a3ddb1d4b8e114a839da419 mins ago0xe4c0527ad5577824652e0bd07098ac6feb63f1b4  IN   EnvionToken0 Ether0.001075248
0xa148da4f7e8acb354dff43b34daadc744f13b9d2e1cbe2790e9f853cbc894c0e26 mins ago0x6e694b340856def5fb18dc176ada0ae7b444dfcc  IN   EnvionToken0 Ether0.00099296
0xc21b66a012bf22b67b7c50b528210b26ee8830c6868a24ebbb9cba4fbabbdb7e1 hr 17 mins ago0xfcf614daf8b69fb33d8cd08af19a81c2c543cbf4  IN   EnvionToken0 Ether0.000273064
0xaa3eb2cb98b4ed0fb68f71af26a95488be42a54c6e13c8b8584cdef8ca9cc5c21 hr 33 mins ago0xf84a7f90692bac72a0ff8a631e0705b994c37883  IN   EnvionToken0 Ether0.000551196
0x336925446d97cc36f22b76ce667203c6db65cb92c654afb5e1bf082fe1474f551 hr 34 mins ago0x5ede6f0209c147cfde59231362ec2bc05fafcf17  IN   EnvionToken0 Ether0.00346144
0x38fc86cda79a8a37b142ac22e2b836e0012edd13d4aa1cf97cb6588f9502065d1 hr 36 mins ago0x375fb4e1dbb13967c0eed59a400db6b515c0b307  IN   EnvionToken0 Ether0.000947034
0x92c414ad1026400ead1091d9c5dea892a35d3311122ab2d785c4891e84d20a811 hr 36 mins ago0x5424b0103957052df46401e6328e3afd51612255  IN   EnvionToken0 Ether0.001020408
0x0542874f280ce83d5a888a6240f133ebc09739d95eab8460ee5e2de3346462301 hr 38 mins ago0x3f15741ce4d3d753545e8c7e9620e71071ee5add  IN   EnvionToken0 Ether0.000778248
0x4ab7283578679b07109c3e4ec26017c4e55dec3699208f8ad83e41bcaf31248e2 hrs 22 mins ago0x55863449c5951c821d8ad74b457202b8d49b329d  IN   EnvionToken0 Ether0.00129237
0x37c4ee095a995d44ff64e1cf8547f51052a3d8c2a14aac42864b9fdc51d26c9d2 hrs 54 mins ago0x327bbe2a3043b01e1fc26eee4e7d6b5c63b22372  IN   EnvionToken0 Ether0.001146725
0xddf14dbab12c08568202a82ff4e0478f8bfa1847aea4b72f97e71f35e77b04152 hrs 59 mins ago0xa12431d0b9db640034b0cdfceef9cce161e62be4  IN   EnvionToken0 Ether0.00059736
0xe43c69918a67d2464855fdda18254fe31fb903eec1ec802a880ec2d1abf3273b3 hrs 3 mins ago0x632093481a93720ede025e5ad273333de06f71df  IN   EnvionToken0 Ether0.003542728
0x115018d8479a35da7fadc79577d52b9f7c8087ba18f2b8ebac96f1e9a1a50ec73 hrs 7 mins ago0xa12431d0b9db640034b0cdfceef9cce161e62be4  IN   EnvionToken0 Ether0.00059736
0x6fb000bddc40f4258be4312747349eda9788bfb5b1975b74337174504bbd33113 hrs 35 mins ago0xa12431d0b9db640034b0cdfceef9cce161e62be4  IN   EnvionToken0 Ether0.00059736
0xd7a149e528a003032731e0efcd127be7cd8053e674ffddf47c66a85c07affb8f4 hrs 14 mins ago0x6d672d06bfc3aa7c15b151076ceb17e72a9278ce  IN   EnvionToken0 Ether0.00086094
0xa648277adbb024274476e84d4643f3c61284a45b3e227a19498dff29609208714 hrs 15 mins ago0x347c2f27e70f4aa3a19df52277018ea6633b310a  IN   EnvionToken0 Ether0.001012536
0x2a79be8d300c64a20b271bccb721cdf5456ae64c2f6e905449dd312d548105574 hrs 42 mins agoHitBTC_2  IN   EnvionToken0 Ether0.0005476
0xfce42d070a4af38fd39d74eed8d70f68ede1b50a89862a23000ab1a00daae5e74 hrs 43 mins agoHitBTC_2  IN   EnvionToken0 Ether0.00101094
0xa2a4ebd60ae9ba89be8323b2cd90966604b79a684292202ba40acb856925dfb24 hrs 48 mins ago0x40f79bc96abe0d3b92d8c2e71f17e898815d742d  IN   EnvionToken0 Ether0.000276366
0x41c6adc05cb8a01dd431181cf5943f78d99c6979a8a021e7cd0a52559bf0ec985 hrs 57 mins ago0x1ba7a20a4349c4801963f69b2c9ce1ce495b9083  IN   EnvionToken0 Ether0.003885722116
0xd99f24930c65238ce07821a2a0159e34986152a24509353b30f16027da0ecaa26 hrs 1 min agoHitBTC_2  IN   EnvionToken0 Ether0.0003976
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here to View More View All
ParentTxHash Block Age From To Value
0x6b96780434bc27455eec7377192395da0e2ee841f5adf35bca078c13d7782487525896367 days 3 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x5360b7a71db9aa771ffb99ff2640429a9ad52000189.99 Ether
0xd31fe47e51ba1e70bfac6a95dd49685aef8d2b909a5cabcc6258b2c0512d4af95060430100 days 18 hrs ago0x1522900b6dafac587d499a862861c0869be6e4280xd780ae2bf04cd96e577d3d014762f831d97129d00.225 Ether
0xf105a568d9e851afeaf4cffda3f22811a39a52a7cd94aa235331c00cece491585005536110 days 56 mins ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x8bac85953664753a58d3c34287cdf096caa3fbbf34,260.693974360090757049 Ether
0x0af2f3b77ededc5319868c83cad8b68a74184f7a34d9d27672c75475e45113d34928573123 days 2 hrs ago0x1522900b6dafac587d499a862861c0869be6e4280xd780ae2bf04cd96e577d3d014762f831d97129d02.3 Ether
0x7bcb3a6e4a5b008ec40ff0a65f529366848349ae9024ba890cf4043d366e95da4914451125 days 15 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xb5a4f2a2c68c230e36bc859b1e0cac0639191ee672cf9805554281d5dbbd7c9d4913591125 days 19 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x1a93d7270095dead3f66d1995cad5380d3af4b88acfee77a7f5f557416bdd24a4910727126 days 8 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x96d67dbb8c45e7204b07bfa83b5e25b97dcf2912cdc72559c6971543fcc464634910486126 days 9 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xed626b61065d0aab13e6ceea030a4eb359d0e974df7d48eaaacd08d5084f17644910238126 days 10 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x8e3ecc28a460e943804c430fefe550e2312ecc32d54f1a3e3b7ad6fd138abb124909994126 days 11 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xb61db4de9af1f48e8fa2a993513bce4a521ddd5e7e2a775a115bb27b97326e0b4909771126 days 12 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xe57392af4782ae67c3407e18fb5448bf1b34b0e4a8fccffcd4bc5c90212aa8b04909556126 days 13 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xc3f82f7db54880c848a6c2ba2c42125bcfc8a2cb3a6530252be3c7929db885bd4907196126 days 23 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xcdde8d26c4e03f9393c73d9ba098bba6d19c9fae01e6d28e685946f98f0305bf4906946127 days 47 mins ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x9b81987f321cc7b76c4aacc521f67036a8e22ea24f1253eda0eb986b4eff53444906721127 days 1 hr ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x2607f6e94d4e54e26c15a8dc6bbc427369999423416f4cbe67a61c1cba42def04906494127 days 2 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xd980fc1aca7d4e9f9c43c4e7452ac424d34f57bd1fa6527debdc5b605bcdff864906200127 days 3 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x92a2c6f83d575fd2ba5b720f8d0670f00049ae72794227d6d80ce1103b842c5c4905948127 days 5 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x2af016925a6eeff3dcecda657a71ad4e0df6c371fb55e1da886516600d9243234905697127 days 6 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x5ed944aafb01f26dfa95efc76eefbb4a8514d47e45a51e3bb00a0775c16910fe4905466127 days 7 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x0310caecfbdfd0d2e70ddaa1667ea671fb47f8d5173e80e887db6295ee78497d4903965127 days 13 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x14d30657d22cbbe2a235230f522b68bb14b0b59ef24947dbb761130055b50c594903734127 days 14 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0x64b438dfbc7a1b3ca5619939ee88a8f074ad3c1dba4a016ec4b0dbc1f996cfe24903488127 days 15 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xed922dc8cf19d42794b1c1f4261a77001d8f651beddaaeb294ed537c37e168c54903267127 days 16 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
0xbbbd5047fde2c5dde633b49b1036a5b9ece24f3f644ab2756edd959115f8e0fe4903030127 days 17 hrs ago0xd780ae2bf04cd96e577d3d014762f831d97129d00x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.022021 Ether
[ Download CSV Export  ] 
Warning: The compiled contract might be susceptible to ZeroFunctionSelector (very low-severity) Solidity compiler bugs.

Contract Source Code Verified (Exact match)
Contract Name: EVNToken
Compiler Version: v0.4.15+commit.bbb8e64f
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

pragma solidity ^0.4.15;

/**
 * @title Safe math operations that throw error on overflow.
 *
 * Credit: Taking ideas from FirstBlood token
 */
library SafeMath {

    /** 
     * @dev Safely add two numbers.
     *
     * @param x First operant.
     * @param y Second operant.
     * @return The result of x+y.
     */
    function add(uint256 x, uint256 y)
    internal constant
    returns(uint256) {
        uint256 z = x + y;
        assert((z >= x) && (z >= y));
        return z;
    }

    /** 
     * @dev Safely substract two numbers.
     *
     * @param x First operant.
     * @param y Second operant.
     * @return The result of x-y.
     */
    function sub(uint256 x, uint256 y)
    internal constant
    returns(uint256) {
        assert(x >= y);
        uint256 z = x - y;
        return z;
    }

    /** 
     * @dev Safely multiply two numbers.
     *
     * @param x First operant.
     * @param y Second operant.
     * @return The result of x*y.
     */
    function mul(uint256 x, uint256 y)
    internal constant
    returns(uint256) {
        uint256 z = x * y;
        assert((x == 0) || (z/x == y));
        return z;
    }

    /**
    * @dev Parse a floating point number from String to uint, e.g. "250.56" to "25056"
     */
    function parse(string s) 
    internal constant 
    returns (uint256) 
    {
    bytes memory b = bytes(s);
    uint result = 0;
    for (uint i = 0; i < b.length; i++) {
        if (b[i] >= 48 && b[i] <= 57) {
            result = result * 10 + (uint(b[i]) - 48); 
        }
    }
    return result; 
}
}

/**
 * @title The abstract ERC-20 Token Standard definition.
 *
 * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
 */
contract Token {
    /// @dev Returns the total token supply.
    uint256 public totalSupply;

    function balanceOf(address _owner) public constant returns (uint256 balance);
    function transfer(address _to, uint256 _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
    function approve(address _spender, uint256 _value) public returns (bool success);
    function allowance(address _owner, address _spender) public constant returns (uint256 remaining);

    /// @dev MUST trigger when tokens are transferred, including zero value transfers.
    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    /// @dev MUST trigger on any successful call to approve(address _spender, uint256 _value).
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

/**
 * @title Default implementation of the ERC-20 Token Standard.
 */
contract StandardToken is Token {

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

    modifier onlyPayloadSize(uint numwords) {
        assert(msg.data.length == numwords * 32 + 4);
        _;
    }

    /**
     * @dev Transfers _value amount of tokens to address _to, and MUST fire the Transfer event. 
     * @dev The function SHOULD throw if the _from account balance does not have enough tokens to spend.
     *
     * @dev A token contract which creates new tokens SHOULD trigger a Transfer event with the _from address set to 0x0 when tokens are created.
     *
     * Note Transfers of 0 values MUST be treated as normal transfers and fire the Transfer event.
     *
     * @param _to The receiver of the tokens.
     * @param _value The amount of tokens to send.
     * @return True on success, false otherwise.
     */
    function transfer(address _to, uint256 _value)
    public
    returns (bool success) {
        if (balances[msg.sender] >= _value && _value > 0 && balances[_to] + _value > balances[_to]) {
            balances[msg.sender] = SafeMath.sub(balances[msg.sender], _value);
            balances[_to] = SafeMath.add(balances[_to], _value);
            Transfer(msg.sender, _to, _value);
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Transfers _value amount of tokens from address _from to address _to, and MUST fire the Transfer event.
     *
     * @dev The transferFrom method is used for a withdraw workflow, allowing contracts to transfer tokens on your behalf. 
     * @dev This can be used for example to allow a contract to transfer tokens on your behalf and/or to charge fees in 
     * @dev sub-currencies. The function SHOULD throw unless the _from account has deliberately authorized the sender of 
     * @dev the message via some mechanism.
     *
     * Note Transfers of 0 values MUST be treated as normal transfers and fire the Transfer event.
     *
     * @param _from The sender of the tokens.
     * @param _to The receiver of the tokens.
     * @param _value The amount of tokens to send.
     * @return True on success, false otherwise.
     */
    function transferFrom(address _from, address _to, uint256 _value)
    public
    returns (bool success) {
        if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0 && balances[_to] + _value > balances[_to]) {
            balances[_to] = SafeMath.add(balances[_to], _value);
            balances[_from] = SafeMath.sub(balances[_from], _value);
            allowed[_from][msg.sender] = SafeMath.sub(allowed[_from][msg.sender], _value);
            Transfer(_from, _to, _value);
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns the account balance of another account with address _owner.
     *
     * @param _owner The address of the account to check.
     * @return The account balance.
     */
    function balanceOf(address _owner)
    public constant
    returns (uint256 balance) {
        return balances[_owner];
    }

    /**
     * @dev Allows _spender to withdraw from your account multiple times, up to the _value amount. 
     * @dev If this function is called again it overwrites the current allowance with _value.
     *
     * @dev NOTE: To prevent attack vectors like the one described in [1] and discussed in [2], clients 
     * @dev SHOULD make sure to create user interfaces in such a way that they set the allowance first 
     * @dev to 0 before setting it to another value for the same spender. THOUGH The contract itself 
     * @dev shouldn't enforce it, to allow backwards compatilibilty with contracts deployed before.
     * @dev [1] https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/
     * @dev [2] https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * @param _spender The address which will spend the funds.
     * @param _value The amount of tokens to be spent.
     * @return True on success, false otherwise.
     */
    function approve(address _spender, uint256 _value)
    public
    onlyPayloadSize(2)
    returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }

    /**
     * @dev Returns the amount which _spender is still allowed to withdraw from _owner.
     *
     * @param _owner The address of the sender.
     * @param _spender The address of the receiver.
     * @return The allowed withdrawal amount.
     */
    function allowance(address _owner, address _spender)
    public constant
    onlyPayloadSize(2)
    returns (uint256 remaining) {
        return allowed[_owner][_spender];
    }
}


// <ORACLIZE_API>
/*
Copyright (c) 2015-2016 Oraclize SRL
Copyright (c) 2016 Oraclize LTD



Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:



The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.



THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/

contract OraclizeI {
    address public cbAddress;
    function query(uint _timestamp, string _datasource, string _arg) payable returns (bytes32 _id);
    function query_withGasLimit(uint _timestamp, string _datasource, string _arg, uint _gaslimit) payable returns (bytes32 _id);
    function query2(uint _timestamp, string _datasource, string _arg1, string _arg2) payable returns (bytes32 _id);
    function query2_withGasLimit(uint _timestamp, string _datasource, string _arg1, string _arg2, uint _gaslimit) payable returns (bytes32 _id);
    function queryN(uint _timestamp, string _datasource, bytes _argN) payable returns (bytes32 _id);
    function queryN_withGasLimit(uint _timestamp, string _datasource, bytes _argN, uint _gaslimit) payable returns (bytes32 _id);
    function getPrice(string _datasource) returns (uint _dsprice);
    function getPrice(string _datasource, uint gaslimit) returns (uint _dsprice);
    function useCoupon(string _coupon);
    function setProofType(byte _proofType);
    function setConfig(bytes32 _config);
    function setCustomGasPrice(uint _gasPrice);
    function randomDS_getSessionPubKeyHash() returns(bytes32);
}
contract OraclizeAddrResolverI {
    function getAddress() returns (address _addr);
}
contract usingOraclize {
    uint constant day = 60*60*24;
    uint constant week = 60*60*24*7;
    uint constant month = 60*60*24*30;
    byte constant proofType_NONE = 0x00;
    byte constant proofType_TLSNotary = 0x10;
    byte constant proofType_Android = 0x20;
    byte constant proofType_Ledger = 0x30;
    byte constant proofType_Native = 0xF0;
    byte constant proofStorage_IPFS = 0x01;
    uint8 constant networkID_auto = 0;
    uint8 constant networkID_mainnet = 1;
    uint8 constant networkID_testnet = 2;
    uint8 constant networkID_morden = 2;
    uint8 constant networkID_consensys = 161;

    OraclizeAddrResolverI OAR;

    OraclizeI oraclize;
    modifier oraclizeAPI {
        if((address(OAR)==0)||(getCodeSize(address(OAR))==0)) oraclize_setNetwork(networkID_auto);
        oraclize = OraclizeI(OAR.getAddress());
        _;
    }
    modifier coupon(string code){
        oraclize = OraclizeI(OAR.getAddress());
        oraclize.useCoupon(code);
        _;
    }

    function oraclize_setNetwork(uint8 networkID) internal returns(bool){
        if (getCodeSize(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed)>0){ //mainnet
            OAR = OraclizeAddrResolverI(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed);
            oraclize_setNetworkName("eth_mainnet");
            return true;
        }
        if (getCodeSize(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1)>0){ //ropsten testnet
            OAR = OraclizeAddrResolverI(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1);
            oraclize_setNetworkName("eth_ropsten3");
            return true;
        }
        if (getCodeSize(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e)>0){ //kovan testnet
            OAR = OraclizeAddrResolverI(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e);
            oraclize_setNetworkName("eth_kovan");
            return true;
        }
        if (getCodeSize(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48)>0){ //rinkeby testnet
            OAR = OraclizeAddrResolverI(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48);
            oraclize_setNetworkName("eth_rinkeby");
            return true;
        }
        if (getCodeSize(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475)>0){ //ethereum-bridge
            OAR = OraclizeAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475);
            return true;
        }
        if (getCodeSize(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF)>0){ //ether.camp ide
            OAR = OraclizeAddrResolverI(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF);
            return true;
        }
        if (getCodeSize(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA)>0){ //browser-solidity
            OAR = OraclizeAddrResolverI(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA);
            return true;
        }
        return false;
    }

    function __callback(bytes32 myid, string result) {
        __callback(myid, result, new bytes(0));
    }
    function __callback(bytes32 myid, string result, bytes proof) {
    }
    
    function oraclize_useCoupon(string code) oraclizeAPI internal {
        oraclize.useCoupon(code);
    }

    function oraclize_getPrice(string datasource) oraclizeAPI internal returns (uint){
        return oraclize.getPrice(datasource);
    }

    function oraclize_getPrice(string datasource, uint gaslimit) oraclizeAPI internal returns (uint){
        return oraclize.getPrice(datasource, gaslimit);
    }
    
    function oraclize_query(string datasource, string arg) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query.value(price)(0, datasource, arg);
    }
    function oraclize_query(uint timestamp, string datasource, string arg) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query.value(price)(timestamp, datasource, arg);
    }
    function oraclize_query(uint timestamp, string datasource, string arg, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query_withGasLimit.value(price)(timestamp, datasource, arg, gaslimit);
    }
    function oraclize_query(string datasource, string arg, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query_withGasLimit.value(price)(0, datasource, arg, gaslimit);
    }
    function oraclize_query(string datasource, string arg1, string arg2) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query2.value(price)(0, datasource, arg1, arg2);
    }
    function oraclize_query(uint timestamp, string datasource, string arg1, string arg2) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query2.value(price)(timestamp, datasource, arg1, arg2);
    }
    function oraclize_query(uint timestamp, string datasource, string arg1, string arg2, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query2_withGasLimit.value(price)(timestamp, datasource, arg1, arg2, gaslimit);
    }
    function oraclize_query(string datasource, string arg1, string arg2, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query2_withGasLimit.value(price)(0, datasource, arg1, arg2, gaslimit);
    }
    function oraclize_query(string datasource, string[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN.value(price)(0, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, string[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN.value(price)(timestamp, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, string[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(timestamp, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, string[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(0, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, string[1] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[1] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];       
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, string[2] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[2] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[3] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[3] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, string[4] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[4] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[5] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[5] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN.value(price)(0, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN.value(price)(timestamp, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(timestamp, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, bytes[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(0, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, bytes[1] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[1] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];       
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, bytes[2] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[2] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[3] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[3] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, bytes[4] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[4] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[5] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[5] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs, gaslimit);
    }

    function oraclize_cbAddress() oraclizeAPI internal returns (address){
        return oraclize.cbAddress();
    }
    function oraclize_setProof(byte proofP) oraclizeAPI internal {
        return oraclize.setProofType(proofP);
    }
    function oraclize_setCustomGasPrice(uint gasPrice) oraclizeAPI internal {
        return oraclize.setCustomGasPrice(gasPrice);
    }
    function oraclize_setConfig(bytes32 config) oraclizeAPI internal {
        return oraclize.setConfig(config);
    }
    
    function oraclize_randomDS_getSessionPubKeyHash() oraclizeAPI internal returns (bytes32){
        return oraclize.randomDS_getSessionPubKeyHash();
    }

    function getCodeSize(address _addr) constant internal returns(uint _size) {
        assembly {
            _size := extcodesize(_addr)
        }
    }

    function parseAddr(string _a) internal returns (address){
        bytes memory tmp = bytes(_a);
        uint160 iaddr = 0;
        uint160 b1;
        uint160 b2;
        for (uint i=2; i<2+2*20; i+=2){
            iaddr *= 256;
            b1 = uint160(tmp[i]);
            b2 = uint160(tmp[i+1]);
            if ((b1 >= 97)&&(b1 <= 102)) b1 -= 87;
            else if ((b1 >= 65)&&(b1 <= 70)) b1 -= 55;
            else if ((b1 >= 48)&&(b1 <= 57)) b1 -= 48;
            if ((b2 >= 97)&&(b2 <= 102)) b2 -= 87;
            else if ((b2 >= 65)&&(b2 <= 70)) b2 -= 55;
            else if ((b2 >= 48)&&(b2 <= 57)) b2 -= 48;
            iaddr += (b1*16+b2);
        }
        return address(iaddr);
    }

    function strCompare(string _a, string _b) internal returns (int) {
        bytes memory a = bytes(_a);
        bytes memory b = bytes(_b);
        uint minLength = a.length;
        if (b.length < minLength) minLength = b.length;
        for (uint i = 0; i < minLength; i ++)
            if (a[i] < b[i])
                return -1;
            else if (a[i] > b[i])
                return 1;
        if (a.length < b.length)
            return -1;
        else if (a.length > b.length)
            return 1;
        else
            return 0;
    }

    function indexOf(string _haystack, string _needle) internal returns (int) {
        bytes memory h = bytes(_haystack);
        bytes memory n = bytes(_needle);
        if(h.length < 1 || n.length < 1 || (n.length > h.length))
            return -1;
        else if(h.length > (2**128 -1))
            return -1;
        else
        {
            uint subindex = 0;
            for (uint i = 0; i < h.length; i ++)
            {
                if (h[i] == n[0])
                {
                    subindex = 1;
                    while(subindex < n.length && (i + subindex) < h.length && h[i + subindex] == n[subindex])
                    {
                        subindex++;
                    }
                    if(subindex == n.length)
                        return int(i);
                }
            }
            return -1;
        }
    }

    function strConcat(string _a, string _b, string _c, string _d, string _e) internal returns (string) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory _bd = bytes(_d);
        bytes memory _be = bytes(_e);
        string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
        bytes memory babcde = bytes(abcde);
        uint k = 0;
        for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
        for (i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
        for (i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
        for (i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
        for (i = 0; i < _be.length; i++) babcde[k++] = _be[i];
        return string(babcde);
    }

    function strConcat(string _a, string _b, string _c, string _d) internal returns (string) {
        return strConcat(_a, _b, _c, _d, "");
    }

    function strConcat(string _a, string _b, string _c) internal returns (string) {
        return strConcat(_a, _b, _c, "", "");
    }

    function strConcat(string _a, string _b) internal returns (string) {
        return strConcat(_a, _b, "", "", "");
    }

    // parseInt
    function parseInt(string _a) internal returns (uint) {
        return parseInt(_a, 0);
    }

    // parseInt(parseFloat*10^_b)
    function parseInt(string _a, uint _b) internal returns (uint) {
        bytes memory bresult = bytes(_a);
        uint mint = 0;
        bool decimals = false;
        for (uint i=0; i<bresult.length; i++){
            if ((bresult[i] >= 48)&&(bresult[i] <= 57)){
                if (decimals){
                   if (_b == 0) break;
                    else _b--;
                }
                mint *= 10;
                mint += uint(bresult[i]) - 48;
            } else if (bresult[i] == 46) decimals = true;
        }
        if (_b > 0) mint *= 10**_b;
        return mint;
    }

    function uint2str(uint i) internal returns (string){
        if (i == 0) return "0";
        uint j = i;
        uint len;
        while (j != 0){
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (i != 0){
            bstr[k--] = byte(48 + i % 10);
            i /= 10;
        }
        return string(bstr);
    }
    
    function stra2cbor(string[] arr) internal returns (bytes) {
            uint arrlen = arr.length;

            // get correct cbor output length
            uint outputlen = 0;
            bytes[] memory elemArray = new bytes[](arrlen);
            for (uint i = 0; i < arrlen; i++) {
                elemArray[i] = (bytes(arr[i]));
                outputlen += elemArray[i].length + (elemArray[i].length - 1)/23 + 3; //+3 accounts for paired identifier types
            }
            uint ctr = 0;
            uint cborlen = arrlen + 0x80;
            outputlen += byte(cborlen).length;
            bytes memory res = new bytes(outputlen);

            while (byte(cborlen).length > ctr) {
                res[ctr] = byte(cborlen)[ctr];
                ctr++;
            }
            for (i = 0; i < arrlen; i++) {
                res[ctr] = 0x5F;
                ctr++;
                for (uint x = 0; x < elemArray[i].length; x++) {
                    // if there's a bug with larger strings, this may be the culprit
                    if (x % 23 == 0) {
                        uint elemcborlen = elemArray[i].length - x >= 24 ? 23 : elemArray[i].length - x;
                        elemcborlen += 0x40;
                        uint lctr = ctr;
                        while (byte(elemcborlen).length > ctr - lctr) {
                            res[ctr] = byte(elemcborlen)[ctr - lctr];
                            ctr++;
                        }
                    }
                    res[ctr] = elemArray[i][x];
                    ctr++;
                }
                res[ctr] = 0xFF;
                ctr++;
            }
            return res;
        }

    function ba2cbor(bytes[] arr) internal returns (bytes) {
            uint arrlen = arr.length;

            // get correct cbor output length
            uint outputlen = 0;
            bytes[] memory elemArray = new bytes[](arrlen);
            for (uint i = 0; i < arrlen; i++) {
                elemArray[i] = (bytes(arr[i]));
                outputlen += elemArray[i].length + (elemArray[i].length - 1)/23 + 3; //+3 accounts for paired identifier types
            }
            uint ctr = 0;
            uint cborlen = arrlen + 0x80;
            outputlen += byte(cborlen).length;
            bytes memory res = new bytes(outputlen);

            while (byte(cborlen).length > ctr) {
                res[ctr] = byte(cborlen)[ctr];
                ctr++;
            }
            for (i = 0; i < arrlen; i++) {
                res[ctr] = 0x5F;
                ctr++;
                for (uint x = 0; x < elemArray[i].length; x++) {
                    // if there's a bug with larger strings, this may be the culprit
                    if (x % 23 == 0) {
                        uint elemcborlen = elemArray[i].length - x >= 24 ? 23 : elemArray[i].length - x;
                        elemcborlen += 0x40;
                        uint lctr = ctr;
                        while (byte(elemcborlen).length > ctr - lctr) {
                            res[ctr] = byte(elemcborlen)[ctr - lctr];
                            ctr++;
                        }
                    }
                    res[ctr] = elemArray[i][x];
                    ctr++;
                }
                res[ctr] = 0xFF;
                ctr++;
            }
            return res;
        }
        
        
    string oraclize_network_name;
    function oraclize_setNetworkName(string _network_name) internal {
        oraclize_network_name = _network_name;
    }
    
    function oraclize_getNetworkName() internal returns (string) {
        return oraclize_network_name;
    }
    
    function oraclize_newRandomDSQuery(uint _delay, uint _nbytes, uint _customGasLimit) internal returns (bytes32){
        if ((_nbytes == 0)||(_nbytes > 32)) throw;
        bytes memory nbytes = new bytes(1);
        nbytes[0] = byte(_nbytes);
        bytes memory unonce = new bytes(32);
        bytes memory sessionKeyHash = new bytes(32);
        bytes32 sessionKeyHash_bytes32 = oraclize_randomDS_getSessionPubKeyHash();
        assembly {
            mstore(unonce, 0x20)
            mstore(add(unonce, 0x20), xor(blockhash(sub(number, 1)), xor(coinbase, timestamp)))
            mstore(sessionKeyHash, 0x20)
            mstore(add(sessionKeyHash, 0x20), sessionKeyHash_bytes32)
        }
        bytes[3] memory args = [unonce, nbytes, sessionKeyHash]; 
        bytes32 queryId = oraclize_query(_delay, "random", args, _customGasLimit);
        oraclize_randomDS_setCommitment(queryId, sha3(bytes8(_delay), args[1], sha256(args[0]), args[2]));
        return queryId;
    }
    
    function oraclize_randomDS_setCommitment(bytes32 queryId, bytes32 commitment) internal {
        oraclize_randomDS_args[queryId] = commitment;
    }
    
    mapping(bytes32=>bytes32) oraclize_randomDS_args;
    mapping(bytes32=>bool) oraclize_randomDS_sessionKeysHashVerified;

    function verifySig(bytes32 tosignh, bytes dersig, bytes pubkey) internal returns (bool){
        bool sigok;
        address signer;
        
        bytes32 sigr;
        bytes32 sigs;
        
        bytes memory sigr_ = new bytes(32);
        uint offset = 4+(uint(dersig[3]) - 0x20);
        sigr_ = copyBytes(dersig, offset, 32, sigr_, 0);
        bytes memory sigs_ = new bytes(32);
        offset += 32 + 2;
        sigs_ = copyBytes(dersig, offset+(uint(dersig[offset-1]) - 0x20), 32, sigs_, 0);

        assembly {
            sigr := mload(add(sigr_, 32))
            sigs := mload(add(sigs_, 32))
        }
        
        
        (sigok, signer) = safer_ecrecover(tosignh, 27, sigr, sigs);
        if (address(sha3(pubkey)) == signer) return true;
        else {
            (sigok, signer) = safer_ecrecover(tosignh, 28, sigr, sigs);
            return (address(sha3(pubkey)) == signer);
        }
    }

    function oraclize_randomDS_proofVerify__sessionKeyValidity(bytes proof, uint sig2offset) internal returns (bool) {
        bool sigok;
        
        // Step 6: verify the attestation signature, APPKEY1 must sign the sessionKey from the correct ledger app (CODEHASH)
        bytes memory sig2 = new bytes(uint(proof[sig2offset+1])+2);
        copyBytes(proof, sig2offset, sig2.length, sig2, 0);
        
        bytes memory appkey1_pubkey = new bytes(64);
        copyBytes(proof, 3+1, 64, appkey1_pubkey, 0);
        
        bytes memory tosign2 = new bytes(1+65+32);
        tosign2[0] = 1; //role
        copyBytes(proof, sig2offset-65, 65, tosign2, 1);
        bytes memory CODEHASH = hex"fd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505c";
        copyBytes(CODEHASH, 0, 32, tosign2, 1+65);
        sigok = verifySig(sha256(tosign2), sig2, appkey1_pubkey);
        
        if (sigok == false) return false;
        
        
        // Step 7: verify the APPKEY1 provenance (must be signed by Ledger)
        bytes memory LEDGERKEY = hex"7fb956469c5c9b89840d55b43537e66a98dd4811ea0a27224272c2e5622911e8537a2f8e86a46baec82864e98dd01e9ccc2f8bc5dfc9cbe5a91a290498dd96e4";
        
        bytes memory tosign3 = new bytes(1+65);
        tosign3[0] = 0xFE;
        copyBytes(proof, 3, 65, tosign3, 1);
        
        bytes memory sig3 = new bytes(uint(proof[3+65+1])+2);
        copyBytes(proof, 3+65, sig3.length, sig3, 0);
        
        sigok = verifySig(sha256(tosign3), sig3, LEDGERKEY);
        
        return sigok;
    }
    
    modifier oraclize_randomDS_proofVerify(bytes32 _queryId, string _result, bytes _proof) {
        // Step 1: the prefix has to match 'LP\x01' (Ledger Proof version 1)
        if ((_proof[0] != "L")||(_proof[1] != "P")||(_proof[2] != 1)) throw;
        
        bool proofVerified = oraclize_randomDS_proofVerify__main(_proof, _queryId, bytes(_result), oraclize_getNetworkName());
        if (proofVerified == false) throw;
        
        _;
    }
    
    function matchBytes32Prefix(bytes32 content, bytes prefix) internal returns (bool){
        bool match_ = true;
        
        for (var i=0; i<prefix.length; i++){
            if (content[i] != prefix[i]) match_ = false;
        }
        
        return match_;
    }

    function oraclize_randomDS_proofVerify__main(bytes proof, bytes32 queryId, bytes result, string context_name) internal returns (bool){
        bool checkok;
        
        
        // Step 2: the unique keyhash has to match with the sha256 of (context name + queryId)
        uint ledgerProofLength = 3+65+(uint(proof[3+65+1])+2)+32;
        bytes memory keyhash = new bytes(32);
        copyBytes(proof, ledgerProofLength, 32, keyhash, 0);
        checkok = (sha3(keyhash) == sha3(sha256(context_name, queryId)));
        if (checkok == false) return false;
        
        bytes memory sig1 = new bytes(uint(proof[ledgerProofLength+(32+8+1+32)+1])+2);
        copyBytes(proof, ledgerProofLength+(32+8+1+32), sig1.length, sig1, 0);
        
        
        // Step 3: we assume sig1 is valid (it will be verified during step 5) and we verify if 'result' is the prefix of sha256(sig1)
        checkok = matchBytes32Prefix(sha256(sig1), result);
        if (checkok == false) return false;
        
        
        // Step 4: commitment match verification, sha3(delay, nbytes, unonce, sessionKeyHash) == commitment in storage.
        // This is to verify that the computed args match with the ones specified in the query.
        bytes memory commitmentSlice1 = new bytes(8+1+32);
        copyBytes(proof, ledgerProofLength+32, 8+1+32, commitmentSlice1, 0);
        
        bytes memory sessionPubkey = new bytes(64);
        uint sig2offset = ledgerProofLength+32+(8+1+32)+sig1.length+65;
        copyBytes(proof, sig2offset-64, 64, sessionPubkey, 0);
        
        bytes32 sessionPubkeyHash = sha256(sessionPubkey);
        if (oraclize_randomDS_args[queryId] == sha3(commitmentSlice1, sessionPubkeyHash)){ //unonce, nbytes and sessionKeyHash match
            delete oraclize_randomDS_args[queryId];
        } else return false;
        
        
        // Step 5: validity verification for sig1 (keyhash and args signed with the sessionKey)
        bytes memory tosign1 = new bytes(32+8+1+32);
        copyBytes(proof, ledgerProofLength, 32+8+1+32, tosign1, 0);
        checkok = verifySig(sha256(tosign1), sig1, sessionPubkey);
        if (checkok == false) return false;
        
        // verify if sessionPubkeyHash was verified already, if not.. let's do it!
        if (oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash] == false){
            oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash] = oraclize_randomDS_proofVerify__sessionKeyValidity(proof, sig2offset);
        }
        
        return oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash];
    }

    
    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    function copyBytes(bytes from, uint fromOffset, uint length, bytes to, uint toOffset) internal returns (bytes) {
        uint minLength = length + toOffset;

        if (to.length < minLength) {
            // Buffer too small
            throw; // Should be a better way?
        }

        // NOTE: the offset 32 is added to skip the `size` field of both bytes variables
        uint i = 32 + fromOffset;
        uint j = 32 + toOffset;

        while (i < (32 + fromOffset + length)) {
            assembly {
                let tmp := mload(add(from, i))
                mstore(add(to, j), tmp)
            }
            i += 32;
            j += 32;
        }

        return to;
    }
    
    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    // Duplicate Solidity's ecrecover, but catching the CALL return value
    function safer_ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal returns (bool, address) {
        // We do our own memory management here. Solidity uses memory offset
        // 0x40 to store the current end of memory. We write past it (as
        // writes are memory extensions), but don't update the offset so
        // Solidity will reuse it. The memory used here is only needed for
        // this context.

        // FIXME: inline assembly can't access return values
        bool ret;
        address addr;

        assembly {
            let size := mload(0x40)
            mstore(size, hash)
            mstore(add(size, 32), v)
            mstore(add(size, 64), r)
            mstore(add(size, 96), s)

            // NOTE: we can reuse the request memory because we deal with
            //       the return code
            ret := call(3000, 1, 0, size, 128, size, 32)
            addr := mload(size)
        }
  
        return (ret, addr);
    }

    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    function ecrecovery(bytes32 hash, bytes sig) internal returns (bool, address) {
        bytes32 r;
        bytes32 s;
        uint8 v;

        if (sig.length != 65)
          return (false, 0);

        // The signature format is a compact form of:
        //   {bytes32 r}{bytes32 s}{uint8 v}
        // Compact means, uint8 is not padded to 32 bytes.
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))

            // Here we are loading the last 32 bytes. We exploit the fact that
            // 'mload' will pad with zeroes if we overread.
            // There is no 'mload8' to do this, but that would be nicer.
            v := byte(0, mload(add(sig, 96)))

            // Alternative solution:
            // 'byte' is not working due to the Solidity parser, so lets
            // use the second best option, 'and'
            // v := and(mload(add(sig, 65)), 255)
        }

        // albeit non-transactional signatures are not specified by the YP, one would expect it
        // to match the YP range of [27, 28]
        //
        // geth uses [0, 1] and some clients have followed. This might change, see:
        //  https://github.com/ethereum/go-ethereum/issues/2053
        if (v < 27)
          v += 27;

        if (v != 27 && v != 28)
            return (false, 0);

        return safer_ecrecover(hash, v, r, s);
    }
        
}
// </ORACLIZE_API>


/**
 * @title The EVNToken Token contract.
 *
 * Credit: Taking ideas from BAT token and NET token
 */
 /*is StandardToken */
contract EVNToken is StandardToken, usingOraclize {

    // Token metadata
    string public constant name = "Envion";
    string public constant symbol = "EVN";
    uint256 public constant decimals = 18;
    string public constant version = "0.9";

    // Fundraising goals: minimums and maximums
    uint256 public constant TOKEN_CREATION_CAP = 130 * (10**6) * 10**decimals; // 130 million EVNs
    uint256 public constant TOKEN_CREATED_MIN = 1 * (10**6) * 10**decimals;    // 1 million EVNs
    uint256 public constant ETH_RECEIVED_CAP = 5333 * (10**2) * 10**decimals;  // 533 300 ETH
    uint256 public constant ETH_RECEIVED_MIN = 1 * (10**3) * 10**decimals;     // 1 000 ETH
    uint256 public constant TOKEN_MIN = 1 * 10**decimals;                      // 1 EVN

    // Discount multipliers
    uint256 public constant TOKEN_FIRST_DISCOUNT_MULTIPLIER  = 142857; // later divided by 10^5 to give users 1,42857 times more tokens per ETH == 30% discount
    uint256 public constant TOKEN_SECOND_DISCOUNT_MULTIPLIER = 125000; // later divided by 10^5 to give users 1,25 more tokens per ETH == 20% discount
    uint256 public constant TOKEN_THIRD_DISCOUNT_MULTIPLIER  = 111111; // later divided by 10^5 to give users 1,11111 more tokens per ETH == 10% discount

    // Fundraising parameters provided when creating the contract
    uint256 public fundingStartBlock; // These two blocks need to be chosen to comply with the
    uint256 public fundingEndBlock;   // start date and 31 day duration requirements
    uint256 public roundTwoBlock;     // block number that triggers the second exchange rate change
    uint256 public roundThreeBlock;   // block number that triggers the third exchange rate change
    uint256 public roundFourBlock;    // block number that triggers the fourth exchange rate change
    uint256 public ccReleaseBlock;    // block number that triggers purchases made by CC be transferable

    address public admin1;      // First administrator for multi-sig mechanism
    address public admin2;      // Second administrator for multi-sig mechanism
    address public tokenVendor; // Account delivering Tokens purchased with credit card

    // Contracts current state (Fundraising, Finalized, Paused) and the saved state (if currently paused)
    ContractState public state;       // Current state of the contract
    ContractState private savedState; // State of the contract before pause

    //@dev Usecase related: Purchasing Tokens with Credit card  
    //@dev Usecase related: Canceling purchases done with credit card
    mapping (string => Purchase) purchases;                 // in case CC payments get charged back, admins shall only be allowed to kill the exact amount of tokens associated with this payment
    mapping (address => uint256) public ccLockedUpBalances; // tracking the total amount of tokens users have bought via CC - locked up until ccReleaseBlock
    string[] public purchaseArray;                          // holding the IDs of all CC purchases

    // Keep track of holders and icoBuyers
    mapping (address => bool) public isHolder; // track if a user is a known token holder to the smart contract - important for payouts later
    address[] public holders;                  // array of all known holders - important for payouts later
    mapping (address => bool) isIcoBuyer;      // for tracking if user has to be kyc verified before being able to transfer tokens

    // ETH balance per user
    // Since we have different exchange rates at different stages, we need to keep track
    // of how much ether each contributed in case that we need to issue a refund
    mapping (address => uint256) private ethBalances;
    mapping (address => uint256) private noKycEthBalances;

    // Total received ETH balances
    // We need to keep track of how much ether have been contributed, since we have a cap for ETH too
    uint256 public allReceivedEth;
    uint256 public allUnKycedEth; // total amount of ETH we have no KYC for yet

    // store the hashes of admins' msg.data
    mapping (address => bytes32) private multiSigHashes;

    // KYC
    mapping (address => bool) public isKycTeam;   // to determine, if a user belongs to the KYC team or not
    mapping (address => bool) public kycVerified; // to check if user has already undergone KYC or not, to lock up his tokens until then

    // to track if team members already got their tokens
    bool public teamTokensDelivered;

    // Current ETH/USD exchange rate
    uint256 public ETH_USD_EXCHANGE_RATE_IN_CENTS; // set by oraclize

    // Everything oraclize related
    event updatedPrice(string price);
    event newOraclizeQuery(string description);
    uint public oraclizeQueryCost;

    // Events used for logging
    event LogRefund(address indexed _to, uint256 _value);
    event LogCreateEVN(address indexed _to, uint256 _value);
    event LogDeliverEVN(address indexed _to, uint256 _value);
    event LogCancelDelivery(address indexed _to, string _id);
    event LogKycRefused(address indexed _user, uint256 _value);
    event LogTeamTokensDelivered(address indexed distributor, uint256 _value);

    // Additional helper structs
    enum ContractState { Fundraising, Finalized, Paused }

    // Credit Card Purchase Parameters
    //@dev Usecase related: Purchase Tokens with Credit card
    //@dev Usecase related: Cancel purchase done with credit card
    struct Purchase {
        address buyer;
        uint256 tokenAmount;
        bool active;
    }

    // Modifiers
    modifier isFinalized() {
        require(state == ContractState.Finalized);
        _;
    }

    modifier isFundraising() {
        require(state == ContractState.Fundraising);
        _;
    }

    modifier isPaused() {
        require(state == ContractState.Paused);
        _;
    }

    modifier notPaused() {
        require(state != ContractState.Paused);
        _;
    }

    modifier isFundraisingIgnorePaused() {
        require(state == ContractState.Fundraising || (state == ContractState.Paused && savedState == ContractState.Fundraising));
        _;
    }

    modifier onlyKycTeam(){
        require(isKycTeam[msg.sender] == true);
        _;
    }

    modifier onlyOwner() {
        // check if transaction sender is admin.
        require (msg.sender == admin1 || msg.sender == admin2);
        // if yes, store his msg.data. 
        multiSigHashes[msg.sender] = keccak256(msg.data);
        // check if his stored msg.data hash equals to the one of the other admin
        if ((multiSigHashes[admin1]) == (multiSigHashes[admin2])) {
            // if yes, both admins agreed - continue.
            _;

            // Reset hashes after successful execution
            multiSigHashes[admin1] = 0x0;
            multiSigHashes[admin2] = 0x0;
        } else {
            // if not (yet), return.
            return;
        }
    }

    modifier onlyVendor() {
        require(msg.sender == tokenVendor);
        _;
    }

    modifier minimumReached() {
        require(allReceivedEth >= ETH_RECEIVED_MIN);
        require(totalSupply >= TOKEN_CREATED_MIN);
        _;
    }

    modifier isKycVerified(address _user) {
        // if token transferring user acquired the tokens through the ICO...
        if (isIcoBuyer[_user] == true) {
            // ...check if user is already unlocked
            require (kycVerified[_user] == true);
        }
        _;
    }

    modifier hasEnoughUnlockedTokens(address _user, uint256 _value) {
        // check if the user was a CC buyer and if the lockup period is not over,
        if (ccLockedUpBalances[_user] > 0 && block.number < ccReleaseBlock) {
            // allow to only transfer the not-locked up tokens
            require ((SafeMath.sub(balances[_user], _value)) >= ccLockedUpBalances[_user]);
        }
        _;
    }

    /**
     * @dev Create a new EVNToken contract.
     *
     *  _fundingStartBlock The starting block of the fundraiser (has to be in the future).
     *  _fundingEndBlock The end block of the fundraiser (has to be after _fundingStartBlock).
     *  _roundTwoBlock The block that changes the discount rate to 20% (has to be between _fundingStartBlock and _roundThreeBlock).
     *  _roundThreeBlock The block that changes the discount rate to 10% (has to be between _roundTwoBlock and _roundFourBlock).
     *  _roundFourBlock The block that changes the discount rate to 0% (has to be between _roundThreeBlock and _fundingEndBlock).
     *  _admin1 The first admin account that owns this contract.
     *  _admin2 The second admin account that owns this contract.
     *  _tokenVendor The account that creates tokens for credit card / fiat contributers.
     */
    function EVNToken(
        uint256 _fundingStartBlock,
        uint256 _fundingEndBlock,
        uint256 _roundTwoBlock, // block number that triggers the first exchange rate change
        uint256 _roundThreeBlock, // block number that triggers the second exchange rate change
        uint256 _roundFourBlock,
        address _admin1,
        address _admin2,
        address _tokenVendor,
        uint256 _ccReleaseBlock)
    payable
    {
        // Check that the parameters make sense

        // The start of the fundraising should happen in the future
        require (block.number <= _fundingStartBlock);

        // The discount rate changes and ending should follow in their subsequent order
        require (_fundingStartBlock < _roundTwoBlock);
        require (_roundTwoBlock < _roundThreeBlock);
        require (_roundThreeBlock < _roundFourBlock);
        require (_roundFourBlock < _fundingEndBlock);

        // block when tokens bought with CC will be released must be in the future
        require (_fundingEndBlock < _ccReleaseBlock);

        // admin1 and admin2 address must be set and must be different
        require (_admin1 != 0x0);
        require (_admin2 != 0x0);
        require (_admin1 != _admin2);

        // tokenVendor must be set and be different from admin1 and admin2
        require (_tokenVendor != 0x0);
        require (_tokenVendor != _admin1);
        require (_tokenVendor != _admin2);

        // provide some ETH for oraclize price feed
        require (msg.value > 0);

        // Init contract state
        state = ContractState.Fundraising;
        savedState = ContractState.Fundraising;
        fundingStartBlock = _fundingStartBlock;
        fundingEndBlock = _fundingEndBlock;
        roundTwoBlock = _roundTwoBlock;
        roundThreeBlock = _roundThreeBlock;
        roundFourBlock = _roundFourBlock;
        ccReleaseBlock = _ccReleaseBlock;

        totalSupply = 0;

        admin1 = _admin1;
        admin2 = _admin2;
        tokenVendor = _tokenVendor;

        //oraclize 
        oraclize_setCustomGasPrice(100000000000 wei); // set the gas price a little bit higher, so the pricefeed definitely works
        updatePrice();
        oraclizeQueryCost = oraclize_getPrice("URL");
    }

    //// oraclize START

    // @dev oraclize is called recursively here - once a callback fetches the newest ETH price, the next callback is scheduled for the next hour again
    function __callback(bytes32 myid, string result) {
        require(msg.sender == oraclize_cbAddress());

        // setting the token price here
        ETH_USD_EXCHANGE_RATE_IN_CENTS = SafeMath.parse(result);
        updatedPrice(result);

        // fetch the next price
        updatePrice();
    }

    function updatePrice() payable {    // can be left public as a way for replenishing contract's ETH balance, just in case
        if (msg.sender != oraclize_cbAddress()) {
            require(msg.value >= 200 finney);
        }
        if (oraclize_getPrice("URL") > this.balance) {
            newOraclizeQuery("Oraclize query was NOT sent, please add some ETH to cover for the query fee");
        } else {
            newOraclizeQuery("Oraclize sent, wait..");
            // Schedule query in 1 hour. Set the gas amount to 220000, as parsing in __callback takes around 70000 - we play it safe.
            oraclize_query(3600, "URL", "json(https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD).USD", 220000);
        }
    }
    //// oraclize END

    // Overridden method to check for end of fundraising before allowing transfer of tokens
    function transfer(address _to, uint256 _value)
    public
    isFinalized // Only allow token transfer after the fundraising has ended
    isKycVerified(msg.sender)
    hasEnoughUnlockedTokens(msg.sender, _value)
    onlyPayloadSize(2)
    returns (bool success)
    {
        bool result = super.transfer(_to, _value);
        if (result) {
            trackHolder(_to); // track the owner for later payouts
        }
        return result;
    }

    // Overridden method to check for end of fundraising before allowing transfer of tokens
    function transferFrom(address _from, address _to, uint256 _value)
    public
    isFinalized // Only allow token transfer after the fundraising has ended
    isKycVerified(msg.sender)
    hasEnoughUnlockedTokens(msg.sender, _value)
    onlyPayloadSize(3)
    returns (bool success)
    {
        bool result = super.transferFrom(_from, _to, _value);
        if (result) {
            trackHolder(_to); // track the owner for later payouts
        }
        return result;
    }

    // Allow for easier balance checking
    function getBalanceOf(address _owner)
    constant
    returns (uint256 _balance)
    {
        return balances[_owner];
    }

     // getting purchase details by ID - workaround, mappings with dynamically sized keys can't be made public yet.
    function getPurchaseById(string _id)
    constant
    returns (address _buyer, uint256 _tokenAmount, bool _active){
        _buyer = purchases[_id].buyer;
        _tokenAmount = purchases[_id].tokenAmount;
        _active = purchases[_id].active;
    }

    // Allows to figure out the amount of known token holders
    function getHolderCount()
    public
    constant
    returns (uint256 _holderCount)
    {
        return holders.length;
    }

    // Allows to figure out the amount of purchases
    function getPurchaseCount()
    public
    constant
    returns (uint256 _purchaseCount)
    {
        return purchaseArray.length;
    }

    // Allows for easier retrieval of holder by array index
    function getHolder(uint256 _index)
    public
    constant
    returns (address _holder)
    {
        return holders[_index];
    }

    function trackHolder(address _to)
    private
    returns (bool success)
    {
        // Check if the recipient is a known token holder
        if (isHolder[_to] == false) {
            // if not, add him to the holders array and mark him as a known holder
            holders.push(_to);
            isHolder[_to] = true;
        }
        return true;
    }


    /// @dev Accepts ether and creates new EVN tokens
    function createTokens()
    payable
    external
    isFundraising
    {
        require(block.number >= fundingStartBlock);
        require(block.number <= fundingEndBlock);
        require(msg.value > 0);

        // First we check the ETH cap: would adding this amount to the total unKYCed eth and the already KYCed eth exceed the eth cap?
        // return the contribution if the cap has been reached already
        uint256 totalKycedAndUnKycEdEth = SafeMath.add(allUnKycedEth, allReceivedEth);
        uint256 checkedReceivedEth = SafeMath.add(totalKycedAndUnKycEdEth, msg.value);
        require(checkedReceivedEth <= ETH_RECEIVED_CAP);

        // If all is fine with the ETH cap, we continue to check the
        // minimum amount of tokens and the cap for how many tokens
        // have been generated so far

        // calculate the token amount
        uint256 tokens = SafeMath.mul(msg.value, ETH_USD_EXCHANGE_RATE_IN_CENTS);

        // divide by 100 to turn ETH_USD_EXCHANGE_RATE_IN_CENTS into full USD
        tokens = tokens / 100;

        // apply discount multiplier
        tokens = safeMulPercentage(tokens, getCurrentDiscountRate());

        require(tokens >= TOKEN_MIN);
        uint256 checkedSupply = SafeMath.add(totalSupply, tokens);
        require(checkedSupply <= TOKEN_CREATION_CAP);

        // Only when all the checks have passed, then we check if the address is already KYCEd and then 
        // update the state (noKycEthBalances, allReceivedEth, totalSupply, and balances) of the contract

        if (kycVerified[msg.sender] == false) {
            // @dev The unKYCed eth balances are moved to ethBalances in unlockKyc()

            noKycEthBalances[msg.sender] = SafeMath.add(noKycEthBalances[msg.sender], msg.value);

            // add the contributed eth to the total unKYCed eth amount
            allUnKycedEth = SafeMath.add(allUnKycedEth, msg.value);
        } else {
            // if buyer is already KYC unlocked...
            ethBalances[msg.sender] = SafeMath.add(ethBalances[msg.sender], msg.value);
            allReceivedEth = SafeMath.add(allReceivedEth, msg.value);
        }

        totalSupply = checkedSupply;
        balances[msg.sender] += tokens;  // safeAdd not needed; bad semantics to use here

        trackHolder(msg.sender);

        // to force the check for KYC Status upon the user when he tries transferring tokens
        // and exclude every later token owner
        isIcoBuyer[msg.sender] = true;

        // Log the creation of these tokens
        LogCreateEVN(msg.sender, tokens);
    }

    //add a user to the KYC team
    function addToKycTeam(address _teamMember)
    onlyOwner
    onlyPayloadSize(1){
        isKycTeam[_teamMember] = true;
    }

    //remove a user from the KYC team
    function removeFromKycTeam(address _teamMember)
    onlyOwner
    onlyPayloadSize(1){
        isKycTeam[_teamMember] = false;
    }

    //called by KYC team 
    function unlockKyc(address _owner)
    external
    onlyKycTeam {
        require(kycVerified[_owner] == false);

        //unlock the owner to allow transfer of tokens
        kycVerified[_owner] = true;

        // we leave the ccLockedUpBalances[_owner] as is, because also KYCed users could cancel their CC payments

        if (noKycEthBalances[_owner] > 0) { // check if the user was an ETH buyer

            // now move the unKYCed eth balance to the regular ethBalance. 
            ethBalances[_owner] = noKycEthBalances[_owner];

            // add the now KYCed eth to the total received eth
            allReceivedEth = SafeMath.add(allReceivedEth, noKycEthBalances[_owner]);

            // subtract the now KYCed eth from total amount of unKYCed eth
            allUnKycedEth = SafeMath.sub(allUnKycedEth, noKycEthBalances[_owner]);

            // and set the user's unKYCed eth balance to 0
            noKycEthBalances[_owner] = 0; // preventing replay attacks
        }
    }

    // Refusing KYC of a user, who only contributed in ETH.
    // We must pay close attention here for the case that a user contributes in ETH AND(!) CC !
    // in this case, he must only kill the tokens he received through ETH, the ones bought in fiat will be
    // killed by canceling his payments and subsequently calling cancelDelivery() with the according payment id.
    function refuseKyc(address _user)
    external
    onlyKycTeam
    {
        // once a user is verified, you can't kick him out.
        require (kycVerified[_user] == false);

        // immediately stop, if a user has none or only CC contributions.
        // we're managing kyc refusing of CC contributors off-chain
        require(noKycEthBalances[_user]>0);

        uint256 EVNVal = balances[_user];
        require(EVNVal > 0);

        uint256 ethVal = noKycEthBalances[_user]; // refund un-KYCd eth
        require(ethVal > 0);

        // Update the state only after all the checks have passed
        allUnKycedEth = SafeMath.sub(allUnKycedEth, noKycEthBalances[_user]); // or if there was any unKYCed Eth, subtract it from the total unKYCed eth balance.
        balances[_user] = ccLockedUpBalances[_user]; // assign user only the token amount he has bought through CC, if there are any.
        noKycEthBalances[_user] = 0;
        totalSupply = SafeMath.sub(totalSupply, EVNVal); // Extra safe

        // Log this refund
        LogKycRefused(_user, ethVal);

        // Send the contributions only after we have updated all the balances
        // If you're using a contract, make sure it works with .transfer() gas limits
        _user.transfer(ethVal);
    }

    // Called in case a buyer cancels his CC payment.
    // @param The payment ID from payment provider
    function cancelDelivery(string _purchaseID)
    external
    onlyKycTeam{
        
        // CC payments are only cancelable until ccReleaseBlock
        require (block.number < ccReleaseBlock);

        // check if the purchase to cancel is still active
        require (purchases[_purchaseID].active == true);

        // now withdraw the canceled purchase's token amount from the user's balance
        balances[purchases[_purchaseID].buyer] = SafeMath.sub(balances[purchases[_purchaseID].buyer], purchases[_purchaseID].tokenAmount);

        // and withdraw the canceled purchase's token amount from the lockedUp token balance
        ccLockedUpBalances[purchases[_purchaseID].buyer] = SafeMath.sub(ccLockedUpBalances[purchases[_purchaseID].buyer], purchases[_purchaseID].tokenAmount);

        // set the purchase's status to inactive
        purchases[_purchaseID].active = false;

        //correct th amount of tokens generated
        totalSupply = SafeMath.sub(totalSupply, purchases[_purchaseID].tokenAmount);

        LogCancelDelivery(purchases[_purchaseID].buyer, _purchaseID);
    }

    // @dev Deliver tokens sold for CC/fiat and BTC
    // @dev param _tokens in Cents, e.g. 1 Token == 1$, passed as 100 cents
    // @dev param _btcBuyer Boolean to determine if the delivered tokens need to be locked (not the case for BTC buyers, their payment is final)
    // @dev discount multipliers are applied off-contract in this case
    function deliverTokens(address _to, uint256 _tokens, string _purchaseId, bool _btcBuyer)
    external
    isFundraising
    onlyVendor
    {
        require(_to != 0x0);
        require(_tokens > 0);
        require(bytes(_purchaseId).length>0);
        require(block.number >= fundingStartBlock);
        require(block.number <= fundingEndBlock + 168000); // allow delivery of tokens sold for fiat for 28 days after end of ICO for safety reasons

        // calculate the total amount of tokens and cut out the extra two decimal units,
        // because _tokens was in cents.
        uint256 tokens = SafeMath.mul(_tokens, (10**(decimals) / 10**2));

        // continue to check for how many tokens
        // have been generated so far
        uint256 checkedSupply = SafeMath.add(totalSupply, tokens);
        require(checkedSupply <= TOKEN_CREATION_CAP);

        // Only when all the checks have passed, then we update the state (totalSupply, and balances) of the contract
        totalSupply = checkedSupply;

        // prevent from adding a delivery multiple times
        require(purchases[_purchaseId].buyer==0x0);

        // Log this information in order to be able to cancel token deliveries (on CC refund) by the payment ID
        purchases[_purchaseId] = Purchase({
            buyer: _to,
            tokenAmount: tokens,
            active: true
        });
        purchaseArray.push(_purchaseId);

        // if tokens were not paid with BTC (but credit card), they need to be locked up 
        if (_btcBuyer == false) {
        ccLockedUpBalances[_to] = SafeMath.add(ccLockedUpBalances[_to], tokens); // update user's locked up token balance
        }

        balances[_to] = SafeMath.add(balances[_to], tokens);                     // safeAdd not needed; bad semantics to use here
        trackHolder(_to);                                                        // log holder's address

        // to force the check for KYC Status upon the user when he tries transferring tokens
        // and exclude every later token owner
        isIcoBuyer[_to] = true;

        // Log the creation of these tokens
        LogDeliverEVN(_to, tokens);
   }

    /// @dev Returns the current token price
    function getCurrentDiscountRate()
    private
    constant
    returns (uint256 currentDiscountRate)
    {
        // determine which discount to apply
        if (block.number < roundTwoBlock) {
            // first round
            return TOKEN_FIRST_DISCOUNT_MULTIPLIER;
        } else if (block.number < roundThreeBlock){
            // second round
            return TOKEN_SECOND_DISCOUNT_MULTIPLIER;
        } else if (block.number < roundFourBlock) {
            // third round
            return TOKEN_THIRD_DISCOUNT_MULTIPLIER;
        } else {
            // fourth round, no discount
            return 100000;
        }
    }

    /// @dev Allows to transfer ether from the contract as soon as the minimum is reached
    function retrieveEth(uint256 _value, address _safe)
    external
    minimumReached
    onlyOwner
    {
        require(SafeMath.sub(this.balance, _value) >= allUnKycedEth); // make sure unKYCed eth cannot be withdrawn
        // make sure a recipient was defined !
        require (_safe != 0x0);

        // send the eth to where admins agree upon
        _safe.transfer(_value);
    }


    /// @dev Ends the fundraising period and sends the ETH to wherever the admins agree upon
    function finalize(address _safe)
    external
    isFundraising
    minimumReached
    onlyOwner  // Only the admins calling this method exactly the same way can finalize the sale.
    {
        // Only allow to finalize the contract before the ending block if we already reached any of the two caps
        require(block.number > fundingEndBlock || totalSupply >= TOKEN_CREATED_MIN || allReceivedEth >= ETH_RECEIVED_MIN);
        // make sure a recipient was defined !
        require (_safe != 0x0);

        // Move the contract to Finalized state
        state = ContractState.Finalized;
        savedState = ContractState.Finalized;

        // Send the KYCed ETH to where admins agree upon.
        _safe.transfer(allReceivedEth);
    }


    /// @dev Pauses the contract
    function pause()
    external
    notPaused   // Prevent the contract getting stuck in the Paused state
    onlyOwner   // Only both admins calling this method can pause the contract
    {
        // Move the contract to Paused state
        savedState = state;
        state = ContractState.Paused;
    }


    /// @dev Proceeds with the contract
    function proceed()
    external
    isPaused
    onlyOwner   // Only both admins calling this method can proceed with the contract
    {
        // Move the contract to the previous state
        state = savedState;
    }

    /// @dev Allows contributors to recover their ether in case the minimum funding goal is not reached
    function refund()
    external
    {
        // Allow refunds only a week after end of funding to give KYC-team time to verify contributors
        // and thereby move un-KYC-ed ETH over into allReceivedEth as well as deliver the tokens paid with CC
        require(block.number > (fundingEndBlock + 42000));

        // No refunds if the minimum has been reached or minimum of 1 Million Tokens have been generated
        require(allReceivedEth < ETH_RECEIVED_MIN || totalSupply < TOKEN_CREATED_MIN);

        // to prevent CC buyers from accidentally calling refund and burning their tokens
        require (ethBalances[msg.sender] > 0 || noKycEthBalances[msg.sender] > 0);

        // Only refund if there are EVN tokens
        uint256 EVNVal = balances[msg.sender];
        require(EVNVal > 0);

        // refunds either KYCed eth or un-KYCd eth
        uint256 ethVal = SafeMath.add(ethBalances[msg.sender], noKycEthBalances[msg.sender]);
        require(ethVal > 0);

        allReceivedEth = SafeMath.sub(allReceivedEth, ethBalances[msg.sender]);    // subtract only the KYCed ETH from allReceivedEth, because the latter is what admins will only be able to withdraw
        allUnKycedEth = SafeMath.sub(allUnKycedEth, noKycEthBalances[msg.sender]); // or if there was any unKYCed Eth, subtract it from the total unKYCed eth balance.

        // Update the state only after all the checks have passed.
        // reset everything to zero, no replay attacks.
        balances[msg.sender] = 0;
        ethBalances[msg.sender] = 0;
        noKycEthBalances[msg.sender] = 0;
        totalSupply = SafeMath.sub(totalSupply, EVNVal); // Extra safe

        // Log this refund
        LogRefund(msg.sender, ethVal);

        // Send the contributions only after we have updated all the balances
        // If you're using a contract, make sure it works with .transfer() gas limits
        msg.sender.transfer(ethVal);
    }

    // @dev Deliver tokens to be distributed to team members
    function deliverTeamTokens(address _to)
    external
    isFinalized
    onlyOwner
    {
        require(teamTokensDelivered == false);
        require(_to != 0x0);

        // allow delivery of tokens for the company and supporters without vesting, team tokens will be supplied like a CC purchase.
        
        // company and supporters gets 7% of a whole final pie, meaning we have to add ~7,5% to the
        // current totalSupply now, basically stretching it and taking 7% from the result, so the 93% that remain equals the amount of tokens created right now.
        // e.g. (93 * x = 100, where x amounts to roughly about 1.07526 and 7 would be the team's part)
        uint256 newTotalSupply = safeMulPercentage(totalSupply, 107526);

        // give company and supporters their 7% 
        uint256 tokens = SafeMath.sub(newTotalSupply, totalSupply);
        balances[_to] = tokens;

        //update state
        teamTokensDelivered = true;
        totalSupply = newTotalSupply;
        trackHolder(_to);

        // Log the creation of these tokens
        LogTeamTokensDelivered(_to, tokens);
    }

    function safeMulPercentage(uint256 value, uint256 percentage)
    internal
    constant
    returns (uint256 resultValue)
    {
        require(percentage >= 100000);
        require(percentage < 200000);

        // Multiply with percentage
        uint256 newValue = SafeMath.mul(value, percentage);
        // Remove the 5 extra decimals
        newValue = newValue / 10**5;
        return newValue;
    }

    // customizing the gas price for oraclize calls during "ICO Rush hours"
    function setOraclizeGas(uint256 _option)
    external
    onlyOwner
    {
        if (_option <= 30) {
            oraclize_setCustomGasPrice(30000000000 wei);
        } else if (_option <= 50) {
            oraclize_setCustomGasPrice(50000000000 wei);
        } else if (_option <= 70) {
            oraclize_setCustomGasPrice(70000000000 wei);
        } else if (_option <= 100) {
            oraclize_setCustomGasPrice(100000000000 wei);
        }
    }
}

    Contract ABI  
[{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_safe","type":"address"}],"name":"retrieveEth","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"admin2","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_teamMember","type":"address"}],"name":"addToKycTeam","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isKycTeam","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"admin1","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ETH_RECEIVED_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_teamMember","type":"address"}],"name":"removeFromKycTeam","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"myid","type":"bytes32"},{"name":"result","type":"string"}],"name":"__callback","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"holders","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"proceed","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"ccLockedUpBalances","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"myid","type":"bytes32"},{"name":"result","type":"string"},{"name":"proof","type":"bytes"}],"name":"__callback","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"oraclizeQueryCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokens","type":"uint256"},{"name":"_purchaseId","type":"string"},{"name":"_btcBuyer","type":"bool"}],"name":"deliverTokens","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_safe","type":"address"}],"name":"finalize","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_purchaseID","type":"string"}],"name":"cancelDelivery","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"updatePrice","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getHolderCount","outputs":[{"name":"_holderCount","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"allReceivedEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ccReleaseBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fundingEndBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"getBalanceOf","outputs":[{"name":"_balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokenVendor","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"kycVerified","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"allUnKycedEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"string"}],"name":"getPurchaseById","outputs":[{"name":"_buyer","type":"address"},{"name":"_tokenAmount","type":"uint256"},{"name":"_active","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"createTokens","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"purchaseArray","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getPurchaseCount","outputs":[{"name":"_purchaseCount","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"deliverTeamTokens","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"state","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_THIRD_DISCOUNT_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ETH_USD_EXCHANGE_RATE_IN_CENTS","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"}],"name":"refuseKyc","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"teamTokensDelivered","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"roundTwoBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isHolder","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fundingStartBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ETH_RECEIVED_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_FIRST_DISCOUNT_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"roundFourBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getHolder","outputs":[{"name":"_holder","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"roundThreeBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_SECOND_DISCOUNT_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_CREATED_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"unlockKyc","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_CREATION_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_option","type":"uint256"}],"name":"setOraclizeGas","outputs":[],"payable":false,"type":"function"},{"inputs":[{"name":"_fundingStartBlock","type":"uint256"},{"name":"_fundingEndBlock","type":"uint256"},{"name":"_roundTwoBlock","type":"uint256"},{"name":"_roundThreeBlock","type":"uint256"},{"name":"_roundFourBlock","type":"uint256"},{"name":"_admin1","type":"address"},{"name":"_admin2","type":"address"},{"name":"_tokenVendor","type":"address"},{"name":"_ccReleaseBlock","type":"uint256"}],"payable":true,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"price","type":"string"}],"name":"updatedPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"description","type":"string"}],"name":"newOraclizeQuery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogRefund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogCreateEVN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogDeliverEVN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_id","type":"string"}],"name":"LogCancelDelivery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_user","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogKycRefused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"distributor","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogTeamTokensDelivered","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"}]

  Contract Creation Code Switch To Opcodes View
606060405260405161012080620054f48339810160405280805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519150505b43899011156200006457600080fd5b8689106200007157600080fd5b8587106200007e57600080fd5b8486106200008b57600080fd5b8785106200009857600080fd5b808810620000a557600080fd5b600160a060020a0384161515620000bb57600080fd5b600160a060020a0383161515620000d157600080fd5b600160a060020a038481169084161415620000eb57600080fd5b600160a060020a03821615156200010157600080fd5b600160a060020a0382811690851614156200011b57600080fd5b600160a060020a0382811690841614156200013557600080fd5b600034116200014357600080fd5b601080546000919060a060020a60ff02191674010000000000000000000000000000000000000000835b0217905550601080546000919060a860020a60ff0219167501000000000000000000000000000000000000000000835b021790555060088990556009889055600a879055600b869055600c859055600d81905560008055600e8054600160a060020a03808716600160a060020a031992831617909255600f805486841690831617905560108054928516929091169190911790556200021f64174876e80064010000000062003c086200029682021704565b620002376401000000006200205f6200040082021704565b6200028360408051908101604052600381527f55524c00000000000000000000000000000000000000000000000000000000006020820152640100000000620035d56200067e82021704565b6020555b50505050505050505062001228565b600354600160a060020a03161580620002d15750600354620002cf90600160a060020a031664010000000062003d1a6200086682021704565b155b15620002f357620002f1600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156200035557600080fd5b6102c65a03f115156200036757600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063ca6ad1e4826040517c010000000000000000000000000000000000000000000000000000000063ffffffff84160281526004810191909152602401600060405180830381600087803b1515620003e657600080fd5b6102c65a03f11515620003f857600080fd5b5050505b5b50565b620004186401000000006200333062000c6b82021704565b600160a060020a031633600160a060020a031614151562000449576702c68af0bb1400003410156200044957600080fd5b5b30600160a060020a031631620004a160408051908101604052600381527f55524c00000000000000000000000000000000000000000000000000000000006020820152640100000000620035d56200067e82021704565b11156200054e57600080516020620054d48339815191526040516020808252604b908201527f4f7261636c697a6520717565727920776173204e4f542073656e742c20706c656040808301919091527f6173652061646420736f6d652045544820746f20636f76657220666f7220746860608301527f6520717565727920666565000000000000000000000000000000000000000000608083015260a0909101905180910390a16200067b565b600080516020620054d483398151915260405160208082526015908201527f4f7261636c697a652073656e742c20776169742e2e00000000000000000000006040808301919091526060909101905180910390a1620003fc610e106040805190810160405280600381526020017f55524c000000000000000000000000000000000000000000000000000000000081525060806040519081016040908152604982527f6a736f6e2868747470733a2f2f6d696e2d6170692e63727970746f636f6d706160208301527f72652e636f6d2f646174612f70726963653f6673796d3d455448267473796d73908201527f3d555344292e5553440000000000000000000000000000000000000000000000606082015262035b606401000000006200376262000de082021704565b505b5b565b600354600090600160a060020a03161580620006bc5750600354620006ba90600160a060020a031664010000000062003d1a6200086682021704565b155b15620006de57620006dc600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156200074057600080fd5b6102c65a03f115156200075257600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063524f3889836000604051602001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620007f55780820151818401525b602001620007da565b50505050905090810190601f168015620008235780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15156200084257600080fd5b6102c65a03f115156200085457600080fd5b50505060405180519150505b5b919050565b803b5b919050565b6000806200089e731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed64010000000062003d1a6200086682021704565b1115620009205760038054600160a060020a031916731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed1790556200091760408051908101604052600b81527f6574685f6d61696e6e65740000000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b60006200094f73c03a2615d5efaf5f49f60b7bb6583eaec212fdf164010000000062003d1a6200086682021704565b1115620009d15760038054600160a060020a03191673c03a2615d5efaf5f49f60b7bb6583eaec212fdf11790556200091760408051908101604052600c81527f6574685f726f707374656e3300000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b600062000a0073b7a07bcf2ba2f2703b24c0691b5278999c59ac7e64010000000062003d1a6200086682021704565b111562000a825760038054600160a060020a03191673b7a07bcf2ba2f2703b24c0691b5278999c59ac7e1790556200091760408051908101604052600981527f6574685f6b6f76616e00000000000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b600062000ab173146500cfd35b22e4a392fe0adc06de1a1368ed4864010000000062003d1a6200086682021704565b111562000b335760038054600160a060020a03191673146500cfd35b22e4a392fe0adc06de1a1368ed481790556200091760408051908101604052600b81527f6574685f72696e6b6562790000000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b600062000b62736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47564010000000062003d1a6200086682021704565b111562000b98575060038054600160a060020a031916736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475179055600162000860565b600062000bc77320e12a1f859b3feae5fb2a0a32c18f5a65555bbf64010000000062003d1a6200086682021704565b111562000bfd575060038054600160a060020a0319167320e12a1f859b3feae5fb2a0a32c18f5a65555bbf179055600162000860565b600062000c2c7351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa64010000000062003d1a6200086682021704565b111562000c62575060038054600160a060020a0319167351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa179055600162000860565b5060005b919050565b600354600090600160a060020a0316158062000ca9575060035462000ca790600160a060020a031664010000000062003d1a6200086682021704565b155b1562000ccb5762000cc9600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151562000d2d57600080fd5b6102c65a03f1151562000d3f57600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063c281d19e6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151562000dbe57600080fd5b6102c65a03f1151562000dd057600080fd5b50505060405180519150505b5b90565b6003546000908190600160a060020a0316158062000e20575060035462000e1e90600160a060020a031664010000000062003d1a6200086682021704565b155b1562000e425762000e40600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151562000ea457600080fd5b6102c65a03f1151562000eb657600080fd5b505050604051805160048054600160a060020a031916600160a060020a039283161790819055169050632ef3accc86856000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101562000f605780820151818401525b60200162000f45565b50505050905090810190601f16801562000f8e5780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b151562000fae57600080fd5b6102c65a03f1151562000fc057600080fd5b5050506040518051915050670de0b6b3a76400003a84020181111562000fea57600091506200115a565b600454600160a060020a031663c51be90f82888888886000604051602001526040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015620010845780820151818401525b60200162001069565b50505050905090810190601f168015620010b25780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b83811015620010eb5780820151818401525b602001620010d0565b50505050905090810190601f168015620011195780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303818588803b15156200113b57600080fd5b6125ee5a03f115156200114d57600080fd5b5050505060405180519250505b5b50949350505050565b6005818051620011799291602001906200117e565b505b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620011c157805160ff1916838001178555620011f1565b82800160010185558215620011f1579182015b82811115620011f1578251825591602001919060010190620011d4565b5b506200120092915062001204565b5090565b62000ddc91905b808211156200120057600081556001016200120b565b5090565b90565b61429c80620012386000396000f300606060405236156102b95763ffffffff60e060020a60003504166304deaeb581146102be57806306a8f8a2146102e257806306fdde0314610311578063095ea7b31461039c5780630fb7cb1d146103d2578063108e4bdb146103f3578063115976c414610426578063168213491461045557806318160ddd1461047a5780631f305ec71461049f57806323b872dd146104c057806327dc297e146104fc5780632a11ced0146105545780632a33fec6146105865780632ed196bd1461059b578063313ce567146105cc57806338bbfa50146105f15780633ba864651461068b5780633eeda7d3146106b05780634ef39b75146106e657806354fd4d5014610707578063590e1ae314610792578063611ef452146107a7578063673a7e28146107c757806370a08231146107d15780637136982b1461080257806373a1e7f5146108275780638456cb591461084c5780638a957f151461086157806391b43d131461088657806395d89b41146108ab5780639b96eece146107d1578063a3766f8814610967578063a5410a6614610996578063a9059cbb146109c9578063acc99bb7146109ff578063af580d2c14610a24578063b442726314610aa5578063b8b8587314610aaf578063becd283f14610b3d578063bf5f016914610b62578063c19d93fb14610b83578063c5fc98c914610bba578063cf9a60d414610bdf578063d134295814610c04578063d16be71b14610c25578063d25a13b414610c4c578063d4d7b19a14610c71578063d648a64714610ca4578063d8e3074014610cc9578063da9b90c414610cee578063dd62ed3e14610d13578063e5a284f814610d4a578063e74799b414610d6f578063e8a96b4614610d94578063eec7006f14610dc6578063f4ee82ee14610deb578063f5689a8014610e10578063f8db5d0714610e35578063f9fae4f714610e56578063fbf44a1b14610e7b575b600080fd5b34156102c957600080fd5b6102e0600435600160a060020a0360243516610e93565b005b34156102ed57600080fd5b6102f5610ff4565b604051600160a060020a03909116815260200160405180910390f35b341561031c57600080fd5b610324611003565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103a757600080fd5b6103be600160a060020a036004351660243561103a565b604051901515815260200160405180910390f35b34156103dd57600080fd5b6102e0600160a060020a03600435166110b5565b005b34156103fe57600080fd5b6103be600160a060020a03600435166111aa565b604051901515815260200160405180910390f35b341561043157600080fd5b6102f56111bf565b604051600160a060020a03909116815260200160405180910390f35b341561046057600080fd5b6104686111ce565b60405190815260200160405180910390f35b341561048557600080fd5b6104686111db565b60405190815260200160405180910390f35b34156104aa57600080fd5b6102e0600160a060020a03600435166111e1565b005b34156104cb57600080fd5b6103be600160a060020a03600435811690602435166044356112db565b604051901515815260200160405180910390f35b341561050757600080fd5b6102e0600480359060446024803590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506113ff95505050505050565b005b341561055f57600080fd5b6102f56004356114d8565b604051600160a060020a03909116815260200160405180910390f35b341561059157600080fd5b6102e061150a565b005b34156105a657600080fd5b610468600160a060020a0360043516611643565b60405190815260200160405180910390f35b34156105d757600080fd5b610468611655565b60405190815260200160405180910390f35b34156105fc57600080fd5b6102e0600480359060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061165a95505050505050565b005b341561069657600080fd5b610468611660565b60405190815260200160405180910390f35b34156106bb57600080fd5b6102e060048035600160a060020a03169060248035916044359182019101356064351515611666565b005b34156106f157600080fd5b6102e0600160a060020a0360043516611923565b005b341561071257600080fd5b610324611b3d565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079d57600080fd5b6102e0611b74565b005b34156107b257600080fd5b6102e06004803560248101910135611d6b565b005b6102e061205f565b005b34156107dc57600080fd5b610468600160a060020a03600435166122cc565b60405190815260200160405180910390f35b341561080d57600080fd5b6104686122eb565b60405190815260200160405180910390f35b341561083257600080fd5b6104686122f2565b60405190815260200160405180910390f35b341561085757600080fd5b6102e06122f8565b005b341561086c57600080fd5b61046861246b565b60405190815260200160405180910390f35b341561089157600080fd5b610468612471565b60405190815260200160405180910390f35b34156108b657600080fd5b610324612477565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156107dc57600080fd5b610468600160a060020a03600435166122cc565b60405190815260200160405180910390f35b341561097257600080fd5b6102f56124cd565b604051600160a060020a03909116815260200160405180910390f35b34156109a157600080fd5b6103be600160a060020a03600435166124dc565b604051901515815260200160405180910390f35b34156109d457600080fd5b6103be600160a060020a03600435166024356124f1565b604051901515815260200160405180910390f35b3415610a0a57600080fd5b610468612613565b60405190815260200160405180910390f35b3415610a2f57600080fd5b610a7560046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061261995505050505050565b604051600160a060020a039093168352602083019190915215156040808301919091526060909101905180910390f35b6102e0612775565b005b3415610aba57600080fd5b6103246004356129ab565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610b4857600080fd5b610468612a67565b60405190815260200160405180910390f35b3415610b6d57600080fd5b6102e0600160a060020a0360043516612a6e565b005b3415610b8e57600080fd5b610b96612c1d565b60405180826002811115610ba657fe5b60ff16815260200191505060405180910390f35b3415610bc557600080fd5b610468612c2d565b60405190815260200160405180910390f35b3415610bea57600080fd5b610468612c34565b60405190815260200160405180910390f35b3415610c0f57600080fd5b6102e0600160a060020a0360043516612c3a565b005b3415610c3057600080fd5b6103be612dd5565b604051901515815260200160405180910390f35b3415610c5757600080fd5b610468612dde565b60405190815260200160405180910390f35b3415610c7c57600080fd5b6103be600160a060020a0360043516612de4565b604051901515815260200160405180910390f35b3415610caf57600080fd5b610468612df9565b60405190815260200160405180910390f35b3415610cd457600080fd5b610468612dff565b60405190815260200160405180910390f35b3415610cf957600080fd5b610468612e0d565b60405190815260200160405180910390f35b3415610d1e57600080fd5b610468600160a060020a0360043581169060243516612e14565b60405190815260200160405180910390f35b3415610d5557600080fd5b610468612e53565b60405190815260200160405180910390f35b3415610d7a57600080fd5b610468612e59565b60405190815260200160405180910390f35b3415610d9f57600080fd5b6102f5600435612e65565b604051600160a060020a03909116815260200160405180910390f35b3415610dd157600080fd5b610468612e9e565b60405190815260200160405180910390f35b3415610df657600080fd5b610468612ea4565b60405190815260200160405180910390f35b3415610e1b57600080fd5b610468612eab565b60405190815260200160405180910390f35b3415610e4057600080fd5b6102e0600160a060020a0360043516612eb9565b005b3415610e6157600080fd5b610468612fbc565b60405190815260200160405180910390f35b3415610e8657600080fd5b6102e0600435612fcb565b005b601954683635c9adc5dea00000901015610eac57600080fd5b60005469d3c21bcecceda1000000901015610ec657600080fd5b600e5433600160a060020a0390811691161480610ef15750600f5433600160a060020a039081169116145b1515610efc57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e54909216815291909120541415610fed57601a54610f6e30600160a060020a03163184613102565b1015610f7957600080fd5b600160a060020a0381161515610f8e57600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f193505050501515610fbf57600080fd5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b5b5050565b600f54600160a060020a031681565b60408051908101604052600681527f456e76696f6e0000000000000000000000000000000000000000000000000000602082015281565b600060023660441461104857fe5b600160a060020a03338116600081815260026020908152604080832094891680845294909152908190208690557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259086905190815260200160405180910390a3600191505b5b5092915050565b600e5433600160a060020a03908116911614806110e05750600f5433600160a060020a039081169116145b15156110eb57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a55760013660241461115257fe5b600160a060020a0382166000908152601c60205260409020805460ff191660011790555b5b50600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b50565b601c6020526000908152604090205460ff1681565b600e54600160a060020a031681565b683635c9adc5dea0000081565b60005481565b600e5433600160a060020a039081169116148061120c5750600f5433600160a060020a039081169116145b151561121757600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a55760013660241461127e57fe5b600160a060020a0382166000908152601c60205260409020805460ff191690555b5b50600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b50565b60008060015b60105460a060020a900460ff1660028111156112f957fe5b1461130357600080fd5b600160a060020a033390811660009081526016602052604090205460ff1615156001141561135557600160a060020a0381166000908152601d602052604090205460ff16151560011461135557600080fd5b5b33600160a060020a0381166000908152601260205260408120548691901180156113815750600d5443105b156113c057600160a060020a0382166000908152601260209081526040808320546001909252909120546113b59083613102565b10156113c057600080fd5b5b6003366064146113cd57fe5b6113d889898961311d565b945084156113eb576113e9886132a9565b505b8495505b5b505b50505b505b509392505050565b611407613330565b600160a060020a031633600160a060020a031614151561142657600080fd5b61142f8161344d565b601f557f891acff763972fa7f25226caa78556f59bcb130f6f13fd6ab9b9fef99cff9c698160405160208082528190810183818151815260200191508051906020019080838360005b838110156114915780820151818401525b602001611478565b50505050905090810190601f1680156114be5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1610fed61205f565b5b5050565b60158054829081106114e657fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b60025b60105460a060020a900460ff16600281111561152557fe5b1461152f57600080fd5b600e5433600160a060020a039081169116148061155a5750600f5433600160a060020a039081169116145b151561156557600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e5490921681529190912054141561163e576010805460ff7501000000000000000000000000000000000000000000820416919074ff0000000000000000000000000000000000000000191660a060020a83600281111561160b57fe5b02179055505b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b5b565b60126020526000908152604090205481565b601281565b5b505050565b60205481565b600080805b60105460a060020a900460ff16600281111561168357fe5b1461168d57600080fd5b60105433600160a060020a039081169116146116a857600080fd5b600160a060020a03871615156116bd57600080fd5b600086116116ca57600080fd5b600084116116d757600080fd5b6008544310156116e657600080fd5b60095462029040014311156116fa57600080fd5b611710866064670de0b6b3a76400005b0461357e565b915061171e600054836135ad565b90506a6b88921f0410abc200000081111561173857600080fd5b6000819055601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03161561177757600080fd5b60606040519081016040528088600160a060020a0316815260200183815260200160011515815250601186866040518083838082843782019150509250505090815260200160405190819003902081518154600160a060020a031916600160a060020a0391909116178155602082015181600101556040820151600291909101805460ff19169115159190911790555060138054600181016118198382614079565b916000526020600020900160005b506118339087876140a3565b505082151561187957600160a060020a03871660009081526012602052604090205461185f90836135ad565b600160a060020a0388166000908152601260205260409020555b600160a060020a03871660009081526001602052604090205461189c90836135ad565b600160a060020a0388166000908152600160205260409020556118be876132a9565b50600160a060020a03871660008181526016602052604090819020805460ff191660011790557f1a0e722b7da39e72a59b39f661ef0ce1167fc012eeacb7481feb8b110d7c481e9084905190815260200160405180910390a25b5b5b50505050505050565b60005b60105460a060020a900460ff16600281111561193e57fe5b1461194857600080fd5b601954683635c9adc5dea0000090101561196157600080fd5b60005469d3c21bcecceda100000090101561197b57600080fd5b600e5433600160a060020a03908116911614806119a65750600f5433600160a060020a039081169116145b15156119b157600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a557600954431180611a29575060005469d3c21bcecceda10000009010155b80611a405750601954683635c9adc5dea000009010155b1515611a4b57600080fd5b600160a060020a0381161515611a6057600080fd5b601080546001919074ff0000000000000000000000000000000000000000191660a060020a835b0217905550601080546001919075ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000835b021790555080600160a060020a03166108fc6019549081150290604051600060405180830381858888f193505050501515611b0057600080fd5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b5b5b50565b60408051908101604052600381527f302e390000000000000000000000000000000000000000000000000000000000602082015281565b60008060095461a4100143111515611b8b57600080fd5b601954683635c9adc5dea00000901080611bb1575060005469d3c21bcecceda100000090105b1515611bbc57600080fd5b600160a060020a0333166000908152601760205260408120541180611bf75750600160a060020a033316600090815260186020526040812054115b1515611c0257600080fd5b600160a060020a03331660009081526001602052604081205492508211611c2857600080fd5b600160a060020a033316600090815260176020908152604080832054601890925290912054611c5791906135ad565b905060008111611c6657600080fd5b601954600160a060020a033316600090815260176020526040902054611c8c9190613102565b601955601a54600160a060020a033316600090815260186020526040902054611cb59190613102565b601a55600160a060020a0333166000908152600160209081526040808320839055601782528083208390556018909152812081905554611cf59083613102565b600055600160a060020a0333167fb6c0eca8138e097d71e2dd31e19a1266487f0553f170b7260ffe68bcbe9ff8a78260405190815260200160405180910390a2600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610fed57600080fd5b5b5050565b600160a060020a0333166000908152601c602052604090205460ff161515600114611d9557600080fd5b600d544310611da357600080fd5b60118282604051808383808284378201915050925050509081526020016040519081900390206002015460ff161515600114611dde57600080fd5b611e5860016000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03168152602081019190915260409081016000205490601190859085905180838380828437820191505092505050908152602001604051809103902060010154613102565b60016000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a0316815260208101919091526040908101600090812092909255611f1f9160129160119086908690518083838082843782019150509250505090815260200160405190819003902054600160a060020a03168152602081019190915260409081016000205490601190859085905180838380828437820191505092505050908152602001604051809103902060010154613102565b60126000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a0316815260208101919091526040908101600090812092909255601190849084905180838380828437820191505092505050908152602001604051908190039020600201805460ff1916911515919091179055600054611fd9906011848460405180838380828437820191505092505050908152602001604051809103902060010154613102565b600055601182826040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03167f6e9b134e7c6a5f38a62b3b3344b833bb9bda58d3c5556223978ec5273ff4735383836040516020808252810182905280604081018484808284378201915050935050505060405180910390a25b5b5050565b612067613330565b600160a060020a031633600160a060020a0316141515612096576702c68af0bb14000034101561209657600080fd5b5b30600160a060020a0316316120de60408051908101604052600381527f55524c000000000000000000000000000000000000000000000000000000000060208201526135d5565b111561219a577f46cb989ef9cef13e930e3b7f286225a086e716a90d63e0b7da85d310a9db0c9a6040516020808252604b908201527f4f7261636c697a6520717565727920776173204e4f542073656e742c20706c656040808301919091527f6173652061646420736f6d652045544820746f20636f76657220666f7220746860608301527f6520717565727920666565000000000000000000000000000000000000000000608083015260a0909101905180910390a161163e565b7f46cb989ef9cef13e930e3b7f286225a086e716a90d63e0b7da85d310a9db0c9a60405160208082526015908201527f4f7261636c697a652073656e742c20776169742e2e00000000000000000000006040808301919091526060909101905180910390a16111a5610e106040805190810160405280600381526020017f55524c0000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604981526020017f6a736f6e2868747470733a2f2f6d696e2d6170692e63727970746f636f6d706181526020017f72652e636f6d2f646174612f70726963653f6673796d3d455448267473796d7381526020017f3d555344292e555344000000000000000000000000000000000000000000000081525062035b60613762565b505b5b565b600160a060020a0381166000908152600160205260409020545b919050565b6015545b90565b60195481565b60025b60105460a060020a900460ff16600281111561231357fe5b141561231e57600080fd5b600e5433600160a060020a03908116911614806123495750600f5433600160a060020a039081169116145b151561235457600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e5490921681529190912054141561163e576010805460ff60a060020a820416919075ff000000000000000000000000000000000000000000191675010000000000000000000000000000000000000000008360028111156123fb57fe5b0217905550601080546002919074ff0000000000000000000000000000000000000000191660a060020a8361160b565b02179055505b600e54600160a060020a039081166000908152601b6020526040808220829055600f5490921681529081205561163e565b61163e565b5b5b565b600d5481565b60095481565b60408051908101604052600381527f45564e0000000000000000000000000000000000000000000000000000000000602082015281565b600160a060020a0381166000908152600160205260409020545b919050565b601054600160a060020a031681565b601d6020526000908152604090205460ff1681565b60008060015b60105460a060020a900460ff16600281111561250f57fe5b1461251957600080fd5b600160a060020a033390811660009081526016602052604090205460ff1615156001141561256b57600160a060020a0381166000908152601d602052604090205460ff16151560011461256b57600080fd5b5b33600160a060020a0381166000908152601260205260408120548691901180156125975750600d5443105b156125d657600160a060020a0382166000908152601260209081526040808320546001909252909120546125cb9083613102565b10156125d657600080fd5b5b6002366044146125e357fe5b6125ed8888613a68565b94508415612600576125fe886132a9565b505b8495505b5b505b50505b505b5092915050565b601a5481565b60008060006011846040518082805190602001908083835b6020831061265157805182525b601f199092019160209182019101612631565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405190819003902054600160a060020a031692506011846040518082805190602001908083835b602083106126c457805182525b601f1990920191602091820191016126a4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001015491506011846040518082805190602001908083835b6020831061273057805182525b601f199092019160209182019101612710565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040519081900390206002015460ff1690505b9193909250565b6000808080805b60105460a060020a900460ff16600281111561279457fe5b1461279e57600080fd5b6008544310156127ad57600080fd5b6009544311156127bc57600080fd5b600034116127c957600080fd5b6127d7601a546019546135ad565b93506127e384346135ad565b92506970ee403ce780ac5000008311156127fc57600080fd5b61280834601f5461357e565b91506064825b0491506128228261281d613b78565b613bc6565b9150670de0b6b3a764000082101561283957600080fd5b612845600054836135ad565b90506a6b88921f0410abc200000081111561285f57600080fd5b600160a060020a0333166000908152601d602052604090205460ff1615156128d257600160a060020a0333166000908152601860205260409020546128a490346135ad565b600160a060020a033316600090815260186020526040902055601a546128ca90346135ad565b601a5561291f565b600160a060020a0333166000908152601760205260409020546128f590346135ad565b600160a060020a03331660009081526017602052604090205560195461291b90346135ad565b6019555b600081815533600160a060020a03811682526001602052604090912080548401905561294a906132a9565b50600160a060020a03331660008181526016602052604090819020805460ff191660011790557ff531cc636ac07444c260ab8fbec2dfcfb2e69f62697aa04f6429a3b052c413989084905190815260200160405180910390a25b5b50505050565b60138054829081106129b957fe5b906000526020600020900160005b915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a5f5780601f10612a3457610100808354040283529160200191612a5f565b820191906000526020600020905b815481529060010190602001808311612a4257829003601f168201915b505050505081565b6013545b90565b60008060015b60105460a060020a900460ff166002811115612a8c57fe5b14612a9657600080fd5b600e5433600160a060020a0390811691161480612ac15750600f5433600160a060020a039081169116145b1515612acc57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e54909216815291909120541415612c1157601e5460ff1615612b3757600080fd5b600160a060020a0383161515612b4c57600080fd5b612b5b6000546201a406613bc6565b9150612b6982600054613102565b600160a060020a03841660009081526001602081905260408220839055601e805460ff191690911790558390559050612ba1836132a9565b5082600160a060020a03167f74c57fa15425b244ab3400bd258037da3499566fe21038ab6e6db4971d1565fa8260405190815260200160405180910390a25b600e54600160a060020a039081166000908152601b6020526040808220829055600f5490921681529081205561165a565b61165a565b5b5b505050565b60105460a060020a900460ff1681565b6201b20781565b601f5481565b600160a060020a0333166000908152601c6020526040812054819060ff161515600114612c6657600080fd5b600160a060020a0383166000908152601d602052604090205460ff1615612c8c57600080fd5b600160a060020a03831660009081526018602052604081205411612caf57600080fd5b600160a060020a03831660009081526001602052604081205492508211612cd557600080fd5b50600160a060020a038216600090815260186020526040812054908111612cfb57600080fd5b601a54600160a060020a038416600090815260186020526040902054612d219190613102565b601a55600160a060020a03831660009081526012602090815260408083205460018352818420556018909152812081905554612d5d9083613102565b600055600160a060020a0383167fa840617fb151e47d5e92a7fd2b59e2aedb6252c5dd8e5656a789e116f5668f038260405190815260200160405180910390a2600160a060020a03831681156108fc0282604051600060405180830381858888f19350505050151561165a57600080fd5b5b5b505050565b601e5460ff1681565b600a5481565b60146020526000908152604090205460ff1681565b60085481565b6970ee403ce780ac50000081565b62022e0981565b6000600236604414612e2257fe5b600160a060020a0380851660009081526002602090815260408083209387168352929052205491505b5b5092915050565b600c5481565b670de0b6b3a764000081565b6000601582815481101515612e7657fe5b906000526020600020900160005b9054906101000a9004600160a060020a031690505b919050565b600b5481565b6201e84881565b69d3c21bcecceda100000081565b600160a060020a0333166000908152601c602052604090205460ff161515600114612ee357600080fd5b600160a060020a0381166000908152601d602052604090205460ff1615612f0957600080fd5b600160a060020a0381166000908152601d60209081526040808320805460ff19166001179055601890915281205411156111a557600160a060020a038116600090815260186020818152604080842054601783529320839055601954919052612f71916135ad565b601955601a54600160a060020a038216600090815260186020526040902054612f9a9190613102565b601a55600160a060020a0381166000908152601860205260408120555b5b5b50565b6a6b88921f0410abc200000081565b600e5433600160a060020a0390811691161480612ff65750600f5433600160a060020a039081169116145b151561300157600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a557601e8111613077576130726406fc23ac00613c08565b611b00565b6032811161309257613072640ba43b7400613c08565b611b00565b604681116130ad5761307264104c533c00613c08565b611b00565b60648111611b0057611b0064174876e800613c08565b5b5b5b5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b50565b6000808284101561310f57fe5b5050808203805b5092915050565b600160a060020a03831660009081526001602052604081205482901080159061316d5750600160a060020a0380851660009081526002602090815260408083203390941683529290522054829010155b80156131795750600082115b801561319e5750600160a060020a038316600090815260016020526040902054828101115b1561329d57600160a060020a0383166000908152600160205260409020546131c690836135ad565b600160a060020a0380851660009081526001602052604080822093909355908616815220546131f59083613102565b600160a060020a03808616600090815260016020908152604080832094909455600281528382203390931682529190915220546132329083613102565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060016132a1565b5060005b5b9392505050565b600160a060020a03811660009081526014602052604081205460ff1615156133275760158054600181016132dd8382614122565b916000526020600020900160005b8154600160a060020a038087166101009390930a838102910219909116179091556000908152601460205260409020805460ff19166001179055505b5060015b919050565b600354600090600160a060020a0316158061335d575060035461335b90600160a060020a0316613d1a565b155b1561336e5761336c6000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156133b657600080fd5b6102c65a03f115156133c757600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063c281d19e6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561342c57600080fd5b6102c65a03f1151561343d57600080fd5b50505060405180519150505b5b90565b600061345761414c565b50816000805b8251811015613572577f300000000000000000000000000000000000000000000000000000000000000083828151811061349357fe5b016020015160f860020a900460f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015801561353457507f39000000000000000000000000000000000000000000000000000000000000008382815181106134fd57fe5b016020015160f860020a900460f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b1561356957603083828151811061354757fe5b016020015160f860020a900460f860020a0260f860020a90040382600a020191505b5b60010161345d565b8193505b505050919050565b600082820283158061359a575082848281151561359757fe5b04145b15156135a257fe5b8091505b5092915050565b600082820183811080159061359a5750828110155b15156135a257fe5b8091505b5092915050565b600354600090600160a060020a03161580613602575060035461360090600160a060020a0316613d1a565b155b15613613576136116000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561365b57600080fd5b6102c65a03f1151561366c57600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063524f3889836000604051602001526040518263ffffffff1660e060020a0281526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136f45780820151818401525b6020016136db565b50505050905090810190601f1680156137215780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b151561373f57600080fd5b6102c65a03f1151561375057600080fd5b50505060405180519150505b5b919050565b6003546000908190600160a060020a03161580613791575060035461378f90600160a060020a0316613d1a565b155b156137a2576137a06000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156137ea57600080fd5b6102c65a03f115156137fb57600080fd5b505050604051805160048054600160a060020a031916600160a060020a039283161790819055169050632ef3accc86856000604051602001526040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561388a5780820151818401525b602001613871565b50505050905090810190601f1680156138b75780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b15156138d657600080fd5b6102c65a03f115156138e757600080fd5b5050506040518051915050670de0b6b3a76400003a84020181111561390f5760009150613a5e565b600454600160a060020a031663c51be90f82888888886000604051602001526040518663ffffffff1660e060020a028152600401808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101561398e5780820151818401525b602001613975565b50505050905090810190601f1680156139bb5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156139f25780820151818401525b6020016139d9565b50505050905090810190601f168015613a1f5780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303818588803b1515613a4057600080fd5b6125ee5a03f11515613a5157600080fd5b5050505060405180519250505b5b50949350505050565b600160a060020a033316600090815260016020526040812054829010801590613a915750600082115b8015613ab65750600160a060020a038316600090815260016020526040902054828101115b15613b6d57600160a060020a033316600090815260016020526040902054613ade9083613102565b600160a060020a033381166000908152600160205260408082209390935590851681522054613b0d90836135ad565b600160a060020a0380851660008181526001602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3506001613b71565b5060005b5b92915050565b6000600a54431015613b8e575062022e096122ef565b600b54431015613ba257506201e8486122ef565b600c54431015613bb657506201b2076122ef565b50620186a06122ef565b5b5b5b90565b600080620186a0831015613bd957600080fd5b62030d408310613be857600080fd5b613bf2848461357e565b9050620186a0815b0490508091505b5092915050565b600354600160a060020a03161580613c325750600354613c3090600160a060020a0316613d1a565b155b15613c4357613c416000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613c8b57600080fd5b6102c65a03f11515613c9c57600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063ca6ad1e48260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515613d0157600080fd5b6102c65a03f115156129a457600080fd5b5050505b5b50565b803b5b919050565b600080613d42731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed613d1a565b1115613db25760038054600160a060020a031916731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed179055613daa60408051908101604052600b81527f6574685f6d61696e6e65740000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613dd173c03a2615d5efaf5f49f60b7bb6583eaec212fdf1613d1a565b1115613e415760038054600160a060020a03191673c03a2615d5efaf5f49f60b7bb6583eaec212fdf1179055613daa60408051908101604052600c81527f6574685f726f707374656e3300000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613e6073b7a07bcf2ba2f2703b24c0691b5278999c59ac7e613d1a565b1115613ed05760038054600160a060020a03191673b7a07bcf2ba2f2703b24c0691b5278999c59ac7e179055613daa60408051908101604052600981527f6574685f6b6f76616e00000000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613eef73146500cfd35b22e4a392fe0adc06de1a1368ed48613d1a565b1115613f5f5760038054600160a060020a03191673146500cfd35b22e4a392fe0adc06de1a1368ed48179055613daa60408051908101604052600b81527f6574685f72696e6b6562790000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613f7e736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475613d1a565b1115613fb2575060038054600160a060020a031916736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47517905560016122e6565b6000613fd17320e12a1f859b3feae5fb2a0a32c18f5a65555bbf613d1a565b1115614005575060038054600160a060020a0319167320e12a1f859b3feae5fb2a0a32c18f5a65555bbf17905560016122e6565b60006140247351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa613d1a565b1115614058575060038054600160a060020a0319167351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa17905560016122e6565b5060005b919050565b6005818051610fed92916020019061415e565b505b50565b81548183558181151161165a5760008381526020902061165a9181019083016141dd565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106140e45782800160ff19823516178555614111565b82800160010185558215614111579182015b828111156141115782358255916020019190600101906140f6565b5b5061411e929150614207565b5090565b81548183558181151161165a5760008381526020902061165a918101908301614207565b5b505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061419f57805160ff1916838001178555614111565b82800160010185558215614111579182015b828111156141115782518255916020019190600101906141b1565b5b5061411e929150614207565b5090565b6122ef91905b8082111561411e5760006141f78282614228565b506001016141e3565b5090565b90565b6122ef91905b8082111561411e576000815560010161420d565b5090565b90565b50805460018160011615610100020316600290046000825580601f1061424e57506111a5565b601f0160209004906000526020600020908101906111a59190614207565b5b505600a165627a7a72305820988c73333ac173572010ad58d9556df1d1832dc3572d43e4c9c9322dbcb322ed002946cb989ef9cef13e930e3b7f286225a086e716a90d63e0b7da85d310a9db0c9a00000000000000000000000000000000000000000000000000000000004847d600000000000000000000000000000000000000000000000000000000004b0764000000000000000000000000000000000000000000000000000000000048753a000000000000000000000000000000000000000000000000000000000048b950000000000000000000000000000000000000000000000000000000000049582e0000000000000000000000007e49e51d4e30054915f11bd72c6c02f7423c1f4000000000000000000000000000cc9587a370fc97edcd54c8dcfcc320a56eaa190000000000000000000000002b4c4a1609c367bec8fed57e95df81c1aea5a1100000000000000000000000000000000000000000000000000000000000598613

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

-----Decoded View---------------
Found 9 constructor arguments :
Arg [0] : 00000000000000000000000000000000000000000000000000000000004847d6
Arg [1] : 00000000000000000000000000000000000000000000000000000000004b0764
Arg [2] : 000000000000000000000000000000000000000000000000000000000048753a
Arg [3] : 000000000000000000000000000000000000000000000000000000000048b950
Arg [4] : 000000000000000000000000000000000000000000000000000000000049582e
Arg [5] : 0000000000000000000000007e49e51d4e30054915f11bd72c6c02f7423c1f40
Arg [6] : 00000000000000000000000000cc9587a370fc97edcd54c8dcfcc320a56eaa19
Arg [7] : 0000000000000000000000002b4c4a1609c367bec8fed57e95df81c1aea5a110
Arg [8] : 0000000000000000000000000000000000000000000000000000000000598613


   Swarm Source:
bzzr://988c73333ac173572010ad58d9556df1d1832dc3572d43e4c9c9322dbcb322ed

 

View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.