ETH Price: $2,521.68 (+1.77%)
Gas: 6.11 Gwei

Contract

0x72C1f8e060E269827571011C5aeD4A611b06A593
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Funds61795862018-08-20 5:05:232261 days ago1534741523IN
0x72C1f8e0...11b06A593
0.01 ETH0.000053531
Delete Teller Mo...61044362018-08-07 12:10:232273 days ago1533643823IN
0x72C1f8e0...11b06A593
0 ETH0.002882240
Delete Teller Mo...61044272018-08-07 12:06:102273 days ago1533643570IN
0x72C1f8e0...11b06A593
0 ETH0.002882240
Delete Teller Mo...61044262018-08-07 12:06:052273 days ago1533643565IN
0x72C1f8e0...11b06A593
0 ETH0.002882240
Delete Teller Mo...61044242018-08-07 12:05:512273 days ago1533643551IN
0x72C1f8e0...11b06A593
0 ETH0.002882240
Delete Teller Mo...61044222018-08-07 12:05:332273 days ago1533643533IN
0x72C1f8e0...11b06A593
0 ETH0.0010111240
Delete Teller Mo...61044202018-08-07 12:04:442273 days ago1533643484IN
0x72C1f8e0...11b06A593
0 ETH0.002882240
Delete Teller Mo...61044182018-08-07 12:04:332273 days ago1533643473IN
0x72C1f8e0...11b06A593
0 ETH0.0028809240
Delete Teller Mo...61044172018-08-07 12:04:262273 days ago1533643466IN
0x72C1f8e0...11b06A593
0 ETH0.002882240
Delete Teller Mo...61044122018-08-07 12:03:162273 days ago1533643396IN
0x72C1f8e0...11b06A593
0 ETH0.002882240
Set Teller Moder...61044002018-08-07 12:00:512273 days ago1533643251IN
0x72C1f8e0...11b06A593
0 ETH0.0017965640
Delete Shop Mods61039882018-08-07 10:15:432273 days ago1533636943IN
0x72C1f8e0...11b06A593
0 ETH0.0010226215
Delete Shop Mods61039862018-08-07 10:15:132273 days ago1533636913IN
0x72C1f8e0...11b06A593
0 ETH0.0010226215
Delete Shop Mods61039862018-08-07 10:15:132273 days ago1533636913IN
0x72C1f8e0...11b06A593
0 ETH0.0010226215
Delete Shop Mods61039842018-08-07 10:14:582273 days ago1533636898IN
0x72C1f8e0...11b06A593
0 ETH0.0010226215
Delete Shop Mods61039842018-08-07 10:14:582273 days ago1533636898IN
0x72C1f8e0...11b06A593
0 ETH0.0010226215
Delete Shop Mods61039842018-08-07 10:14:582273 days ago1533636898IN
0x72C1f8e0...11b06A593
0 ETH0.0010226215
Delete Shop Mods61039812018-08-07 10:14:252273 days ago1533636865IN
0x72C1f8e0...11b06A593
0 ETH0.0010226215
Delete Shop Mods61039792018-08-07 10:13:492273 days ago1533636829IN
0x72C1f8e0...11b06A593
0 ETH0.0010226215
Delete Shop Mods61039772018-08-07 10:12:442273 days ago1533636764IN
0x72C1f8e0...11b06A593
0 ETH0.0010226215
Delete Shop Mods61039772018-08-07 10:12:442273 days ago1533636764IN
0x72C1f8e0...11b06A593
0 ETH0.0010226215
Delete Shop Mods61039772018-08-07 10:12:442273 days ago1533636764IN
0x72C1f8e0...11b06A593
0 ETH0.0010226215
Delete Shop Mods61039772018-08-07 10:12:442273 days ago1533636764IN
0x72C1f8e0...11b06A593
0 ETH0.0010226215
Delete Shop Mods61039772018-08-07 10:12:442273 days ago1533636764IN
0x72C1f8e0...11b06A593
0 ETH0.0010226215
Delete Shop Mods61039752018-08-07 10:12:262273 days ago1533636746IN
0x72C1f8e0...11b06A593
0 ETH0.0010226215
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
62696412018-09-04 9:54:392245 days ago1536054879
0x72C1f8e0...11b06A593
0 ETH
62696412018-09-04 9:54:392245 days ago1536054879
0x72C1f8e0...11b06A593
0 ETH
62696292018-09-04 9:51:492245 days ago1536054709
0x72C1f8e0...11b06A593
0 ETH
62696292018-09-04 9:51:492245 days ago1536054709
0x72C1f8e0...11b06A593
0 ETH
61795862018-08-20 5:05:232261 days ago1534741523
0x72C1f8e0...11b06A593
0.01 ETH
61674852018-08-18 4:07:552263 days ago1534565275
0x72C1f8e0...11b06A593
0 ETH
61674852018-08-18 4:07:552263 days ago1534565275
0x72C1f8e0...11b06A593
0 ETH
61674852018-08-18 4:07:552263 days ago1534565275
0x72C1f8e0...11b06A593
0 ETH
61674852018-08-18 4:07:552263 days ago1534565275
0x72C1f8e0...11b06A593
0 ETH
61044362018-08-07 12:10:232273 days ago1533643823
0x72C1f8e0...11b06A593
0 ETH
61044362018-08-07 12:10:232273 days ago1533643823
0x72C1f8e0...11b06A593
0 ETH
61044272018-08-07 12:06:102273 days ago1533643570
0x72C1f8e0...11b06A593
0 ETH
61044272018-08-07 12:06:102273 days ago1533643570
0x72C1f8e0...11b06A593
0 ETH
61044262018-08-07 12:06:052273 days ago1533643565
0x72C1f8e0...11b06A593
0 ETH
61044262018-08-07 12:06:052273 days ago1533643565
0x72C1f8e0...11b06A593
0 ETH
61044242018-08-07 12:05:512273 days ago1533643551
0x72C1f8e0...11b06A593
0 ETH
61044242018-08-07 12:05:512273 days ago1533643551
0x72C1f8e0...11b06A593
0 ETH
61044202018-08-07 12:04:442273 days ago1533643484
0x72C1f8e0...11b06A593
0 ETH
61044202018-08-07 12:04:442273 days ago1533643484
0x72C1f8e0...11b06A593
0 ETH
61044182018-08-07 12:04:332273 days ago1533643473
0x72C1f8e0...11b06A593
0 ETH
61044182018-08-07 12:04:332273 days ago1533643473
0x72C1f8e0...11b06A593
0 ETH
61044172018-08-07 12:04:262273 days ago1533643466
0x72C1f8e0...11b06A593
0 ETH
61044172018-08-07 12:04:262273 days ago1533643466
0x72C1f8e0...11b06A593
0 ETH
61044122018-08-07 12:03:162273 days ago1533643396
0x72C1f8e0...11b06A593
0 ETH
61044122018-08-07 12:03:162273 days ago1533643396
0x72C1f8e0...11b06A593
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DetherCore

Compiler Version
v0.4.23+commit.124ca40d

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-06-17
*/

contract Certifier {
	event Confirmed(address indexed who);
	event Revoked(address indexed who);
	function certified(address _who) view public returns (bool);
}

/// @title Contract that supports the receival of ERC223 tokens.
contract ERC223ReceivingContract {

    /// @dev Standard ERC223 function that will handle incoming token transfers.
    /// @param _from  Token sender address.
    /// @param _value Amount of tokens.
    /// @param _data  Transaction metadata.
    function tokenFallback(address _from, uint _value, bytes _data) public;

}


contract SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  /**
  * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}


contract ERC223Basic is ERC20Basic {

    /**
      * @dev Transfer the specified amount of tokens to the specified address.
      *      Now with a new parameter _data.
      *
      * @param _to    Receiver address.
      * @param _value Amount of tokens that will be transferred.
      * @param _data  Transaction metadata.
      */
    function transfer(address _to, uint _value, bytes _data) public returns (bool);

    /**
      * @dev triggered when transfer is successfully called.
      *
      * @param _from  Sender address.
      * @param _to    Receiver address.
      * @param _value Amount of tokens that will be transferred.
      * @param _data  Transaction metadata.
      */
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _value, bytes _data);
}

contract DetherAccessControl {
    // This facet controls access control for Dether. There are four roles managed here:
    //
    //     - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart
    //         contracts. It is also the only role that can unpause the smart contract.
    //
    //     - The CMO: The CMO is in charge to open or close activity in zone
    //
    // It should be noted that these roles are distinct without overlap in their access abilities, the
    // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any
    // address to any role, the CEO address itself doesn't have the ability to act in those roles. This
    // restriction is intentional so that we aren't tempted to use the CEO address frequently out of
    // convenience. The less we use an address, the less likely it is that we somehow compromise the
    // account.

    /// @dev Emited when contract is upgraded
    event ContractUpgrade(address newContract);

    // The addresses of the accounts (or contracts) that can execute actions within each roles.
    address public ceoAddress;
    address public cmoAddress;
    address public csoAddress; // CHIEF SHOP OFFICER
    address public cfoAddress; // CHIEF FINANCIAL OFFICER
	  mapping (address => bool) public shopModerators;   // centralised moderator, would become decentralised
    mapping (address => bool) public tellerModerators;   // centralised moderator, would become decentralised

    // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked
    bool public paused = false;

    /// @dev Access modifier for CEO-only functionality
    modifier onlyCEO() {
        require(msg.sender == ceoAddress);
        _;
    }

    /// @dev Access modifier for CMO-only functionality
    modifier onlyCMO() {
        require(msg.sender == cmoAddress);
        _;
    }

    modifier onlyCSO() {
        require(msg.sender == csoAddress);
        _;
    }

    modifier onlyCFO() {
        require(msg.sender == cfoAddress);
        _;
    }

    modifier isShopModerator(address _user) {
      require(shopModerators[_user]);
      _;
    }
    modifier isTellerModerator(address _user) {
      require(tellerModerators[_user]);
      _;
    }

    /// @dev Assigns a new address to act as the CEO. Only available to the current CEO.
    /// @param _newCEO The address of the new CEO
    function setCEO(address _newCEO) external onlyCEO {
        require(_newCEO != address(0));
        ceoAddress = _newCEO;
    }

    /// @dev Assigns a new address to act as the CMO. Only available to the current CEO.
    /// @param _newCMO The address of the new CMO
    function setCMO(address _newCMO) external onlyCEO {
        require(_newCMO != address(0));
        cmoAddress = _newCMO;
    }

    function setCSO(address _newCSO) external onlyCEO {
        require(_newCSO != address(0));
        csoAddress = _newCSO;
    }

    function setCFO(address _newCFO) external onlyCEO {
        require(_newCFO != address(0));
        cfoAddress = _newCFO;
    }

    function setShopModerator(address _moderator) external onlyCEO {
      require(_moderator != address(0));
      shopModerators[_moderator] = true;
    }

    function removeShopModerator(address _moderator) external onlyCEO {
      shopModerators[_moderator] = false;
    }

    function setTellerModerator(address _moderator) external onlyCEO {
      require(_moderator != address(0));
      tellerModerators[_moderator] = true;
    }

    function removeTellerModerator(address _moderator) external onlyCEO {
      tellerModerators[_moderator] = false;
    }
    /*** Pausable functionality adapted from OpenZeppelin ***/

    /// @dev Modifier to allow actions only when the contract IS NOT paused
    modifier whenNotPaused() {
        require(!paused);
        _;
    }

    /// @dev Modifier to allow actions only when the contract IS paused
    modifier whenPaused {
        require(paused);
        _;
    }

    /// @dev Called by any "C-level" role to pause the contract. Used only when
    ///  a bug or exploit is detected and we need to limit damage.
    function pause() external onlyCEO whenNotPaused {
        paused = true;
    }

    /// @dev Unpauses the smart contract. Can only be called by the CEO, since
    ///  one reason we may pause the contract is when CMO account are
    ///  compromised.
    /// @notice This is public rather than external so it can be called by
    ///  derived contracts.
    function unpause() public onlyCEO whenPaused {
        // can't unpause if contract was upgraded
        paused = false;
    }
}


contract DetherSetup is DetherAccessControl  {

  bool public run1 = false;
  bool public run2 = false;
  // -Need to be whitelisted to be able to register in the contract as a shop or
  // teller, there is two level of identification.
  // -This identification method are now centralised and processed by dether, but
  // will be decentralised soon
  Certifier public smsCertifier;
  Certifier public kycCertifier;
  // Zone need to be open by the CMO before accepting registration
  // The bytes2 parameter wait for a country ID (ex: FR (0x4652 in hex) for france cf:README)
  mapping(bytes2 => bool) public openedCountryShop;
  mapping(bytes2 => bool) public openedCountryTeller;
  // For registering in a zone you need to stake DTH
  // The price can differ by country
  // Uts now a fixed price by the CMO but the price will adjusted automatically
  // regarding different factor in the futur smart contract
  mapping(bytes2 => uint) public licenceShop;
  mapping(bytes2 => uint) public licenceTeller;

  modifier tier1(address _user) {
    require(smsCertifier.certified(_user));
    _;
  }
  modifier tier2(address _user) {
    require(kycCertifier.certified(_user));
    _;
  }
  modifier isZoneShopOpen(bytes2 _country) {
    require(openedCountryShop[_country]);
    _;
  }
  modifier isZoneTellerOpen(bytes2 _country) {
    require(openedCountryTeller[_country]);
    _;
  }

  function isTier1(address _user) public view returns(bool) {
    return smsCertifier.certified(_user);
  }
  function isTier2(address _user) public view returns(bool) {
    return kycCertifier.certified(_user);
  }

  /**
   * INIT
   */
  function setSmsCertifier (address _smsCertifier) external onlyCEO {
    require(!run1);
    smsCertifier = Certifier(_smsCertifier);
    run1 = true;
  }
  /**
   * CORE FUNCTION
   */
  function setKycCertifier (address _kycCertifier) external onlyCEO {
    require(!run2);
    kycCertifier = Certifier(_kycCertifier);
    run2 = true;
  }
  function setLicenceShopPrice(bytes2 country, uint price) external onlyCMO {
    licenceShop[country] = price;
  }
  function setLicenceTellerPrice(bytes2 country, uint price) external onlyCMO {
    licenceTeller[country] = price;
  }
  function openZoneShop(bytes2 _country) external onlyCMO {
    openedCountryShop[_country] = true;
  }
  function closeZoneShop(bytes2 _country) external onlyCMO {
    openedCountryShop[_country] = false;
  }
  function openZoneTeller(bytes2 _country) external onlyCMO {
    openedCountryTeller[_country] = true;
  }
  function closeZoneTeller(bytes2 _country) external onlyCMO {
    openedCountryTeller[_country] = false;
  }
}

library BytesLib {
    function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes) {
        bytes memory tempBytes;

        assembly {
            // Get a location of some free memory and store it in tempBytes as
            // Solidity does for memory variables.
            tempBytes := mload(0x40)

            // Store the length of the first bytes array at the beginning of
            // the memory for tempBytes.
            let length := mload(_preBytes)
            mstore(tempBytes, length)

            // Maintain a memory counter for the current write location in the
            // temp bytes array by adding the 32 bytes for the array length to
            // the starting location.
            let mc := add(tempBytes, 0x20)
            // Stop copying when the memory counter reaches the length of the
            // first bytes array.
            let end := add(mc, length)

            for {
                // Initialize a copy counter to the start of the _preBytes data,
                // 32 bytes into its memory.
                let cc := add(_preBytes, 0x20)
            } lt(mc, end) {
                // Increase both counters by 32 bytes each iteration.
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                // Write the _preBytes data into the tempBytes memory 32 bytes
                // at a time.
                mstore(mc, mload(cc))
            }

            // Add the length of _postBytes to the current length of tempBytes
            // and store it as the new length in the first 32 bytes of the
            // tempBytes memory.
            length := mload(_postBytes)
            mstore(tempBytes, add(length, mload(tempBytes)))

            // Move the memory counter back from a multiple of 0x20 to the
            // actual end of the _preBytes data.
            mc := end
            // Stop copying when the memory counter reaches the new combined
            // length of the arrays.
            end := add(mc, length)

            for {
                let cc := add(_postBytes, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

            // Update the free-memory pointer by padding our last write location
            // to 32 bytes: add 31 bytes to the end of tempBytes to move to the
            // next 32 byte block, then round down to the nearest multiple of
            // 32. If the sum of the length of the two arrays is zero then add
            // one before rounding down to leave a blank 32 bytes (the length block with 0).
            mstore(0x40, and(
              add(add(end, iszero(add(length, mload(_preBytes)))), 31),
              not(31) // Round down to the nearest 32 bytes.
            ))
        }

        return tempBytes;
    }

    function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {
        assembly {
            // Read the first 32 bytes of _preBytes storage, which is the length
            // of the array. (We don't need to use the offset into the slot
            // because arrays use the entire slot.)
            let fslot := sload(_preBytes_slot)
            // Arrays of 31 bytes or less have an even value in their slot,
            // while longer arrays have an odd value. The actual length is
            // the slot divided by two for odd values, and the lowest order
            // byte divided by two for even values.
            // If the slot is even, bitwise and the slot with 255 and divide by
            // two to get the length. If the slot is odd, bitwise and the slot
            // with -1 and divide by two.
            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
            let mlength := mload(_postBytes)
            let newlength := add(slength, mlength)
            // slength can contain both the length and contents of the array
            // if length < 32 bytes so let's prepare for that
            // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
            switch add(lt(slength, 32), lt(newlength, 32))
            case 2 {
                // Since the new array still fits in the slot, we just need to
                // update the contents of the slot.
                // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length
                sstore(
                    _preBytes_slot,
                    // all the modifications to the slot are inside this
                    // next block
                    add(
                        // we can just add to the slot contents because the
                        // bytes we want to change are the LSBs
                        fslot,
                        add(
                            mul(
                                div(
                                    // load the bytes from memory
                                    mload(add(_postBytes, 0x20)),
                                    // zero all bytes to the right
                                    exp(0x100, sub(32, mlength))
                                ),
                                // and now shift left the number of bytes to
                                // leave space for the length in the slot
                                exp(0x100, sub(32, newlength))
                            ),
                            // increase length by the double of the memory
                            // bytes length
                            mul(mlength, 2)
                        )
                    )
                )
            }
            case 1 {
                // The stored value fits in the slot, but the combined value
                // will exceed it.
                // get the keccak hash to get the contents of the array
                mstore(0x0, _preBytes_slot)
                let sc := add(keccak256(0x0, 0x20), div(slength, 32))

                // save new length
                sstore(_preBytes_slot, add(mul(newlength, 2), 1))

                // The contents of the _postBytes array start 32 bytes into
                // the structure. Our first read should obtain the `submod`
                // bytes that can fit into the unused space in the last word
                // of the stored array. To get this, we read 32 bytes starting
                // from `submod`, so the data we read overlaps with the array
                // contents by `submod` bytes. Masking the lowest-order
                // `submod` bytes allows us to add that value directly to the
                // stored value.

                let submod := sub(32, slength)
                let mc := add(_postBytes, submod)
                let end := add(_postBytes, mlength)
                let mask := sub(exp(0x100, submod), 1)

                sstore(
                    sc,
                    add(
                        and(
                            fslot,
                            0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
                        ),
                        and(mload(mc), mask)
                    )
                )

                for {
                    mc := add(mc, 0x20)
                    sc := add(sc, 1)
                } lt(mc, end) {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } {
                    sstore(sc, mload(mc))
                }

                mask := exp(0x100, sub(mc, end))

                sstore(sc, mul(div(mload(mc), mask), mask))
            }
            default {
                // get the keccak hash to get the contents of the array
                mstore(0x0, _preBytes_slot)
                // Start copying to the last used word of the stored array.
                let sc := add(keccak256(0x0, 0x20), div(slength, 32))

                // save new length
                sstore(_preBytes_slot, add(mul(newlength, 2), 1))

                // Copy over the first `submod` bytes of the new data as in
                // case 1 above.
                let slengthmod := mod(slength, 32)
                let mlengthmod := mod(mlength, 32)
                let submod := sub(32, slengthmod)
                let mc := add(_postBytes, submod)
                let end := add(_postBytes, mlength)
                let mask := sub(exp(0x100, submod), 1)

                sstore(sc, add(sload(sc), and(mload(mc), mask)))

                for {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } lt(mc, end) {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } {
                    sstore(sc, mload(mc))
                }

                mask := exp(0x100, sub(mc, end))

                sstore(sc, mul(div(mload(mc), mask), mask))
            }
        }
    }

    function slice(bytes _bytes, uint _start, uint _length) internal  pure returns (bytes) {
        require(_bytes.length >= (_start + _length));

        bytes memory tempBytes;

        assembly {
            switch iszero(_length)
            case 0 {
                // Get a location of some free memory and store it in tempBytes as
                // Solidity does for memory variables.
                tempBytes := mload(0x40)

                // The first word of the slice result is potentially a partial
                // word read from the original array. To read it, we calculate
                // the length of that partial word and start copying that many
                // bytes into the array. The first word we copy will start with
                // data we don't care about, but the last `lengthmod` bytes will
                // land at the beginning of the contents of the new array. When
                // we're done copying, we overwrite the full first word with
                // the actual length of the slice.
                let lengthmod := and(_length, 31)

                // The multiplication in the next line is necessary
                // because when slicing multiples of 32 bytes (lengthmod == 0)
                // the following copy loop was copying the origin's length
                // and then ending prematurely not copying everything it should.
                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
                let end := add(mc, _length)

                for {
                    // The multiplication in the next line has the same exact purpose
                    // as the one above.
                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
                } lt(mc, end) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    mstore(mc, mload(cc))
                }

                mstore(tempBytes, _length)

                //update free-memory pointer
                //allocating the array padded to 32 bytes like the compiler does now
                mstore(0x40, and(add(mc, 31), not(31)))
            }
            //if we want a zero-length slice let's just return a zero-length array
            default {
                tempBytes := mload(0x40)

                mstore(0x40, add(tempBytes, 0x20))
            }
        }

        return tempBytes;
    }

    function toAddress(bytes _bytes, uint _start) internal  pure returns (address) {
        require(_bytes.length >= (_start + 20));
        address tempAddress;

        assembly {
            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
        }

        return tempAddress;
    }

    function toUint(bytes _bytes, uint _start) internal  pure returns (uint256) {
        require(_bytes.length >= (_start + 32));
        uint256 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x20), _start))
        }

        return tempUint;
    }

    function toBytes32(bytes _bytes, uint _start) internal  pure returns (bytes32) {
        require(_bytes.length >= (_start + 32));
        bytes32 tempBytes32;

        assembly {
            tempBytes32 := mload(add(add(_bytes, 0x20), _start))
        }

        return tempBytes32;
    }

    function toBytes16(bytes _bytes, uint _start) internal  pure returns (bytes16) {
        require(_bytes.length >= (_start + 16));
        bytes16 tempBytes16;

        assembly {
            tempBytes16 := mload(add(add(_bytes, 0x20), _start))
        }

        return tempBytes16;
    }

    function toBytes2(bytes _bytes, uint _start) internal  pure returns (bytes2) {
        require(_bytes.length >= (_start + 2));
        bytes2 tempBytes2;

        assembly {
            tempBytes2 := mload(add(add(_bytes, 0x20), _start))
        }

        return tempBytes2;
    }

    function toBytes4(bytes _bytes, uint _start) internal  pure returns (bytes4) {
        require(_bytes.length >= (_start + 4));
        bytes4 tempBytes4;

        assembly {
            tempBytes4 := mload(add(add(_bytes, 0x20), _start))
        }
        return tempBytes4;
    }

    function toBytes1(bytes _bytes, uint _start) internal  pure returns (bytes1) {
        require(_bytes.length >= (_start + 1));
        bytes1 tempBytes1;

        assembly {
            tempBytes1 := mload(add(add(_bytes, 0x20), _start))
        }

        return tempBytes1;
    }

    function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {
        bool success = true;

        assembly {
            let length := mload(_preBytes)

            // if lengths don't match the arrays are not equal
            switch eq(length, mload(_postBytes))
            case 1 {
                // cb is a circuit breaker in the for loop since there's
                //  no said feature for inline assembly loops
                // cb = 1 - don't breaker
                // cb = 0 - break
                let cb := 1

                let mc := add(_preBytes, 0x20)
                let end := add(mc, length)

                for {
                    let cc := add(_postBytes, 0x20)
                // the next line is the loop condition:
                // while(uint(mc < end) + cb == 2)
                } eq(add(lt(mc, end), cb), 2) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    // if any of these checks fails then arrays are not equal
                    if iszero(eq(mload(mc), mload(cc))) {
                        // unsuccess:
                        success := 0
                        cb := 0
                    }
                }
            }
            default {
                // unsuccess:
                success := 0
            }
        }

        return success;
    }

    function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) {
        bool success = true;

        assembly {
            // we know _preBytes_offset is 0
            let fslot := sload(_preBytes_slot)
            // Decode the length of the stored array like in concatStorage().
            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
            let mlength := mload(_postBytes)

            // if lengths don't match the arrays are not equal
            switch eq(slength, mlength)
            case 1 {
                // slength can contain both the length and contents of the array
                // if length < 32 bytes so let's prepare for that
                // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
                if iszero(iszero(slength)) {
                    switch lt(slength, 32)
                    case 1 {
                        // blank the last byte which is the length
                        fslot := mul(div(fslot, 0x100), 0x100)

                        if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {
                            // unsuccess:
                            success := 0
                        }
                    }
                    default {
                        // cb is a circuit breaker in the for loop since there's
                        //  no said feature for inline assembly loops
                        // cb = 1 - don't breaker
                        // cb = 0 - break
                        let cb := 1

                        // get the keccak hash to get the contents of the array
                        mstore(0x0, _preBytes_slot)
                        let sc := keccak256(0x0, 0x20)

                        let mc := add(_postBytes, 0x20)
                        let end := add(mc, mlength)

                        // the next line is the loop condition:
                        // while(uint(mc < end) + cb == 2)
                        for {} eq(add(lt(mc, end), cb), 2) {
                            sc := add(sc, 1)
                            mc := add(mc, 0x20)
                        } {
                            if iszero(eq(sload(sc), mload(mc))) {
                                // unsuccess:
                                success := 0
                                cb := 0
                            }
                        }
                    }
                }
            }
            default {
                // unsuccess:
                success := 0
            }
        }

        return success;
    }
}
contract ExchangeRateOracle {
  function getWeiPriceOneUsd() external view returns(uint256);
}

// only interface to save gas
contract DetherBank {
  function withdrawDthTeller(address _receiver) external;
  function withdrawDthShop(address _receiver) external;
  function withdrawDthShopAdmin(address _from, address _receiver) external;
  function addTokenShop(address _from, uint _value) external;
  function addTokenTeller(address _from, uint _value) external;
  function addEthTeller(address _from, uint _value) external payable returns (bool);
  function withdrawEth(address _from, address _to, uint _amount) external;
  function refundEth(address _from) external;
  function getDthTeller(address _user) public view returns (uint);
  function getDthShop(address _user) public view returns (uint);
  function getEthBalTeller(address _user) public view returns (uint);
  function getWeiSoldToday(address _user) public view returns (uint256 weiSoldToday);
  function transferOwnership(address newOwner) public;
}

contract DetherCore is DetherSetup, ERC223ReceivingContract, SafeMath {
  using BytesLib for bytes;

  /**
  * Event
  */
  // when a Teller is registered
  event RegisterTeller(address indexed tellerAddress);
  // when a teller is deleted
  event DeleteTeller(address indexed tellerAddress);
  // when teller update
  event UpdateTeller(address indexed tellerAddress);
  // when a teller send to a buyer
  event Sent(address indexed _from, address indexed _to, uint amount);
  // when a shop register
  event RegisterShop(address shopAddress);
  // when a shop delete
  event DeleteShop(address shopAddress);
  // when a moderator delete a shop
  event DeleteShopModerator(address indexed moderator, address shopAddress);
  // when a moderator delete a teller
  event DeleteTellerModerator(address indexed moderator, address tellerAddress);

  /**
   * Modifier
   */
  // if teller has staked enough dth to
  modifier tellerHasStaked(uint amount) {
    require(bank.getDthTeller(msg.sender) >= amount);
    _;
  }
  // if shop has staked enough dth to
  modifier shopHasStaked(uint amount) {
    require(bank.getDthShop(msg.sender) >= amount);
    _;
  }

  /*
   * External contract
   */
  // DTH contract
  ERC223Basic public dth;
  // bank contract where are stored ETH and DTH
  DetherBank public bank;

  ExchangeRateOracle public priceOracle;

  // teller struct
  struct Teller {
    int32 lat;            // Latitude
    int32 lng;            // Longitude
    bytes2 countryId;     // countryID (in hexa), ISO ALPHA 2 https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
    bytes16 postalCode;   // postalCode if present, in Hexa https://en.wikipedia.org/wiki/List_of_postal_codes

    int8 currencyId;      // 1 - 100 , cf README
    bytes16 messenger;    // telegrame nickname
    int8 avatarId;        // 1 - 100 , regarding the front-end app you use
    int16 rates;          // margin of tellers , -999 - +9999 , corresponding to -99,9% x 10  , 999,9% x 10
    bool buyer;           // appear as a buyer as well on the map
    int16 buyRates;         // margin of tellers of

    uint zoneIndex;       // index of the zone mapping
    uint generalIndex;    // index of general mapping
    bool online;          // switch online/offline, if the tellers want to be inactive without deleting his point
  }

  mapping(address => mapping(address => uint)) internal pairSellsLoyaltyPerc;
  //      from               to         percentage of loyalty points from gets

  /*
   * Reputation field V0.1
   * Reputation is based on volume sell, volume buy, and number of transaction
   */
  mapping(address => uint) volumeBuy;
  mapping(address => uint) volumeSell;
  mapping(address => uint) nbTrade;
  mapping(address => uint256) loyaltyPoints;

  // general mapping of teller
  mapping(address => Teller) teller;
  // mappoing of teller by COUNTRYCODE => POSTALCODE
  mapping(bytes2 => mapping(bytes16 => address[])) tellerInZone;
  // teller array currently registered
  address[] public tellerIndex; // unordered list of teller register on it
  bool isStarted = false;
  // shop struct
  struct Shop {
    int32 lat;            // latitude
    int32 lng;            // longitude
    bytes2 countryId;     // countryID (in hexa char), ISO ALPHA 2 https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
    bytes16 postalCode;   // postalCode if present (in hexa char), in Hexa https://en.wikipedia.org/wiki/List_of_postal_codes
    bytes16 cat;          // Category of the shop (in hex char), will be used later for search engine and auction by zone
    bytes16 name;         // name of the shop (in hex char)
    bytes32 description;  // description of the shop
    bytes16 opening;      // opening hours, cf README for the format

    uint zoneIndex;       // index of the zone mapping
    uint generalIndex;    // index of general mapping
    bool detherShop;      // bool if shop is registered by dether as business partnership (still required DTH)
  }

  // general mapping of shop
  mapping(address => Shop) shop;
  // mapping of teller by COUNTRYCODE => POSTALCODE
  mapping(bytes2 => mapping(bytes16 => address[])) shopInZone;
  // shop array currently registered
  address[] public shopIndex; // unordered list of shop register on it

  /*
   * Instanciation
   */
  function DetherCore() {
   ceoAddress = msg.sender;
  }
  function initContract (address _dth, address _bank) external onlyCEO {
    require(!isStarted);
    dth = ERC223Basic(_dth);
    bank = DetherBank(_bank);
    isStarted = true;
  }

  function setPriceOracle (address _priceOracle) external onlyCFO {
    priceOracle = ExchangeRateOracle(_priceOracle);
  }

  /**
   * Core fonction
   */

  /**
   * @dev Standard ERC223 function that will handle incoming token transfers.
   * This is the main function to register SHOP or TELLER, its calling when you
   * send token to the DTH contract and by passing data as bytes on the third
   * parameter.
   * Its not supposed to be use on its own but will only handle incoming DTH
   * transaction.
   * The _data will wait for
   * [1st byte] 1 (0x31) for shop OR 2 (0x32) for teller
   * FOR SHOP AND TELLER:
   * 2sd to 5th bytes lat
   * 6th to 9th bytes lng
   * ...
   * Modifier tier1: Check if address is whitelisted with the sms verification
   */
  function tokenFallback(address _from, uint _value, bytes _data) whenNotPaused tier1(_from ) {
    // require than the token fallback is triggered from the dth token contract
    require(msg.sender == address(dth));
    // check first byte to know if its shop or teller registration
    // 1 / 0x31 = shop // 2 / 0x32 = teller
    bytes1 _func = _data.toBytes1(0);
    int32 posLat = _data.toBytes1(1) == bytes1(0x01) ? int32(_data.toBytes4(2)) * -1 : int32(_data.toBytes4(2));
    int32 posLng = _data.toBytes1(6) == bytes1(0x01) ? int32(_data.toBytes4(7)) * -1 : int32(_data.toBytes4(7));
    if (_func == bytes1(0x31)) { // shop registration // GAS USED 311000
      // require staked greater than licence price
      require(_value >= licenceShop[_data.toBytes2(11)]);
      // require its not already shop
      require(!isShop(_from));
      // require zone is open
      require(openedCountryShop[_data.toBytes2(11)]);

      shop[_from].lat = posLat;
      shop[_from].lng = posLng;
      shop[_from].countryId = _data.toBytes2(11);
      shop[_from].postalCode = _data.toBytes16(13);
      shop[_from].cat = _data.toBytes16(29);
      shop[_from].name = _data.toBytes16(45);
      shop[_from].description = _data.toBytes32(61);
      shop[_from].opening = _data.toBytes16(93);
      shop[_from].generalIndex = shopIndex.push(_from) - 1;
      shop[_from].zoneIndex = shopInZone[_data.toBytes2(11)][_data.toBytes16(13)].push(_from) - 1;
      emit RegisterShop(_from);
      bank.addTokenShop(_from,_value);
      dth.transfer(address(bank), _value);
    } else if (_func == bytes1(0x32)) { // teller registration -- GAS USED 310099
      // require staked greater than licence price
      require(_value >= licenceTeller[_data.toBytes2(11)]);
      // require is not already a teller
      require(!isTeller(_from));
      // require zone is open
      require(openedCountryTeller[_data.toBytes2(11)]);

      teller[_from].lat = posLat;
      teller[_from].lng = posLng;
      teller[_from].countryId = _data.toBytes2(11);
      teller[_from].postalCode = _data.toBytes16(13);
      teller[_from].avatarId = int8(_data.toBytes1(29));
      teller[_from].currencyId = int8(_data.toBytes1(30));
      teller[_from].messenger = _data.toBytes16(31);
      teller[_from].rates = int16(_data.toBytes2(47));
      teller[_from].buyer = _data.toBytes1(49) == bytes1(0x01) ? true : false;
      teller[_from].buyRates = int16(_data.toBytes2(50));
      teller[_from].generalIndex = tellerIndex.push(_from) - 1;
      teller[_from].zoneIndex = tellerInZone[_data.toBytes2(11)][_data.toBytes16(13)].push(_from) - 1;
      teller[_from].online = true;
      emit RegisterTeller(_from);
      bank.addTokenTeller(_from, _value);
      dth.transfer(address(bank), _value);
    } else if (_func == bytes1(0x33)) {  // shop bulk registration
      // We need to have the possibility to register in bulk some shop
      // For big retailer company willing to be listed on dether, we need to have a way to add
      // all their shop from one address
      // This functionnality will become available for anyone willing to list multiple shop
      // in the futures contract

      // Only the CSO should be able to register shop in bulk
      require(_from == csoAddress);
      // Each shop still need his own staking
      require(_value >= licenceShop[_data.toBytes2(11)]);
      // require the addresses not already registered
      require(!isShop(address(_data.toAddress(109))));
      // require zone is open
      require(openedCountryShop[_data.toBytes2(11)]);
      address newShopAddress = _data.toAddress(109);
      shop[newShopAddress].lat = posLat;
      shop[newShopAddress].lng = posLng;
      shop[newShopAddress].countryId = _data.toBytes2(11);
      shop[newShopAddress].postalCode = _data.toBytes16(13);
      shop[newShopAddress].cat = _data.toBytes16(29);
      shop[newShopAddress].name = _data.toBytes16(45);
      shop[newShopAddress].description = _data.toBytes32(61);
      shop[newShopAddress].opening = _data.toBytes16(93);
      shop[newShopAddress].generalIndex = shopIndex.push(newShopAddress) - 1;
      shop[newShopAddress].zoneIndex = shopInZone[_data.toBytes2(11)][_data.toBytes16(13)].push(newShopAddress) - 1;
      shop[newShopAddress].detherShop = true;
      emit RegisterShop(newShopAddress);
      bank.addTokenShop(newShopAddress, _value);
      dth.transfer(address(bank), _value);
    }
  }

  /**
   * a teller can update his profile
   * If a teller want to change his location, he would need to delete and recreate
   * a new point
   */
  function updateTeller(
    int8 currencyId,
    bytes16 messenger,
    int8 avatarId,
    int16 rates,
    bool online
   ) public payable {
    require(isTeller(msg.sender));
    if (currencyId != teller[msg.sender].currencyId)
    teller[msg.sender].currencyId = currencyId;
    if (teller[msg.sender].messenger != messenger)
     teller[msg.sender].messenger = messenger;
    if (teller[msg.sender].avatarId != avatarId)
     teller[msg.sender].avatarId = avatarId;
    if (teller[msg.sender].rates != rates)
     teller[msg.sender].rates = rates;
    if (teller[msg.sender].online != online)
      teller[msg.sender].online = online;
    if (msg.value > 0) {
      bank.addEthTeller.value(msg.value)(msg.sender, msg.value);
    }
    emit UpdateTeller(msg.sender);
  }

  // mapping for limiting the sell amount
  //      tier             countryId usdDailyLimit
  mapping(uint => mapping (bytes2 => uint)) limitTier;

  function setSellDailyLimit(uint _tier, bytes2 _countryId, uint256 _limitUsd) public onlyCFO {
    limitTier[_tier][_countryId] = _limitUsd;
  }
  function getSellDailyLimit(uint _tier, bytes2 _countryId) public view returns(uint256 limitUsd) {
    limitUsd = limitTier[_tier][_countryId];
  }

  modifier doesNotExceedDailySellLimit(address _teller, uint256 _weiSellAmount) {
    // limits are set per country
    bytes2 countryId = teller[_teller].countryId;

    // user is always tier1, and could be tier2
    uint256 usdDailyLimit = getSellDailyLimit(isTier2(_teller) ? 2 : 1, countryId);

    // weiPriceOneUsd is set by the oracle (which runs every day at midnight)
    uint256 weiDailyLimit = SafeMath.mul(priceOracle.getWeiPriceOneUsd(), usdDailyLimit);

    // with each sell we update wei sold today for that user inside the Bank contract
    uint256 weiSoldToday = bank.getWeiSoldToday(_teller);

    uint256 newWeiSoldToday = SafeMath.add(weiSoldToday, _weiSellAmount);

    // we may not exceed the daily wei limit with this sell
    require(newWeiSoldToday <= weiDailyLimit);
    _;
  }

  function getPairSellLoyaltyPerc(address _from, address _to) public view returns(uint256) {
    return pairSellsLoyaltyPerc[_from][_to];
  }

  function getLoyaltyPoints(address who) public view returns (uint256) {
    return loyaltyPoints[who];
  }

  /**
   * SellEth
   * average gas cost: 123173
   * @param _to -> the address for the receiver
   * @param _amount -> the amount to send
   */
  function sellEth(address _to, uint _amount)
    whenNotPaused
    doesNotExceedDailySellLimit(msg.sender, _amount)
    external
  {
    require(isTeller(msg.sender));
    require(_to != msg.sender);
    // send eth to the receiver from the bank contract
    // this will also update eth amount sold 'today' by msg.sender
    bank.withdrawEth(msg.sender, _to, _amount);

    // increase reput for the buyer and the seller Only if the buyer is also whitelisted,
    // It's a way to incentive user to trade on the system
    if (smsCertifier.certified(_to)) {
      uint currentSellerLoyaltyPointsPerc = pairSellsLoyaltyPerc[msg.sender][_to];
      if (currentSellerLoyaltyPointsPerc == 0) {
        // this is the first sell between seller and buyer, set to 100%
        pairSellsLoyaltyPerc[msg.sender][_to] = 10000;
        currentSellerLoyaltyPointsPerc = 10000;
      }

      // add percentage of loyaltyPoints of this sell to seller's loyaltyPoints
      loyaltyPoints[msg.sender] = SafeMath.add(loyaltyPoints[msg.sender], SafeMath.mul(_amount, currentSellerLoyaltyPointsPerc) / 10000);

      // update the loyaltyPoints percentage of the seller, there will be a 21% decrease with every sell to the same buyer (100 - 21 = 79)
      pairSellsLoyaltyPerc[msg.sender][_to] = SafeMath.mul(currentSellerLoyaltyPointsPerc, 79) / 100;

      volumeBuy[_to] = SafeMath.add(volumeBuy[_to], _amount);
      volumeSell[msg.sender] = SafeMath.add(volumeSell[msg.sender], _amount);
      nbTrade[msg.sender] += 1;
    }
    emit Sent(msg.sender, _to, _amount);
  }

  /**
   * switchStatus
   * Turn status teller on/off
   */
  function switchStatus(bool _status) external {
    if (teller[msg.sender].online != _status)
     teller[msg.sender].online = _status;
  }

  /**
   * addFunds
   * teller can add more funds on his sellpoint
   */
  function addFunds() external payable {
    require(isTeller(msg.sender));
    require(bank.addEthTeller.value(msg.value)(msg.sender, msg.value));
  }

  // gas used 67841
  // a teller can delete a sellpoint
  function deleteTeller() external {
    require(isTeller(msg.sender));
    uint rowToDelete1 = teller[msg.sender].zoneIndex;
    address keyToMove1 = tellerInZone[teller[msg.sender].countryId][teller[msg.sender].postalCode][tellerInZone[teller[msg.sender].countryId][teller[msg.sender].postalCode].length - 1];
    tellerInZone[teller[msg.sender].countryId][teller[msg.sender].postalCode][rowToDelete1] = keyToMove1;
    teller[keyToMove1].zoneIndex = rowToDelete1;
    tellerInZone[teller[msg.sender].countryId][teller[msg.sender].postalCode].length--;

    uint rowToDelete2 = teller[msg.sender].generalIndex;
    address keyToMove2 = tellerIndex[tellerIndex.length - 1];
    tellerIndex[rowToDelete2] = keyToMove2;
    teller[keyToMove2].generalIndex = rowToDelete2;
    tellerIndex.length--;
    delete teller[msg.sender];
    bank.withdrawDthTeller(msg.sender);
    bank.refundEth(msg.sender);
    emit DeleteTeller(msg.sender);
  }

  // gas used 67841
  // A moderator can delete a sellpoint
  function deleteTellerMods(address _toDelete) isTellerModerator(msg.sender) external {
    require(isTeller(_toDelete));
    uint rowToDelete1 = teller[_toDelete].zoneIndex;
    address keyToMove1 = tellerInZone[teller[_toDelete].countryId][teller[_toDelete].postalCode][tellerInZone[teller[_toDelete].countryId][teller[_toDelete].postalCode].length - 1];
    tellerInZone[teller[_toDelete].countryId][teller[_toDelete].postalCode][rowToDelete1] = keyToMove1;
    teller[keyToMove1].zoneIndex = rowToDelete1;
    tellerInZone[teller[_toDelete].countryId][teller[_toDelete].postalCode].length--;

    uint rowToDelete2 = teller[_toDelete].generalIndex;
    address keyToMove2 = tellerIndex[tellerIndex.length - 1];
    tellerIndex[rowToDelete2] = keyToMove2;
    teller[keyToMove2].generalIndex = rowToDelete2;
    tellerIndex.length--;
    delete teller[_toDelete];
    bank.withdrawDthTeller(_toDelete);
    bank.refundEth(_toDelete);
    emit DeleteTellerModerator(msg.sender, _toDelete);
  }

  // gas used 67841
  // A shop owner can delete his point.
  function deleteShop() external {
    require(isShop(msg.sender));
    uint rowToDelete1 = shop[msg.sender].zoneIndex;
    address keyToMove1 = shopInZone[shop[msg.sender].countryId][shop[msg.sender].postalCode][shopInZone[shop[msg.sender].countryId][shop[msg.sender].postalCode].length - 1];
    shopInZone[shop[msg.sender].countryId][shop[msg.sender].postalCode][rowToDelete1] = keyToMove1;
    shop[keyToMove1].zoneIndex = rowToDelete1;
    shopInZone[shop[msg.sender].countryId][shop[msg.sender].postalCode].length--;

    uint rowToDelete2 = shop[msg.sender].generalIndex;
    address keyToMove2 = shopIndex[shopIndex.length - 1];
    shopIndex[rowToDelete2] = keyToMove2;
    shop[keyToMove2].generalIndex = rowToDelete2;
    shopIndex.length--;
    delete shop[msg.sender];
    bank.withdrawDthShop(msg.sender);
    emit DeleteShop(msg.sender);
  }

  // gas used 67841
  // Moderator can delete a shop point
  function deleteShopMods(address _toDelete) isShopModerator(msg.sender) external {
    uint rowToDelete1 = shop[_toDelete].zoneIndex;
    address keyToMove1 = shopInZone[shop[_toDelete].countryId][shop[_toDelete].postalCode][shopInZone[shop[_toDelete].countryId][shop[_toDelete].postalCode].length - 1];
    shopInZone[shop[_toDelete].countryId][shop[_toDelete].postalCode][rowToDelete1] = keyToMove1;
    shop[keyToMove1].zoneIndex = rowToDelete1;
    shopInZone[shop[_toDelete].countryId][shop[_toDelete].postalCode].length--;

    uint rowToDelete2 = shop[_toDelete].generalIndex;
    address keyToMove2 = shopIndex[shopIndex.length - 1];
    shopIndex[rowToDelete2] = keyToMove2;
    shop[keyToMove2].generalIndex = rowToDelete2;
    shopIndex.length--;
    if (!shop[_toDelete].detherShop)
      bank.withdrawDthShop(_toDelete);
    else
      bank.withdrawDthShopAdmin(_toDelete, csoAddress);
    delete shop[_toDelete];
    emit DeleteShopModerator(msg.sender, _toDelete);
  }

  /**
   *  GETTER
   */

  // get teller
  // return teller info
  function getTeller(address _teller) public view returns (
    int32 lat,
    int32 lng,
    bytes2 countryId,
    bytes16 postalCode,
    int8 currencyId,
    bytes16 messenger,
    int8 avatarId,
    int16 rates,
    uint balance,
    bool online,
    bool buyer,
    int16 buyRates
    ) {
    Teller storage theTeller = teller[_teller];
    lat = theTeller.lat;
    lng = theTeller.lng;
    countryId = theTeller.countryId;
    postalCode = theTeller.postalCode;
    currencyId = theTeller.currencyId;
    messenger = theTeller.messenger;
    avatarId = theTeller.avatarId;
    rates = theTeller.rates;
    online = theTeller.online;
    buyer = theTeller.buyer;
    buyRates = theTeller.buyRates;
    balance = bank.getEthBalTeller(_teller);
  }

  /*
   * Shop ----------------------------------
   * return Shop value
   */
  function getShop(address _shop) public view returns (
   int32 lat,
   int32 lng,
   bytes2 countryId,
   bytes16 postalCode,
   bytes16 cat,
   bytes16 name,
   bytes32 description,
   bytes16 opening
   ) {
    Shop storage theShop = shop[_shop];
    lat = theShop.lat;
    lng = theShop.lng;
    countryId = theShop.countryId;
    postalCode = theShop.postalCode;
    cat = theShop.cat;
    name = theShop.name;
    description = theShop.description;
    opening = theShop.opening;
   }

   // get reput
   // return reputation data from teller
  function getReput(address _teller) public view returns (
   uint buyVolume,
   uint sellVolume,
   uint numTrade,
   uint256 loyaltyPoints_
   ) {
     buyVolume = volumeBuy[_teller];
     sellVolume = volumeSell[_teller];
     numTrade = nbTrade[_teller];
     loyaltyPoints_ = loyaltyPoints[_teller];
  }
  // return balance of teller put in escrow
  function getTellerBalance(address _teller) public view returns (uint) {
    return bank.getEthBalTeller(_teller);
  }

  // return an array of address of all zone present on a zone
  // zone is a mapping COUNTRY => POSTALCODE
  function getZoneShop(bytes2 _country, bytes16 _postalcode) public view returns (address[]) {
     return shopInZone[_country][_postalcode];
  }

  // return array of address of all shop
  function getAllShops() public view returns (address[]) {
   return shopIndex;
  }

  function isShop(address _shop) public view returns (bool ){
   return (shop[_shop].countryId != bytes2(0x0));
  }

  // return an array of address of all teller present on a zone
  // zone is a mapping COUNTRY => POSTALCODE
  function getZoneTeller(bytes2 _country, bytes16 _postalcode) public view returns (address[]) {
     return tellerInZone[_country][_postalcode];
  }

  // return array of address of all teller
  function getAllTellers() public view returns (address[]) {
   return tellerIndex;
  }

  // return if teller or not
  function isTeller(address _teller) public view returns (bool ){
    return (teller[_teller].countryId != bytes2(0x0));
  }

  /*
   * misc
   */
   // return info about how much DTH the shop has staked
  function getStakedShop(address _shop) public view returns (uint) {
    return bank.getDthShop(_shop);
  }
  // return info about how much DTH the teller has staked
  function getStakedTeller(address _teller) public view returns (uint) {
    return bank.getDthTeller(_teller);
  }
  // give ownership to the bank contract
  function transferBankOwnership(address _newbankowner) external onlyCEO whenPaused {
    bank.transferOwnership(_newbankowner);
  }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"dth","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"kycCertifier","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes2"}],"name":"licenceShop","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_shop","type":"address"}],"name":"getShop","outputs":[{"name":"lat","type":"int32"},{"name":"lng","type":"int32"},{"name":"countryId","type":"bytes2"},{"name":"postalCode","type":"bytes16"},{"name":"cat","type":"bytes16"},{"name":"name","type":"bytes16"},{"name":"description","type":"bytes32"},{"name":"opening","type":"bytes16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_teller","type":"address"}],"name":"getStakedTeller","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_shop","type":"address"}],"name":"isShop","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_country","type":"bytes2"}],"name":"openZoneTeller","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCMO","type":"address"}],"name":"setCMO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCSO","type":"address"}],"name":"setCSO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"csoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_teller","type":"address"}],"name":"getReput","outputs":[{"name":"buyVolume","type":"uint256"},{"name":"sellVolume","type":"uint256"},{"name":"numTrade","type":"uint256"},{"name":"loyaltyPoints_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dth","type":"address"},{"name":"_bank","type":"address"}],"name":"initContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"priceOracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"isTier2","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"smsCertifier","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_status","type":"bool"}],"name":"switchStatus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"currencyId","type":"int8"},{"name":"messenger","type":"bytes16"},{"name":"avatarId","type":"int8"},{"name":"rates","type":"int16"},{"name":"online","type":"bool"}],"name":"updateTeller","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"deleteShop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tier","type":"uint256"},{"name":"_countryId","type":"bytes2"},{"name":"_limitUsd","type":"uint256"}],"name":"setSellDailyLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_shop","type":"address"}],"name":"getStakedShop","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAllTellers","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_moderator","type":"address"}],"name":"removeShopModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_priceOracle","type":"address"}],"name":"setPriceOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_teller","type":"address"}],"name":"getTellerBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_country","type":"bytes2"}],"name":"openZoneShop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"shopModerators","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newbankowner","type":"address"}],"name":"transferBankOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes2"}],"name":"openedCountryShop","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bank","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"isTier1","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_moderator","type":"address"}],"name":"setShopModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tier","type":"uint256"},{"name":"_countryId","type":"bytes2"}],"name":"getSellDailyLimit","outputs":[{"name":"limitUsd","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"shopIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"deleteTeller","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cmoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tellerIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"country","type":"bytes2"},{"name":"price","type":"uint256"}],"name":"setLicenceShopPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_country","type":"bytes2"}],"name":"closeZoneTeller","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"addFunds","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_moderator","type":"address"}],"name":"removeTellerModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_toDelete","type":"address"}],"name":"deleteShopMods","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_country","type":"bytes2"},{"name":"_postalcode","type":"bytes16"}],"name":"getZoneShop","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_country","type":"bytes2"}],"name":"closeZoneShop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"tokenFallback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tellerModerators","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes2"}],"name":"openedCountryTeller","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"getLoyaltyPoints","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_moderator","type":"address"}],"name":"setTellerModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"run2","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAllShops","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"sellEth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_kycCertifier","type":"address"}],"name":"setKycCertifier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_toDelete","type":"address"}],"name":"deleteTellerMods","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"country","type":"bytes2"},{"name":"price","type":"uint256"}],"name":"setLicenceTellerPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes2"}],"name":"licenceTeller","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_teller","type":"address"}],"name":"getTeller","outputs":[{"name":"lat","type":"int32"},{"name":"lng","type":"int32"},{"name":"countryId","type":"bytes2"},{"name":"postalCode","type":"bytes16"},{"name":"currencyId","type":"int8"},{"name":"messenger","type":"bytes16"},{"name":"avatarId","type":"int8"},{"name":"rates","type":"int16"},{"name":"balance","type":"uint256"},{"name":"online","type":"bool"},{"name":"buyer","type":"bool"},{"name":"buyRates","type":"int16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"run1","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_country","type":"bytes2"},{"name":"_postalcode","type":"bytes16"}],"name":"getZoneTeller","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_teller","type":"address"}],"name":"isTeller","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_smsCertifier","type":"address"}],"name":"setSmsCertifier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"getPairSellLoyaltyPerc","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tellerAddress","type":"address"}],"name":"RegisterTeller","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tellerAddress","type":"address"}],"name":"DeleteTeller","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tellerAddress","type":"address"}],"name":"UpdateTeller","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"shopAddress","type":"address"}],"name":"RegisterShop","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"shopAddress","type":"address"}],"name":"DeleteShop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"moderator","type":"address"},{"indexed":false,"name":"shopAddress","type":"address"}],"name":"DeleteShopModerator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"moderator","type":"address"},{"indexed":false,"name":"tellerAddress","type":"address"}],"name":"DeleteTellerModerator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"}]

60806040526006805462ffffff191690556017805460ff1916905534801561002657600080fd5b5060008054600160a060020a033316600160a060020a03199091161790556148f8806100536000396000f3006080604052600436106103085763ffffffff60e060020a60003504166301e57a37811461030d5780630519ce791461033e5780630a0f8168146103535780630d46f91a146103685780630d926f7a1461037d5780630e479dc7146103b157806319f1cded146104325780631d0e8a4d146104535780631d32f106146104885780632072863b146104ac5780632105c049146104cd5780632272b0af146104ee5780632314a5c81461050357806325ba0f511461054a5780632630c12f1461057157806327d7874c146105865780632e3a4def146105a757806330a55316146105c85780633b23a5ca146105dd5780633f4ba83a146105f75780633fa198041461060c57806343579fe81461063b5780634a9f0110146106505780634b0ad8fa146106785780634e0a3379146106995780634f4cd650146106ba578063529e65e11461071f578063530e784f1461074057806359b17b43146107615780635c975abb1461078257806366d5eb9b1461079757806367bb15ad146107b9578063681e3356146107da578063744955a9146107fb57806376cdb03b1461081d57806378843a9514610832578063809ffb20146108535780638456cb59146108745780638620084214610889578063878127c8146108ae5780638bd1b610146108c65780638c267b97146108db57806395d43eea146108f05780639a8061e8146109085780639ae120dd1461092d578063a26759cb1461094f578063aa5a11c514610957578063b0547d8c14610978578063b5c4147f14610999578063ba2a98f2146109c8578063c0ee0b8a146109ea578063c640ee3d14610a53578063ca34333b14610a74578063d04c911514610a96578063d0a4a81b14610ab7578063d4f639ea14610ad8578063d5c9b23914610aed578063dd955c4414610b02578063e019ac2914610b26578063f002467714610b47578063f2d15c4814610b68578063f3943ca914610b8d578063f554567f14610baf578063f983c0fa14610c65578063fa1d9cf814610c7a578063fac8a80014610ca9578063fcf3438c14610cca578063fdff31ed14610ceb575b600080fd5b34801561031957600080fd5b50610322610d12565b60408051600160a060020a039092168252519081900360200190f35b34801561034a57600080fd5b50610322610d21565b34801561035f57600080fd5b50610322610d30565b34801561037457600080fd5b50610322610d3f565b34801561038957600080fd5b5061039f600160f060020a031960043516610d4e565b60408051918252519081900360200190f35b3480156103bd57600080fd5b506103d2600160a060020a0360043516610d60565b604080516003998a0b8a0b815297890b90980b6020880152600160f060020a0319909516868801526001608060020a031993841660608701529183166080860152821660a085015260c08401521660e08201529051908190036101000190f35b34801561043e57600080fd5b5061039f600160a060020a0360043516610dc9565b34801561045f57600080fd5b50610474600160a060020a0360043516610e66565b604080519115158252519081900360200190f35b34801561049457600080fd5b506104aa600160f060020a031960043516610e9d565b005b3480156104b857600080fd5b506104aa600160a060020a0360043516610edd565b3480156104d957600080fd5b506104aa600160a060020a0360043516610f2f565b3480156104fa57600080fd5b50610322610f81565b34801561050f57600080fd5b50610524600160a060020a0360043516610f90565b604080519485526020850193909352838301919091526060830152519081900360800190f35b34801561055657600080fd5b506104aa600160a060020a0360043581169060243516610fcc565b34801561057d57600080fd5b50610322611032565b34801561059257600080fd5b506104aa600160a060020a0360043516611041565b3480156105b357600080fd5b50610474600160a060020a0360043516611093565b3480156105d457600080fd5b506103226110e8565b3480156105e957600080fd5b506104aa60043515156110fe565b34801561060357600080fd5b506104aa611152565b6104aa600435600090810b906001608060020a03196024351690604435900b60643560010b608435151561118a565b34801561064757600080fd5b506104aa6114c4565b34801561065c57600080fd5b506104aa600435600160f060020a03196024351660443561183a565b34801561068457600080fd5b5061039f600160a060020a036004351661187c565b3480156106a557600080fd5b506104aa600160a060020a03600435166118e7565b3480156106c657600080fd5b506106cf611939565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561070b5781810151838201526020016106f3565b505050509050019250505060405180910390f35b34801561072b57600080fd5b506104aa600160a060020a036004351661199c565b34801561074c57600080fd5b506104aa600160a060020a03600435166119d8565b34801561076d57600080fd5b5061039f600160a060020a0360043516611a15565b34801561078e57600080fd5b50610474611a80565b3480156107a357600080fd5b506104aa600160f060020a031960043516611a89565b3480156107c557600080fd5b50610474600160a060020a0360043516611ac9565b3480156107e657600080fd5b506104aa600160a060020a0360043516611ade565b34801561080757600080fd5b50610474600160f060020a031960043516611b8c565b34801561082957600080fd5b50610322611ba1565b34801561083e57600080fd5b50610474600160a060020a0360043516611bb0565b34801561085f57600080fd5b506104aa600160a060020a0360043516611c0b565b34801561088057600080fd5b506104aa611c5f565b34801561089557600080fd5b5061039f600435600160f060020a031960243516611c99565b3480156108ba57600080fd5b50610322600435611cc1565b3480156108d257600080fd5b506104aa611ce9565b3480156108e757600080fd5b506103226120d6565b3480156108fc57600080fd5b506103226004356120e5565b34801561091457600080fd5b506104aa600160f060020a0319600435166024356120f3565b34801561093957600080fd5b506104aa600160f060020a03196004351661212b565b6104aa612168565b34801561096357600080fd5b506104aa600160a060020a0360043516612225565b34801561098457600080fd5b506104aa600160a060020a0360043516612261565b3480156109a557600080fd5b506106cf600160f060020a0319600435166001608060020a0319602435166126ad565b3480156109d457600080fd5b506104aa600160f060020a031960043516612737565b3480156109f657600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526104aa948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506127749650505050505050565b348015610a5f57600080fd5b50610474600160a060020a03600435166139fd565b348015610a8057600080fd5b50610474600160f060020a031960043516613a12565b348015610aa257600080fd5b5061039f600160a060020a0360043516613a27565b348015610ac357600080fd5b506104aa600160a060020a0360043516613a42565b348015610ae457600080fd5b50610474613a96565b348015610af957600080fd5b506106cf613aa5565b348015610b0e57600080fd5b506104aa600160a060020a0360043516602435613b05565b348015610b3257600080fd5b506104aa600160a060020a0360043516613fee565b348015610b5357600080fd5b506104aa600160a060020a0360043516614053565b348015610b7457600080fd5b506104aa600160f060020a03196004351660243561447a565b348015610b9957600080fd5b5061039f600160f060020a0319600435166144b2565b348015610bbb57600080fd5b50610bd0600160a060020a03600435166144c4565b6040805160039d8e0b8e0b81529b8d0b909c0b60208c0152600160f060020a03199099168a8c01526001608060020a031997881660608b0152600096870b870b60808b01529490961660a089015291840b90930b60c0870152600192830b830b60e087015261010086015291151561012085015290151561014084015290810b900b6101608201529051908190036101800190f35b348015610c7157600080fd5b5061047461462a565b348015610c8657600080fd5b506106cf600160f060020a0319600435166001608060020a031960243516614638565b348015610cb557600080fd5b50610474600160a060020a03600435166146c0565b348015610cd657600080fd5b506104aa600160a060020a03600435166146f7565b348015610cf757600080fd5b5061039f600160a060020a0360043581169060243516614769565b600c54600160a060020a031681565b600354600160a060020a031681565b600054600160a060020a031681565b600754600160a060020a031681565b600a6020526000908152604090205481565b600160a060020a0316600090815260186020526040902080546001820154600283015460039384015483850b95640100000000850490950b9460f060020a604060020a86040294608060020a605060020a90910481029480820294908290048202939092910290565b600d54604080517f78d0a415000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915160009392909216916378d0a4159160248082019260209290919082900301818787803b158015610e3457600080fd5b505af1158015610e48573d6000803e3d6000fd5b505050506040513d6020811015610e5e57600080fd5b505192915050565b600160a060020a038116600090815260186020526040902054604060020a900460f060020a02600160f060020a0319161515919050565b60015433600160a060020a03908116911614610eb857600080fd5b600160f060020a0319166000908152600960205260409020805460ff19166001179055565b60005433600160a060020a03908116911614610ef857600080fd5b600160a060020a0381161515610f0d57600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a03908116911614610f4a57600080fd5b600160a060020a0381161515610f5f57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600254600160a060020a031681565b600160a060020a031660009081526010602090815260408083205460118352818420546012845282852054601390945291909320549293909290565b60005433600160a060020a03908116911614610fe757600080fd5b60175460ff1615610ff757600080fd5b600c8054600160a060020a03938416600160a060020a031991821617909155600d80549290931691161790556017805460ff19166001179055565b600e54600160a060020a031681565b60005433600160a060020a0390811691161461105c57600080fd5b600160a060020a038116151561107157600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b6007546040805160e160020a63660ea601028152600160a060020a0384811660048301529151600093929092169163cc1d4c029160248082019260209290919082900301818787803b158015610e3457600080fd5b60065463010000009004600160a060020a031681565b600160a060020a03331660009081526014602052604090206004015460ff1615158115151461114f5733600160a060020a03166000908152601460205260409020600401805460ff19168215151790555b50565b60005433600160a060020a0390811691161461116d57600080fd5b60065460ff16151561117e57600080fd5b6006805460ff19169055565b611193336146c0565b151561119e57600080fd5b33600160a060020a031660009081526014602052604081205460d060020a9004810b810b9086900b1461121957600160a060020a033316600090815260146020526040812080549187900b60ff1660d060020a027aff0000000000000000000000000000000000000000000000000000199092169190911790555b600160a060020a033316600090815260146020526040902060010154608060020a026001608060020a0319908116908516146112815733600160a060020a0316600090815260146020526040902060010180546001608060020a031916608060020a86041790555b600160a060020a033316600090815260146020526040812060010154608060020a9004810b810b9084900b146112f857600160a060020a033316600090815260146020526040812060010180549185900b60ff16608060020a0270ff00000000000000000000000000000000199092169190911790555b600160a060020a0333166000908152601460205260409020600190810154710100000000000000000000000000000000009004810b810b9083900b1461139257600160a060020a0333166000908152601460205260409020600190810180549184900b61ffff16710100000000000000000000000000000000000272ffff0000000000000000000000000000000000199092169190911790555b600160a060020a03331660009081526014602052604090206004015460ff161515811515146113e35733600160a060020a03166000908152601460205260409020600401805460ff19168215151790555b600034111561148957600d54604080517fe4651465000000000000000000000000000000000000000000000000000000008152600160a060020a0333811660048301523460248301819052925193169263e4651465929160448082019260209290919082900301818588803b15801561145b57600080fd5b505af115801561146f573d6000803e3d6000fd5b50505050506040513d602081101561148657600080fd5b50505b604051600160a060020a033316907fe3df84c3ca6a90f0e6485beae08e7bd034695356bec32910a3d62559ff33fbc890600090a25050505050565b6000806000806114d333610e66565b15156114de57600080fd5b33600160a060020a0316600090815260186020908152604080832060048101549054604060020a810460f060020a02600160f060020a031916855260198452828520605060020a909104608060020a026001608060020a0319168552909252909120805491955090600019810190811061155457fe5b600091825260208083209190910154600160a060020a03338116845260188352604080852054604060020a810460f060020a02600160f060020a031916865260198552818620605060020a909104608060020a026001608060020a0319168652909352919092208054919092169450849190869081106115d057fe5b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055858316825260188152604080832060040188905533909316825282822054604060020a810460f060020a02600160f060020a031916835260198252838320605060020a909104608060020a026001608060020a0319168352905220805490611664906000198301614885565b50600160a060020a033316600090815260186020526040902060050154601a805491935090600019810190811061169757fe5b600091825260209091200154601a8054600160a060020a0390921692508291849081106116c057fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790559183168152601890915260409020600501829055601a80549061170f906000198301614885565b50600160a060020a03338116600081815260186020526040808220805479ffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101839055600281018390556003810180546001608060020a03191690556004808201849055600582018490556006909101805460ff19169055600d5482517f3716f65d0000000000000000000000000000000000000000000000000000000081529182019490945290519290931692633716f65d926024808301939282900301818387803b1580156117df57600080fd5b505af11580156117f3573d6000803e3d6000fd5b505060408051600160a060020a033316815290517fe607eb1578eec3de556aa2d57f7ff9365c1706069a8959e794883eba60b043e39350908190036020019150a150505050565b60035433600160a060020a0390811691161461185557600080fd5b6000928352601b60209081526040808520600160f060020a03199094168552929052912055565b600d54604080517fa96b3ab8000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151600093929092169163a96b3ab89160248082019260209290919082900301818787803b158015610e3457600080fd5b60005433600160a060020a0390811691161461190257600080fd5b600160a060020a038116151561191757600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b6060601680548060200260200160405190810160405280929190818152602001828054801561199157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611973575b505050505090505b90565b60005433600160a060020a039081169116146119b757600080fd5b600160a060020a03166000908152600460205260409020805460ff19169055565b60035433600160a060020a039081169116146119f357600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b600d54604080517f8d837f38000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000939290921691638d837f389160248082019260209290919082900301818787803b158015610e3457600080fd5b60065460ff1681565b60015433600160a060020a03908116911614611aa457600080fd5b600160f060020a0319166000908152600860205260409020805460ff19166001179055565b60046020526000908152604090205460ff1681565b60005433600160a060020a03908116911614611af957600080fd5b60065460ff161515611b0a57600080fd5b600d54604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b158015611b7157600080fd5b505af1158015611b85573d6000803e3d6000fd5b5050505050565b60086020526000908152604090205460ff1681565b600d54600160a060020a031681565b6006546040805160e160020a63660ea601028152600160a060020a0384811660048301529151600093630100000090049092169163cc1d4c029160248082019260209290919082900301818787803b158015610e3457600080fd5b60005433600160a060020a03908116911614611c2657600080fd5b600160a060020a0381161515611c3b57600080fd5b600160a060020a03166000908152600460205260409020805460ff19166001179055565b60005433600160a060020a03908116911614611c7a57600080fd5b60065460ff1615611c8a57600080fd5b6006805460ff19166001179055565b6000918252601b60209081526040808420600160f060020a0319909316845291905290205490565b601a805482908110611ccf57fe5b600091825260209091200154600160a060020a0316905081565b600080600080611cf8336146c0565b1515611d0357600080fd5b33600160a060020a0316600090815260146020908152604080832060028101549054604060020a810460f060020a02600160f060020a031916855260158452828520605060020a909104608060020a026001608060020a03191685529092529091208054919550906000198101908110611d7957fe5b600091825260208083209190910154600160a060020a03338116845260148352604080852054604060020a810460f060020a02600160f060020a031916865260158552818620605060020a909104608060020a026001608060020a031916865290935291909220805491909216945084919086908110611df557fe5b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055858316825260148152604080832060020188905533909316825282822054604060020a810460f060020a02600160f060020a031916835260158252838320605060020a909104608060020a026001608060020a0319168352905220805490611e89906000198301614885565b50600160a060020a03331660009081526014602052604090206003015460168054919350906000198101908110611ebc57fe5b60009182526020909120015460168054600160a060020a039092169250829184908110611ee557fe5b60009182526020808320919091018054600160a060020a031916600160a060020a0394851617905591831681526014909152604090206003018290556016805490611f34906000198301614885565b50600160a060020a0333811660008181526014602052604080822080547affffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101805475ffffffffffffffffffffffffffffffffffffffffffff1916905560028101839055600381018390556004908101805460ff19169055600d5482517fb71738f1000000000000000000000000000000000000000000000000000000008152918201949094529051929093169263b71738f1926024808301939282900301818387803b15801561200557600080fd5b505af1158015612019573d6000803e3d6000fd5b5050600d54604080517fd83edd70000000000000000000000000000000000000000000000000000000008152600160a060020a033381166004830152915191909216935063d83edd709250602480830192600092919082900301818387803b15801561208457600080fd5b505af1158015612098573d6000803e3d6000fd5b5050604051600160a060020a03331692507fb1e40dcb43d26b3a6cb20da12c333af5a0de0bcd6264eddca5fbacf3e31d4f949150600090a250505050565b600154600160a060020a031681565b6016805482908110611ccf57fe5b60015433600160a060020a0390811691161461210e57600080fd5b600160f060020a03199091166000908152600a6020526040902055565b60015433600160a060020a0390811691161461214657600080fd5b600160f060020a0319166000908152600960205260409020805460ff19169055565b612171336146c0565b151561217c57600080fd5b600d54604080517fe4651465000000000000000000000000000000000000000000000000000000008152600160a060020a0333811660048301523460248301819052925193169263e4651465929160448082019260209290919082900301818588803b1580156121eb57600080fd5b505af11580156121ff573d6000803e3d6000fd5b50505050506040513d602081101561221657600080fd5b5051151561222357600080fd5b565b60005433600160a060020a0390811691161461224057600080fd5b600160a060020a03166000908152600560205260409020805460ff19169055565b33600160a060020a038116600090815260046020526040812054909182918291829160ff16151561229157600080fd5b600160a060020a038616600090815260186020908152604080832060048101549054604060020a810460f060020a02600160f060020a031916855260198452828520605060020a909104608060020a026001608060020a0319168552909252909120805491965090600019810190811061230757fe5b600091825260208083209190910154600160a060020a03898116845260188352604080852054604060020a810460f060020a02600160f060020a031916865260198552818620605060020a909104608060020a026001608060020a03191686529093529190922080549190921695508591908790811061238357fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790558683168252601881526040808320600401899055928916825282822054604060020a810460f060020a02600160f060020a031916835260198252838320605060020a909104608060020a026001608060020a0319168352905220805490612416906000198301614885565b50600160a060020a038616600090815260186020526040902060050154601a805491945090600019810190811061244957fe5b600091825260209091200154601a8054600160a060020a03909216935083918590811061247257fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790559184168152601890915260409020600501839055601a8054906124c1906000198301614885565b50600160a060020a03861660009081526018602052604090206006015460ff16151561256b57600d54604080517f3716f65d000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519190921691633716f65d91602480830192600092919082900301818387803b15801561254e57600080fd5b505af1158015612562573d6000803e3d6000fd5b505050506125f6565b600d54600254604080517f7139b595000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152928316602482015290519190921691637139b59591604480830192600092919082900301818387803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b505050505b600160a060020a038087166000818152601860209081526040808320805479ffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101849055600281018490556003810180546001608060020a03191690556004810184905560058101939093556006909201805460ff191690558151928352905133909316927f34fe9e989d541054eb508f79a2e9b0bc3aa3d7ff2f2ded4f1f6b2819aaec86a39281900390910190a2505050505050565b600160f060020a0319821660009081526019602090815260408083206001608060020a03198516845282529182902080548351818402810184019094528084526060939283018282801561272a57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161270c575b5050505050905092915050565b60015433600160a060020a0390811691161461275257600080fd5b600160f060020a0319166000908152600860205260409020805460ff19169055565b60065460009081908190819060ff161561278d57600080fd5b6006546040805160e160020a63660ea601028152600160a060020a038a8116600483015291518a93630100000090049092169163cc1d4c02916024808201926020929091908290030181600087803b1580156127e857600080fd5b505af11580156127fc573d6000803e3d6000fd5b505050506040513d602081101561281257600080fd5b5051151561281f57600080fd5b600c5433600160a060020a0390811691161461283a57600080fd5b61284b86600063ffffffff61479416565b945060f860020a61286387600163ffffffff61479416565b600160f860020a0319161461288f5761288386600263ffffffff6147bc16565b60e060020a90046128ac565b6128a086600263ffffffff6147bc16565b60e060020a9004600019025b935060f860020a6128c487600663ffffffff61479416565b600160f860020a031916146128f0576128e486600763ffffffff6147bc16565b60e060020a900461290d565b61290186600763ffffffff6147bc16565b60e060020a9004600019025b9250600160f860020a031985167f31000000000000000000000000000000000000000000000000000000000000001415612e6d57600a600061295688600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205487101561297d57600080fd5b61298688610e66565b1561299057600080fd5b600860006129a588600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205460ff1615156129ce57600080fd5b600160a060020a0388166000908152601860205260409020805463ffffffff1916600386810b63ffffffff9081169290921767ffffffff0000000019166401000000009187900b83169190910217909155612a2e908790600b906147d216565b600160a060020a0389166000908152601860205260409020805460f060020a909204604060020a0269ffff000000000000000019909216919091179055612a7c86600d63ffffffff6147e816565b600160a060020a03891660009081526018602052604090208054608060020a909204605060020a0279ffffffffffffffffffffffffffffffff0000000000000000000019909216919091179055612ada86601d63ffffffff6147e816565b600160a060020a038916600090815260186020526040902060010180546001608060020a031916608060020a909204919091179055612b1a86602d6147e8565b600160a060020a038916600090815260186020526040902060010180546fffffffffffffffffffffffffffffffff16608060020a92839004909202919091179055612b6686603d6147fe565b600160a060020a038916600090815260186020526040902060020155612b9386605d63ffffffff6147e816565b600160a060020a03891660008181526018602052604081206003810180546001608060020a031916608060020a90950494909417909355601a805460018181019092557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e81018054600160a060020a031916909417909355600590930191909155601990612c2289600b6147d2565b600160f060020a03191681526020810191909152604001600090812090612c5089600d63ffffffff6147e816565b6fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020019081526020016000208990806001815401808255809150509060018203906000526020600020016000909192909190916101000a815481600160a060020a030219169083600160a060020a0316021790555003601860008a600160a060020a0316600160a060020a03168152602001908152602001600020600401819055507ff45ad76a8c4c14053708bfd052607c5e35446beb04fbdff6f2f3c9dde8e83b37886040518082600160a060020a0316600160a060020a0316815260200191505060405180910390a1600d54604080517fd4d84da5000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152602482018b90529151919092169163d4d84da591604480830192600092919082900301818387803b158015612db157600080fd5b505af1158015612dc5573d6000803e3d6000fd5b5050600c54600d54604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018d9052905191909216935063a9059cbb925060448083019260209291908290030181600087803b158015612e3b57600080fd5b505af1158015612e4f573d6000803e3d6000fd5b505050506040513d6020811015612e6557600080fd5b506139f39050565b600160f860020a031985167f320000000000000000000000000000000000000000000000000000000000000014156134ad57600b6000612eb3888363ffffffff6147d216565b600160f060020a0319168152602081019190915260400160002054871015612eda57600080fd5b612ee3886146c0565b15612eed57600080fd5b60096000612f0288600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205460ff161515612f2b57600080fd5b600160a060020a0388166000908152601460205260409020805463ffffffff1916600386810b63ffffffff9081169290921767ffffffff0000000019166401000000009187900b83169190910217909155612f8b908790600b906147d216565b600160a060020a0389166000908152601460205260409020805460f060020a909204604060020a0269ffff000000000000000019909216919091179055612fd986600d63ffffffff6147e816565b600160a060020a03891660009081526014602052604090208054608060020a909204605060020a0279ffffffffffffffffffffffffffffffff000000000000000000001990921691909117905561303786601d63ffffffff61479416565b600160a060020a0389166000908152601460205260408120600101805460f860020a90930490910b60ff16608060020a0270ff000000000000000000000000000000001990921691909117905561309586601e63ffffffff61479416565b600160a060020a0389166000908152601460205260408120805460f860020a90930490910b60ff1660d060020a027aff0000000000000000000000000000000000000000000000000000199092169190911790556130fa86601f63ffffffff6147e816565b600160a060020a038916600090815260146020526040902060010180546001608060020a031916608060020a90920491909117905561313a86602f6147d2565b600160a060020a03891660009081526014602052604090206001908101805460f060020a90930490910b61ffff16710100000000000000000000000000000000000272ffff00000000000000000000000000000000001990921691909117905560f860020a6131b087603163ffffffff61479416565b600160f860020a031916146131c65760006131c9565b60015b600160a060020a038916600090815260146020526040902060010180549115157301000000000000000000000000000000000000000273ff000000000000000000000000000000000000001990921691909117905561322f86603263ffffffff6147d216565b600160a060020a03891660008181526014602052604081206001808201805460f060020a909604820b61ffff16740100000000000000000000000000000000000000000275ffff00000000000000000000000000000000000000001990961695909517909455601680548086019091557fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428981018054600160a060020a03191685179055928252600301919091556015906132f089600b63ffffffff6147d216565b600160f060020a0319168152602081019190915260400160009081209061331e89600d63ffffffff6147e816565b6fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020019081526020016000208990806001815401808255809150509060018203906000526020600020016000909192909190916101000a815481600160a060020a030219169083600160a060020a0316021790555003601460008a600160a060020a0316600160a060020a03168152602001908152602001600020600201819055506001601460008a600160a060020a0316600160a060020a0316815260200190815260200160002060040160006101000a81548160ff02191690831515021790555087600160a060020a03167fdc94eebf39359cb097be68bd4890a58fce65c66d2d284d4349f666013dc8a43d60405160405180910390a2600d54604080517f18a6d58b000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152602482018b9052915191909216916318a6d58b91604480830192600092919082900301818387803b158015612db157600080fd5b600160f860020a031985167f330000000000000000000000000000000000000000000000000000000000000014156139f357600254600160a060020a038981169116146134f957600080fd5b600a600061350e88600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205487101561353557600080fd5b61354e61354987606d63ffffffff61481416565b610e66565b1561355857600080fd5b6008600061356d88600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205460ff16151561359657600080fd5b6135a786606d63ffffffff61481416565b600160a060020a0381166000908152601860205260409020805463ffffffff1916600387810b63ffffffff9081169290921767ffffffff0000000019166401000000009188900b8316919091021790915590925061360a908790600b906147d216565b600160a060020a0383166000908152601860205260409020805460f060020a909204604060020a0269ffff00000000000000001990921691909117905561365886600d63ffffffff6147e816565b600160a060020a03831660009081526018602052604090208054608060020a909204605060020a0279ffffffffffffffffffffffffffffffff00000000000000000000199092169190911790556136b686601d63ffffffff6147e816565b600160a060020a038316600090815260186020526040902060010180546001608060020a031916608060020a9092049190911790556136f686602d6147e8565b600160a060020a038316600090815260186020526040902060010180546fffffffffffffffffffffffffffffffff16608060020a9283900490920291909117905561374286603d6147fe565b600160a060020a03831660009081526018602052604090206002015561376f86605d63ffffffff6147e816565b600160a060020a03831660008181526018602052604081206003810180546001608060020a031916608060020a90950494909417909355601a805460018181019092557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e81018054600160a060020a0319169094179093556005909301919091556019906137fe89600b6147d2565b600160f060020a0319168152602081019190915260400160009081209061382c89600d63ffffffff6147e816565b6001608060020a03191681526020808201929092526040908101600090812080546001808201835591835284832081018054600160a060020a031916600160a060020a038a169081179091558084526018865292849020959003810160048601556006909401805460ff19169094179093558051928352517ff45ad76a8c4c14053708bfd052607c5e35446beb04fbdff6f2f3c9dde8e83b379281900390910190a1600d54604080517fd4d84da5000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018b90529151919092169163d4d84da591604480830192600092919082900301818387803b15801561393c57600080fd5b505af1158015613950573d6000803e3d6000fd5b5050600c54600d54604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018d9052905191909216935063a9059cbb925060448083019260209291908290030181600087803b1580156139c657600080fd5b505af11580156139da573d6000803e3d6000fd5b505050506040513d60208110156139f057600080fd5b50505b5050505050505050565b60056020526000908152604090205460ff1681565b60096020526000908152604090205460ff1681565b600160a060020a031660009081526013602052604090205490565b60005433600160a060020a03908116911614613a5d57600080fd5b600160a060020a0381161515613a7257600080fd5b600160a060020a03166000908152600560205260409020805460ff19166001179055565b60065462010000900460ff1681565b6060601a80548060200260200160405190810160405280929190818152602001828054801561199157602002820191906000526020600020908154600160a060020a03168152600190910190602001808311611973575050505050905090565b60065460009060ff1615613b1857600080fd5b33600160a060020a0381166000908152601460205260408120548491604060020a90910460f060020a0290808080613b69613b5288611093565b613b5d576001613b60565b60025b60ff1686611c99565b9350613bf3600e60009054906101000a9004600160a060020a0316600160a060020a03166350ccf36b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015613bc157600080fd5b505af1158015613bd5573d6000803e3d6000fd5b505050506040513d6020811015613beb57600080fd5b505185614844565b600d54604080517fad71766e000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152915193965091169163ad71766e916024808201926020929091908290030181600087803b158015613c5d57600080fd5b505af1158015613c71573d6000803e3d6000fd5b505050506040513d6020811015613c8757600080fd5b50519150613c958287614876565b905082811115613ca457600080fd5b613cad336146c0565b1515613cb857600080fd5b33600160a060020a03168a600160a060020a031614151515613cd957600080fd5b600d54604080517ff5923a6e000000000000000000000000000000000000000000000000000000008152600160a060020a0333811660048301528d81166024830152604482018d90529151919092169163f5923a6e91606480830192600092919082900301818387803b158015613d4f57600080fd5b505af1158015613d63573d6000803e3d6000fd5b50506006546040805160e160020a63660ea601028152600160a060020a038f8116600483015291516301000000909304909116935063cc1d4c0292506024808201926020929091908290030181600087803b158015613dc157600080fd5b505af1158015613dd5573d6000803e3d6000fd5b505050506040513d6020811015613deb57600080fd5b505115613f9757600160a060020a033381166000908152600f60209081526040808320938e16835292905220549750871515613e5057600160a060020a033381166000908152600f60209081526040808320938e168352929052206127109081905597505b600160a060020a033316600090815260136020526040902054613e8990612710613e7a8c8c614844565b811515613e8357fe5b04614876565b600160a060020a0333166000908152601360205260409020556064613eaf89604f614844565b811515613eb857fe5b04600f600033600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002081905550613f34601060008c600160a060020a0316600160a060020a03168152602001908152602001600020548a614876565b600160a060020a03808c1660009081526010602090815260408083209490945533909216815260119091522054613f6b908a614876565b600160a060020a0333166000908152601160209081526040808320939093556012905220805460010190555b89600160a060020a031633600160a060020a03167f3990db2d31862302a685e8086b5755072a6e2b5b780af1ee81ece35ee3cd33458b6040518082815260200191505060405180910390a350505050505050505050565b60005433600160a060020a0390811691161461400957600080fd5b60065462010000900460ff161561401f57600080fd5b60078054600160a060020a03909216600160a060020a03199092169190911790556006805462ff0000191662010000179055565b33600160a060020a038116600090815260056020526040812054909182918291829160ff16151561408357600080fd5b61408c866146c0565b151561409757600080fd5b600160a060020a038616600090815260146020908152604080832060028101549054604060020a810460f060020a02600160f060020a031916855260158452828520605060020a909104608060020a026001608060020a0319168552909252909120805491965090600019810190811061410d57fe5b600091825260208083209190910154600160a060020a03898116845260148352604080852054604060020a810460f060020a02600160f060020a031916865260158552818620605060020a909104608060020a026001608060020a03191686529093529190922080549190921695508591908790811061418957fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790558683168252601481526040808320600201899055928916825282822054604060020a810460f060020a02600160f060020a031916835260158252838320605060020a909104608060020a026001608060020a031916835290522080549061421c906000198301614885565b50600160a060020a0386166000908152601460205260409020600301546016805491945090600019810190811061424f57fe5b60009182526020909120015460168054600160a060020a03909216935083918590811061427857fe5b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055918416815260149091526040902060030183905560168054906142c7906000198301614885565b50600160a060020a0380871660008181526014602052604080822080547affffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101805475ffffffffffffffffffffffffffffffffffffffffffff1916905560028101839055600381018390556004908101805460ff19169055600d5482517fb71738f1000000000000000000000000000000000000000000000000000000008152918201949094529051929093169263b71738f1926024808301939282900301818387803b15801561439857600080fd5b505af11580156143ac573d6000803e3d6000fd5b5050600d54604080517fd83edd70000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152915191909216935063d83edd709250602480830192600092919082900301818387803b15801561441757600080fd5b505af115801561442b573d6000803e3d6000fd5b505060408051600160a060020a038a811682529151339290921693507fcf9fc954c975d15bad8f5fa3c1cd94f55105a98b1ecf33021ebb059122277f8f925081900360200190a2505050505050565b60015433600160a060020a0390811691161461449557600080fd5b600160f060020a03199091166000908152600b6020526040902055565b600b6020526000908152604090205481565b600160a060020a0380821660008181526014602090815260408083208054600180830154600480850154600d5487517f8d837f380000000000000000000000000000000000000000000000000000000081529283019a909a529551600385810b9b640100000000870490910b9a60f060020a604060020a8804029a608060020a605060020a890481029b60d060020a909904820b9a8782029a918804830b997101000000000000000000000000000000000089048a0b99939860ff928316987301000000000000000000000000000000000000008204909316977401000000000000000000000000000000000000000090910490940b95929490921692638d837f389260248084019391929182900301818b87803b1580156145e557600080fd5b505af11580156145f9573d6000803e3d6000fd5b505050506040513d602081101561460f57600080fd5b50519c9e9b9d50999b989a9799509597949693959193909250565b600654610100900460ff1681565b600160f060020a0319821660009081526015602090815260408083206001608060020a03198516845282529182902080548351818402810184019094528084526060939283018282801561272a57602002820191906000526020600020908154600160a060020a0316815260019091019060200180831161270c575050505050905092915050565b600160a060020a038116600090815260146020526040902054604060020a900460f060020a02600160f060020a0319161515919050565b60005433600160a060020a0390811691161461471257600080fd5b600654610100900460ff161561472757600080fd5b6006805461ff0019600160a060020a0390931663010000000276ffffffffffffffffffffffffffffffffffffffff000000199091161791909116610100179055565b600160a060020a039182166000908152600f6020908152604080832093909416825291909152205490565b600080826001018451101515156147aa57600080fd5b505081810160200151805b5092915050565b600080826004018451101515156147aa57600080fd5b600080826002018451101515156147aa57600080fd5b600080826010018451101515156147aa57600080fd5b600080826020018451101515156147aa57600080fd5b6000808260140184511015151561482a57600080fd5b505001602001516c01000000000000000000000000900490565b60008083151561485757600091506147b5565b5082820282848281151561486757fe5b041461486f57fe5b9392505050565b60008282018381101561486f57fe5b8154818355818111156148a9576000838152602090206148a99181019083016148ae565b505050565b61199991905b808211156148c857600081556001016148b4565b50905600a165627a7a72305820a34ae3cd5140b74ce2a7d0f03a58b2ebb2d2566d167b4e095d48a2d884b47db10029

Deployed Bytecode

0x6080604052600436106103085763ffffffff60e060020a60003504166301e57a37811461030d5780630519ce791461033e5780630a0f8168146103535780630d46f91a146103685780630d926f7a1461037d5780630e479dc7146103b157806319f1cded146104325780631d0e8a4d146104535780631d32f106146104885780632072863b146104ac5780632105c049146104cd5780632272b0af146104ee5780632314a5c81461050357806325ba0f511461054a5780632630c12f1461057157806327d7874c146105865780632e3a4def146105a757806330a55316146105c85780633b23a5ca146105dd5780633f4ba83a146105f75780633fa198041461060c57806343579fe81461063b5780634a9f0110146106505780634b0ad8fa146106785780634e0a3379146106995780634f4cd650146106ba578063529e65e11461071f578063530e784f1461074057806359b17b43146107615780635c975abb1461078257806366d5eb9b1461079757806367bb15ad146107b9578063681e3356146107da578063744955a9146107fb57806376cdb03b1461081d57806378843a9514610832578063809ffb20146108535780638456cb59146108745780638620084214610889578063878127c8146108ae5780638bd1b610146108c65780638c267b97146108db57806395d43eea146108f05780639a8061e8146109085780639ae120dd1461092d578063a26759cb1461094f578063aa5a11c514610957578063b0547d8c14610978578063b5c4147f14610999578063ba2a98f2146109c8578063c0ee0b8a146109ea578063c640ee3d14610a53578063ca34333b14610a74578063d04c911514610a96578063d0a4a81b14610ab7578063d4f639ea14610ad8578063d5c9b23914610aed578063dd955c4414610b02578063e019ac2914610b26578063f002467714610b47578063f2d15c4814610b68578063f3943ca914610b8d578063f554567f14610baf578063f983c0fa14610c65578063fa1d9cf814610c7a578063fac8a80014610ca9578063fcf3438c14610cca578063fdff31ed14610ceb575b600080fd5b34801561031957600080fd5b50610322610d12565b60408051600160a060020a039092168252519081900360200190f35b34801561034a57600080fd5b50610322610d21565b34801561035f57600080fd5b50610322610d30565b34801561037457600080fd5b50610322610d3f565b34801561038957600080fd5b5061039f600160f060020a031960043516610d4e565b60408051918252519081900360200190f35b3480156103bd57600080fd5b506103d2600160a060020a0360043516610d60565b604080516003998a0b8a0b815297890b90980b6020880152600160f060020a0319909516868801526001608060020a031993841660608701529183166080860152821660a085015260c08401521660e08201529051908190036101000190f35b34801561043e57600080fd5b5061039f600160a060020a0360043516610dc9565b34801561045f57600080fd5b50610474600160a060020a0360043516610e66565b604080519115158252519081900360200190f35b34801561049457600080fd5b506104aa600160f060020a031960043516610e9d565b005b3480156104b857600080fd5b506104aa600160a060020a0360043516610edd565b3480156104d957600080fd5b506104aa600160a060020a0360043516610f2f565b3480156104fa57600080fd5b50610322610f81565b34801561050f57600080fd5b50610524600160a060020a0360043516610f90565b604080519485526020850193909352838301919091526060830152519081900360800190f35b34801561055657600080fd5b506104aa600160a060020a0360043581169060243516610fcc565b34801561057d57600080fd5b50610322611032565b34801561059257600080fd5b506104aa600160a060020a0360043516611041565b3480156105b357600080fd5b50610474600160a060020a0360043516611093565b3480156105d457600080fd5b506103226110e8565b3480156105e957600080fd5b506104aa60043515156110fe565b34801561060357600080fd5b506104aa611152565b6104aa600435600090810b906001608060020a03196024351690604435900b60643560010b608435151561118a565b34801561064757600080fd5b506104aa6114c4565b34801561065c57600080fd5b506104aa600435600160f060020a03196024351660443561183a565b34801561068457600080fd5b5061039f600160a060020a036004351661187c565b3480156106a557600080fd5b506104aa600160a060020a03600435166118e7565b3480156106c657600080fd5b506106cf611939565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561070b5781810151838201526020016106f3565b505050509050019250505060405180910390f35b34801561072b57600080fd5b506104aa600160a060020a036004351661199c565b34801561074c57600080fd5b506104aa600160a060020a03600435166119d8565b34801561076d57600080fd5b5061039f600160a060020a0360043516611a15565b34801561078e57600080fd5b50610474611a80565b3480156107a357600080fd5b506104aa600160f060020a031960043516611a89565b3480156107c557600080fd5b50610474600160a060020a0360043516611ac9565b3480156107e657600080fd5b506104aa600160a060020a0360043516611ade565b34801561080757600080fd5b50610474600160f060020a031960043516611b8c565b34801561082957600080fd5b50610322611ba1565b34801561083e57600080fd5b50610474600160a060020a0360043516611bb0565b34801561085f57600080fd5b506104aa600160a060020a0360043516611c0b565b34801561088057600080fd5b506104aa611c5f565b34801561089557600080fd5b5061039f600435600160f060020a031960243516611c99565b3480156108ba57600080fd5b50610322600435611cc1565b3480156108d257600080fd5b506104aa611ce9565b3480156108e757600080fd5b506103226120d6565b3480156108fc57600080fd5b506103226004356120e5565b34801561091457600080fd5b506104aa600160f060020a0319600435166024356120f3565b34801561093957600080fd5b506104aa600160f060020a03196004351661212b565b6104aa612168565b34801561096357600080fd5b506104aa600160a060020a0360043516612225565b34801561098457600080fd5b506104aa600160a060020a0360043516612261565b3480156109a557600080fd5b506106cf600160f060020a0319600435166001608060020a0319602435166126ad565b3480156109d457600080fd5b506104aa600160f060020a031960043516612737565b3480156109f657600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526104aa948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506127749650505050505050565b348015610a5f57600080fd5b50610474600160a060020a03600435166139fd565b348015610a8057600080fd5b50610474600160f060020a031960043516613a12565b348015610aa257600080fd5b5061039f600160a060020a0360043516613a27565b348015610ac357600080fd5b506104aa600160a060020a0360043516613a42565b348015610ae457600080fd5b50610474613a96565b348015610af957600080fd5b506106cf613aa5565b348015610b0e57600080fd5b506104aa600160a060020a0360043516602435613b05565b348015610b3257600080fd5b506104aa600160a060020a0360043516613fee565b348015610b5357600080fd5b506104aa600160a060020a0360043516614053565b348015610b7457600080fd5b506104aa600160f060020a03196004351660243561447a565b348015610b9957600080fd5b5061039f600160f060020a0319600435166144b2565b348015610bbb57600080fd5b50610bd0600160a060020a03600435166144c4565b6040805160039d8e0b8e0b81529b8d0b909c0b60208c0152600160f060020a03199099168a8c01526001608060020a031997881660608b0152600096870b870b60808b01529490961660a089015291840b90930b60c0870152600192830b830b60e087015261010086015291151561012085015290151561014084015290810b900b6101608201529051908190036101800190f35b348015610c7157600080fd5b5061047461462a565b348015610c8657600080fd5b506106cf600160f060020a0319600435166001608060020a031960243516614638565b348015610cb557600080fd5b50610474600160a060020a03600435166146c0565b348015610cd657600080fd5b506104aa600160a060020a03600435166146f7565b348015610cf757600080fd5b5061039f600160a060020a0360043581169060243516614769565b600c54600160a060020a031681565b600354600160a060020a031681565b600054600160a060020a031681565b600754600160a060020a031681565b600a6020526000908152604090205481565b600160a060020a0316600090815260186020526040902080546001820154600283015460039384015483850b95640100000000850490950b9460f060020a604060020a86040294608060020a605060020a90910481029480820294908290048202939092910290565b600d54604080517f78d0a415000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915160009392909216916378d0a4159160248082019260209290919082900301818787803b158015610e3457600080fd5b505af1158015610e48573d6000803e3d6000fd5b505050506040513d6020811015610e5e57600080fd5b505192915050565b600160a060020a038116600090815260186020526040902054604060020a900460f060020a02600160f060020a0319161515919050565b60015433600160a060020a03908116911614610eb857600080fd5b600160f060020a0319166000908152600960205260409020805460ff19166001179055565b60005433600160a060020a03908116911614610ef857600080fd5b600160a060020a0381161515610f0d57600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a03908116911614610f4a57600080fd5b600160a060020a0381161515610f5f57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600254600160a060020a031681565b600160a060020a031660009081526010602090815260408083205460118352818420546012845282852054601390945291909320549293909290565b60005433600160a060020a03908116911614610fe757600080fd5b60175460ff1615610ff757600080fd5b600c8054600160a060020a03938416600160a060020a031991821617909155600d80549290931691161790556017805460ff19166001179055565b600e54600160a060020a031681565b60005433600160a060020a0390811691161461105c57600080fd5b600160a060020a038116151561107157600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b6007546040805160e160020a63660ea601028152600160a060020a0384811660048301529151600093929092169163cc1d4c029160248082019260209290919082900301818787803b158015610e3457600080fd5b60065463010000009004600160a060020a031681565b600160a060020a03331660009081526014602052604090206004015460ff1615158115151461114f5733600160a060020a03166000908152601460205260409020600401805460ff19168215151790555b50565b60005433600160a060020a0390811691161461116d57600080fd5b60065460ff16151561117e57600080fd5b6006805460ff19169055565b611193336146c0565b151561119e57600080fd5b33600160a060020a031660009081526014602052604081205460d060020a9004810b810b9086900b1461121957600160a060020a033316600090815260146020526040812080549187900b60ff1660d060020a027aff0000000000000000000000000000000000000000000000000000199092169190911790555b600160a060020a033316600090815260146020526040902060010154608060020a026001608060020a0319908116908516146112815733600160a060020a0316600090815260146020526040902060010180546001608060020a031916608060020a86041790555b600160a060020a033316600090815260146020526040812060010154608060020a9004810b810b9084900b146112f857600160a060020a033316600090815260146020526040812060010180549185900b60ff16608060020a0270ff00000000000000000000000000000000199092169190911790555b600160a060020a0333166000908152601460205260409020600190810154710100000000000000000000000000000000009004810b810b9083900b1461139257600160a060020a0333166000908152601460205260409020600190810180549184900b61ffff16710100000000000000000000000000000000000272ffff0000000000000000000000000000000000199092169190911790555b600160a060020a03331660009081526014602052604090206004015460ff161515811515146113e35733600160a060020a03166000908152601460205260409020600401805460ff19168215151790555b600034111561148957600d54604080517fe4651465000000000000000000000000000000000000000000000000000000008152600160a060020a0333811660048301523460248301819052925193169263e4651465929160448082019260209290919082900301818588803b15801561145b57600080fd5b505af115801561146f573d6000803e3d6000fd5b50505050506040513d602081101561148657600080fd5b50505b604051600160a060020a033316907fe3df84c3ca6a90f0e6485beae08e7bd034695356bec32910a3d62559ff33fbc890600090a25050505050565b6000806000806114d333610e66565b15156114de57600080fd5b33600160a060020a0316600090815260186020908152604080832060048101549054604060020a810460f060020a02600160f060020a031916855260198452828520605060020a909104608060020a026001608060020a0319168552909252909120805491955090600019810190811061155457fe5b600091825260208083209190910154600160a060020a03338116845260188352604080852054604060020a810460f060020a02600160f060020a031916865260198552818620605060020a909104608060020a026001608060020a0319168652909352919092208054919092169450849190869081106115d057fe5b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055858316825260188152604080832060040188905533909316825282822054604060020a810460f060020a02600160f060020a031916835260198252838320605060020a909104608060020a026001608060020a0319168352905220805490611664906000198301614885565b50600160a060020a033316600090815260186020526040902060050154601a805491935090600019810190811061169757fe5b600091825260209091200154601a8054600160a060020a0390921692508291849081106116c057fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790559183168152601890915260409020600501829055601a80549061170f906000198301614885565b50600160a060020a03338116600081815260186020526040808220805479ffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101839055600281018390556003810180546001608060020a03191690556004808201849055600582018490556006909101805460ff19169055600d5482517f3716f65d0000000000000000000000000000000000000000000000000000000081529182019490945290519290931692633716f65d926024808301939282900301818387803b1580156117df57600080fd5b505af11580156117f3573d6000803e3d6000fd5b505060408051600160a060020a033316815290517fe607eb1578eec3de556aa2d57f7ff9365c1706069a8959e794883eba60b043e39350908190036020019150a150505050565b60035433600160a060020a0390811691161461185557600080fd5b6000928352601b60209081526040808520600160f060020a03199094168552929052912055565b600d54604080517fa96b3ab8000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151600093929092169163a96b3ab89160248082019260209290919082900301818787803b158015610e3457600080fd5b60005433600160a060020a0390811691161461190257600080fd5b600160a060020a038116151561191757600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b6060601680548060200260200160405190810160405280929190818152602001828054801561199157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611973575b505050505090505b90565b60005433600160a060020a039081169116146119b757600080fd5b600160a060020a03166000908152600460205260409020805460ff19169055565b60035433600160a060020a039081169116146119f357600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b600d54604080517f8d837f38000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000939290921691638d837f389160248082019260209290919082900301818787803b158015610e3457600080fd5b60065460ff1681565b60015433600160a060020a03908116911614611aa457600080fd5b600160f060020a0319166000908152600860205260409020805460ff19166001179055565b60046020526000908152604090205460ff1681565b60005433600160a060020a03908116911614611af957600080fd5b60065460ff161515611b0a57600080fd5b600d54604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b158015611b7157600080fd5b505af1158015611b85573d6000803e3d6000fd5b5050505050565b60086020526000908152604090205460ff1681565b600d54600160a060020a031681565b6006546040805160e160020a63660ea601028152600160a060020a0384811660048301529151600093630100000090049092169163cc1d4c029160248082019260209290919082900301818787803b158015610e3457600080fd5b60005433600160a060020a03908116911614611c2657600080fd5b600160a060020a0381161515611c3b57600080fd5b600160a060020a03166000908152600460205260409020805460ff19166001179055565b60005433600160a060020a03908116911614611c7a57600080fd5b60065460ff1615611c8a57600080fd5b6006805460ff19166001179055565b6000918252601b60209081526040808420600160f060020a0319909316845291905290205490565b601a805482908110611ccf57fe5b600091825260209091200154600160a060020a0316905081565b600080600080611cf8336146c0565b1515611d0357600080fd5b33600160a060020a0316600090815260146020908152604080832060028101549054604060020a810460f060020a02600160f060020a031916855260158452828520605060020a909104608060020a026001608060020a03191685529092529091208054919550906000198101908110611d7957fe5b600091825260208083209190910154600160a060020a03338116845260148352604080852054604060020a810460f060020a02600160f060020a031916865260158552818620605060020a909104608060020a026001608060020a031916865290935291909220805491909216945084919086908110611df557fe5b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055858316825260148152604080832060020188905533909316825282822054604060020a810460f060020a02600160f060020a031916835260158252838320605060020a909104608060020a026001608060020a0319168352905220805490611e89906000198301614885565b50600160a060020a03331660009081526014602052604090206003015460168054919350906000198101908110611ebc57fe5b60009182526020909120015460168054600160a060020a039092169250829184908110611ee557fe5b60009182526020808320919091018054600160a060020a031916600160a060020a0394851617905591831681526014909152604090206003018290556016805490611f34906000198301614885565b50600160a060020a0333811660008181526014602052604080822080547affffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101805475ffffffffffffffffffffffffffffffffffffffffffff1916905560028101839055600381018390556004908101805460ff19169055600d5482517fb71738f1000000000000000000000000000000000000000000000000000000008152918201949094529051929093169263b71738f1926024808301939282900301818387803b15801561200557600080fd5b505af1158015612019573d6000803e3d6000fd5b5050600d54604080517fd83edd70000000000000000000000000000000000000000000000000000000008152600160a060020a033381166004830152915191909216935063d83edd709250602480830192600092919082900301818387803b15801561208457600080fd5b505af1158015612098573d6000803e3d6000fd5b5050604051600160a060020a03331692507fb1e40dcb43d26b3a6cb20da12c333af5a0de0bcd6264eddca5fbacf3e31d4f949150600090a250505050565b600154600160a060020a031681565b6016805482908110611ccf57fe5b60015433600160a060020a0390811691161461210e57600080fd5b600160f060020a03199091166000908152600a6020526040902055565b60015433600160a060020a0390811691161461214657600080fd5b600160f060020a0319166000908152600960205260409020805460ff19169055565b612171336146c0565b151561217c57600080fd5b600d54604080517fe4651465000000000000000000000000000000000000000000000000000000008152600160a060020a0333811660048301523460248301819052925193169263e4651465929160448082019260209290919082900301818588803b1580156121eb57600080fd5b505af11580156121ff573d6000803e3d6000fd5b50505050506040513d602081101561221657600080fd5b5051151561222357600080fd5b565b60005433600160a060020a0390811691161461224057600080fd5b600160a060020a03166000908152600560205260409020805460ff19169055565b33600160a060020a038116600090815260046020526040812054909182918291829160ff16151561229157600080fd5b600160a060020a038616600090815260186020908152604080832060048101549054604060020a810460f060020a02600160f060020a031916855260198452828520605060020a909104608060020a026001608060020a0319168552909252909120805491965090600019810190811061230757fe5b600091825260208083209190910154600160a060020a03898116845260188352604080852054604060020a810460f060020a02600160f060020a031916865260198552818620605060020a909104608060020a026001608060020a03191686529093529190922080549190921695508591908790811061238357fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790558683168252601881526040808320600401899055928916825282822054604060020a810460f060020a02600160f060020a031916835260198252838320605060020a909104608060020a026001608060020a0319168352905220805490612416906000198301614885565b50600160a060020a038616600090815260186020526040902060050154601a805491945090600019810190811061244957fe5b600091825260209091200154601a8054600160a060020a03909216935083918590811061247257fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790559184168152601890915260409020600501839055601a8054906124c1906000198301614885565b50600160a060020a03861660009081526018602052604090206006015460ff16151561256b57600d54604080517f3716f65d000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519190921691633716f65d91602480830192600092919082900301818387803b15801561254e57600080fd5b505af1158015612562573d6000803e3d6000fd5b505050506125f6565b600d54600254604080517f7139b595000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152928316602482015290519190921691637139b59591604480830192600092919082900301818387803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b505050505b600160a060020a038087166000818152601860209081526040808320805479ffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101849055600281018490556003810180546001608060020a03191690556004810184905560058101939093556006909201805460ff191690558151928352905133909316927f34fe9e989d541054eb508f79a2e9b0bc3aa3d7ff2f2ded4f1f6b2819aaec86a39281900390910190a2505050505050565b600160f060020a0319821660009081526019602090815260408083206001608060020a03198516845282529182902080548351818402810184019094528084526060939283018282801561272a57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161270c575b5050505050905092915050565b60015433600160a060020a0390811691161461275257600080fd5b600160f060020a0319166000908152600860205260409020805460ff19169055565b60065460009081908190819060ff161561278d57600080fd5b6006546040805160e160020a63660ea601028152600160a060020a038a8116600483015291518a93630100000090049092169163cc1d4c02916024808201926020929091908290030181600087803b1580156127e857600080fd5b505af11580156127fc573d6000803e3d6000fd5b505050506040513d602081101561281257600080fd5b5051151561281f57600080fd5b600c5433600160a060020a0390811691161461283a57600080fd5b61284b86600063ffffffff61479416565b945060f860020a61286387600163ffffffff61479416565b600160f860020a0319161461288f5761288386600263ffffffff6147bc16565b60e060020a90046128ac565b6128a086600263ffffffff6147bc16565b60e060020a9004600019025b935060f860020a6128c487600663ffffffff61479416565b600160f860020a031916146128f0576128e486600763ffffffff6147bc16565b60e060020a900461290d565b61290186600763ffffffff6147bc16565b60e060020a9004600019025b9250600160f860020a031985167f31000000000000000000000000000000000000000000000000000000000000001415612e6d57600a600061295688600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205487101561297d57600080fd5b61298688610e66565b1561299057600080fd5b600860006129a588600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205460ff1615156129ce57600080fd5b600160a060020a0388166000908152601860205260409020805463ffffffff1916600386810b63ffffffff9081169290921767ffffffff0000000019166401000000009187900b83169190910217909155612a2e908790600b906147d216565b600160a060020a0389166000908152601860205260409020805460f060020a909204604060020a0269ffff000000000000000019909216919091179055612a7c86600d63ffffffff6147e816565b600160a060020a03891660009081526018602052604090208054608060020a909204605060020a0279ffffffffffffffffffffffffffffffff0000000000000000000019909216919091179055612ada86601d63ffffffff6147e816565b600160a060020a038916600090815260186020526040902060010180546001608060020a031916608060020a909204919091179055612b1a86602d6147e8565b600160a060020a038916600090815260186020526040902060010180546fffffffffffffffffffffffffffffffff16608060020a92839004909202919091179055612b6686603d6147fe565b600160a060020a038916600090815260186020526040902060020155612b9386605d63ffffffff6147e816565b600160a060020a03891660008181526018602052604081206003810180546001608060020a031916608060020a90950494909417909355601a805460018181019092557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e81018054600160a060020a031916909417909355600590930191909155601990612c2289600b6147d2565b600160f060020a03191681526020810191909152604001600090812090612c5089600d63ffffffff6147e816565b6fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020019081526020016000208990806001815401808255809150509060018203906000526020600020016000909192909190916101000a815481600160a060020a030219169083600160a060020a0316021790555003601860008a600160a060020a0316600160a060020a03168152602001908152602001600020600401819055507ff45ad76a8c4c14053708bfd052607c5e35446beb04fbdff6f2f3c9dde8e83b37886040518082600160a060020a0316600160a060020a0316815260200191505060405180910390a1600d54604080517fd4d84da5000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152602482018b90529151919092169163d4d84da591604480830192600092919082900301818387803b158015612db157600080fd5b505af1158015612dc5573d6000803e3d6000fd5b5050600c54600d54604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018d9052905191909216935063a9059cbb925060448083019260209291908290030181600087803b158015612e3b57600080fd5b505af1158015612e4f573d6000803e3d6000fd5b505050506040513d6020811015612e6557600080fd5b506139f39050565b600160f860020a031985167f320000000000000000000000000000000000000000000000000000000000000014156134ad57600b6000612eb3888363ffffffff6147d216565b600160f060020a0319168152602081019190915260400160002054871015612eda57600080fd5b612ee3886146c0565b15612eed57600080fd5b60096000612f0288600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205460ff161515612f2b57600080fd5b600160a060020a0388166000908152601460205260409020805463ffffffff1916600386810b63ffffffff9081169290921767ffffffff0000000019166401000000009187900b83169190910217909155612f8b908790600b906147d216565b600160a060020a0389166000908152601460205260409020805460f060020a909204604060020a0269ffff000000000000000019909216919091179055612fd986600d63ffffffff6147e816565b600160a060020a03891660009081526014602052604090208054608060020a909204605060020a0279ffffffffffffffffffffffffffffffff000000000000000000001990921691909117905561303786601d63ffffffff61479416565b600160a060020a0389166000908152601460205260408120600101805460f860020a90930490910b60ff16608060020a0270ff000000000000000000000000000000001990921691909117905561309586601e63ffffffff61479416565b600160a060020a0389166000908152601460205260408120805460f860020a90930490910b60ff1660d060020a027aff0000000000000000000000000000000000000000000000000000199092169190911790556130fa86601f63ffffffff6147e816565b600160a060020a038916600090815260146020526040902060010180546001608060020a031916608060020a90920491909117905561313a86602f6147d2565b600160a060020a03891660009081526014602052604090206001908101805460f060020a90930490910b61ffff16710100000000000000000000000000000000000272ffff00000000000000000000000000000000001990921691909117905560f860020a6131b087603163ffffffff61479416565b600160f860020a031916146131c65760006131c9565b60015b600160a060020a038916600090815260146020526040902060010180549115157301000000000000000000000000000000000000000273ff000000000000000000000000000000000000001990921691909117905561322f86603263ffffffff6147d216565b600160a060020a03891660008181526014602052604081206001808201805460f060020a909604820b61ffff16740100000000000000000000000000000000000000000275ffff00000000000000000000000000000000000000001990961695909517909455601680548086019091557fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428981018054600160a060020a03191685179055928252600301919091556015906132f089600b63ffffffff6147d216565b600160f060020a0319168152602081019190915260400160009081209061331e89600d63ffffffff6147e816565b6fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020019081526020016000208990806001815401808255809150509060018203906000526020600020016000909192909190916101000a815481600160a060020a030219169083600160a060020a0316021790555003601460008a600160a060020a0316600160a060020a03168152602001908152602001600020600201819055506001601460008a600160a060020a0316600160a060020a0316815260200190815260200160002060040160006101000a81548160ff02191690831515021790555087600160a060020a03167fdc94eebf39359cb097be68bd4890a58fce65c66d2d284d4349f666013dc8a43d60405160405180910390a2600d54604080517f18a6d58b000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152602482018b9052915191909216916318a6d58b91604480830192600092919082900301818387803b158015612db157600080fd5b600160f860020a031985167f330000000000000000000000000000000000000000000000000000000000000014156139f357600254600160a060020a038981169116146134f957600080fd5b600a600061350e88600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205487101561353557600080fd5b61354e61354987606d63ffffffff61481416565b610e66565b1561355857600080fd5b6008600061356d88600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205460ff16151561359657600080fd5b6135a786606d63ffffffff61481416565b600160a060020a0381166000908152601860205260409020805463ffffffff1916600387810b63ffffffff9081169290921767ffffffff0000000019166401000000009188900b8316919091021790915590925061360a908790600b906147d216565b600160a060020a0383166000908152601860205260409020805460f060020a909204604060020a0269ffff00000000000000001990921691909117905561365886600d63ffffffff6147e816565b600160a060020a03831660009081526018602052604090208054608060020a909204605060020a0279ffffffffffffffffffffffffffffffff00000000000000000000199092169190911790556136b686601d63ffffffff6147e816565b600160a060020a038316600090815260186020526040902060010180546001608060020a031916608060020a9092049190911790556136f686602d6147e8565b600160a060020a038316600090815260186020526040902060010180546fffffffffffffffffffffffffffffffff16608060020a9283900490920291909117905561374286603d6147fe565b600160a060020a03831660009081526018602052604090206002015561376f86605d63ffffffff6147e816565b600160a060020a03831660008181526018602052604081206003810180546001608060020a031916608060020a90950494909417909355601a805460018181019092557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e81018054600160a060020a0319169094179093556005909301919091556019906137fe89600b6147d2565b600160f060020a0319168152602081019190915260400160009081209061382c89600d63ffffffff6147e816565b6001608060020a03191681526020808201929092526040908101600090812080546001808201835591835284832081018054600160a060020a031916600160a060020a038a169081179091558084526018865292849020959003810160048601556006909401805460ff19169094179093558051928352517ff45ad76a8c4c14053708bfd052607c5e35446beb04fbdff6f2f3c9dde8e83b379281900390910190a1600d54604080517fd4d84da5000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018b90529151919092169163d4d84da591604480830192600092919082900301818387803b15801561393c57600080fd5b505af1158015613950573d6000803e3d6000fd5b5050600c54600d54604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018d9052905191909216935063a9059cbb925060448083019260209291908290030181600087803b1580156139c657600080fd5b505af11580156139da573d6000803e3d6000fd5b505050506040513d60208110156139f057600080fd5b50505b5050505050505050565b60056020526000908152604090205460ff1681565b60096020526000908152604090205460ff1681565b600160a060020a031660009081526013602052604090205490565b60005433600160a060020a03908116911614613a5d57600080fd5b600160a060020a0381161515613a7257600080fd5b600160a060020a03166000908152600560205260409020805460ff19166001179055565b60065462010000900460ff1681565b6060601a80548060200260200160405190810160405280929190818152602001828054801561199157602002820191906000526020600020908154600160a060020a03168152600190910190602001808311611973575050505050905090565b60065460009060ff1615613b1857600080fd5b33600160a060020a0381166000908152601460205260408120548491604060020a90910460f060020a0290808080613b69613b5288611093565b613b5d576001613b60565b60025b60ff1686611c99565b9350613bf3600e60009054906101000a9004600160a060020a0316600160a060020a03166350ccf36b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015613bc157600080fd5b505af1158015613bd5573d6000803e3d6000fd5b505050506040513d6020811015613beb57600080fd5b505185614844565b600d54604080517fad71766e000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152915193965091169163ad71766e916024808201926020929091908290030181600087803b158015613c5d57600080fd5b505af1158015613c71573d6000803e3d6000fd5b505050506040513d6020811015613c8757600080fd5b50519150613c958287614876565b905082811115613ca457600080fd5b613cad336146c0565b1515613cb857600080fd5b33600160a060020a03168a600160a060020a031614151515613cd957600080fd5b600d54604080517ff5923a6e000000000000000000000000000000000000000000000000000000008152600160a060020a0333811660048301528d81166024830152604482018d90529151919092169163f5923a6e91606480830192600092919082900301818387803b158015613d4f57600080fd5b505af1158015613d63573d6000803e3d6000fd5b50506006546040805160e160020a63660ea601028152600160a060020a038f8116600483015291516301000000909304909116935063cc1d4c0292506024808201926020929091908290030181600087803b158015613dc157600080fd5b505af1158015613dd5573d6000803e3d6000fd5b505050506040513d6020811015613deb57600080fd5b505115613f9757600160a060020a033381166000908152600f60209081526040808320938e16835292905220549750871515613e5057600160a060020a033381166000908152600f60209081526040808320938e168352929052206127109081905597505b600160a060020a033316600090815260136020526040902054613e8990612710613e7a8c8c614844565b811515613e8357fe5b04614876565b600160a060020a0333166000908152601360205260409020556064613eaf89604f614844565b811515613eb857fe5b04600f600033600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002081905550613f34601060008c600160a060020a0316600160a060020a03168152602001908152602001600020548a614876565b600160a060020a03808c1660009081526010602090815260408083209490945533909216815260119091522054613f6b908a614876565b600160a060020a0333166000908152601160209081526040808320939093556012905220805460010190555b89600160a060020a031633600160a060020a03167f3990db2d31862302a685e8086b5755072a6e2b5b780af1ee81ece35ee3cd33458b6040518082815260200191505060405180910390a350505050505050505050565b60005433600160a060020a0390811691161461400957600080fd5b60065462010000900460ff161561401f57600080fd5b60078054600160a060020a03909216600160a060020a03199092169190911790556006805462ff0000191662010000179055565b33600160a060020a038116600090815260056020526040812054909182918291829160ff16151561408357600080fd5b61408c866146c0565b151561409757600080fd5b600160a060020a038616600090815260146020908152604080832060028101549054604060020a810460f060020a02600160f060020a031916855260158452828520605060020a909104608060020a026001608060020a0319168552909252909120805491965090600019810190811061410d57fe5b600091825260208083209190910154600160a060020a03898116845260148352604080852054604060020a810460f060020a02600160f060020a031916865260158552818620605060020a909104608060020a026001608060020a03191686529093529190922080549190921695508591908790811061418957fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790558683168252601481526040808320600201899055928916825282822054604060020a810460f060020a02600160f060020a031916835260158252838320605060020a909104608060020a026001608060020a031916835290522080549061421c906000198301614885565b50600160a060020a0386166000908152601460205260409020600301546016805491945090600019810190811061424f57fe5b60009182526020909120015460168054600160a060020a03909216935083918590811061427857fe5b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055918416815260149091526040902060030183905560168054906142c7906000198301614885565b50600160a060020a0380871660008181526014602052604080822080547affffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101805475ffffffffffffffffffffffffffffffffffffffffffff1916905560028101839055600381018390556004908101805460ff19169055600d5482517fb71738f1000000000000000000000000000000000000000000000000000000008152918201949094529051929093169263b71738f1926024808301939282900301818387803b15801561439857600080fd5b505af11580156143ac573d6000803e3d6000fd5b5050600d54604080517fd83edd70000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152915191909216935063d83edd709250602480830192600092919082900301818387803b15801561441757600080fd5b505af115801561442b573d6000803e3d6000fd5b505060408051600160a060020a038a811682529151339290921693507fcf9fc954c975d15bad8f5fa3c1cd94f55105a98b1ecf33021ebb059122277f8f925081900360200190a2505050505050565b60015433600160a060020a0390811691161461449557600080fd5b600160f060020a03199091166000908152600b6020526040902055565b600b6020526000908152604090205481565b600160a060020a0380821660008181526014602090815260408083208054600180830154600480850154600d5487517f8d837f380000000000000000000000000000000000000000000000000000000081529283019a909a529551600385810b9b640100000000870490910b9a60f060020a604060020a8804029a608060020a605060020a890481029b60d060020a909904820b9a8782029a918804830b997101000000000000000000000000000000000089048a0b99939860ff928316987301000000000000000000000000000000000000008204909316977401000000000000000000000000000000000000000090910490940b95929490921692638d837f389260248084019391929182900301818b87803b1580156145e557600080fd5b505af11580156145f9573d6000803e3d6000fd5b505050506040513d602081101561460f57600080fd5b50519c9e9b9d50999b989a9799509597949693959193909250565b600654610100900460ff1681565b600160f060020a0319821660009081526015602090815260408083206001608060020a03198516845282529182902080548351818402810184019094528084526060939283018282801561272a57602002820191906000526020600020908154600160a060020a0316815260019091019060200180831161270c575050505050905092915050565b600160a060020a038116600090815260146020526040902054604060020a900460f060020a02600160f060020a0319161515919050565b60005433600160a060020a0390811691161461471257600080fd5b600654610100900460ff161561472757600080fd5b6006805461ff0019600160a060020a0390931663010000000276ffffffffffffffffffffffffffffffffffffffff000000199091161791909116610100179055565b600160a060020a039182166000908152600f6020908152604080832093909416825291909152205490565b600080826001018451101515156147aa57600080fd5b505081810160200151805b5092915050565b600080826004018451101515156147aa57600080fd5b600080826002018451101515156147aa57600080fd5b600080826010018451101515156147aa57600080fd5b600080826020018451101515156147aa57600080fd5b6000808260140184511015151561482a57600080fd5b505001602001516c01000000000000000000000000900490565b60008083151561485757600091506147b5565b5082820282848281151561486757fe5b041461486f57fe5b9392505050565b60008282018381101561486f57fe5b8154818355818111156148a9576000838152602090206148a99181019083016148ae565b505050565b61199991905b808211156148c857600081556001016148b4565b50905600a165627a7a72305820a34ae3cd5140b74ce2a7d0f03a58b2ebb2d2566d167b4e095d48a2d884b47db10029

Swarm Source

bzzr://a34ae3cd5140b74ce2a7d0f03a58b2ebb2d2566d167b4e095d48a2d884b47db1

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.