Contract Address Details
contract

0x521211789711E7048E900d16310e1De940B1e53B

Contract Name
HomeMediator
Creator
0xe50cc2–d8dc07 at 0x617f64–1eeda4
Balance
0 SPOA
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
27172849
Contract name:
HomeMediator




Optimization enabled
true
Compiler version
v0.4.24+commit.e67f0147




Optimization runs
200
EVM Version
default




Verified at
2019-10-04T15:04:35.800245Z

Contract source code

// File: bridge-contracts/contracts/upgradeability/EternalStorage.sol

pragma solidity 0.4.24;

/**
 * @title EternalStorage
 * @dev This contract holds all the necessary state variables to carry out the storage of any contract.
 */
contract EternalStorage {
    mapping(bytes32 => uint256) internal uintStorage;
    mapping(bytes32 => string) internal stringStorage;
    mapping(bytes32 => address) internal addressStorage;
    mapping(bytes32 => bytes) internal bytesStorage;
    mapping(bytes32 => bool) internal boolStorage;
    mapping(bytes32 => int256) internal intStorage;

}

// File: bridge-contracts/contracts/upgradeable_contracts/Initializable.sol

pragma solidity 0.4.24;


contract Initializable is EternalStorage {
    bytes32 internal constant INITIALIZED = keccak256(abi.encodePacked("isInitialized"));
    bytes32 internal constant DEPLOYED_AT_BLOCK = keccak256(abi.encodePacked("deployedAtBlock"));

    function setInitialize() internal {
        boolStorage[INITIALIZED] = true;
    }

    function isInitialized() public view returns (bool) {
        return boolStorage[INITIALIZED];
    }

    function deployedAtBlock() external view returns (uint256) {
        return uintStorage[DEPLOYED_AT_BLOCK];
    }
}

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol

pragma solidity ^0.4.24;


/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * See https://github.com/ethereum/EIPs/issues/179
 */
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);
}

// File: bridge-contracts/contracts/upgradeable_contracts/Sacrifice.sol

pragma solidity 0.4.24;

contract Sacrifice {
    constructor(address _recipient) public payable {
        selfdestruct(_recipient);
    }
}

// File: bridge-contracts/contracts/upgradeable_contracts/Claimable.sol

pragma solidity 0.4.24;



contract Claimable {
    bytes4 internal constant TRANSFER = 0xa9059cbb; // transfer(address,uint256)

    modifier validAddress(address _to) {
        require(_to != address(0));
        /* solcov ignore next */
        _;
    }

    function claimValues(address _token, address _to) internal {
        if (_token == address(0)) {
            claimNativeCoins(_to);
        } else {
            claimErc20Tokens(_token, _to);
        }
    }

    function claimNativeCoins(address _to) internal {
        uint256 value = address(this).balance;
        if (!_to.send(value)) {
            (new Sacrifice).value(value)(_to);
        }
    }

    function claimErc20Tokens(address _token, address _to) internal {
        ERC20Basic token = ERC20Basic(_token);
        uint256 balance = token.balanceOf(this);
        safeTransfer(_token, _to, balance);
    }

    function safeTransfer(address _token, address _to, uint256 _value) internal {
        bytes memory returnData;
        bool returnDataResult;
        bytes memory callData = abi.encodeWithSelector(TRANSFER, _to, _value);
        assembly {
            let result := call(gas, _token, 0x0, add(callData, 0x20), mload(callData), 0, 32)
            returnData := mload(0)
            returnDataResult := mload(0)

            switch result
                case 0 {
                    revert(0, 0)
                }
        }

        // Return data is optional
        if (returnData.length > 0) {
            require(returnDataResult);
        }
    }
}

// File: bridge-contracts/contracts/interfaces/IUpgradeabilityOwnerStorage.sol

pragma solidity 0.4.24;

interface IUpgradeabilityOwnerStorage {
    function upgradeabilityOwner() external view returns (address);
}

// File: bridge-contracts/contracts/upgradeable_contracts/Upgradeable.sol

pragma solidity 0.4.24;


contract Upgradeable {
    // Avoid using onlyUpgradeabilityOwner name to prevent issues with implementation from proxy contract
    modifier onlyIfUpgradeabilityOwner() {
        require(msg.sender == IUpgradeabilityOwnerStorage(this).upgradeabilityOwner());
        /* solcov ignore next */
        _;
    }
}

// File: bridge-contracts/contracts/libraries/Bytes.sol

pragma solidity 0.4.24;

library Bytes {
    function bytesToBytes32(bytes _bytes) internal pure returns (bytes32 result) {
        assembly {
            result := mload(add(_bytes, 32))
        }
    }
}

// File: bridge-contracts/contracts/interfaces/IAMB.sol

pragma solidity 0.4.24;

interface IAMB {
    function messageSender() external view returns (address);
    function maxGasPerTx() external view returns (uint256);
    function transactionHash() external view returns (bytes32);
    function messageCallStatus(bytes32 _txHash) external view returns (bool);
    function failedMessageDataHash(bytes32 _txHash) external view returns (bytes32);
    function failedMessageReceiver(bytes32 _txHash) external view returns (address);
    function failedMessageSender(bytes32 _txHash) external view returns (address);
    function requireToPassMessage(address _contract, bytes _data, uint256 _gas) external;
}

// File: bridge-contracts/contracts/upgradeable_contracts/Ownable.sol

pragma solidity 0.4.24;


/**
 * @title Ownable
 * @dev This contract has an owner address providing basic authorization control
 */
contract Ownable is EternalStorage {
    /**
    * @dev Event to show ownership has been transferred
    * @param previousOwner representing the address of the previous owner
    * @param newOwner representing the address of the new owner
    */
    event OwnershipTransferred(address previousOwner, address newOwner);

    /**
    * @dev Throws if called by any account other than the owner.
    */
    modifier onlyOwner() {
        require(msg.sender == owner());
        /* solcov ignore next */
        _;
    }

    /**
    * @dev Tells the address of the owner
    * @return the address of the owner
    */
    function owner() public view returns (address) {
        return addressStorage[keccak256(abi.encodePacked("owner"))];
    }

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

    /**
    * @dev Sets a new owner address
    */
    function setOwner(address newOwner) internal {
        emit OwnershipTransferred(owner(), newOwner);
        addressStorage[keccak256(abi.encodePacked("owner"))] = newOwner;
    }
}

// File: openzeppelin-solidity/contracts/AddressUtils.sol

pragma solidity ^0.4.24;


/**
 * Utility library of inline functions on addresses
 */
library AddressUtils {

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   * as the code is not actually created until after the constructor finishes.
   * @param _addr address to check
   * @return whether the target address is a contract
   */
  function isContract(address _addr) internal view returns (bool) {
    uint256 size;
    // XXX Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address.
    // See https://ethereum.stackexchange.com/a/14016/36603
    // for more details about how this works.
    // TODO Check this again before the Serenity release, because all addresses will be
    // contracts then.
    // solium-disable-next-line security/no-inline-assembly
    assembly { size := extcodesize(_addr) }
    return size > 0;
  }

}

// File: contracts/mediator/AMBMediator.sol

pragma solidity 0.4.24;





contract AMBMediator is EternalStorage, Ownable {
    bytes32 internal constant BRIDGE_CONTRACT = keccak256(abi.encodePacked("bridgeContract"));
    bytes32 internal constant MEDIATOR_CONTRACT = keccak256(abi.encodePacked("mediatorContract"));
    bytes32 internal constant REQUEST_GAS_LIMIT = keccak256(abi.encodePacked("requestGasLimit"));

    function setBridgeContract(address _bridgeContract) external onlyOwner {
        _setBridgeContract(_bridgeContract);
    }

    function _setBridgeContract(address _bridgeContract) internal {
        require(AddressUtils.isContract(_bridgeContract));
        addressStorage[BRIDGE_CONTRACT] = _bridgeContract;
    }

    function bridgeContract() public view returns (IAMB) {
        return IAMB(addressStorage[BRIDGE_CONTRACT]);
    }

    function setMediatorContractOnOtherSide(address _mediatorContract) external onlyOwner {
        _setMediatorContractOnOtherSide(_mediatorContract);
    }

    function _setMediatorContractOnOtherSide(address _mediatorContract) internal {
        addressStorage[MEDIATOR_CONTRACT] = _mediatorContract;
    }

    function mediatorContractOnOtherSide() public view returns (address) {
        return addressStorage[MEDIATOR_CONTRACT];
    }

    function setRequestGasLimit(uint256 _requestGasLimit) external onlyOwner {
        _setRequestGasLimit(_requestGasLimit);
    }

    function _setRequestGasLimit(uint256 _requestGasLimit) internal {
        require(_requestGasLimit <= bridgeContract().maxGasPerTx());
        uintStorage[REQUEST_GAS_LIMIT] = _requestGasLimit;
    }

    function requestGasLimit() public view returns (uint256) {
        return uintStorage[REQUEST_GAS_LIMIT];
    }
}

// File: contracts/kitty/ERC721.sol

pragma solidity 0.4.24;
/// @title Interface for contracts conforming to ERC-721: Non-Fungible Tokens
/// @author Dieter Shirley <[email protected]> (https://github.com/dete)

contract ERC721 {
    // Required methods
    function totalSupply() public view returns (uint256 total);
    function balanceOf(address _owner) public view returns (uint256 balance);
    function ownerOf(uint256 _tokenId) external view returns (address owner);
    function approve(address _to, uint256 _tokenId) external;
    function transfer(address _to, uint256 _tokenId) external;
    function transferFrom(address _from, address _to, uint256 _tokenId) external;

    // Events
    event Transfer(address from, address to, uint256 tokenId);
    event Approval(address owner, address approved, uint256 tokenId);

    // Optional
    // function name() public view returns (string name);
    // function symbol() public view returns (string symbol);
    // function tokensOfOwner(address _owner) external view returns (uint256[] tokenIds);
    // function tokenMetadata(uint256 _tokenId, string _preferredTransport) public view returns (string infoUrl);

    // ERC-165 Compatibility (https://github.com/ethereum/EIPs/issues/165)
    function supportsInterface(bytes4 _interfaceID) external view returns (bool);
}

// File: contracts/mediator/ERC721Bridge.sol

pragma solidity 0.4.24;




contract ERC721Bridge is EternalStorage {
    bytes32 internal constant ERC721_TOKEN = keccak256(abi.encodePacked("erc721token"));

    function erc721token() public view returns (ERC721) {
        return ERC721(addressStorage[ERC721_TOKEN]);
    }

    function setErc721token(address _token) internal {
        require(AddressUtils.isContract(_token));
        addressStorage[ERC721_TOKEN] = _token;
    }
}

// File: contracts/mediator/BasicMediator.sol

pragma solidity 0.4.24;







contract BasicMediator is Initializable, AMBMediator, ERC721Bridge, Upgradeable, Claimable {
    event FailedMessageFixed(bytes32 indexed dataHash, address recipient, uint256 tokenId);

    bytes32 internal constant NONCE = keccak256(abi.encodePacked("nonce"));
    bytes4 internal constant GET_KITTY = 0xe98b7f4d; // getKitty(uint256)

    function initialize(
        address _bridgeContract,
        address _mediatorContract,
        address _erc721token,
        uint256 _requestGasLimit,
        address _owner
    ) external returns (bool) {
        require(!isInitialized());

        _setBridgeContract(_bridgeContract);
        _setMediatorContractOnOtherSide(_mediatorContract);
        setErc721token(_erc721token);
        _setRequestGasLimit(_requestGasLimit);
        setOwner(_owner);
        setNonce(keccak256(abi.encodePacked(address(this))));
        setInitialize();

        return isInitialized();
    }

    function getBridgeInterfacesVersion() external pure returns (uint64 major, uint64 minor, uint64 patch) {
        return (1, 0, 0);
    }

    function getBridgeMode() external pure returns (bytes4 _data) {
        return bytes4(keccak256(abi.encodePacked("nft-to-nft-amb")));
    }

    function transferToken(address _from, uint256 _tokenId) external {
        ERC721 token = erc721token();
        address to = address(this);

        token.transferFrom(_from, to, _tokenId);
        bridgeSpecificActionsOnTokenTransfer(_from, _tokenId);
    }

    /**
    *  getKitty(uint256) returns:
    *       bool isGestating,
    *       bool isReady,
    *       uint256 cooldownIndex,
    *       uint256 nextActionAt,
    *       uint256 siringWithId,
    *       uint256 birthTime,
    *       uint256 matronId,
    *       uint256 sireId,
    *       uint256 generation,
    *       uint256 genes
    **/
    function getMetadata(uint256 _tokenId) internal view returns (bytes memory metadata) {
        bytes memory callData = abi.encodeWithSelector(GET_KITTY, _tokenId);
        address tokenAddress = erc721token();
        metadata = new bytes(320);
        assembly {
            let result := call(gas, tokenAddress, 0x0, add(callData, 0x20), mload(callData), 0, 0)
            returndatacopy(add(metadata, 0x20), 0, returndatasize)

            switch result
                case 0 {
                    revert(0, 0)
                }
        }
    }

    function nonce() internal view returns (bytes32) {
        return Bytes.bytesToBytes32(bytesStorage[NONCE]);
    }

    function setNonce(bytes32 _hash) internal {
        bytesStorage[NONCE] = abi.encodePacked(_hash);
    }

    function setMessageHashTokenId(bytes32 _hash, uint256 _tokenId) internal {
        uintStorage[keccak256(abi.encodePacked("messageHashTokenId", _hash))] = _tokenId;
    }

    function messageHashTokenId(bytes32 _hash) internal view returns (uint256) {
        return uintStorage[keccak256(abi.encodePacked("messageHashTokenId", _hash))];
    }

    function setMessageHashRecipient(bytes32 _hash, address _recipient) internal {
        addressStorage[keccak256(abi.encodePacked("messageHashRecipient", _hash))] = _recipient;
    }

    function messageHashRecipient(bytes32 _hash) internal view returns (address) {
        return addressStorage[keccak256(abi.encodePacked("messageHashRecipient", _hash))];
    }

    function setMessageHashFixed(bytes32 _hash) internal {
        boolStorage[keccak256(abi.encodePacked("messageHashFixed", _hash))] = true;
    }

    function messageHashFixed(bytes32 _hash) public view returns (bool) {
        return boolStorage[keccak256(abi.encodePacked("messageHashFixed", _hash))];
    }

    function requestFailedMessageFix(bytes32 _txHash) external {
        require(!bridgeContract().messageCallStatus(_txHash));
        require(bridgeContract().failedMessageReceiver(_txHash) == address(this));
        require(bridgeContract().failedMessageSender(_txHash) == mediatorContractOnOtherSide());
        bytes32 dataHash = bridgeContract().failedMessageDataHash(_txHash);

        bytes4 methodSelector = this.fixFailedMessage.selector;
        bytes memory data = abi.encodeWithSelector(methodSelector, dataHash);
        bridgeContract().requireToPassMessage(mediatorContractOnOtherSide(), data, requestGasLimit());
    }

    function claimTokens(address _token, address _to) public onlyIfUpgradeabilityOwner validAddress(_to) {
        claimValues(_token, _to);
    }

    function fixFailedMessage(bytes32 _dataHash) external;

    function bridgeSpecificActionsOnTokenTransfer(address _from, uint256 _tokenId) internal;
}

// File: contracts/interfaces/IForeignMediator.sol

pragma solidity 0.4.24;

interface IForeignMediator {
    function handleBridgedTokens(address _recipient, uint256 _tokenId, bytes32 _nonce) external;
}

// File: contracts/interfaces/ISimpleBridgeKitty.sol

pragma solidity 0.4.24;

interface ISimpleBridgeKitty {
    function mint(
        uint256 _tokenId,
        bool _isReady,
        uint256 _cooldownIndex,
        uint256 _nextActionAt,
        uint256 _siringWithId,
        uint256 _birthTime,
        uint256 _matronId,
        uint256 _sireId,
        uint256 _generation,
        uint256 _genes,
        address _owner
    ) external;
    function burn(uint256 _tokenId) external;
}

// File: contracts/mediator/HomeMediator.sol

pragma solidity 0.4.24;




contract HomeMediator is BasicMediator {
    function passMessage(address _from, uint256 _tokenId, bytes _metadata) internal {
        bytes4 methodSelector = IForeignMediator(0).handleBridgedTokens.selector;
        bytes memory data = abi.encodeWithSelector(methodSelector, _from, _tokenId, nonce());

        bytes32 dataHash = keccak256(data);
        setMessageHashTokenId(dataHash, _tokenId);
        setMessageHashRecipient(dataHash, _from);
        setMessageHashMetadata(dataHash, _metadata);
        setNonce(dataHash);

        bridgeContract().requireToPassMessage(mediatorContractOnOtherSide(), data, requestGasLimit());
    }

    function handleBridgedTokens(
        address _recipient,
        uint256 _tokenId,
        bytes _metadata,
        bytes32 /* _nonce */
    ) external {
        require(msg.sender == address(bridgeContract()));
        require(bridgeContract().messageSender() == mediatorContractOnOtherSide());

        mintToken(_recipient, _tokenId, _metadata);
    }

    function mintToken(address _recipient, uint256 _tokenId, bytes _metadata) internal {
        ISimpleBridgeKitty(erc721token()).mint(
            _tokenId,
            getMetadataBoolValue(_metadata, 2), // isReady
            getMetadataUintValue(_metadata, 3), // cooldownIndex
            getMetadataUintValue(_metadata, 4), // nextActionAt
            getMetadataUintValue(_metadata, 5), // siringWithId
            getMetadataUintValue(_metadata, 6), // birthTime
            getMetadataUintValue(_metadata, 7), // matronId
            getMetadataUintValue(_metadata, 8), // sireId
            getMetadataUintValue(_metadata, 9), // generation
            getMetadataUintValue(_metadata, 10), // genes
            _recipient
        );
    }

    function bridgeSpecificActionsOnTokenTransfer(address _from, uint256 _tokenId) internal {
        bytes memory metadata = getMetadata(_tokenId);

        ISimpleBridgeKitty(erc721token()).burn(_tokenId);
        passMessage(_from, _tokenId, metadata);
    }

    function getMetadataUintValue(bytes _data, uint256 _index) internal pure returns (uint256 value) {
        uint256 offset = 32 * _index;
        assembly {
            value := mload(add(_data, offset))
        }
    }

    function getMetadataBoolValue(bytes _data, uint256 _index) internal pure returns (bool value) {
        uint256 offset = 32 * _index;
        assembly {
            value := mload(add(_data, offset))
        }
    }

    function setMessageHashMetadata(bytes32 _hash, bytes _metadata) internal {
        bytesStorage[keccak256(abi.encodePacked("messageHashMetadata", _hash))] = _metadata;
    }

    function messageHashMetadata(bytes32 _hash) internal view returns (bytes) {
        return bytesStorage[keccak256(abi.encodePacked("messageHashMetadata", _hash))];
    }

    function fixFailedMessage(bytes32 _dataHash) external {
        require(msg.sender == address(bridgeContract()));
        require(bridgeContract().messageSender() == mediatorContractOnOtherSide());
        require(!messageHashFixed(_dataHash));

        address recipient = messageHashRecipient(_dataHash);
        uint256 tokenId = messageHashTokenId(_dataHash);
        bytes memory metadata = messageHashMetadata(_dataHash);

        setMessageHashFixed(_dataHash);
        mintToken(recipient, tokenId, metadata);

        emit FailedMessageFixed(_dataHash, recipient, tokenId);
    }
}
        

Contract ABI

[{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"fixFailedMessage","inputs":[{"type":"bytes32","name":"_dataHash"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setBridgeContract","inputs":[{"type":"address","name":"_bridgeContract"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferToken","inputs":[{"type":"address","name":"_from"},{"type":"uint256","name":"_tokenId"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"isInitialized","inputs":[],"constant":true},{"type":"function","stateMutability":"pure","payable":false,"outputs":[{"type":"bytes4","name":"_data"}],"name":"getBridgeMode","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":""}],"name":"initialize","inputs":[{"type":"address","name":"_bridgeContract"},{"type":"address","name":"_mediatorContract"},{"type":"address","name":"_erc721token"},{"type":"uint256","name":"_requestGasLimit"},{"type":"address","name":"_owner"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"handleBridgedTokens","inputs":[{"type":"address","name":"_recipient"},{"type":"uint256","name":"_tokenId"},{"type":"bytes","name":"_metadata"},{"type":"bytes32","name":""}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"claimTokens","inputs":[{"type":"address","name":"_token"},{"type":"address","name":"_to"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setMediatorContractOnOtherSide","inputs":[{"type":"address","name":"_mediatorContract"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"mediatorContractOnOtherSide","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":""}],"name":"messageHashFixed","inputs":[{"type":"bytes32","name":"_hash"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"deployedAtBlock","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"requestFailedMessageFix","inputs":[{"type":"bytes32","name":"_txHash"}],"constant":false},{"type":"function","stateMutability":"pure","payable":false,"outputs":[{"type":"uint64","name":"major"},{"type":"uint64","name":"minor"},{"type":"uint64","name":"patch"}],"name":"getBridgeInterfacesVersion","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":""}],"name":"requestGasLimit","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"bridgeContract","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":""}],"name":"erc721token","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"setRequestGasLimit","inputs":[{"type":"uint256","name":"_requestGasLimit"}],"constant":false},{"type":"event","name":"FailedMessageFixed","inputs":[{"type":"bytes32","name":"dataHash","indexed":true},{"type":"address","name":"recipient","indexed":false},{"type":"uint256","name":"tokenId","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":false},{"type":"address","name":"newOwner","indexed":false}],"anonymous":false}]
            

Contract Creation Code

0x608060405234801561001057600080fd5b50612686806100206000396000f3006080604052600436106100f85763ffffffff60e060020a6000350416630950d51581146100fd5780630b26cf66146101175780631072cbea14610138578063392e53cd1461015c578063437764df14610185578063530b97a4146101cc5780635d4f3b2a1461020357806369ffa08a146102375780636e5d6bea1461025e578063871c07601461027f5780638da5cb5b146102b057806399650862146102c55780639a454b99146102dd5780639a4a4395146103045780639cb7595a1461031c578063be3b625b1461035d578063cd59658314610372578063e5ebccf414610387578063f2fde38b1461039c578063f3b83791146103bd575b600080fd5b34801561010957600080fd5b506101156004356103d5565b005b34801561012357600080fd5b50610115600160a060020a036004351661051c565b34801561014457600080fd5b50610115600160a060020a0360043516602435610544565b34801561016857600080fd5b506101716105f0565b604080519115158252519081900360200190f35b34801561019157600080fd5b5061019a6106a9565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff199092168252519081900360200190f35b3480156101d857600080fd5b50610171600160a060020a03600435811690602435811690604435811690606435906084351661074c565b34801561020f57600080fd5b5061011560048035600160a060020a0316906024803591604435918201910135606435610839565b34801561024357600080fd5b50610115600160a060020a036004358116906024351661092c565b34801561026a57600080fd5b50610115600160a060020a03600435166109cf565b34801561028b57600080fd5b506102946109f4565b60408051600160a060020a039092168252519081900360200190f35b3480156102bc57600080fd5b50610294610ab2565b3480156102d157600080fd5b50610171600435610b26565b3480156102e957600080fd5b506102f2610bef565b60408051918252519081900360200190f35b34801561031057600080fd5b50610115600435610ca3565b34801561032857600080fd5b50610331611056565b6040805167ffffffffffffffff9485168152928416602084015292168183015290519081900360600190f35b34801561036957600080fd5b506102f2611060565b34801561037e57600080fd5b506102946110d3565b34801561039357600080fd5b50610294611147565b3480156103a857600080fd5b50610115600160a060020a03600435166111bb565b3480156103c957600080fd5b506101156004356111f5565b60008060606103e26110d3565b600160a060020a031633146103f657600080fd5b6103fe6109f4565b600160a060020a031661040f6110d3565b600160a060020a031663d67bdd256040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561044c57600080fd5b505af1158015610460573d6000803e3d6000fd5b505050506040513d602081101561047657600080fd5b5051600160a060020a03161461048b57600080fd5b61049484610b26565b1561049e57600080fd5b6104a78461121a565b92506104b2846112e9565b91506104bd846113ae565b90506104c884611516565b6104d38383836115e8565b60408051600160a060020a038516815260208101849052815186927f06297b0797e3363e96e454edd4ab62862051bf559a7a431ce09415306771d133928290030190a250505050565b610524610ab2565b600160a060020a0316331461053857600080fd5b6105418161170a565b50565b60008061054f611147565b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301523060248301819052604483018890529251939550919350908416916323b872dd9160648082019260009290919082900301818387803b1580156105c857600080fd5b505af11580156105dc573d6000803e3d6000fd5b505050506105ea84846117fb565b50505050565b60006004600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d0190506040516020818303038152906040526040518082805190602001908083835b602083106106655780518252601f199092019160209182019101610646565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205460ff1693505050505b90565b600060405160200180807f6e66742d746f2d6e66742d616d62000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b6020831061071a5780518252601f1990920191602091820191016106fb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b60006107566105f0565b1561076057600080fd5b6107698661170a565b6107728561187b565b61077b846118ee565b61078483611975565b61078d82611aa6565b604080516c01000000000000000000000000300260208083019190915282518083036014018152603490920192839052815161081f93918291908401908083835b602083106107ed5780518252601f1990920191602091820191016107ce565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020611b64565b610827611c3d565b61082f6105f0565b9695505050505050565b6108416110d3565b600160a060020a0316331461085557600080fd5b61085d6109f4565b600160a060020a031661086e6110d3565b600160a060020a031663d67bdd256040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156108ab57600080fd5b505af11580156108bf573d6000803e3d6000fd5b505050506040513d60208110156108d557600080fd5b5051600160a060020a0316146108ea57600080fd5b610925858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437506115e8945050505050565b5050505050565b30600160a060020a0316636fde82026040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561096a57600080fd5b505af115801561097e573d6000803e3d6000fd5b505050506040513d602081101561099457600080fd5b5051600160a060020a031633146109aa57600080fd5b80600160a060020a03811615156109c057600080fd5b6109ca8383611cfe565b505050565b6109d7610ab2565b600160a060020a031633146109eb57600080fd5b6105418161187b565b60006002600060405160200180807f6d65646961746f72436f6e74726163740000000000000000000000000000000081525060100190506040516020818303038152906040526040518082805190602001908083835b60208310610a695780518252601f199092019160209182019101610a4a565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316949350505050565b60006002600060405160200180807f6f776e6572000000000000000000000000000000000000000000000000000000815250600501905060405160208183030381529060405260405180828051906020019080838360208310610a695780518252601f199092019160209182019101610a4a565b6000600460008360405160200180807f6d6573736167654861736846697865640000000000000000000000000000000081525060100182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b60208310610bab5780518252601f199092019160209182019101610b8c565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205460ff1695945050505050565b600080600060405160200180807f6465706c6f7965644174426c6f636b0000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b60208310610c635780518252601f199092019160209182019101610c44565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054949350505050565b6000806060610cb06110d3565b600160a060020a031663cb08a10c856040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610d0057600080fd5b505af1158015610d14573d6000803e3d6000fd5b505050506040513d6020811015610d2a57600080fd5b505115610d3657600080fd5b30610d3f6110d3565b600160a060020a0316633f9a8e7e866040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610d8f57600080fd5b505af1158015610da3573d6000803e3d6000fd5b505050506040513d6020811015610db957600080fd5b5051600160a060020a031614610dce57600080fd5b610dd66109f4565b600160a060020a0316610de76110d3565b600160a060020a0316634a610b04866040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610e3757600080fd5b505af1158015610e4b573d6000803e3d6000fd5b505050506040513d6020811015610e6157600080fd5b5051600160a060020a031614610e7657600080fd5b610e7e6110d3565b600160a060020a031663e37c3289856040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610ece57600080fd5b505af1158015610ee2573d6000803e3d6000fd5b505050506040513d6020811015610ef857600080fd5b5051604080516024808201849052825180830390910181526044909101909152602081018051600160e060020a03167f0950d515000000000000000000000000000000000000000000000000000000009081179091529194509092509050610f5e6110d3565b600160a060020a031663dc8601b3610f746109f4565b83610f7d611060565b6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015610fea578181015183820152602001610fd2565b50505050905090810190601f1680156110175780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561103857600080fd5b505af115801561104c573d6000803e3d6000fd5b5050505050505050565b6001600080909192565b600080600060405160200180807f726571756573744761734c696d69740000000000000000000000000000000000815250600f01905060405160208183030381529060405260405180828051906020019080838360208310610c635780518252601f199092019160209182019101610c44565b60006002600060405160200180807f627269646765436f6e7472616374000000000000000000000000000000000000815250600e01905060405160208183030381529060405260405180828051906020019080838360208310610a695780518252601f199092019160209182019101610a4a565b60006002600060405160200180807f657263373231746f6b656e000000000000000000000000000000000000000000815250600b01905060405160208183030381529060405260405180828051906020019080838360208310610a695780518252601f199092019160209182019101610a4a565b6111c3610ab2565b600160a060020a031633146111d757600080fd5b600160a060020a03811615156111ec57600080fd5b61054181611aa6565b6111fd610ab2565b600160a060020a0316331461121157600080fd5b61054181611975565b6000600260008360405160200180807f6d65737361676548617368526563697069656e7400000000000000000000000081525060140182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061129f5780518252601f199092019160209182019101611280565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a031695945050505050565b60008060008360405160200180807f6d65737361676548617368546f6b656e4964000000000000000000000000000081525060120182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061136d5780518252601f19909201916020918201910161134e565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205495945050505050565b6060600360008360405160200180807f6d657373616765486173684d657461646174610000000000000000000000000081525060130182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b602083106114335780518252601f199092019160209182019101611414565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561150a5780601f106114df5761010080835404028352916020019161150a565b820191906000526020600020905b8154815290600101906020018083116114ed57829003601f168201915b50505050509050919050565b6001600460008360405160200180807f6d6573736167654861736846697865640000000000000000000000000000000081525060100182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061159b5780518252601f19909201916020918201910161157c565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805460ff19169415159490941790935550505050565b6115f0611147565b600160a060020a031663319346678361160a846002611d26565b611615856003611d26565b611620866004611d26565b61162b876005611d26565b611636886006611d26565b611641896007611d26565b61164c8a6008611d26565b6116578b6009611d26565b6116628c600a611d26565b6040805160e060020a63ffffffff8e16028152600481019b909b5298151560248b015260448a01979097526064890195909552608488019390935260a487019190915260c486015260e4850152610104840152610124830152600160a060020a0387166101448301525161016480830192600092919082900301818387803b1580156116ed57600080fd5b505af1158015611701573d6000803e3d6000fd5b50505050505050565b61171381611d2e565b151561171e57600080fd5b806002600060405160200180807f627269646765436f6e7472616374000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b602083106117925780518252601f199092019160209182019101611773565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03959095169490941790935550505050565b606061180682611d36565b9050611810611147565b600160a060020a03166342966c68836040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561185857600080fd5b505af115801561186c573d6000803e3d6000fd5b505050506109ca838383611de0565b806002600060405160200180807f6d65646961746f72436f6e7472616374000000000000000000000000000000008152506010019050604051602081830303815290604052604051808280519060200190808383602083106117925780518252601f199092019160209182019101611773565b6118f781611d2e565b151561190257600080fd5b806002600060405160200180807f657263373231746f6b656e000000000000000000000000000000000000000000815250600b019050604051602081830303815290604052604051808280519060200190808383602083106117925780518252601f199092019160209182019101611773565b61197d6110d3565b600160a060020a031663e5789d036040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156119ba57600080fd5b505af11580156119ce573d6000803e3d6000fd5b505050506040513d60208110156119e457600080fd5b50518111156119f257600080fd5b8060008060405160200180807f726571756573744761734c696d69740000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b60208310611a655780518252601f199092019160209182019101611a46565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000209390935550505050565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0611acf610ab2565b60408051600160a060020a03928316815291841660208301528051918290030190a1806002600060405160200180807f6f776e65720000000000000000000000000000000000000000000000000000008152506005019050604051602081830303815290604052604051808280519060200190808383602083106117925780518252601f199092019160209182019101611773565b60408051602080820184905282518083038201815282840184527f6e6f6e636500000000000000000000000000000000000000000000000000000060608401528351604581850301815260659093019384905282519093600393600093909282918401908083835b60208310611beb5780518252601f199092019160209182019101611bcc565b51815160001960209485036101000a01908116901991909116179052604080519490920184900390932086528583019690965250929093016000208451611c39959194509201919050612592565b5050565b60016004600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d0190506040516020818303038152906040526040518082805190602001908083835b60208310611cb25780518252601f199092019160209182019101611c93565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805460ff191694151594909417909355505050565b600160a060020a0382161515611d1c57611d1781612004565b611c39565b611c398282612068565b602002015190565b6000903b1190565b604080516024808201849052825180830390910181526044909101909152602081018051600160e060020a03167fe98b7f4d000000000000000000000000000000000000000000000000000000001790526060906000611d94611147565b60408051610140808252610160820190925291925060208201612800803883390190505092506000808351602085016000855af13d6000602086013e8080156100f85750505050919050565b7f6435914e0000000000000000000000000000000000000000000000000000000060606000828686611e10612106565b60408051600160a060020a03909416602485015260448401929092526064808401919091528151808403909101815260849092018152602082018051600160e060020a03167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19909416939093178352518151919450849290918291908083835b60208310611eac5780518252601f199092019160209182019101611e8d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050611ee58186612264565b611eef8187612329565b611ef98185612417565b611f0281611b64565b611f0a6110d3565b600160a060020a031663dc8601b3611f206109f4565b84611f29611060565b6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611f96578181015183820152602001611f7e565b50505050905090810190601f168015611fc35780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611fe457600080fd5b505af1158015611ff8573d6000803e3d6000fd5b50505050505050505050565b604051303190600160a060020a0383169082156108fc029083906000818181858888f193505050501515611c3957808261203c612610565b600160a060020a039091168152604051908190036020019082f080158015610925573d6000803e3d6000fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518391600091600160a060020a038416916370a0823191602480830192602092919082900301818787803b1580156120cd57600080fd5b505af11580156120e1573d6000803e3d6000fd5b505050506040513d60208110156120f757600080fd5b505190506105ea8484836124e9565b600061225f6003600060405160200180807f6e6f6e636500000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040526040518082805190602001908083835b6020831061217e5780518252601f19909201916020918201910161215f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122555780601f1061222a57610100808354040283529160200191612255565b820191906000526020600020905b81548152906001019060200180831161223857829003601f168201915b505050505061258b565b905090565b806000808460405160200180807f6d65737361676548617368546f6b656e4964000000000000000000000000000081525060120182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b602083106122e75780518252601f1990920191602091820191016122c8565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020939093555050505050565b80600260008460405160200180807f6d65737361676548617368526563697069656e7400000000000000000000000081525060140182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b602083106123ad5780518252601f19909201916020918201910161238e565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0395909516949094179093555050505050565b80600360008460405160200180807f6d657373616765486173684d657461646174610000000000000000000000000081525060130182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061249b5780518252601f19909201916020918201910161247c565b51815160001960209485036101000a019081169019919091161790526040805194909201849003909320865285830196909652509290930160002084516109ca959194509201919050612592565b60408051600160a060020a0384166024820152604480820184905282518083039091018152606490910190915260208181018051600160e060020a03167fa9059cbb000000000000000000000000000000000000000000000000000000001781528251606093600093909290918491828a5af160005193508392508080156100f85750506000835111156125835781151561258357600080fd5b505050505050565b6020015190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106125d357805160ff1916838001178555612600565b82800160010185558215612600579182015b828111156126005782518255916020019190600101906125e5565b5061260c92915061261f565b5090565b60405160218061263a83390190565b6106a691905b8082111561260c57600081556001016126255600608060405260405160208060218339810160405251600160a060020a038116ff00a165627a7a723058203751013e5368ed767543fcd7b74f8fc3d8c0a9d69255daf3cd7b4dca9c01b65c0029

Deployed ByteCode

0x6080604052600436106100f85763ffffffff60e060020a6000350416630950d51581146100fd5780630b26cf66146101175780631072cbea14610138578063392e53cd1461015c578063437764df14610185578063530b97a4146101cc5780635d4f3b2a1461020357806369ffa08a146102375780636e5d6bea1461025e578063871c07601461027f5780638da5cb5b146102b057806399650862146102c55780639a454b99146102dd5780639a4a4395146103045780639cb7595a1461031c578063be3b625b1461035d578063cd59658314610372578063e5ebccf414610387578063f2fde38b1461039c578063f3b83791146103bd575b600080fd5b34801561010957600080fd5b506101156004356103d5565b005b34801561012357600080fd5b50610115600160a060020a036004351661051c565b34801561014457600080fd5b50610115600160a060020a0360043516602435610544565b34801561016857600080fd5b506101716105f0565b604080519115158252519081900360200190f35b34801561019157600080fd5b5061019a6106a9565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff199092168252519081900360200190f35b3480156101d857600080fd5b50610171600160a060020a03600435811690602435811690604435811690606435906084351661074c565b34801561020f57600080fd5b5061011560048035600160a060020a0316906024803591604435918201910135606435610839565b34801561024357600080fd5b50610115600160a060020a036004358116906024351661092c565b34801561026a57600080fd5b50610115600160a060020a03600435166109cf565b34801561028b57600080fd5b506102946109f4565b60408051600160a060020a039092168252519081900360200190f35b3480156102bc57600080fd5b50610294610ab2565b3480156102d157600080fd5b50610171600435610b26565b3480156102e957600080fd5b506102f2610bef565b60408051918252519081900360200190f35b34801561031057600080fd5b50610115600435610ca3565b34801561032857600080fd5b50610331611056565b6040805167ffffffffffffffff9485168152928416602084015292168183015290519081900360600190f35b34801561036957600080fd5b506102f2611060565b34801561037e57600080fd5b506102946110d3565b34801561039357600080fd5b50610294611147565b3480156103a857600080fd5b50610115600160a060020a03600435166111bb565b3480156103c957600080fd5b506101156004356111f5565b60008060606103e26110d3565b600160a060020a031633146103f657600080fd5b6103fe6109f4565b600160a060020a031661040f6110d3565b600160a060020a031663d67bdd256040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561044c57600080fd5b505af1158015610460573d6000803e3d6000fd5b505050506040513d602081101561047657600080fd5b5051600160a060020a03161461048b57600080fd5b61049484610b26565b1561049e57600080fd5b6104a78461121a565b92506104b2846112e9565b91506104bd846113ae565b90506104c884611516565b6104d38383836115e8565b60408051600160a060020a038516815260208101849052815186927f06297b0797e3363e96e454edd4ab62862051bf559a7a431ce09415306771d133928290030190a250505050565b610524610ab2565b600160a060020a0316331461053857600080fd5b6105418161170a565b50565b60008061054f611147565b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301523060248301819052604483018890529251939550919350908416916323b872dd9160648082019260009290919082900301818387803b1580156105c857600080fd5b505af11580156105dc573d6000803e3d6000fd5b505050506105ea84846117fb565b50505050565b60006004600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d0190506040516020818303038152906040526040518082805190602001908083835b602083106106655780518252601f199092019160209182019101610646565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205460ff1693505050505b90565b600060405160200180807f6e66742d746f2d6e66742d616d62000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b6020831061071a5780518252601f1990920191602091820191016106fb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b60006107566105f0565b1561076057600080fd5b6107698661170a565b6107728561187b565b61077b846118ee565b61078483611975565b61078d82611aa6565b604080516c01000000000000000000000000300260208083019190915282518083036014018152603490920192839052815161081f93918291908401908083835b602083106107ed5780518252601f1990920191602091820191016107ce565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020611b64565b610827611c3d565b61082f6105f0565b9695505050505050565b6108416110d3565b600160a060020a0316331461085557600080fd5b61085d6109f4565b600160a060020a031661086e6110d3565b600160a060020a031663d67bdd256040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156108ab57600080fd5b505af11580156108bf573d6000803e3d6000fd5b505050506040513d60208110156108d557600080fd5b5051600160a060020a0316146108ea57600080fd5b610925858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437506115e8945050505050565b5050505050565b30600160a060020a0316636fde82026040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561096a57600080fd5b505af115801561097e573d6000803e3d6000fd5b505050506040513d602081101561099457600080fd5b5051600160a060020a031633146109aa57600080fd5b80600160a060020a03811615156109c057600080fd5b6109ca8383611cfe565b505050565b6109d7610ab2565b600160a060020a031633146109eb57600080fd5b6105418161187b565b60006002600060405160200180807f6d65646961746f72436f6e74726163740000000000000000000000000000000081525060100190506040516020818303038152906040526040518082805190602001908083835b60208310610a695780518252601f199092019160209182019101610a4a565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a0316949350505050565b60006002600060405160200180807f6f776e6572000000000000000000000000000000000000000000000000000000815250600501905060405160208183030381529060405260405180828051906020019080838360208310610a695780518252601f199092019160209182019101610a4a565b6000600460008360405160200180807f6d6573736167654861736846697865640000000000000000000000000000000081525060100182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b60208310610bab5780518252601f199092019160209182019101610b8c565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205460ff1695945050505050565b600080600060405160200180807f6465706c6f7965644174426c6f636b0000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b60208310610c635780518252601f199092019160209182019101610c44565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054949350505050565b6000806060610cb06110d3565b600160a060020a031663cb08a10c856040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610d0057600080fd5b505af1158015610d14573d6000803e3d6000fd5b505050506040513d6020811015610d2a57600080fd5b505115610d3657600080fd5b30610d3f6110d3565b600160a060020a0316633f9a8e7e866040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610d8f57600080fd5b505af1158015610da3573d6000803e3d6000fd5b505050506040513d6020811015610db957600080fd5b5051600160a060020a031614610dce57600080fd5b610dd66109f4565b600160a060020a0316610de76110d3565b600160a060020a0316634a610b04866040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610e3757600080fd5b505af1158015610e4b573d6000803e3d6000fd5b505050506040513d6020811015610e6157600080fd5b5051600160a060020a031614610e7657600080fd5b610e7e6110d3565b600160a060020a031663e37c3289856040518263ffffffff1660e060020a028152600401808260001916600019168152602001915050602060405180830381600087803b158015610ece57600080fd5b505af1158015610ee2573d6000803e3d6000fd5b505050506040513d6020811015610ef857600080fd5b5051604080516024808201849052825180830390910181526044909101909152602081018051600160e060020a03167f0950d515000000000000000000000000000000000000000000000000000000009081179091529194509092509050610f5e6110d3565b600160a060020a031663dc8601b3610f746109f4565b83610f7d611060565b6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015610fea578181015183820152602001610fd2565b50505050905090810190601f1680156110175780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561103857600080fd5b505af115801561104c573d6000803e3d6000fd5b5050505050505050565b6001600080909192565b600080600060405160200180807f726571756573744761734c696d69740000000000000000000000000000000000815250600f01905060405160208183030381529060405260405180828051906020019080838360208310610c635780518252601f199092019160209182019101610c44565b60006002600060405160200180807f627269646765436f6e7472616374000000000000000000000000000000000000815250600e01905060405160208183030381529060405260405180828051906020019080838360208310610a695780518252601f199092019160209182019101610a4a565b60006002600060405160200180807f657263373231746f6b656e000000000000000000000000000000000000000000815250600b01905060405160208183030381529060405260405180828051906020019080838360208310610a695780518252601f199092019160209182019101610a4a565b6111c3610ab2565b600160a060020a031633146111d757600080fd5b600160a060020a03811615156111ec57600080fd5b61054181611aa6565b6111fd610ab2565b600160a060020a0316331461121157600080fd5b61054181611975565b6000600260008360405160200180807f6d65737361676548617368526563697069656e7400000000000000000000000081525060140182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061129f5780518252601f199092019160209182019101611280565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002054600160a060020a031695945050505050565b60008060008360405160200180807f6d65737361676548617368546f6b656e4964000000000000000000000000000081525060120182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061136d5780518252601f19909201916020918201910161134e565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000205495945050505050565b6060600360008360405160200180807f6d657373616765486173684d657461646174610000000000000000000000000081525060130182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b602083106114335780518252601f199092019160209182019101611414565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561150a5780601f106114df5761010080835404028352916020019161150a565b820191906000526020600020905b8154815290600101906020018083116114ed57829003601f168201915b50505050509050919050565b6001600460008360405160200180807f6d6573736167654861736846697865640000000000000000000000000000000081525060100182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061159b5780518252601f19909201916020918201910161157c565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805460ff19169415159490941790935550505050565b6115f0611147565b600160a060020a031663319346678361160a846002611d26565b611615856003611d26565b611620866004611d26565b61162b876005611d26565b611636886006611d26565b611641896007611d26565b61164c8a6008611d26565b6116578b6009611d26565b6116628c600a611d26565b6040805160e060020a63ffffffff8e16028152600481019b909b5298151560248b015260448a01979097526064890195909552608488019390935260a487019190915260c486015260e4850152610104840152610124830152600160a060020a0387166101448301525161016480830192600092919082900301818387803b1580156116ed57600080fd5b505af1158015611701573d6000803e3d6000fd5b50505050505050565b61171381611d2e565b151561171e57600080fd5b806002600060405160200180807f627269646765436f6e7472616374000000000000000000000000000000000000815250600e0190506040516020818303038152906040526040518082805190602001908083835b602083106117925780518252601f199092019160209182019101611773565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03959095169490941790935550505050565b606061180682611d36565b9050611810611147565b600160a060020a03166342966c68836040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561185857600080fd5b505af115801561186c573d6000803e3d6000fd5b505050506109ca838383611de0565b806002600060405160200180807f6d65646961746f72436f6e7472616374000000000000000000000000000000008152506010019050604051602081830303815290604052604051808280519060200190808383602083106117925780518252601f199092019160209182019101611773565b6118f781611d2e565b151561190257600080fd5b806002600060405160200180807f657263373231746f6b656e000000000000000000000000000000000000000000815250600b019050604051602081830303815290604052604051808280519060200190808383602083106117925780518252601f199092019160209182019101611773565b61197d6110d3565b600160a060020a031663e5789d036040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156119ba57600080fd5b505af11580156119ce573d6000803e3d6000fd5b505050506040513d60208110156119e457600080fd5b50518111156119f257600080fd5b8060008060405160200180807f726571756573744761734c696d69740000000000000000000000000000000000815250600f0190506040516020818303038152906040526040518082805190602001908083835b60208310611a655780518252601f199092019160209182019101611a46565b51815160209384036101000a600019018019909216911617905260408051929094018290039091208652850195909552929092016000209390935550505050565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0611acf610ab2565b60408051600160a060020a03928316815291841660208301528051918290030190a1806002600060405160200180807f6f776e65720000000000000000000000000000000000000000000000000000008152506005019050604051602081830303815290604052604051808280519060200190808383602083106117925780518252601f199092019160209182019101611773565b60408051602080820184905282518083038201815282840184527f6e6f6e636500000000000000000000000000000000000000000000000000000060608401528351604581850301815260659093019384905282519093600393600093909282918401908083835b60208310611beb5780518252601f199092019160209182019101611bcc565b51815160001960209485036101000a01908116901991909116179052604080519490920184900390932086528583019690965250929093016000208451611c39959194509201919050612592565b5050565b60016004600060405160200180807f6973496e697469616c697a656400000000000000000000000000000000000000815250600d0190506040516020818303038152906040526040518082805190602001908083835b60208310611cb25780518252601f199092019160209182019101611c93565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805460ff191694151594909417909355505050565b600160a060020a0382161515611d1c57611d1781612004565b611c39565b611c398282612068565b602002015190565b6000903b1190565b604080516024808201849052825180830390910181526044909101909152602081018051600160e060020a03167fe98b7f4d000000000000000000000000000000000000000000000000000000001790526060906000611d94611147565b60408051610140808252610160820190925291925060208201612800803883390190505092506000808351602085016000855af13d6000602086013e8080156100f85750505050919050565b7f6435914e0000000000000000000000000000000000000000000000000000000060606000828686611e10612106565b60408051600160a060020a03909416602485015260448401929092526064808401919091528151808403909101815260849092018152602082018051600160e060020a03167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19909416939093178352518151919450849290918291908083835b60208310611eac5780518252601f199092019160209182019101611e8d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050611ee58186612264565b611eef8187612329565b611ef98185612417565b611f0281611b64565b611f0a6110d3565b600160a060020a031663dc8601b3611f206109f4565b84611f29611060565b6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611f96578181015183820152602001611f7e565b50505050905090810190601f168015611fc35780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611fe457600080fd5b505af1158015611ff8573d6000803e3d6000fd5b50505050505050505050565b604051303190600160a060020a0383169082156108fc029083906000818181858888f193505050501515611c3957808261203c612610565b600160a060020a039091168152604051908190036020019082f080158015610925573d6000803e3d6000fd5b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290518391600091600160a060020a038416916370a0823191602480830192602092919082900301818787803b1580156120cd57600080fd5b505af11580156120e1573d6000803e3d6000fd5b505050506040513d60208110156120f757600080fd5b505190506105ea8484836124e9565b600061225f6003600060405160200180807f6e6f6e636500000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040526040518082805190602001908083835b6020831061217e5780518252601f19909201916020918201910161215f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020600019166000191681526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122555780601f1061222a57610100808354040283529160200191612255565b820191906000526020600020905b81548152906001019060200180831161223857829003601f168201915b505050505061258b565b905090565b806000808460405160200180807f6d65737361676548617368546f6b656e4964000000000000000000000000000081525060120182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b602083106122e75780518252601f1990920191602091820191016122c8565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020939093555050505050565b80600260008460405160200180807f6d65737361676548617368526563697069656e7400000000000000000000000081525060140182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b602083106123ad5780518252601f19909201916020918201910161238e565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120865285019590955292909201600020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0395909516949094179093555050505050565b80600360008460405160200180807f6d657373616765486173684d657461646174610000000000000000000000000081525060130182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b6020831061249b5780518252601f19909201916020918201910161247c565b51815160001960209485036101000a019081169019919091161790526040805194909201849003909320865285830196909652509290930160002084516109ca959194509201919050612592565b60408051600160a060020a0384166024820152604480820184905282518083039091018152606490910190915260208181018051600160e060020a03167fa9059cbb000000000000000000000000000000000000000000000000000000001781528251606093600093909290918491828a5af160005193508392508080156100f85750506000835111156125835781151561258357600080fd5b505050505050565b6020015190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106125d357805160ff1916838001178555612600565b82800160010185558215612600579182015b828111156126005782518255916020019190600101906125e5565b5061260c92915061261f565b5090565b60405160218061263a83390190565b6106a691905b8082111561260c57600081556001016126255600608060405260405160208060218339810160405251600160a060020a038116ff00a165627a7a723058203751013e5368ed767543fcd7b74f8fc3d8c0a9d69255daf3cd7b4dca9c01b65c0029