ETH Price: $2,606.76 (-5.50%)

Contract

0x4fb255ae1f82F6C49f213d6465a94F99E3C6CAF4
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw House S...111030502020-10-22 1:32:271570 days ago1603330347IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0029671455
Withdraw House S...111030382020-10-22 1:29:561570 days ago1603330196IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0029947855.5
Server End Game110716202020-10-17 5:41:441575 days ago1602913304IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0007390820.00000145
Create Game110715452020-10-17 5:25:321575 days ago1602912332IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0016231518.00000145
Server Cancel Ac...110715212020-10-17 5:19:371575 days ago1602911977IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0011163218.00000145
User Cancel Acti...110715202020-10-17 5:19:221575 days ago1602911962IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0009124218.00000145
Server End Game110714882020-10-17 5:12:491575 days ago1602911569IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0006705318.00000145
Create Game110714422020-10-17 5:02:131575 days ago1602910933IN
0x4fb255ae...9E3C6CAF4
0 ETH0.001803520
Withdraw House S...110714232020-10-17 4:57:131575 days ago1602910633IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0013102419
Create Game110709732020-10-17 3:17:051575 days ago1602904625IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0028906984
Create Game110709722020-10-17 3:16:571575 days ago1602904617IN
0x4fb255ae...9E3C6CAF4
0 ETH0.000691720.1
Create Game110709602020-10-17 3:13:181575 days ago1602904398IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0028906984
Create Game110709552020-10-17 3:12:391575 days ago1602904359IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0021140120.1
Create Game110709392020-10-17 3:09:221575 days ago1602904162IN
0x4fb255ae...9E3C6CAF4
0 ETH0.008834784
Create Game110699932020-10-16 23:45:531575 days ago1602891953IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0008041623.36
Create Game110698342020-10-16 23:07:311575 days ago1602889651IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0047799153
Create Game110698312020-10-16 23:06:281575 days ago1602889588IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0046271744
User Cancel Acti...110697952020-10-16 22:57:291575 days ago1602889049IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0008464735
User Cancel Acti...110697952020-10-16 22:57:291575 days ago1602889049IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0012672525
Create Game110697852020-10-16 22:53:461575 days ago1602888826IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0014099441
Create Game110697392020-10-16 22:42:261575 days ago1602888146IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0019983219.00000145
Server Cancel Ac...110695182020-10-16 21:58:291575 days ago1602885509IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0011586818.68300126
User Cancel Acti...110695132020-10-16 21:57:261575 days ago1602885446IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0009470418.68300126
Create Game110694932020-10-16 21:53:041575 days ago1602885184IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0016545818.34862385
Server Cancel Ac...110694662020-10-16 21:48:571575 days ago1602884937IN
0x4fb255ae...9E3C6CAF4
0 ETH0.0011955519.27752859
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GameChannel

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-10-13
*/

pragma solidity ^0.5.0;


/**
 * @title Conflict Resolution Interface
 * @dev interface to contract used for conflict resolution. Only needed if server or
 * user stops responding during game session. For documentation consult implementation
 * contract.
 * @author dicether
 */
interface ConflictResolutionInterface {
    function minHouseStake(uint activeGames) external view returns(uint);

    function maxBalance() external view returns(int);

    function conflictEndFine() external pure returns(int);

    function isValidBet(uint8 _gameType, uint _betNum, uint _betValue) external view returns(bool);

    function endGameConflict(
        uint8 _gameType,
        uint _betNum,
        uint _betValue,
        int _balance,
        uint _stake,
        bytes32 _serverSeed,
        bytes32 _userSeed
    )
        external
        view
        returns(int);

    function serverForceGameEnd(
        uint8 gameType,
        uint _betNum,
        uint _betValue,
        int _balance,
        uint _stake,
        bytes32 _serverSeed,
        bytes32 _userSeed,
        uint _endInitiatedTime
    )
        external
        view
        returns(int);

    function userForceGameEnd(
        uint8 _gameType,
        uint _betNum,
        uint _betValue,
        int _balance,
        uint _stake,
        uint _endInitiatedTime
    )
        external
        view
        returns(int);
}

/**
 * @title Owned
 * @dev Basic contract for authorization control.
 * @author dicether
 */
contract Ownable {
    address public owner;
    address public pendingOwner;

    event LogOwnerShipTransferred(address indexed previousOwner, address indexed newOwner);
    event LogOwnerShipTransferInitiated(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Modifier, which throws if called by other account than owner.
     */
    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    /**
     * @dev Modifier throws if called by any account other than the pendingOwner.
     */
    modifier onlyPendingOwner() {
        require(msg.sender == pendingOwner);
        _;
    }

    /**
     * @dev Set contract creator as initial owner
     */
    constructor() public {
        owner = msg.sender;
        pendingOwner = address(0);
    }

    /**
     * @dev Allows the current owner to set the pendingOwner address.
     * @param _newOwner The address to transfer ownership to.
     */
    function transferOwnership(address _newOwner) public onlyOwner {
        pendingOwner = _newOwner;
        emit LogOwnerShipTransferInitiated(owner, _newOwner);
    }

    /**
     * @dev PendingOwner can accept ownership.
     */
    function claimOwnership() public onlyPendingOwner {
        owner = pendingOwner;
        pendingOwner = address(0);
        emit LogOwnerShipTransferred(owner, pendingOwner);
    }
}

/**
 * @title Conflict Resolution Manager
 * @author dicether
 */
contract ConflictResolutionManager is Ownable {
    /// @dev Conflict resolution contract.
    ConflictResolutionInterface public conflictRes;

    /// @dev New Conflict resolution contract.
    address public newConflictRes = address(0);

    /// @dev Time update of new conflict resolution contract was initiated.
    uint public updateTime = 0;

    /// @dev Min time before new conflict res contract can be activated after initiating update.
    uint public constant MIN_TIMEOUT = 3 days;

    /// @dev Min time before new conflict res contract can be activated after initiating update.
    uint public constant MAX_TIMEOUT = 6 days;

    /// @dev Update of conflict resolution contract was initiated.
    event LogUpdatingConflictResolution(address newConflictResolutionAddress);

    /// @dev New conflict resolution contract is active.
    event LogUpdatedConflictResolution(address newConflictResolutionAddress);

    /**
     * @dev Constructor
     * @param _conflictResAddress conflict resolution contract address.
     */
    constructor(address _conflictResAddress) public {
        conflictRes = ConflictResolutionInterface(_conflictResAddress);
    }

    /**
     * @dev Initiate conflict resolution contract update.
     * @param _newConflictResAddress New conflict resolution contract address.
     */
    function updateConflictResolution(address _newConflictResAddress) public onlyOwner {
        newConflictRes = _newConflictResAddress;
        updateTime = block.timestamp;

        emit LogUpdatingConflictResolution(_newConflictResAddress);
    }

    /**
     * @dev Active new conflict resolution contract.
     */
    function activateConflictResolution() public onlyOwner {
        require(newConflictRes != address(0));
        require(updateTime != 0);
        require(updateTime + MIN_TIMEOUT <= block.timestamp && block.timestamp <= updateTime + MAX_TIMEOUT);

        conflictRes = ConflictResolutionInterface(newConflictRes);
        newConflictRes = address(0);
        updateTime = 0;

        emit LogUpdatedConflictResolution(newConflictRes);
    }
}

/**
 * @title Activatable
 * @dev Contract is initial deactivated and can be activated by owner.
 * @author Dicether
 */
contract Activatable is Ownable {
    bool public activated = false;

    /// @dev Event is fired if activated.
    event LogActive();

    /// @dev Modifier, which only allows function execution if activated.
    modifier onlyActivated() {
        require(activated);
        _;
    }

    /// @dev Modifier, which only allows function execution if not activated.
    modifier onlyNotActivated() {
        require(!activated);
        _;
    }

    /// @dev activate contract, can be only called once by the contract owner.
    function activate() public onlyOwner onlyNotActivated {
        activated = true;
        emit LogActive();
    }
}

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error.
 * From zeppelin-solidity
 */
library SafeMath {

    /**
    * @dev Multiplies two unsigned integers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        c = a * b;
        assert(c / a == b);
        return c;
    }

    /**
    * @dev Multiplies two signed integers, throws on overflow.
    */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }
        int256 c = a * b;
        assert(c / a == b);
        return c;
    }

    /**
    * @dev Integer division of two unsigned integers, 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 a / b;
    }

    /**
    * @dev Integer division of two signed integers, truncating the quotient.
    */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // assert(b > 0); // Solidity automatically throws when dividing by 0
        // Overflow only happens when the smallest negative int is multiplied by -1.
        int256 INT256_MIN = int256((uint256(1) << 255));
        assert(a != INT256_MIN || b != - 1);
        return a / b;
    }

    /**
    * @dev Subtracts two unsigned integers, 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 Subtracts two signed integers, throws on overflow.
    */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        assert((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

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

    /**
    * @dev Adds two signed integers, throws on overflow.
    */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        assert((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }
}

/**
 * @title Pausable
 * @dev Provides pausing support.
 * @author dicether
 */
contract Pausable is Activatable {
    using SafeMath for uint;

    /// @dev Is contract paused. Initial it is paused.
    bool public paused = true;

    /// @dev Time pause was called
    uint public timePaused = block.timestamp;

    /// @dev Modifier, which only allows function execution if not paused.
    modifier onlyNotPaused() {
        require(!paused, "paused");
        _;
    }

    /// @dev Modifier, which only allows function execution if paused.
    modifier onlyPaused() {
        require(paused);
        _;
    }

    /// @dev Modifier, which only allows function execution if paused longer than timeSpan.
    modifier onlyPausedSince(uint timeSpan) {
        require(paused && (timePaused.add(timeSpan) <= block.timestamp));
        _;
    }

    /// @dev Event is fired if paused.
    event LogPause();

    /// @dev Event is fired if pause is ended.
    event LogUnpause();

    /**
     * @dev Pause contract. No new game sessions can be created.
     */
    function pause() public onlyOwner onlyNotPaused {
        paused = true;
        timePaused = block.timestamp;
        emit LogPause();
    }

    /**
     * @dev Unpause contract. Initial contract is paused and can only be unpaused after activating it.
     */
    function unpause() public onlyOwner onlyPaused onlyActivated {
        paused = false;
        timePaused = 0;
        emit LogUnpause();
    }
}

/**
 * @title Destroyable
 * @dev Provides destroy support
 * @author dicether
 */
contract Destroyable is Pausable {
    /// @dev After pausing the contract for 20 days owner can selfdestruct it.
    uint public constant TIMEOUT_DESTROY = 20 days;

    /**
     * @dev Destroy contract and transfer ether to owner.
     */
    function destroy() public onlyOwner onlyPausedSince(TIMEOUT_DESTROY) {
        selfdestruct(address(uint160(owner)));
    }
}

/**
 * @title Math utils
 * @author dicether
 */
library MathUtil {
    /**
     * @dev Returns the absolute value of _val.
     * @param _val value
     * @return The absolute value of _val.
     */
    function abs(int _val) internal pure returns(uint) {
        if (_val < 0) {
            return uint(-_val);
        } else {
            return uint(_val);
        }
    }

    /**
     * @dev Calculate maximum.
     */
    function max(uint _val1, uint _val2) internal pure returns(uint) {
        return _val1 >= _val2 ? _val1 : _val2;
    }

    /**
     * @dev Calculate minimum.
     */
    function min(uint _val1, uint _val2) internal pure returns(uint) {
        return _val1 <= _val2 ? _val1 : _val2;
    }
}

library SafeCast {
    /**
     * Cast unsigned a to signed a.
     */
    function castToInt(uint a) internal pure returns(int) {
        assert(a < (1 << 255));
        return int(a);
    }

    /**
     * Cast signed a to unsigned a.
     */
    function castToUint(int a) internal pure returns(uint) {
        assert(a >= 0);
        return uint(a);
    }
}

contract ERC20 {
    function approve(address _spender, uint256 _value) public returns (bool success);
    function allowance(address owner, address spender) public returns (uint256);
    function balanceOf(address who) public returns  (uint256);
    function transferFrom(address from, address to, uint256 value) public returns (bool);
    function transfer(address _to, uint _value) public;
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

/**
 * @title Game Channel Base
 * @dev Base contract for state channel implementation.
 * @author dicether
 */
contract GameChannelBase is Destroyable, ConflictResolutionManager {
    using SafeCast for int;
    using SafeCast for uint;
    using SafeMath for int;
    using SafeMath for uint;

    address public ERC20TokenAddress = 0x9BB6fd000109E24Eb38B0Deb806382fF9247E478;

    /// @dev Different game session states.
    enum GameStatus {
        ENDED, ///< @dev Game session is ended.
        ACTIVE, ///< @dev Game session is active.
        USER_INITIATED_END, ///< @dev User initiated non regular end.
        SERVER_INITIATED_END ///< @dev Server initiated non regular end.
    }

    /// @dev Reason game session ended.
    enum ReasonEnded {
        REGULAR_ENDED, ///< @dev Game session is regularly ended.
        SERVER_FORCED_END, ///< @dev User did not respond. Server forced end.
        USER_FORCED_END, ///< @dev Server did not respond. User forced end.
        CONFLICT_ENDED ///< @dev Server or user raised conflict ans pushed game state, opponent pushed same game state.
    }

    struct Game {
        /// @dev Game session status.
        GameStatus status;

        /// @dev User's stake.
        uint128 stake;

        /// @dev Last game round info if not regularly ended.
        /// If game session is ended normally this data is not used.
        uint8 gameType;
        uint32 roundId;
        uint betNum;
        uint betValue;
        int balance;
        bytes32 userSeed;
        bytes32 serverSeed;
        uint endInitiatedTime;
    }

    /// @dev Minimal time span between profit transfer.
    uint public constant MIN_TRANSFER_TIMESPAN = 1 days;

    /// @dev Maximal time span between profit transfer.
    uint public constant MAX_TRANSFER_TIMSPAN = 6 * 30 days;

    bytes32 public constant EIP712DOMAIN_TYPEHASH = keccak256(
        "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
    );

    bytes32 public constant BET_TYPEHASH = keccak256(
        "Bet(uint32 roundId,uint8 gameType,uint256 number,uint256 value,int256 balance,bytes32 serverHash,bytes32 userHash,uint256 gameId)"
    );

    bytes32 public DOMAIN_SEPERATOR;

    /// @dev Current active game sessions.
    uint public activeGames = 0;

    /// @dev Game session id counter. Points to next free game session slot. So gameIdCntr -1 is the
    // number of game sessions created.
    uint public gameIdCntr = 1;

    /// @dev Only this address can accept and end games.
    address public serverAddress;

    /// @dev Address to transfer profit to.
    address public houseAddress;

    /// @dev Current house stake.
    uint public houseStake = 0;

    /// @dev House profit since last profit transfer.
    int public houseProfit = 0;

    /// @dev Min value user needs to deposit for creating game session.
    uint128 public minStake;

    /// @dev Max value user can deposit for creating game session.
    uint128 public maxStake;

    /// @dev Timeout until next profit transfer is allowed.
    uint public profitTransferTimeSpan = 14 days;

    /// @dev Last time profit transferred to house.
    uint public lastProfitTransferTimestamp;

    /// @dev Maps gameId to game struct.
    mapping (uint => Game) public gameIdGame;

    /// @dev Maps user address to current user game id.
    mapping (address => uint) public userGameId;

    /// @dev Maps user address to pending returns.
    mapping (address => uint) public pendingReturns;

    /// @dev Modifier, which only allows to execute if house stake is high enough.
    modifier onlyValidHouseStake(uint _activeGames) {
        uint minHouseStake = conflictRes.minHouseStake(_activeGames);
        require(houseStake >= minHouseStake, "inv houseStake");
        _;
    }

    /// @dev Modifier to check if value send fulfills user stake requirements.
    modifier onlyValidValue(uint _amount) {
        require(minStake <= _amount && _amount <= maxStake, "inv stake");
        _;
    }

    /// @dev Modifier, which only allows server to call function.
    modifier onlyServer() {
        require(msg.sender == serverAddress);
        _;
    }

    /// @dev Modifier, which only allows to set valid transfer timeouts.
    modifier onlyValidTransferTimeSpan(uint transferTimeout) {
        require(transferTimeout >= MIN_TRANSFER_TIMESPAN
                && transferTimeout <= MAX_TRANSFER_TIMSPAN);
        _;
    }

    /// @dev This event is fired when user creates game session.
    event LogGameCreated(address indexed user, uint indexed gameId, uint128 stake, bytes32 indexed serverEndHash, bytes32 userEndHash);

    /// @dev This event is fired when user requests conflict end.
    event LogUserRequestedEnd(address indexed user, uint indexed gameId);

    /// @dev This event is fired when server requests conflict end.
    event LogServerRequestedEnd(address indexed user, uint indexed gameId);

    /// @dev This event is fired when game session is ended.
    event LogGameEnded(address indexed user, uint indexed gameId, uint32 roundId, int balance, ReasonEnded reason);

    /// @dev this event is fired when owner modifies user's stake limits.
    event LogStakeLimitsModified(uint minStake, uint maxStake);

    /**
     * @dev Contract constructor.
     * @param _serverAddress Server address.
     * @param _minStake Min value user needs to deposit to create game session.
     * @param _maxStake Max value user can deposit to create game session.
     * @param _conflictResAddress Conflict resolution contract address.
     * @param _houseAddress House address to move profit to.
     * @param _chainId Chain id for signature domain.
     */
    constructor(
        address _serverAddress,
        uint128 _minStake,
        uint128 _maxStake,
        address _conflictResAddress,
        address _houseAddress,
        uint _chainId
    )
        public
        ConflictResolutionManager(_conflictResAddress)
    {
        require(_minStake > 0 && _minStake <= _maxStake);

        serverAddress = _serverAddress;
        houseAddress = _houseAddress;
        lastProfitTransferTimestamp = block.timestamp;
        minStake = _minStake;
        maxStake = _maxStake;

        DOMAIN_SEPERATOR =  keccak256(abi.encode(
            EIP712DOMAIN_TYPEHASH,
            keccak256("Dicether"),
            keccak256("2"),
            _chainId,
            address(this)
        ));
    }

    /**
     * @dev Set gameIdCntr. Can be only set before activating contract.
     */
    function setGameIdCntr(uint _gameIdCntr) public onlyOwner onlyNotActivated {
        require(gameIdCntr > 0);
        gameIdCntr = _gameIdCntr;
    }

    /**
     * @notice Withdraw pending returns.
     */
    function withdraw() public {
        uint toTransfer = pendingReturns[msg.sender];
        require(toTransfer > 0);

        pendingReturns[msg.sender] = 0;
        msg.sender.transfer(toTransfer);
    }

    /**
     * @notice Transfer house profit to houseAddress.
     */
    function transferProfitToHouse() public {
        require(lastProfitTransferTimestamp.add(profitTransferTimeSpan) <= block.timestamp);

        // update last transfer timestamp
        lastProfitTransferTimestamp = block.timestamp;

        if (houseProfit <= 0) {
            // no profit to transfer
            return;
        }

        uint toTransfer = houseProfit.castToUint();

        houseProfit = 0;
        houseStake = houseStake.sub(toTransfer);

        ERC20(ERC20TokenAddress).transfer(houseAddress, toTransfer);
    }

    /**
     * @dev Set profit transfer time span.
     */
    function setProfitTransferTimeSpan(uint _profitTransferTimeSpan)
        public
        onlyOwner
        onlyValidTransferTimeSpan(_profitTransferTimeSpan)
    {
        profitTransferTimeSpan = _profitTransferTimeSpan;
    }

    /**
     * @dev Increase house stake by msg.value
     * @param _amount _amount of house stake that added.
     */
    function addHouseStake(uint _amount) 
        public 
        onlyOwner {
        ERC20(ERC20TokenAddress).transferFrom(msg.sender, address(this), _amount);
        houseStake = houseStake.add(_amount);
    }

    /**
     * @dev Withdraw house stake.
     */
    function withdrawHouseStake(uint value) public onlyOwner {
        uint minHouseStake = conflictRes.minHouseStake(activeGames);

        require(value <= houseStake && houseStake.sub(value) >= minHouseStake);
        require(houseProfit <= 0 || houseProfit.castToUint() <= houseStake.sub(value));

        houseStake = houseStake.sub(value);
        ERC20(ERC20TokenAddress).transfer(houseAddress, value);
        // owner.transfer(value);
    }

    /**
     * @dev Withdraw house stake and profit.
     */
    function withdrawAll() public onlyOwner onlyPausedSince(3 days) {
        houseProfit = 0;
        uint toTransfer = houseStake;
        houseStake = 0;
        ERC20(ERC20TokenAddress).transfer(houseAddress, toTransfer);
        // owner.transfer(toTransfer);
    }

    /**
     * @dev Set new house address.
     * @param _houseAddress New house address.
     */
    function setHouseAddress(address _houseAddress) public onlyOwner {
        houseAddress = _houseAddress;
    }

    /**
     * @dev Set stake min and max value.
     * @param _minStake Min stake.
     * @param _maxStake Max stake.
     */
    function setStakeRequirements(uint128 _minStake, uint128 _maxStake) public onlyOwner {
        require(_minStake > 0 && _minStake <= _maxStake);
        minStake = _minStake;
        maxStake = _maxStake;
        emit LogStakeLimitsModified(minStake, maxStake);
    }

    /**
     * @dev Close game session.
     * @param _game Game session data.
     * @param _gameId Id of game session.
     * @param _userAddress User's address of game session.
     * @param _reason Reason for closing game session.
     * @param _balance Game session balance.
     */
    function closeGame(
        Game storage _game,
        uint _gameId,
        uint32 _roundId,
        address _userAddress,
        ReasonEnded _reason,
        int _balance
    )
        internal
    {
        _game.status = GameStatus.ENDED;

        activeGames = activeGames.sub(1);

        payOut(_userAddress, _game.stake, _balance);

        emit LogGameEnded(_userAddress, _gameId, _roundId, _balance, _reason);
    }

    /**
     * @dev End game by paying out user and server.
     * @param _userAddress User's address.
     * @param _stake User's stake.
     * @param _balance User's balance.
     */
    
    function payOut(address _userAddress, uint128 _stake, int _balance) internal {
        int stakeInt = _stake;
        int houseStakeInt = houseStake.castToInt();

        assert(_balance <= conflictRes.maxBalance());
        assert((stakeInt.add(_balance)) >= 0);

        if (_balance > 0 && houseStakeInt < _balance) {
            // Should never happen!
            // House is bankrupt.
            // Payout left money.
            _balance = houseStakeInt;
        }

        houseProfit = houseProfit.sub(_balance);

        int newHouseStake = houseStakeInt.sub(_balance);
        houseStake = newHouseStake.castToUint();

        uint valueUser = stakeInt.add(_balance).castToUint();
        pendingReturns[_userAddress] += valueUser;
        if (pendingReturns[_userAddress] > 0) {
            safeSend(_userAddress);
        }
    }

    /**
     * @dev Send value of pendingReturns[_address] to _address.
     * @param _address Address to send value to.
     */
    function safeSend(address _address) internal {
        uint valueToSend = pendingReturns[_address];
        assert(valueToSend > 0);

        pendingReturns[_address] = 0;

        ERC20(ERC20TokenAddress).transfer(_address, valueToSend);

        // if (_address.send(valueToSend) == false) {
        //     pendingReturns[_address] = valueToSend;
        // }
    }

    /**
     * @dev Verify signature of given data. Throws on verification failure.
     * @param _sig Signature of given data in the form of rsv.
     * @param _address Address of signature signer.
     */
    function verifySig(
        uint32 _roundId,
        uint8 _gameType,
        uint _num,
        uint _value,
        int _balance,
        bytes32 _serverHash,
        bytes32 _userHash,
        uint _gameId,
        address _contractAddress,
        bytes memory _sig,
        address _address
    )
        internal
        view
    {
        // check if this is the correct contract
        address contractAddress = address(this);
        require(_contractAddress == contractAddress, "inv contractAddress");

        bytes32 roundHash = calcHash(
                _roundId,
                _gameType,
                _num,
                _value,
                _balance,
                _serverHash,
                _userHash,
                _gameId
        );

        verify(
                roundHash,
                _sig,
                _address
        );
    }

     /**
     * @dev Check if _sig is valid signature of _hash. Throws if invalid signature.
     * @param _hash Hash to check signature of.
     * @param _sig Signature of _hash.
     * @param _address Address of signer.
     */
    function verify(
        bytes32 _hash,
        bytes memory _sig,
        address _address
    )
        internal
        pure
    {
        (bytes32 r, bytes32 s, uint8 v) = signatureSplit(_sig);
        address addressRecover = ecrecover(_hash, v, r, s);
        require(addressRecover == _address, "inv sig");
    }

    /**
     * @dev Calculate typed hash of given data (compare eth_signTypedData).
     * @return Hash of given data.
     */
    function calcHash(
        uint32 _roundId,
        uint8 _gameType,
        uint _num,
        uint _value,
        int _balance,
        bytes32 _serverHash,
        bytes32 _userHash,
        uint _gameId
    )
        private
        view
        returns(bytes32)
    {
        bytes32 betHash = keccak256(abi.encode(
            BET_TYPEHASH,
            _roundId,
            _gameType,
            _num,
            _value,
            _balance,
            _serverHash,
            _userHash,
            _gameId
        ));

        return keccak256(abi.encodePacked(
            "\x19\x01",
            DOMAIN_SEPERATOR,
            betHash
        ));
    }

    /**
     * @dev Split the given signature of the form rsv in r s v. v is incremented with 27 if
     * it is below 2.
     * @param _signature Signature to split.
     * @return r s v
     */
    function signatureSplit(bytes memory _signature)
        private
        pure
        returns (bytes32 r, bytes32 s, uint8 v)
    {
        require(_signature.length == 65, "inv sig");

        assembly {
            r := mload(add(_signature, 32))
            s := mload(add(_signature, 64))
            v := and(mload(add(_signature, 65)), 0xff)
        }
        if (v < 2) {
            v = v + 27;
        }
    }
}

/**
 * @title Game Channel Conflict
 * @dev Conflict handling implementation.
 * @author dicether
 */
contract GameChannelConflict is GameChannelBase {
    using SafeCast for int;
    using SafeCast for uint;
    using SafeMath for int;
    using SafeMath for uint;

    /**
     * @dev Contract constructor.
     * @param _serverAddress Server address.
     * @param _minStake Min value user needs to deposit to create game session.
     * @param _maxStake Max value user can deposit to create game session.
     * @param _conflictResAddress Conflict resolution contract address
     * @param _houseAddress House address to move profit to
     * @param _chainId Chain id for signature domain.
     */
    constructor(
        address _serverAddress,
        uint128 _minStake,
        uint128 _maxStake,
        address _conflictResAddress,
        address _houseAddress,
        uint _chainId
    )
        public
        GameChannelBase(_serverAddress, _minStake, _maxStake, _conflictResAddress, _houseAddress, _chainId)
    {
        // nothing to do
    }

    /**
     * @dev Used by server if user does not end game session.
     * @param _roundId Round id of bet.
     * @param _gameType Game type of bet.
     * @param _num Number of bet.
     * @param _value Value of bet.
     * @param _balance Balance before this bet.
     * @param _serverHash Hash of server seed for this bet.
     * @param _userHash Hash of user seed for this bet.
     * @param _gameId Game session id.
     * @param _contractAddress Address of this contract.
     * @param _userSig User signature of this bet.
     * @param _userAddress Address of user.
     * @param _serverSeed Server seed for this bet.
     * @param _userSeed User seed for this bet.
     */
    function serverEndGameConflict(
        uint32 _roundId,
        uint8 _gameType,
        uint _num,
        uint _value,
        int _balance,
        bytes32 _serverHash,
        bytes32 _userHash,
        uint _gameId,
        address _contractAddress,
        bytes memory _userSig,
        address _userAddress,
        bytes32 _serverSeed,
        bytes32 _userSeed
    )
        public
        onlyServer
    {
        verifySig(
                _roundId,
                _gameType,
                _num,
                _value,
                _balance,
                _serverHash,
                _userHash,
                _gameId,
                _contractAddress,
                _userSig,
                _userAddress
        );

        serverEndGameConflictImpl(
                _roundId,
                _gameType,
                _num,
                _value,
                _balance,
                _serverHash,
                _userHash,
                _serverSeed,
                _userSeed,
                _gameId,
                _userAddress
        );
    }

    /**
     * @notice Can be used by user if server does not answer to the end game session request.
     * @param _roundId Round id of bet.
     * @param _gameType Game type of bet.
     * @param _num Number of bet.
     * @param _value Value of bet.
     * @param _balance Balance before this bet.
     * @param _serverHash Hash of server seed for this bet.
     * @param _userHash Hash of user seed for this bet.
     * @param _gameId Game session id.
     * @param _contractAddress Address of this contract.
     * @param _serverSig Server signature of this bet.
     * @param _userSeed User seed for this bet.
     */
    function userEndGameConflict(
        uint32 _roundId,
        uint8 _gameType,
        uint _num,
        uint _value,
        int _balance,
        bytes32 _serverHash,
        bytes32 _userHash,
        uint _gameId,
        address _contractAddress,
        bytes memory _serverSig,
        bytes32 _userSeed
    )
        public
    {
        verifySig(
            _roundId,
            _gameType,
            _num,
            _value,
            _balance,
            _serverHash,
            _userHash,
            _gameId,
            _contractAddress,
            _serverSig,
            serverAddress
        );

        userEndGameConflictImpl(
            _roundId,
            _gameType,
            _num,
            _value,
            _balance,
            _userHash,
            _userSeed,
            _gameId,
            msg.sender
        );
    }

    /**
     * @notice Cancel active game without playing. Useful if server stops responding before
     * one game is played.
     * @param _gameId Game session id.
     */
    function userCancelActiveGame(uint _gameId) public {
        address userAddress = msg.sender;
        uint gameId = userGameId[userAddress];
        Game storage game = gameIdGame[gameId];

        require(gameId == _gameId, "inv gameId");

        if (game.status == GameStatus.ACTIVE) {
            game.endInitiatedTime = block.timestamp;
            game.status = GameStatus.USER_INITIATED_END;

            emit LogUserRequestedEnd(msg.sender, gameId);
        } else if (game.status == GameStatus.SERVER_INITIATED_END && game.roundId == 0) {
            cancelActiveGame(game, gameId, userAddress);
        } else {
            revert();
        }
    }

    /**
     * @dev Cancel active game without playing. Useful if user starts game session and
     * does not play.
     * @param _userAddress Users' address.
     * @param _gameId Game session id.
     */
    function serverCancelActiveGame(address _userAddress, uint _gameId) public onlyServer {
        uint gameId = userGameId[_userAddress];
        Game storage game = gameIdGame[gameId];

        require(gameId == _gameId, "inv gameId");

        if (game.status == GameStatus.ACTIVE) {
            game.endInitiatedTime = block.timestamp;
            game.status = GameStatus.SERVER_INITIATED_END;

            emit LogServerRequestedEnd(msg.sender, gameId);
        } else if (game.status == GameStatus.USER_INITIATED_END && game.roundId == 0) {
            cancelActiveGame(game, gameId, _userAddress);
        } else {
            revert();
        }
    }

    /**
    * @dev Force end of game if user does not respond. Only possible after a certain period of time
    * to give the user a chance to respond.
    * @param _userAddress User's address.
    */
    function serverForceGameEnd(address _userAddress, uint _gameId) public onlyServer {
        uint gameId = userGameId[_userAddress];
        Game storage game = gameIdGame[gameId];

        require(gameId == _gameId, "inv gameId");
        require(game.status == GameStatus.SERVER_INITIATED_END, "inv status");

        // theoretically we have enough data to calculate winner
        // but as user did not respond assume he has lost.
        int newBalance = conflictRes.serverForceGameEnd(
            game.gameType,
            game.betNum,
            game.betValue,
            game.balance,
            game.stake,
            game.serverSeed,
            game.userSeed,
            game.endInitiatedTime
        );

        closeGame(game, gameId, game.roundId, _userAddress, ReasonEnded.SERVER_FORCED_END, newBalance);
    }

    /**
    * @notice Force end of game if server does not respond. Only possible after a certain period of time
    * to give the server a chance to respond.
    */
    function userForceGameEnd(uint _gameId) public {
        address userAddress = msg.sender;
        uint gameId = userGameId[userAddress];
        Game storage game = gameIdGame[gameId];

        require(gameId == _gameId, "inv gameId");
        require(game.status == GameStatus.USER_INITIATED_END, "inv status");

        int newBalance = conflictRes.userForceGameEnd(
            game.gameType,
            game.betNum,
            game.betValue,
            game.balance,
            game.stake,
            game.endInitiatedTime
        );

        closeGame(game, gameId, game.roundId, userAddress, ReasonEnded.USER_FORCED_END, newBalance);
    }

    /**
     * @dev Conflict handling implementation. Stores game data and timestamp if game
     * is active. If server has already marked conflict for game session the conflict
     * resolution contract is used (compare conflictRes).
     * @param _roundId Round id of bet.
     * @param _gameType Game type of bet.
     * @param _num Number of bet.
     * @param _value Value of bet.
     * @param _balance Balance before this bet.
     * @param _userHash Hash of user's seed for this bet.
     * @param _userSeed User's seed for this bet.
     * @param _gameId game Game session id.
     * @param _userAddress User's address.
     */
    function userEndGameConflictImpl(
        uint32 _roundId,
        uint8 _gameType,
        uint _num,
        uint _value,
        int _balance,
        bytes32 _userHash,
        bytes32 _userSeed,
        uint _gameId,
        address _userAddress
    )
        private
    {
        uint gameId = userGameId[_userAddress];
        Game storage game = gameIdGame[gameId];
        int maxBalance = conflictRes.maxBalance();
        int gameStake = game.stake;

        require(gameId == _gameId, "inv gameId");
        require(_roundId > 0, "inv roundId");
        require(keccak256(abi.encodePacked(_userSeed)) == _userHash, "inv userSeed");
        require(-gameStake <= _balance && _balance <= maxBalance, "inv balance"); // game.stake save to cast as uint128
        require(conflictRes.isValidBet(_gameType, _num, _value), "inv bet");
        require(gameStake.add(_balance).sub(_value.castToInt()) >= 0, "value too high"); // game.stake save to cast as uint128

        if (game.status == GameStatus.SERVER_INITIATED_END && game.roundId == _roundId) {
            game.userSeed = _userSeed;
            endGameConflict(game, gameId, _userAddress);
        } else if (game.status == GameStatus.ACTIVE
                || (game.status == GameStatus.SERVER_INITIATED_END && game.roundId < _roundId)) {
            game.status = GameStatus.USER_INITIATED_END;
            game.endInitiatedTime = block.timestamp;
            game.roundId = _roundId;
            game.gameType = _gameType;
            game.betNum = _num;
            game.betValue = _value;
            game.balance = _balance;
            game.userSeed = _userSeed;
            game.serverSeed = bytes32(0);

            emit LogUserRequestedEnd(msg.sender, gameId);
        } else {
            revert("inv state");
        }
    }

    /**
     * @dev Conflict handling implementation. Stores game data and timestamp if game
     * is active. If user has already marked conflict for game session the conflict
     * resolution contract is used (compare conflictRes).
     * @param _roundId Round id of bet.
     * @param _gameType Game type of bet.
     * @param _num Number of bet.
     * @param _value Value of bet.
     * @param _balance Balance before this bet.
     * @param _serverHash Hash of server's seed for this bet.
     * @param _userHash Hash of user's seed for this bet.
     * @param _serverSeed Server's seed for this bet.
     * @param _userSeed User's seed for this bet.
     * @param _userAddress User's address.
     */
    function serverEndGameConflictImpl(
        uint32 _roundId,
        uint8 _gameType,
        uint _num,
        uint _value,
        int _balance,
        bytes32 _serverHash,
        bytes32 _userHash,
        bytes32 _serverSeed,
        bytes32 _userSeed,
        uint _gameId,
        address _userAddress
    )
        private
    {
        uint gameId = userGameId[_userAddress];
        Game storage game = gameIdGame[gameId];
        int maxBalance = conflictRes.maxBalance();
        int gameStake = game.stake;

        require(gameId == _gameId, "inv gameId");
        require(_roundId > 0, "inv roundId");
        require(keccak256(abi.encodePacked(_serverSeed)) == _serverHash, "inv serverSeed");
        require(keccak256(abi.encodePacked(_userSeed)) == _userHash, "inv userSeed");
        require(-gameStake <= _balance && _balance <= maxBalance, "inv balance"); // game.stake save to cast as uint128
        require(conflictRes.isValidBet(_gameType, _num, _value), "inv bet");
        require(gameStake.add(_balance).sub(_value.castToInt()) >= 0, "too high value"); // game.stake save to cast as uin128

        if (game.status == GameStatus.USER_INITIATED_END && game.roundId == _roundId) {
            game.serverSeed = _serverSeed;
            endGameConflict(game, gameId, _userAddress);
        } else if (game.status == GameStatus.ACTIVE
                || (game.status == GameStatus.USER_INITIATED_END && game.roundId < _roundId)) {
            game.status = GameStatus.SERVER_INITIATED_END;
            game.endInitiatedTime = block.timestamp;
            game.roundId = _roundId;
            game.gameType = _gameType;
            game.betNum = _num;
            game.betValue = _value;
            game.balance = _balance;
            game.serverSeed = _serverSeed;
            game.userSeed = _userSeed;

            emit LogServerRequestedEnd(_userAddress, gameId);
        } else {
            revert("inv state");
        }
    }

    /**
     * @dev End conflicting game without placed bets.
     * @param _game Game session data.
     * @param _gameId Game session id.
     * @param _userAddress User's address.
     */
    function cancelActiveGame(Game storage _game, uint _gameId, address _userAddress) private {
        // user need to pay a fee when conflict ended.
        // this ensures a malicious, rich user can not just generate game sessions and then wait
        // for us to end the game session and then confirm the session status, so
        // we would have to pay a high gas fee without profit.
        int newBalance = -conflictRes.conflictEndFine();

        // do not allow balance below user stake
        int stake = _game.stake;
        if (newBalance < -stake) {
            newBalance = -stake;
        }
        closeGame(_game, _gameId, 0, _userAddress, ReasonEnded.CONFLICT_ENDED, newBalance);
    }

    /**
     * @dev End conflicting game.
     * @param _game Game session data.
     * @param _gameId Game session id.
     * @param _userAddress User's address.
     */
    function endGameConflict(Game storage _game, uint _gameId, address _userAddress) private {
        int newBalance = conflictRes.endGameConflict(
            _game.gameType,
            _game.betNum,
            _game.betValue,
            _game.balance,
            _game.stake,
            _game.serverSeed,
            _game.userSeed
        );

        closeGame(_game, _gameId, _game.roundId, _userAddress, ReasonEnded.CONFLICT_ENDED, newBalance);
    }
}

/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
/**
 * @title Game Channel
 * @author dicether
 */
contract GameChannel is GameChannelConflict {
    
    address public ERC20TokenAddress = 0x9BB6fd000109E24Eb38B0Deb806382fF9247E478;

    /**
     * @dev contract constructor
     * @param _serverAddress Server address.
     * @param _minStake Min value user needs to deposit to create game session.
     * @param _maxStake Max value user can deposit to create game session.
     * @param _conflictResAddress Conflict resolution contract address.
     * @param _houseAddress House address to move profit to.
     * @param _chainId Chain id for signature domain.
     */
    constructor(
        address _serverAddress,
        uint128 _minStake,
        uint128 _maxStake,
        address _conflictResAddress,
        address _houseAddress,
        uint _chainId
    )
        public
        GameChannelConflict(_serverAddress, _minStake, _maxStake, _conflictResAddress, _houseAddress, _chainId)
    {
        // nothing to do
    }

    /**
     * @notice Create games session request. msg.value needs to be valid stake value.
     * @param _hashes Last entry of users' hash chain. [_userEndHash, _serverEndHash]
     * @param _previousGameId User's previous game id, initial 0.
     * @param _createBefore Game can be only created before this timestamp.
     * @param _serverSig Server signature. See verifyCreateSig
     * @param _amount Bet amount in ERC-20
     */

    function createGame(
        bytes32[] memory _hashes,
        uint _previousGameId,
        uint _createBefore,
        bytes memory _serverSig,
        uint _amount
    )
        public
        onlyValidValue(_amount)
        onlyValidHouseStake(activeGames + 1)
        onlyNotPaused
    {
        bytes32 _userEndHash = _hashes[0];
        bytes32 _serverEndHash = _hashes[1];
        uint previousGameId = userGameId[msg.sender];
        Game storage game = gameIdGame[previousGameId];

        require(game.status == GameStatus.ENDED, "prev game not ended");
        require(previousGameId == _previousGameId, "inv gamePrevGameId");
        require(block.timestamp < _createBefore, "expired");

        verifyCreateSig(msg.sender, _previousGameId, _createBefore, _serverEndHash, _serverSig);

        ERC20(ERC20TokenAddress).transferFrom(msg.sender, address(this), _amount);

        uint gameId = gameIdCntr++;
        userGameId[msg.sender] = gameId;
        Game storage newGame = gameIdGame[gameId];

        newGame.stake = uint128(_amount); // It's safe to cast _amount as it is limited, see onlyValidValue
        newGame.status = GameStatus.ACTIVE;

        activeGames = activeGames.add(1);


        // It's safe to cast _amount as it is limited, see onlyValidValue
        emit LogGameCreated(msg.sender, gameId, uint128(_amount), _serverEndHash,  _userEndHash);
    }

    /**
     * @dev Regular end game session. Used if user and house have both
     * accepted current game session state.
     * The game session with gameId _gameId is closed
     * and the user paid out. This functions is called by the server after
     * the user requested the termination of the current game session.
     * @param _roundId Round id of bet.
     * @param _balance Current balance.
     * @param _serverHash Hash of server's seed for this bet.
     * @param _userHash Hash of user's seed for this bet.
     * @param _gameId Game session id.
     * @param _contractAddress Address of this contract.
     * @param _userAddress Address of user.
     * @param _userSig User's signature of this bet.
     */
    function serverEndGame(
        uint32 _roundId,
        int _balance,
        bytes32 _serverHash,
        bytes32 _userHash,
        uint _gameId,
        address _contractAddress,
        address _userAddress,
        bytes memory _userSig
    )
        public
        onlyServer
    {
        verifySig(
                _roundId,
                0,
                0,
                0,
                _balance,
                _serverHash,
                _userHash,
                _gameId,
                _contractAddress,
                _userSig,
                _userAddress
        );

        regularEndGame(_userAddress, _roundId, _balance, _gameId, _contractAddress);
    }

    /**
     * @notice Regular end game session. Normally not needed as server ends game (@see serverEndGame).
     * Can be used by user if server does not end game session.
     * @param _roundId Round id of bet.
     * @param _balance Current balance.
     * @param _serverHash Hash of server's seed for this bet.
     * @param _userHash Hash of user's seed for this bet.
     * @param _gameId Game session id.
     * @param _contractAddress Address of this contract.
     * @param _serverSig Server's signature of this bet.
     */
    function userEndGame(
        uint32 _roundId,
        int _balance,
        bytes32 _serverHash,
        bytes32 _userHash,
        uint _gameId,
        address _contractAddress,
        bytes memory _serverSig
    )
        public
    {
        verifySig(
                _roundId,
                0,
                0,
                0,
                _balance,
                _serverHash,
                _userHash,
                _gameId,
                _contractAddress,
                _serverSig,
                serverAddress
        );

        regularEndGame(msg.sender, _roundId, _balance, _gameId, _contractAddress);
    }

    /**
     * @dev Verify server signature.
     * @param _userAddress User's address.
     * @param _previousGameId User's previous game id, initial 0.
     * @param _createBefore Game can be only created before this timestamp.
     * @param _serverEndHash Last entry of server's hash chain.
     * @param _serverSig Server signature.
     */
    function verifyCreateSig(
        address _userAddress,
        uint _previousGameId,
        uint _createBefore,
        bytes32 _serverEndHash,
        bytes memory _serverSig
    )
        private view
    {
        address contractAddress = address(this);
        bytes32 hash = keccak256(abi.encodePacked(
            contractAddress, _userAddress, _previousGameId, _createBefore, _serverEndHash
        ));

        verify(hash, _serverSig, serverAddress);
    }

    /**
     * @dev Regular end game session implementation. Used if user and house have both
     * accepted current game session state. The game session with gameId _gameId is closed
     * and the user paid out.
     * @param _userAddress Address of user.
     * @param _balance Current balance.
     * @param _gameId Game session id.
     * @param _contractAddress Address of this contract.
     */
    function regularEndGame(
        address _userAddress,
        uint32 _roundId,
        int _balance,
        uint _gameId,
        address _contractAddress
    )
        private
    {
        uint gameId = userGameId[_userAddress];
        Game storage game = gameIdGame[gameId];
        int maxBalance = conflictRes.maxBalance();
        int gameStake = game.stake;

        require(_gameId == gameId, "inv gameId");
        require(_roundId > 0, "inv roundId");
        // save to cast as game.stake hash fixed range
        require(-gameStake <= _balance && _balance <= maxBalance, "inv balance");
        require(game.status == GameStatus.ACTIVE, "inv status");

        assert(_contractAddress == address(this));

        closeGame(game, gameId, _roundId, _userAddress, ReasonEnded.REGULAR_ENDED, _balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_serverAddress","type":"address"},{"internalType":"uint128","name":"_minStake","type":"uint128"},{"internalType":"uint128","name":"_maxStake","type":"uint128"},{"internalType":"address","name":"_conflictResAddress","type":"address"},{"internalType":"address","name":"_houseAddress","type":"address"},{"internalType":"uint256","name":"_chainId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"LogActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"stake","type":"uint128"},{"indexed":true,"internalType":"bytes32","name":"serverEndHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"userEndHash","type":"bytes32"}],"name":"LogGameCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"roundId","type":"uint32"},{"indexed":false,"internalType":"int256","name":"balance","type":"int256"},{"indexed":false,"internalType":"enum GameChannelBase.ReasonEnded","name":"reason","type":"uint8"}],"name":"LogGameEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"LogOwnerShipTransferInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"LogOwnerShipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"LogPause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"LogServerRequestedEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxStake","type":"uint256"}],"name":"LogStakeLimitsModified","type":"event"},{"anonymous":false,"inputs":[],"name":"LogUnpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newConflictResolutionAddress","type":"address"}],"name":"LogUpdatedConflictResolution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newConflictResolutionAddress","type":"address"}],"name":"LogUpdatingConflictResolution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"LogUserRequestedEnd","type":"event"},{"constant":true,"inputs":[],"name":"BET_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPERATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EIP712DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ERC20TokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TIMEOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TRANSFER_TIMSPAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_TIMEOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_TRANSFER_TIMESPAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TIMEOUT_DESTROY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"activate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"activateConflictResolution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"activeGames","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addHouseStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"conflictRes","outputs":[{"internalType":"contract ConflictResolutionInterface","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32[]","name":"_hashes","type":"bytes32[]"},{"internalType":"uint256","name":"_previousGameId","type":"uint256"},{"internalType":"uint256","name":"_createBefore","type":"uint256"},{"internalType":"bytes","name":"_serverSig","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"createGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gameIdCntr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"gameIdGame","outputs":[{"internalType":"enum GameChannelBase.GameStatus","name":"status","type":"uint8"},{"internalType":"uint128","name":"stake","type":"uint128"},{"internalType":"uint8","name":"gameType","type":"uint8"},{"internalType":"uint32","name":"roundId","type":"uint32"},{"internalType":"uint256","name":"betNum","type":"uint256"},{"internalType":"uint256","name":"betValue","type":"uint256"},{"internalType":"int256","name":"balance","type":"int256"},{"internalType":"bytes32","name":"userSeed","type":"bytes32"},{"internalType":"bytes32","name":"serverSeed","type":"bytes32"},{"internalType":"uint256","name":"endInitiatedTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"houseAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"houseProfit","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"houseStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastProfitTransferTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxStake","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minStake","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newConflictRes","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingReturns","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"profitTransferTimeSpan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"serverAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"serverCancelActiveGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"bytes","name":"_userSig","type":"bytes"}],"name":"serverEndGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"uint8","name":"_gameType","type":"uint8"},{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"bytes","name":"_userSig","type":"bytes"},{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"bytes32","name":"_serverSeed","type":"bytes32"},{"internalType":"bytes32","name":"_userSeed","type":"bytes32"}],"name":"serverEndGameConflict","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"serverForceGameEnd","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_gameIdCntr","type":"uint256"}],"name":"setGameIdCntr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_houseAddress","type":"address"}],"name":"setHouseAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_profitTransferTimeSpan","type":"uint256"}],"name":"setProfitTransferTimeSpan","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint128","name":"_minStake","type":"uint128"},{"internalType":"uint128","name":"_maxStake","type":"uint128"}],"name":"setStakeRequirements","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"timePaused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"transferProfitToHouse","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newConflictResAddress","type":"address"}],"name":"updateConflictResolution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"updateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"userCancelActiveGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"bytes","name":"_serverSig","type":"bytes"}],"name":"userEndGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"uint8","name":"_gameType","type":"uint8"},{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"bytes","name":"_serverSig","type":"bytes"},{"internalType":"bytes32","name":"_userSeed","type":"bytes32"}],"name":"userEndGameConflict","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"userForceGameEnd","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userGameId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdrawHouseStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526001805461ffff60a01b1916600160a81b17815542600255600480546001600160a01b031990811690915560006005819055600680548316739bb6fd000109e24eb38b0deb806382ff9247e4789081179091556008829055600993909355600c819055600d5562127500600f556014805490911690911790553480156200008a57600080fd5b506040516200396b3803806200396b833981810160405260c0811015620000b057600080fd5b508051602082015160408301516060840151608085015160a09095015160008054336001600160a01b0319918216179091556001805482169055600380549091166001600160a01b03841617905593949293919290918585858585858585858585856001600160801b038516158015906200013d5750836001600160801b0316856001600160801b031611155b6200014757600080fd5b600a80546001600160a01b038089166001600160a01b031992831617909255600b80549285169290911691909117905542601055600e80546001600160801b03868116600160801b028189166001600160801b0319909316929092171617905560405180605262003919823960408051918290036052018220672234b1b2ba3432b960c11b83528151928390036008018320601960f91b8452825193849003600101842060208086019390935284840191909152606084015260808301949094523060a0808401919091528151808403909101815260c0909201905280519201919091206007555050505050505050505050505050505050506136c980620002506000396000f3fe608060405234801561001057600080fd5b50600436106103785760003560e01c806388fedd04116101d3578063d1e9dcbf11610104578063e475222e116100a2578063ef3aaf541161007c578063ef3aaf5414610c10578063f2fde38b14610c36578063f87ffb7414610c5c578063fd306ca714610c6457610378565b8063e475222e14610b29578063e60a33aa14610b31578063ea1b28e014610c0857610378565b8063db420fe3116100de578063db420fe314610b09578063dc55509014610b11578063de38eb3a14610b19578063e30c397814610b2157610378565b8063d1e9dcbf14610aa7578063d6e5fe9814610ad3578063d7cee31e14610b0157610378565b8063a09f865911610171578063bd5c4e241161014b578063bd5c4e2414610a69578063c49f91d314610a71578063c861f3a014610a79578063cbffb1ae14610a8157610378565b8063a09f865914610a18578063a8182cd314610a20578063b064ca1814610a4c57610378565b8063947bc72d116101ad578063947bc72d146109ce5780639b29f133146109d65780639c0051db146109f35780639f34ce1414610a1057610378565b806388fedd04146108b95780638da5cb5b146108c15780639399dd7e146108c957610378565b80634d20d4bc116102ad5780637ead05f11161024b57806383e256dc1161022557806383e256dc146107205780638456cb59146107b6578063853828b6146107be578063878de0ae146107c657610378565b80637ead05f1146106de57806381efc01d146106fb57806383197ef01461071857610378565b8063563c23a011610287578063563c23a0146105925780635a48766c1461059a5780635ba2dd22146106ce5780635c975abb146106d657610378565b80634d20d4bc1461057a5780634e71e0c814610582578063543ad1df1461058a57610378565b8063287e9fbc1161031a5780633ccfd60b116102f45780633ccfd60b1461047e5780633f4ba83a14610486578063410453ae1461048e57806341b801841461057257610378565b8063287e9fbc146104355780632c94a23514610452578063375b3c0a1461045a57610378565b806319fc36ed1161035657806319fc36ed146103bd5780631aef99b7146103c55780631b08345a146103e957806326b387bb1461040f57610378565b80630df632101461037d5780630f15f4c014610397578063186601ca146103a1575b600080fd5b610385610c6c565b60408051918252519081900360200190f35b61039f610c72565b005b6103a9610cde565b604080519115158252519081900360200190f35b610385610cee565b6103cd610cf5565b604080516001600160a01b039092168252519081900360200190f35b610385600480360360208110156103ff57600080fd5b50356001600160a01b0316610d04565b6103856004803603602081101561042557600080fd5b50356001600160a01b0316610d16565b61039f6004803603602081101561044b57600080fd5b5035610d28565b610385610d6a565b610462610d70565b604080516001600160801b039092168252519081900360200190f35b61039f610d7f565b61039f610dd8565b61039f60048036036101008110156104a557600080fd5b63ffffffff823516916020810135916040820135916060810135916080820135916001600160a01b0360a082013581169260c08301359091169190810190610100810160e0820135600160201b8111156104fe57600080fd5b82018360208201111561051057600080fd5b803590602001918460018302840111600160201b8311171561053157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e58945050505050565b610385610e9b565b610385610ea1565b61039f610ebc565b610385610f2d565b610385610f34565b61039f600480360360a08110156105b057600080fd5b810190602081018135600160201b8111156105ca57600080fd5b8201836020820111156105dc57600080fd5b803590602001918460208302840111600160201b831117156105fd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295843595602086013595919450925060608101915060400135600160201b81111561065857600080fd5b82018360208201111561066a57600080fd5b803590602001918460018302840111600160201b8311171561068b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610f3a915050565b6103cd611344565b6103a9611353565b61039f600480360360208110156106f457600080fd5b5035611363565b61039f6004803603602081101561071157600080fd5b5035611419565b61039f61159d565b61073d6004803603602081101561073657600080fd5b50356115fc565b604051808b600381111561074d57fe5b60ff90811682526001600160801b03909b166020820152989099166040808a019190915263ffffffff9097166060890152608088019590955260a087019390935260c086019190915260e085015261010084015261012083015251908190036101400192509050f35b61039f611663565b61039f611704565b61039f60048036036101608110156107dd57600080fd5b63ffffffff8235169160ff6020820135169160408201359160608101359160808201359160a08101359160c08201359160e0810135916001600160a01b036101008301351691908101906101408101610120820135600160201b81111561084357600080fd5b82018360208201111561085557600080fd5b803590602001918460018302840111600160201b8311171561087657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506117bb915050565b610385611801565b6103cd611807565b61039f60048036036101a08110156108e057600080fd5b63ffffffff8235169160ff6020820135169160408201359160608101359160808201359160a08101359160c08201359160e0810135916001600160a01b036101008301351691908101906101408101610120820135600160201b81111561094657600080fd5b82018360208201111561095857600080fd5b803590602001918460018302840111600160201b8311171561097957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b038335169350505060208101359060400135611816565b610385611862565b61039f600480360360208110156109ec57600080fd5b5035611869565b61039f60048036036020811015610a0957600080fd5b5035611964565b61039f6119a1565b6103cd611a60565b61039f60048036036040811015610a3657600080fd5b506001600160a01b038135169060200135611a6f565b61039f60048036036020811015610a6257600080fd5b5035611b84565b610385611d2a565b610385611d31565b610385611d4c565b61039f60048036036020811015610a9757600080fd5b50356001600160a01b0316611d52565b61039f60048036036040811015610abd57600080fd5b506001600160a01b038135169060200135611dc1565b61039f60048036036040811015610ae957600080fd5b506001600160801b0381358116916020013516611f98565b6103cd612063565b6103cd612072565b610385612081565b610385612087565b6103cd61208e565b61038561209d565b61039f600480360360e0811015610b4757600080fd5b63ffffffff823516916020810135916040820135916060810135916080820135916001600160a01b0360a0820135169181019060e0810160c0820135600160201b811115610b9457600080fd5b820183602082011115610ba657600080fd5b803590602001918460018302840111600160201b83111715610bc757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506120a3945050505050565b6104626120e3565b61039f60048036036020811015610c2657600080fd5b50356001600160a01b03166120f9565b61039f60048036036020811015610c4c57600080fd5b50356001600160a01b0316612132565b61038561219a565b61039f6121a0565b60075481565b6000546001600160a01b03163314610c8957600080fd5b600154600160a01b900460ff1615610ca057600080fd5b6001805460ff60a01b1916600160a01b1790556040517fc9d6bebde85c4e3348468c6af2cb34f978d1a8c6eebc438f1361c1ad5edf5f0e90600090a1565b600154600160a01b900460ff1681565b6201518081565b6014546001600160a01b031681565b60126020526000908152604090205481565b60136020526000908152604090205481565b6000546001600160a01b03163314610d3f57600080fd5b600154600160a01b900460ff1615610d5657600080fd5b600060095411610d6557600080fd5b600955565b600f5481565b600e546001600160801b031681565b3360009081526013602052604090205480610d9957600080fd5b336000818152601360205260408082208290555183156108fc0291849190818181858888f19350505050158015610dd4573d6000803e3d6000fd5b5050565b6000546001600160a01b03163314610def57600080fd5b600154600160a81b900460ff16610e0557600080fd5b600154600160a01b900460ff16610e1b57600080fd5b6001805460ff60a81b19169055600060028190556040517f730c1faaa977b67dacf1e2451ef54556e04a07d577785ff79f6d31f73502efc99190a1565b600a546001600160a01b03163314610e6f57600080fd5b610e848860008060008b8b8b8b8b8a8c61226f565b610e9182898987876122e2565b5050505050505050565b60105481565b60405180608161361482396081019050604051809103902081565b6001546001600160a01b03163314610ed357600080fd5b60018054600080546001600160a01b038084166001600160a01b031992831617808455919093169093556040519092909116907f897d3c8bbea11029ba3b26eb993fe8edb14c2c4c0d2ecceccce41d1d83d3e359908390a3565b6203f48081565b60025481565b600e5481906001600160801b03168110801590610f695750600e54600160801b90046001600160801b03168111155b610fa6576040805162461bcd60e51b8152602060048201526009602482015268696e76207374616b6560b81b604482015290519081900360640190fd5b600854600354604080516373c4726b60e01b8152600190930160048401819052905190926000926001600160a01b0316916373c4726b91602480820192602092909190829003018186803b158015610ffd57600080fd5b505afa158015611011573d6000803e3d6000fd5b505050506040513d602081101561102757600080fd5b5051600c54909150811115611074576040805162461bcd60e51b815260206004820152600e60248201526d696e7620686f7573655374616b6560901b604482015290519081900360640190fd5b600154600160a81b900460ff16156110bc576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b6000886000815181106110cb57fe5b602002602001015190506000896001815181106110e457fe5b6020908102919091018101513360009081526012835260408082205480835260119094528120919350815460ff16600381111561111d57fe5b14611165576040805162461bcd60e51b81526020600482015260136024820152721c1c995d8819d85b59481b9bdd08195b991959606a1b604482015290519081900360640190fd5b8a82146111ae576040805162461bcd60e51b81526020600482015260126024820152711a5b9d8819d85b59541c995d91d85b59525960721b604482015290519081900360640190fd5b8942106111ec576040805162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b604482015290519081900360640190fd5b6111f9338c8c868d6124db565b601454604080516323b872dd60e01b8152336004820152306024820152604481018b905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b505050506040513d602081101561127d57600080fd5b505060098054600180820190925533600090815260126020908152604080832084905583835260119091529020805470ffffffffffffffffffffffffffffffff0019166101006001600160801b038d16021760ff191683178155600854919290916112e79161254e565b600855604080516001600160801b038c1681526020810188905281518792859233927fd25faca801440882fa5d7c7f70b072a2ad89621e277ee0b6f9923ccac48411b1929181900390910190a45050505050505050505050505050565b6003546001600160a01b031681565b600154600160a81b900460ff1681565b6000546001600160a01b0316331461137a57600080fd5b600654604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156113d457600080fd5b505af11580156113e8573d6000803e3d6000fd5b505050506040513d60208110156113fe57600080fd5b5050600c54611413908263ffffffff61254e16565b600c5550565b6000546001600160a01b0316331461143057600080fd5b600354600854604080516373c4726b60e01b81526004810192909252516000926001600160a01b0316916373c4726b916024808301926020929190829003018186803b15801561147f57600080fd5b505afa158015611493573d6000803e3d6000fd5b505050506040513d60208110156114a957600080fd5b5051600c5490915082118015906114d35750600c5481906114d0908463ffffffff61256116565b10155b6114dc57600080fd5b6000600d5413158061150a5750600c546114fc908363ffffffff61256116565b611507600d54612573565b11155b61151357600080fd5b600c54611526908363ffffffff61256116565b600c55600654600b546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919092169163a9059cbb91604480830192600092919082900301818387803b15801561158157600080fd5b505af1158015611595573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031633146115b457600080fd5b600154621a5e0090600160a81b900460ff1680156115e5575060025442906115e2908363ffffffff61254e16565b11155b6115ee57600080fd5b6000546001600160a01b0316ff5b601160205260009081526040902080546001820154600283015460038401546004850154600586015460069096015460ff8087169761010088046001600160801b031697600160881b810490921696600160901b90920463ffffffff16959194919391928a565b6000546001600160a01b0316331461167a57600080fd5b600154600160a81b900460ff16156116c2576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b6001805460ff60a81b1916600160a81b179055426002556040517f4b314b34e912fda7f95e7d23e9c8c95f82f0aff1984e4ce592a0b005f905562490600090a1565b6000546001600160a01b0316331461171b57600080fd5b6001546203f48090600160a81b900460ff16801561174c57506002544290611749908363ffffffff61254e16565b11155b61175557600080fd5b6000600d819055600c805490829055600654600b546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810185905290519394919092169263a9059cbb92604480820193929182900301818387803b15801561158157600080fd5b6117e38b8b8b8b8b8b8b8b8b8b600a60009054906101000a90046001600160a01b031661226f565b6117f48b8b8b8b8b8a878b33612583565b5050505050505050505050565b600d5481565b6000546001600160a01b031681565b600a546001600160a01b0316331461182d57600080fd5b6118408d8d8d8d8d8d8d8d8d8d8d61226f565b6118538d8d8d8d8d8d8d89898f8d612a2b565b50505050505050505050505050565b62ed4e0081565b3360008181526012602090815260408083205480845260119092529091208382146118c8576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6001815460ff1660038111156118da57fe5b141561192357426006820155805460ff19166002178155604051829033907f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed90600090a361195e565b6003815460ff16600381111561193557fe5b14801561194e57508054600160901b900463ffffffff16155b156103785761195e818385612f2d565b50505050565b6000546001600160a01b0316331461197b57600080fd5b80620151808110158015611992575062ed4e008111155b61199b57600080fd5b50600f55565b6000546001600160a01b031633146119b857600080fd5b6004546001600160a01b03166119cd57600080fd5b6005546119d957600080fd5b426203f48060055401111580156119f757506207e900600554014211155b611a0057600080fd5b60048054600380546001600160a01b03199081166001600160a01b038416179091551690556000600581905560408051918252517f28de3c2df3d09a8b061f86cd0c78b7d02f1f5caffcd086ff45ee12a4a51056c89181900360200190a1565b6004546001600160a01b031681565b600a546001600160a01b03163314611a8657600080fd5b6001600160a01b0382166000908152601260209081526040808320548084526011909252909120828214611aee576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6001815460ff166003811115611b0057fe5b1415611b4957426006820155805460ff19166003178155604051829033907fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab090600090a361195e565b6002815460ff166003811115611b5b57fe5b148015611b7457508054600160901b900463ffffffff16155b156103785761195e818386612f2d565b336000818152601260209081526040808320548084526011909252909120838214611be3576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6002815460ff166003811115611bf557fe5b14611c34576040805162461bcd60e51b815260206004820152600a602482015269696e762073746174757360b01b604482015290519081900360640190fd5b600380548254600184015460028501549385015460068601546040805163062f5d8d60e11b8152600160881b860460ff1660048201526024810194909452604484019690965260648301919091526101009092046001600160801b0316608482015260a481019190915291516000926001600160a01b0390921691630c5ebb1a9160c4808301926020929190829003018186803b158015611cd457600080fd5b505afa158015611ce8573d6000803e3d6000fd5b505050506040513d6020811015611cfe57600080fd5b50518254909150611d239083908590600160901b900463ffffffff1687600286612fd3565b5050505050565b621a5e0081565b6040518060526135c282396052019050604051809103902081565b600c5481565b6000546001600160a01b03163314611d6957600080fd5b600480546001600160a01b0383166001600160a01b031990911681179091554260055560408051918252517f97044e884f04922f1959ef2de012f4734423df2d4da57fd4c5eaf40cd63b525f9181900360200190a150565b600a546001600160a01b03163314611dd857600080fd5b6001600160a01b0382166000908152601260209081526040808320548084526011909252909120828214611e40576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6003815460ff166003811115611e5257fe5b14611e91576040805162461bcd60e51b815260206004820152600a602482015269696e762073746174757360b01b604482015290519081900360640190fd5b6003805482546001840154600285015493850154600586015460048088015460068901546040805163454a41cd60e11b8152600160881b890460ff16948101949094526024840196909652604483019890985260648201939093526101009094046001600160801b0316608485015260a484015260c483015260e482019390935291516000926001600160a01b0390921691638a94839a91610104808301926020929190829003018186803b158015611f4957600080fd5b505afa158015611f5d573d6000803e3d6000fd5b505050506040513d6020811015611f7357600080fd5b50518254909150611d239083908590600160901b900463ffffffff1688600186612fd3565b6000546001600160a01b03163314611faf57600080fd5b6000826001600160801b0316118015611fda5750806001600160801b0316826001600160801b031611155b611fe357600080fd5b600e80546fffffffffffffffffffffffffffffffff19166001600160801b03848116919091178116600160801b8483168102919091179283905560408051848416815291909304909116602082015281517f1ec948cac143dba0e555a87dd86ae387e2ecd4a8fee80f7dd324d5987cb3e7f8929181900390910190a15050565b600b546001600160a01b031681565b600a546001600160a01b031681565b60055481565b6207e90081565b6001546001600160a01b031681565b60085481565b6120cd8760008060008a8a8a8a8a8a600a60009054906101000a90046001600160a01b031661226f565b6120da33888886866122e2565b50505050505050565b600e54600160801b90046001600160801b031681565b6000546001600160a01b0316331461211057600080fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461214957600080fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917f83ada3430836f9d4bd6f7bc690ffbba5199cb19b37393dd64c229930213535969190a350565b60095481565b426121b8600f5460105461254e90919063ffffffff16565b11156121c357600080fd5b42601055600d546000126121d65761226d565b60006121e3600d54612573565b6000600d55600c549091506121fe908263ffffffff61256116565b600c55600654600b546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018590529051919092169163a9059cbb91604480830192600092919082900301818387803b15801561225957600080fd5b505af1158015611d23573d6000803e3d6000fd5b565b306001600160a01b03841681146122c3576040805162461bcd60e51b8152602060048201526013602482015272696e7620636f6e74726163744164647265737360681b604482015290519081900360640190fd5b60006122d58d8d8d8d8d8d8d8d61307c565b905061185381858561313a565b6001600160a01b038086166000908152601260209081526040808320548084526011835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a9260048083019392829003018186803b15801561234357600080fd5b505afa158015612357573d6000803e3d6000fd5b505050506040513d602081101561236d57600080fd5b5051825490915061010090046001600160801b03168386146123c3576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b60008863ffffffff161161240c576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9d881c9bdd5b99125960aa1b604482015290519081900360640190fd5b86816000031315801561241f5750818713155b61245e576040805162461bcd60e51b815260206004820152600b60248201526a696e762062616c616e636560a81b604482015290519081900360640190fd5b6001835460ff16600381111561247057fe5b146124af576040805162461bcd60e51b815260206004820152600a602482015269696e762073746174757360b01b604482015290519081900360640190fd5b6001600160a01b03851630146124c157fe5b6124d083858a8c60008c612fd3565b505050505050505050565b6040805130606081811b6020808501919091529089901b6bffffffffffffffffffffffff19166034840152604883018890526068830187905260888084018790528451808503909101815260a890930190935281519190920120600a546120da90829085906001600160a01b031661313a565b8181018281101561255b57fe5b92915050565b60008282111561256d57fe5b50900390565b60008082121561257f57fe5b5090565b6001600160a01b038082166000908152601260209081526040808320548084526011835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a9260048083019392829003018186803b1580156125e457600080fd5b505afa1580156125f8573d6000803e3d6000fd5b505050506040513d602081101561260e57600080fd5b5051825490915061010090046001600160801b0316858414612664576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b60008d63ffffffff16116126ad576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9d881c9bdd5b99125960aa1b604482015290519081900360640190fd5b6040805160208082018a90528251808303820181529183019092528051910120881461270f576040805162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b604482015290519081900360640190fd5b8881600003131580156127225750818913155b612761576040805162461bcd60e51b815260206004820152600b60248201526a696e762062616c616e636560a81b604482015290519081900360640190fd5b600354604080516309eecdd760e01b815260ff8f166004820152602481018e9052604481018d905290516001600160a01b03909216916309eecdd791606480820192602092909190829003018186803b1580156127bd57600080fd5b505afa1580156127d1573d6000803e3d6000fd5b505050506040513d60208110156127e757600080fd5b5051612824576040805162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b604482015290519081900360640190fd5b600061284e6128328c613209565b612842848d63ffffffff61321816565b9063ffffffff61324f16565b1215612892576040805162461bcd60e51b815260206004820152600e60248201526d0ecc2d8eaca40e8dede40d0d2ced60931b604482015290519081900360640190fd5b6003835460ff1660038111156128a457fe5b1480156128c15750825463ffffffff8e8116600160901b90920416145b156128dd57600483018790556128d883858761327e565b611853565b6001835460ff1660038111156128ef57fe5b148061292557506003835460ff16600381111561290857fe5b1480156129255750825463ffffffff808f16600160901b90920416105b156129f2578254600290849060ff191660018302179055504283600601819055508c8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508b8360000160116101000a81548160ff021916908360ff1602179055508a83600101819055508983600201819055508883600301819055508683600401819055506000801b836005018190555083336001600160a01b03167f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed60405160405180910390a3611853565b6040805162461bcd60e51b8152602060048201526009602482015268696e7620737461746560b81b604482015290519081900360640190fd5b6001600160a01b038082166000908152601260209081526040808320548084526011835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a9260048083019392829003018186803b158015612a8c57600080fd5b505afa158015612aa0573d6000803e3d6000fd5b505050506040513d6020811015612ab657600080fd5b5051825490915061010090046001600160801b0316858414612b0c576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b60008f63ffffffff1611612b55576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9d881c9bdd5b99125960aa1b604482015290519081900360640190fd5b6040805160208082018b905282518083038201815291830190925280519101208a14612bb9576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d881cd95c9d995c94d9595960921b604482015290519081900360640190fd5b6040805160208082018a905282518083038201815291830190925280519101208914612c1b576040805162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b604482015290519081900360640190fd5b8a8160000313158015612c2e5750818b13155b612c6d576040805162461bcd60e51b815260206004820152600b60248201526a696e762062616c616e636560a81b604482015290519081900360640190fd5b600360009054906101000a90046001600160a01b03166001600160a01b03166309eecdd78f8f8f6040518463ffffffff1660e01b8152600401808460ff1660ff168152602001838152602001828152602001935050505060206040518083038186803b158015612cdc57600080fd5b505afa158015612cf0573d6000803e3d6000fd5b505050506040513d6020811015612d0657600080fd5b5051612d43576040805162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b604482015290519081900360640190fd5b6000612d61612d518e613209565b612842848f63ffffffff61321816565b1215612da5576040805162461bcd60e51b815260206004820152600e60248201526d746f6f20686967682076616c756560901b604482015290519081900360640190fd5b6002835460ff166003811115612db757fe5b148015612de357508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16145b15612dff5760058301889055612dfa83858761327e565b612f1c565b6001835460ff166003811115612e1157fe5b1480612e5657506002835460ff166003811115612e2a57fe5b148015612e5657508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16105b156129f2578254600390849060ff191660018302179055504283600601819055508e8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508d8360000160116101000a81548160ff021916908360ff1602179055508c83600101819055508b83600201819055508a836003018190555087836005018190555086836004018190555083856001600160a01b03167fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab060405160405180910390a35b505050505050505050505050505050565b60035460408051637e7630bd60e11b815290516000926001600160a01b03169163fcec617a916004808301926020929190829003018186803b158015612f7257600080fd5b505afa158015612f86573d6000803e3d6000fd5b505050506040513d6020811015612f9c57600080fd5b505184546000918203925061010090046001600160801b031690819003821215612fc7578060000391505b611d2385856000866003875b855460ff19168655600854612fe9906001612561565b600855855461300890849061010090046001600160801b03168361337d565b84836001600160a01b03167f59ba0efd7d5a5d7e109fb346b50365a8d68661fc7c2c311cd29750707e1b8de5868486604051808463ffffffff1663ffffffff16815260200183815260200182600381111561305f57fe5b60ff168152602001935050505060405180910390a3505050505050565b6000806040518080613614608191396040805191829003608101822060208084019190915263ffffffff9d909d168282015260ff9b909b166060820152608081019990995250505060a086019490945260c085019290925260e084015261010083015261012080830191909152825180830390910181526101408201835280519084012060075461190160f01b61016084015261016283015261018280830191909152825180830390910181526101a2909101909152805191012090565b6000806000613148856134d0565b925092509250600060018783868660405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156131ad573d6000803e3d6000fd5b505050602060405103519050846001600160a01b0316816001600160a01b0316146120da576040805162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b604482015290519081900360640190fd5b6000600160ff1b821061257f57fe5b600082820181831280159061322d5750838112155b80613242575060008312801561324257508381125b61324857fe5b9392505050565b60008183038183128015906132645750838113155b806132425750600083128015613242575083811361324857fe5b600380548454600186015460028701549387015460058801546004808a015460408051631503b1e760e11b8152600160881b880460ff16938101939093526024830195909552604482019790975260648101929092526101009093046001600160801b0316608482015260a481019290925260c482019390935291516000926001600160a01b0390921691632a0763ce9160e4808301926020929190829003018186803b15801561332e57600080fd5b505afa158015613342573d6000803e3d6000fd5b505050506040513d602081101561335857600080fd5b5051845490915061195e9085908590600160901b900463ffffffff1685600386612fd3565b6000826001600160801b031690506000613398600c54613209565b9050600360009054906101000a90046001600160a01b03166001600160a01b03166373ad468a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156133e857600080fd5b505afa1580156133fc573d6000803e3d6000fd5b505050506040513d602081101561341257600080fd5b505183131561341d57fe5b600061342f838563ffffffff61321816565b121561343757fe5b60008313801561344657508281125b1561344f578092505b600d54613462908463ffffffff61324f16565b600d556000613477828563ffffffff61324f16565b905061348281612573565b600c55600061349f61349a858763ffffffff61321816565b612573565b6001600160a01b03881660009081526013602052604090208054820190819055909150156120da576120da8761353e565b60008060008351604114613515576040805162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b604482015290519081900360640190fd5b50505060208101516040820151604183015160ff16600281101561353757601b015b9193909250565b6001600160a01b0381166000908152601360205260409020548061355e57fe5b6001600160a01b03808316600081815260136020526040808220829055600654815163a9059cbb60e01b8152600481019490945260248401869052905193169263a9059cbb92604480820193929182900301818387803b15801561158157600080fdfe454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374294265742875696e74333220726f756e6449642c75696e74382067616d65547970652c75696e74323536206e756d6265722c75696e743235362076616c75652c696e743235362062616c616e63652c6279746573333220736572766572486173682c627974657333322075736572486173682c75696e743235362067616d65496429a265627a7a723158203c6923dfa52cb5447c4679690d20ae4c36d324b5d79687182c0b56dd20d1aa4864736f6c63430005100032454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374290000000000000000000000008bea174f641d239d7f02b9e2d92b8fd1cdd75773000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000069f52540949eb5417fc70e200140ca2a26307070000000000000000000000000986ded3c50bc1d7c59c8c40e4bcc61a2b87efeca0000000000000000000000000000000000000000000000000000000000000001

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103785760003560e01c806388fedd04116101d3578063d1e9dcbf11610104578063e475222e116100a2578063ef3aaf541161007c578063ef3aaf5414610c10578063f2fde38b14610c36578063f87ffb7414610c5c578063fd306ca714610c6457610378565b8063e475222e14610b29578063e60a33aa14610b31578063ea1b28e014610c0857610378565b8063db420fe3116100de578063db420fe314610b09578063dc55509014610b11578063de38eb3a14610b19578063e30c397814610b2157610378565b8063d1e9dcbf14610aa7578063d6e5fe9814610ad3578063d7cee31e14610b0157610378565b8063a09f865911610171578063bd5c4e241161014b578063bd5c4e2414610a69578063c49f91d314610a71578063c861f3a014610a79578063cbffb1ae14610a8157610378565b8063a09f865914610a18578063a8182cd314610a20578063b064ca1814610a4c57610378565b8063947bc72d116101ad578063947bc72d146109ce5780639b29f133146109d65780639c0051db146109f35780639f34ce1414610a1057610378565b806388fedd04146108b95780638da5cb5b146108c15780639399dd7e146108c957610378565b80634d20d4bc116102ad5780637ead05f11161024b57806383e256dc1161022557806383e256dc146107205780638456cb59146107b6578063853828b6146107be578063878de0ae146107c657610378565b80637ead05f1146106de57806381efc01d146106fb57806383197ef01461071857610378565b8063563c23a011610287578063563c23a0146105925780635a48766c1461059a5780635ba2dd22146106ce5780635c975abb146106d657610378565b80634d20d4bc1461057a5780634e71e0c814610582578063543ad1df1461058a57610378565b8063287e9fbc1161031a5780633ccfd60b116102f45780633ccfd60b1461047e5780633f4ba83a14610486578063410453ae1461048e57806341b801841461057257610378565b8063287e9fbc146104355780632c94a23514610452578063375b3c0a1461045a57610378565b806319fc36ed1161035657806319fc36ed146103bd5780631aef99b7146103c55780631b08345a146103e957806326b387bb1461040f57610378565b80630df632101461037d5780630f15f4c014610397578063186601ca146103a1575b600080fd5b610385610c6c565b60408051918252519081900360200190f35b61039f610c72565b005b6103a9610cde565b604080519115158252519081900360200190f35b610385610cee565b6103cd610cf5565b604080516001600160a01b039092168252519081900360200190f35b610385600480360360208110156103ff57600080fd5b50356001600160a01b0316610d04565b6103856004803603602081101561042557600080fd5b50356001600160a01b0316610d16565b61039f6004803603602081101561044b57600080fd5b5035610d28565b610385610d6a565b610462610d70565b604080516001600160801b039092168252519081900360200190f35b61039f610d7f565b61039f610dd8565b61039f60048036036101008110156104a557600080fd5b63ffffffff823516916020810135916040820135916060810135916080820135916001600160a01b0360a082013581169260c08301359091169190810190610100810160e0820135600160201b8111156104fe57600080fd5b82018360208201111561051057600080fd5b803590602001918460018302840111600160201b8311171561053157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e58945050505050565b610385610e9b565b610385610ea1565b61039f610ebc565b610385610f2d565b610385610f34565b61039f600480360360a08110156105b057600080fd5b810190602081018135600160201b8111156105ca57600080fd5b8201836020820111156105dc57600080fd5b803590602001918460208302840111600160201b831117156105fd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295843595602086013595919450925060608101915060400135600160201b81111561065857600080fd5b82018360208201111561066a57600080fd5b803590602001918460018302840111600160201b8311171561068b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610f3a915050565b6103cd611344565b6103a9611353565b61039f600480360360208110156106f457600080fd5b5035611363565b61039f6004803603602081101561071157600080fd5b5035611419565b61039f61159d565b61073d6004803603602081101561073657600080fd5b50356115fc565b604051808b600381111561074d57fe5b60ff90811682526001600160801b03909b166020820152989099166040808a019190915263ffffffff9097166060890152608088019590955260a087019390935260c086019190915260e085015261010084015261012083015251908190036101400192509050f35b61039f611663565b61039f611704565b61039f60048036036101608110156107dd57600080fd5b63ffffffff8235169160ff6020820135169160408201359160608101359160808201359160a08101359160c08201359160e0810135916001600160a01b036101008301351691908101906101408101610120820135600160201b81111561084357600080fd5b82018360208201111561085557600080fd5b803590602001918460018302840111600160201b8311171561087657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506117bb915050565b610385611801565b6103cd611807565b61039f60048036036101a08110156108e057600080fd5b63ffffffff8235169160ff6020820135169160408201359160608101359160808201359160a08101359160c08201359160e0810135916001600160a01b036101008301351691908101906101408101610120820135600160201b81111561094657600080fd5b82018360208201111561095857600080fd5b803590602001918460018302840111600160201b8311171561097957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b038335169350505060208101359060400135611816565b610385611862565b61039f600480360360208110156109ec57600080fd5b5035611869565b61039f60048036036020811015610a0957600080fd5b5035611964565b61039f6119a1565b6103cd611a60565b61039f60048036036040811015610a3657600080fd5b506001600160a01b038135169060200135611a6f565b61039f60048036036020811015610a6257600080fd5b5035611b84565b610385611d2a565b610385611d31565b610385611d4c565b61039f60048036036020811015610a9757600080fd5b50356001600160a01b0316611d52565b61039f60048036036040811015610abd57600080fd5b506001600160a01b038135169060200135611dc1565b61039f60048036036040811015610ae957600080fd5b506001600160801b0381358116916020013516611f98565b6103cd612063565b6103cd612072565b610385612081565b610385612087565b6103cd61208e565b61038561209d565b61039f600480360360e0811015610b4757600080fd5b63ffffffff823516916020810135916040820135916060810135916080820135916001600160a01b0360a0820135169181019060e0810160c0820135600160201b811115610b9457600080fd5b820183602082011115610ba657600080fd5b803590602001918460018302840111600160201b83111715610bc757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506120a3945050505050565b6104626120e3565b61039f60048036036020811015610c2657600080fd5b50356001600160a01b03166120f9565b61039f60048036036020811015610c4c57600080fd5b50356001600160a01b0316612132565b61038561219a565b61039f6121a0565b60075481565b6000546001600160a01b03163314610c8957600080fd5b600154600160a01b900460ff1615610ca057600080fd5b6001805460ff60a01b1916600160a01b1790556040517fc9d6bebde85c4e3348468c6af2cb34f978d1a8c6eebc438f1361c1ad5edf5f0e90600090a1565b600154600160a01b900460ff1681565b6201518081565b6014546001600160a01b031681565b60126020526000908152604090205481565b60136020526000908152604090205481565b6000546001600160a01b03163314610d3f57600080fd5b600154600160a01b900460ff1615610d5657600080fd5b600060095411610d6557600080fd5b600955565b600f5481565b600e546001600160801b031681565b3360009081526013602052604090205480610d9957600080fd5b336000818152601360205260408082208290555183156108fc0291849190818181858888f19350505050158015610dd4573d6000803e3d6000fd5b5050565b6000546001600160a01b03163314610def57600080fd5b600154600160a81b900460ff16610e0557600080fd5b600154600160a01b900460ff16610e1b57600080fd5b6001805460ff60a81b19169055600060028190556040517f730c1faaa977b67dacf1e2451ef54556e04a07d577785ff79f6d31f73502efc99190a1565b600a546001600160a01b03163314610e6f57600080fd5b610e848860008060008b8b8b8b8b8a8c61226f565b610e9182898987876122e2565b5050505050505050565b60105481565b60405180608161361482396081019050604051809103902081565b6001546001600160a01b03163314610ed357600080fd5b60018054600080546001600160a01b038084166001600160a01b031992831617808455919093169093556040519092909116907f897d3c8bbea11029ba3b26eb993fe8edb14c2c4c0d2ecceccce41d1d83d3e359908390a3565b6203f48081565b60025481565b600e5481906001600160801b03168110801590610f695750600e54600160801b90046001600160801b03168111155b610fa6576040805162461bcd60e51b8152602060048201526009602482015268696e76207374616b6560b81b604482015290519081900360640190fd5b600854600354604080516373c4726b60e01b8152600190930160048401819052905190926000926001600160a01b0316916373c4726b91602480820192602092909190829003018186803b158015610ffd57600080fd5b505afa158015611011573d6000803e3d6000fd5b505050506040513d602081101561102757600080fd5b5051600c54909150811115611074576040805162461bcd60e51b815260206004820152600e60248201526d696e7620686f7573655374616b6560901b604482015290519081900360640190fd5b600154600160a81b900460ff16156110bc576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b6000886000815181106110cb57fe5b602002602001015190506000896001815181106110e457fe5b6020908102919091018101513360009081526012835260408082205480835260119094528120919350815460ff16600381111561111d57fe5b14611165576040805162461bcd60e51b81526020600482015260136024820152721c1c995d8819d85b59481b9bdd08195b991959606a1b604482015290519081900360640190fd5b8a82146111ae576040805162461bcd60e51b81526020600482015260126024820152711a5b9d8819d85b59541c995d91d85b59525960721b604482015290519081900360640190fd5b8942106111ec576040805162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b604482015290519081900360640190fd5b6111f9338c8c868d6124db565b601454604080516323b872dd60e01b8152336004820152306024820152604481018b905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b505050506040513d602081101561127d57600080fd5b505060098054600180820190925533600090815260126020908152604080832084905583835260119091529020805470ffffffffffffffffffffffffffffffff0019166101006001600160801b038d16021760ff191683178155600854919290916112e79161254e565b600855604080516001600160801b038c1681526020810188905281518792859233927fd25faca801440882fa5d7c7f70b072a2ad89621e277ee0b6f9923ccac48411b1929181900390910190a45050505050505050505050505050565b6003546001600160a01b031681565b600154600160a81b900460ff1681565b6000546001600160a01b0316331461137a57600080fd5b600654604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156113d457600080fd5b505af11580156113e8573d6000803e3d6000fd5b505050506040513d60208110156113fe57600080fd5b5050600c54611413908263ffffffff61254e16565b600c5550565b6000546001600160a01b0316331461143057600080fd5b600354600854604080516373c4726b60e01b81526004810192909252516000926001600160a01b0316916373c4726b916024808301926020929190829003018186803b15801561147f57600080fd5b505afa158015611493573d6000803e3d6000fd5b505050506040513d60208110156114a957600080fd5b5051600c5490915082118015906114d35750600c5481906114d0908463ffffffff61256116565b10155b6114dc57600080fd5b6000600d5413158061150a5750600c546114fc908363ffffffff61256116565b611507600d54612573565b11155b61151357600080fd5b600c54611526908363ffffffff61256116565b600c55600654600b546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919092169163a9059cbb91604480830192600092919082900301818387803b15801561158157600080fd5b505af1158015611595573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031633146115b457600080fd5b600154621a5e0090600160a81b900460ff1680156115e5575060025442906115e2908363ffffffff61254e16565b11155b6115ee57600080fd5b6000546001600160a01b0316ff5b601160205260009081526040902080546001820154600283015460038401546004850154600586015460069096015460ff8087169761010088046001600160801b031697600160881b810490921696600160901b90920463ffffffff16959194919391928a565b6000546001600160a01b0316331461167a57600080fd5b600154600160a81b900460ff16156116c2576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b6001805460ff60a81b1916600160a81b179055426002556040517f4b314b34e912fda7f95e7d23e9c8c95f82f0aff1984e4ce592a0b005f905562490600090a1565b6000546001600160a01b0316331461171b57600080fd5b6001546203f48090600160a81b900460ff16801561174c57506002544290611749908363ffffffff61254e16565b11155b61175557600080fd5b6000600d819055600c805490829055600654600b546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810185905290519394919092169263a9059cbb92604480820193929182900301818387803b15801561158157600080fd5b6117e38b8b8b8b8b8b8b8b8b8b600a60009054906101000a90046001600160a01b031661226f565b6117f48b8b8b8b8b8a878b33612583565b5050505050505050505050565b600d5481565b6000546001600160a01b031681565b600a546001600160a01b0316331461182d57600080fd5b6118408d8d8d8d8d8d8d8d8d8d8d61226f565b6118538d8d8d8d8d8d8d89898f8d612a2b565b50505050505050505050505050565b62ed4e0081565b3360008181526012602090815260408083205480845260119092529091208382146118c8576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6001815460ff1660038111156118da57fe5b141561192357426006820155805460ff19166002178155604051829033907f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed90600090a361195e565b6003815460ff16600381111561193557fe5b14801561194e57508054600160901b900463ffffffff16155b156103785761195e818385612f2d565b50505050565b6000546001600160a01b0316331461197b57600080fd5b80620151808110158015611992575062ed4e008111155b61199b57600080fd5b50600f55565b6000546001600160a01b031633146119b857600080fd5b6004546001600160a01b03166119cd57600080fd5b6005546119d957600080fd5b426203f48060055401111580156119f757506207e900600554014211155b611a0057600080fd5b60048054600380546001600160a01b03199081166001600160a01b038416179091551690556000600581905560408051918252517f28de3c2df3d09a8b061f86cd0c78b7d02f1f5caffcd086ff45ee12a4a51056c89181900360200190a1565b6004546001600160a01b031681565b600a546001600160a01b03163314611a8657600080fd5b6001600160a01b0382166000908152601260209081526040808320548084526011909252909120828214611aee576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6001815460ff166003811115611b0057fe5b1415611b4957426006820155805460ff19166003178155604051829033907fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab090600090a361195e565b6002815460ff166003811115611b5b57fe5b148015611b7457508054600160901b900463ffffffff16155b156103785761195e818386612f2d565b336000818152601260209081526040808320548084526011909252909120838214611be3576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6002815460ff166003811115611bf557fe5b14611c34576040805162461bcd60e51b815260206004820152600a602482015269696e762073746174757360b01b604482015290519081900360640190fd5b600380548254600184015460028501549385015460068601546040805163062f5d8d60e11b8152600160881b860460ff1660048201526024810194909452604484019690965260648301919091526101009092046001600160801b0316608482015260a481019190915291516000926001600160a01b0390921691630c5ebb1a9160c4808301926020929190829003018186803b158015611cd457600080fd5b505afa158015611ce8573d6000803e3d6000fd5b505050506040513d6020811015611cfe57600080fd5b50518254909150611d239083908590600160901b900463ffffffff1687600286612fd3565b5050505050565b621a5e0081565b6040518060526135c282396052019050604051809103902081565b600c5481565b6000546001600160a01b03163314611d6957600080fd5b600480546001600160a01b0383166001600160a01b031990911681179091554260055560408051918252517f97044e884f04922f1959ef2de012f4734423df2d4da57fd4c5eaf40cd63b525f9181900360200190a150565b600a546001600160a01b03163314611dd857600080fd5b6001600160a01b0382166000908152601260209081526040808320548084526011909252909120828214611e40576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6003815460ff166003811115611e5257fe5b14611e91576040805162461bcd60e51b815260206004820152600a602482015269696e762073746174757360b01b604482015290519081900360640190fd5b6003805482546001840154600285015493850154600586015460048088015460068901546040805163454a41cd60e11b8152600160881b890460ff16948101949094526024840196909652604483019890985260648201939093526101009094046001600160801b0316608485015260a484015260c483015260e482019390935291516000926001600160a01b0390921691638a94839a91610104808301926020929190829003018186803b158015611f4957600080fd5b505afa158015611f5d573d6000803e3d6000fd5b505050506040513d6020811015611f7357600080fd5b50518254909150611d239083908590600160901b900463ffffffff1688600186612fd3565b6000546001600160a01b03163314611faf57600080fd5b6000826001600160801b0316118015611fda5750806001600160801b0316826001600160801b031611155b611fe357600080fd5b600e80546fffffffffffffffffffffffffffffffff19166001600160801b03848116919091178116600160801b8483168102919091179283905560408051848416815291909304909116602082015281517f1ec948cac143dba0e555a87dd86ae387e2ecd4a8fee80f7dd324d5987cb3e7f8929181900390910190a15050565b600b546001600160a01b031681565b600a546001600160a01b031681565b60055481565b6207e90081565b6001546001600160a01b031681565b60085481565b6120cd8760008060008a8a8a8a8a8a600a60009054906101000a90046001600160a01b031661226f565b6120da33888886866122e2565b50505050505050565b600e54600160801b90046001600160801b031681565b6000546001600160a01b0316331461211057600080fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461214957600080fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917f83ada3430836f9d4bd6f7bc690ffbba5199cb19b37393dd64c229930213535969190a350565b60095481565b426121b8600f5460105461254e90919063ffffffff16565b11156121c357600080fd5b42601055600d546000126121d65761226d565b60006121e3600d54612573565b6000600d55600c549091506121fe908263ffffffff61256116565b600c55600654600b546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018590529051919092169163a9059cbb91604480830192600092919082900301818387803b15801561225957600080fd5b505af1158015611d23573d6000803e3d6000fd5b565b306001600160a01b03841681146122c3576040805162461bcd60e51b8152602060048201526013602482015272696e7620636f6e74726163744164647265737360681b604482015290519081900360640190fd5b60006122d58d8d8d8d8d8d8d8d61307c565b905061185381858561313a565b6001600160a01b038086166000908152601260209081526040808320548084526011835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a9260048083019392829003018186803b15801561234357600080fd5b505afa158015612357573d6000803e3d6000fd5b505050506040513d602081101561236d57600080fd5b5051825490915061010090046001600160801b03168386146123c3576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b60008863ffffffff161161240c576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9d881c9bdd5b99125960aa1b604482015290519081900360640190fd5b86816000031315801561241f5750818713155b61245e576040805162461bcd60e51b815260206004820152600b60248201526a696e762062616c616e636560a81b604482015290519081900360640190fd5b6001835460ff16600381111561247057fe5b146124af576040805162461bcd60e51b815260206004820152600a602482015269696e762073746174757360b01b604482015290519081900360640190fd5b6001600160a01b03851630146124c157fe5b6124d083858a8c60008c612fd3565b505050505050505050565b6040805130606081811b6020808501919091529089901b6bffffffffffffffffffffffff19166034840152604883018890526068830187905260888084018790528451808503909101815260a890930190935281519190920120600a546120da90829085906001600160a01b031661313a565b8181018281101561255b57fe5b92915050565b60008282111561256d57fe5b50900390565b60008082121561257f57fe5b5090565b6001600160a01b038082166000908152601260209081526040808320548084526011835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a9260048083019392829003018186803b1580156125e457600080fd5b505afa1580156125f8573d6000803e3d6000fd5b505050506040513d602081101561260e57600080fd5b5051825490915061010090046001600160801b0316858414612664576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b60008d63ffffffff16116126ad576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9d881c9bdd5b99125960aa1b604482015290519081900360640190fd5b6040805160208082018a90528251808303820181529183019092528051910120881461270f576040805162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b604482015290519081900360640190fd5b8881600003131580156127225750818913155b612761576040805162461bcd60e51b815260206004820152600b60248201526a696e762062616c616e636560a81b604482015290519081900360640190fd5b600354604080516309eecdd760e01b815260ff8f166004820152602481018e9052604481018d905290516001600160a01b03909216916309eecdd791606480820192602092909190829003018186803b1580156127bd57600080fd5b505afa1580156127d1573d6000803e3d6000fd5b505050506040513d60208110156127e757600080fd5b5051612824576040805162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b604482015290519081900360640190fd5b600061284e6128328c613209565b612842848d63ffffffff61321816565b9063ffffffff61324f16565b1215612892576040805162461bcd60e51b815260206004820152600e60248201526d0ecc2d8eaca40e8dede40d0d2ced60931b604482015290519081900360640190fd5b6003835460ff1660038111156128a457fe5b1480156128c15750825463ffffffff8e8116600160901b90920416145b156128dd57600483018790556128d883858761327e565b611853565b6001835460ff1660038111156128ef57fe5b148061292557506003835460ff16600381111561290857fe5b1480156129255750825463ffffffff808f16600160901b90920416105b156129f2578254600290849060ff191660018302179055504283600601819055508c8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508b8360000160116101000a81548160ff021916908360ff1602179055508a83600101819055508983600201819055508883600301819055508683600401819055506000801b836005018190555083336001600160a01b03167f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed60405160405180910390a3611853565b6040805162461bcd60e51b8152602060048201526009602482015268696e7620737461746560b81b604482015290519081900360640190fd5b6001600160a01b038082166000908152601260209081526040808320548084526011835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a9260048083019392829003018186803b158015612a8c57600080fd5b505afa158015612aa0573d6000803e3d6000fd5b505050506040513d6020811015612ab657600080fd5b5051825490915061010090046001600160801b0316858414612b0c576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b60008f63ffffffff1611612b55576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9d881c9bdd5b99125960aa1b604482015290519081900360640190fd5b6040805160208082018b905282518083038201815291830190925280519101208a14612bb9576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d881cd95c9d995c94d9595960921b604482015290519081900360640190fd5b6040805160208082018a905282518083038201815291830190925280519101208914612c1b576040805162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b604482015290519081900360640190fd5b8a8160000313158015612c2e5750818b13155b612c6d576040805162461bcd60e51b815260206004820152600b60248201526a696e762062616c616e636560a81b604482015290519081900360640190fd5b600360009054906101000a90046001600160a01b03166001600160a01b03166309eecdd78f8f8f6040518463ffffffff1660e01b8152600401808460ff1660ff168152602001838152602001828152602001935050505060206040518083038186803b158015612cdc57600080fd5b505afa158015612cf0573d6000803e3d6000fd5b505050506040513d6020811015612d0657600080fd5b5051612d43576040805162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b604482015290519081900360640190fd5b6000612d61612d518e613209565b612842848f63ffffffff61321816565b1215612da5576040805162461bcd60e51b815260206004820152600e60248201526d746f6f20686967682076616c756560901b604482015290519081900360640190fd5b6002835460ff166003811115612db757fe5b148015612de357508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16145b15612dff5760058301889055612dfa83858761327e565b612f1c565b6001835460ff166003811115612e1157fe5b1480612e5657506002835460ff166003811115612e2a57fe5b148015612e5657508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16105b156129f2578254600390849060ff191660018302179055504283600601819055508e8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508d8360000160116101000a81548160ff021916908360ff1602179055508c83600101819055508b83600201819055508a836003018190555087836005018190555086836004018190555083856001600160a01b03167fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab060405160405180910390a35b505050505050505050505050505050565b60035460408051637e7630bd60e11b815290516000926001600160a01b03169163fcec617a916004808301926020929190829003018186803b158015612f7257600080fd5b505afa158015612f86573d6000803e3d6000fd5b505050506040513d6020811015612f9c57600080fd5b505184546000918203925061010090046001600160801b031690819003821215612fc7578060000391505b611d2385856000866003875b855460ff19168655600854612fe9906001612561565b600855855461300890849061010090046001600160801b03168361337d565b84836001600160a01b03167f59ba0efd7d5a5d7e109fb346b50365a8d68661fc7c2c311cd29750707e1b8de5868486604051808463ffffffff1663ffffffff16815260200183815260200182600381111561305f57fe5b60ff168152602001935050505060405180910390a3505050505050565b6000806040518080613614608191396040805191829003608101822060208084019190915263ffffffff9d909d168282015260ff9b909b166060820152608081019990995250505060a086019490945260c085019290925260e084015261010083015261012080830191909152825180830390910181526101408201835280519084012060075461190160f01b61016084015261016283015261018280830191909152825180830390910181526101a2909101909152805191012090565b6000806000613148856134d0565b925092509250600060018783868660405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156131ad573d6000803e3d6000fd5b505050602060405103519050846001600160a01b0316816001600160a01b0316146120da576040805162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b604482015290519081900360640190fd5b6000600160ff1b821061257f57fe5b600082820181831280159061322d5750838112155b80613242575060008312801561324257508381125b61324857fe5b9392505050565b60008183038183128015906132645750838113155b806132425750600083128015613242575083811361324857fe5b600380548454600186015460028701549387015460058801546004808a015460408051631503b1e760e11b8152600160881b880460ff16938101939093526024830195909552604482019790975260648101929092526101009093046001600160801b0316608482015260a481019290925260c482019390935291516000926001600160a01b0390921691632a0763ce9160e4808301926020929190829003018186803b15801561332e57600080fd5b505afa158015613342573d6000803e3d6000fd5b505050506040513d602081101561335857600080fd5b5051845490915061195e9085908590600160901b900463ffffffff1685600386612fd3565b6000826001600160801b031690506000613398600c54613209565b9050600360009054906101000a90046001600160a01b03166001600160a01b03166373ad468a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156133e857600080fd5b505afa1580156133fc573d6000803e3d6000fd5b505050506040513d602081101561341257600080fd5b505183131561341d57fe5b600061342f838563ffffffff61321816565b121561343757fe5b60008313801561344657508281125b1561344f578092505b600d54613462908463ffffffff61324f16565b600d556000613477828563ffffffff61324f16565b905061348281612573565b600c55600061349f61349a858763ffffffff61321816565b612573565b6001600160a01b03881660009081526013602052604090208054820190819055909150156120da576120da8761353e565b60008060008351604114613515576040805162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b604482015290519081900360640190fd5b50505060208101516040820151604183015160ff16600281101561353757601b015b9193909250565b6001600160a01b0381166000908152601360205260409020548061355e57fe5b6001600160a01b03808316600081815260136020526040808220829055600654815163a9059cbb60e01b8152600481019490945260248401869052905193169263a9059cbb92604480820193929182900301818387803b15801561158157600080fdfe454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374294265742875696e74333220726f756e6449642c75696e74382067616d65547970652c75696e74323536206e756d6265722c75696e743235362076616c75652c696e743235362062616c616e63652c6279746573333220736572766572486173682c627974657333322075736572486173682c75696e743235362067616d65496429a265627a7a723158203c6923dfa52cb5447c4679690d20ae4c36d324b5d79687182c0b56dd20d1aa4864736f6c63430005100032

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

0000000000000000000000008bea174f641d239d7f02b9e2d92b8fd1cdd75773000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000069f52540949eb5417fc70e200140ca2a26307070000000000000000000000000986ded3c50bc1d7c59c8c40e4bcc61a2b87efeca0000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : _serverAddress (address): 0x8beA174F641D239D7f02b9E2d92B8Fd1Cdd75773
Arg [1] : _minStake (uint128): 10000000000000000
Arg [2] : _maxStake (uint128): 200000000000000000000
Arg [3] : _conflictResAddress (address): 0x69F52540949EB5417Fc70e200140Ca2a26307070
Arg [4] : _houseAddress (address): 0x986dED3c50Bc1d7c59C8C40E4BCc61a2b87efecA
Arg [5] : _chainId (uint256): 1

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000008bea174f641d239d7f02b9e2d92b8fd1cdd75773
Arg [1] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [2] : 00000000000000000000000000000000000000000000000ad78ebc5ac6200000
Arg [3] : 00000000000000000000000069f52540949eb5417fc70e200140ca2a26307070
Arg [4] : 000000000000000000000000986ded3c50bc1d7c59c8c40e4bcc61a2b87efeca
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001


Deployed Bytecode Sourcemap

43311:7630:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43311:7630:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14995:31;;;:::i;:::-;;;;;;;;;;;;;;;;5867:116;;;:::i;:::-;;5358:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;14440:51;;;:::i;43368:77::-;;;:::i;:::-;;;;-1:-1:-1;;;;;43368:77:0;;;;;;;;;;;;;;16197:43;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16197:43:0;-1:-1:-1;;;;;16197:43:0;;:::i;16301:47::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16301:47:0;-1:-1:-1;;;;;16301:47:0;;:::i;19445:152::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19445:152:0;;:::i;15895:44::-;;;:::i;15702:23::-;;;:::i;:::-;;;;-1:-1:-1;;;;;15702:23:0;;;;;;;;;;;;;;19665:209;;;:::i;10419:147::-;;;:::i;46893:717::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;46893:717:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46893:717:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;46893:717:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46893:717:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;46893:717:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46893:717:0;;-1:-1:-1;46893:717:0;;-1:-1:-1;;;;;46893:717:0:i;16001:39::-;;;:::i;14789:197::-;;;:::i;2784:185::-;;;:::i;3507:41::-;;;:::i;9321:40::-;;;:::i;44723:1423::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;44723:1423:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;44723:1423:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;44723:1423:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;44723:1423:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;44723:1423:0;;;;;;;;;;;;-1:-1:-1;44723:1423:0;-1:-1:-1;44723:1423:0;;;;-1:-1:-1;44723:1423:0;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;44723:1423:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;44723:1423:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;44723:1423:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;44723:1423:0;;-1:-1:-1;;44723:1423:0;;;-1:-1:-1;44723:1423:0;;-1:-1:-1;;44723:1423:0:i;3143:46::-;;;:::i;9251:25::-;;;:::i;20941:213::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20941:213:0;;:::i;21215:454::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21215:454:0;;:::i;10913:125::-;;;:::i;16091:40::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16091:40:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16091:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16091:40:0;-1:-1:-1;16091:40:0;10144:145;;;:::i;21741:272::-;;;:::i;31756:909::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;31756:909:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31756:909:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;31756:909:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31756:909:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;31756:909:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;31756:909:0;;-1:-1:-1;;31756:909:0;;;-1:-1:-1;31756:909:0;;-1:-1:-1;;31756:909:0:i;15594:26::-;;;:::i;1579:20::-;;;:::i;29979:1131::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;29979:1131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29979:1131:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;29979:1131:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;29979:1131:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;29979:1131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;29979:1131:0;;-1:-1:-1;;;;;;;29979:1131:0;;;;-1:-1:-1;;;29979:1131:0;;;;;;;;;:::i;14557:55::-;;;:::i;32852:677::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32852:677:0;;:::i;20578:232::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20578:232:0;;:::i;4735:451::-;;;:::i;3246:42::-;;;:::i;33750:673::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;33750:673:0;;;;;;;;:::i;35668:669::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35668:669:0;;:::i;10781:46::-;;;:::i;14621:159::-;;;:::i;15504:26::-;;;:::i;4404:251::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4404:251:0;-1:-1:-1;;;;;4404:251:0;;:::i;34637:853::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;34637:853:0;;;;;;;;:::i;22375:272::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22375:272:0;;;;;;;;;;:::i;15433:27::-;;;:::i;15351:28::-;;;:::i;3374:26::-;;;:::i;3655:41::-;;;:::i;1606:27::-;;;:::i;15079:::-;;;:::i;48165:667::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;48165:667:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48165:667:0;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;48165:667:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;48165:667:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;48165:667:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;48165:667:0;;-1:-1:-1;48165:667:0;;-1:-1:-1;;;;;48165:667:0:i;15802:23::-;;;:::i;22123:112::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22123:112:0;-1:-1:-1;;;;;22123:112:0;;:::i;2541:169::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2541:169:0;-1:-1:-1;;;;;2541:169:0;;:::i;15258:26::-;;;:::i;19955:553::-;;;:::i;14995:31::-;;;;:::o;5867:116::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;5749:9;;-1:-1:-1;;;5749:9:0;;;;5748:10;5740:19;;;;;;5944:4;5932:16;;-1:-1:-1;;;;5932:16:0;-1:-1:-1;;;5932:16:0;;;5964:11;;;;5932:16;;5964:11;5867:116::o;5358:29::-;;;-1:-1:-1;;;5358:29:0;;;;;:::o;14440:51::-;14485:6;14440:51;:::o;43368:77::-;;;-1:-1:-1;;;;;43368:77:0;;:::o;16197:43::-;;;;;;;;;;;;;:::o;16301:47::-;;;;;;;;;;;;;:::o;19445:152::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;5749:9;;-1:-1:-1;;;5749:9:0;;;;5748:10;5740:19;;;;;;19552:1;19539:10;;:14;19531:23;;;;;;19565:10;:24;19445:152::o;15895:44::-;;;;:::o;15702:23::-;;;-1:-1:-1;;;;;15702:23:0;;:::o;19665:209::-;19736:10;19703:15;19721:26;;;:14;:26;;;;;;19766:14;19758:23;;;;;;19809:10;19823:1;19794:26;;;:14;:26;;;;;;:30;;;19835:31;;;;;;19855:10;;19835:31;;19823:1;19835:31;19855:10;19809;19835:31;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19835:31:0;19665:209;:::o;10419:147::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;9649:6;;-1:-1:-1;;;9649:6:0;;;;9641:15;;;;;;5584:9;;-1:-1:-1;;;5584:9:0;;;;5576:18;;;;;;10491:6;:14;;-1:-1:-1;;;;10491:14:0;;;10500:5;10516:10;:14;;;10546:12;;;;10500:5;10546:12;10419:147::o;46893:717::-;16996:13;;-1:-1:-1;;;;;16996:13:0;16982:10;:27;16974:36;;;;;;47203:311;47231:8;47258:1;47278;47298;47318:8;47345:11;47375:9;47403:7;47429:16;47464:8;47491:12;47203:9;:311::i;:::-;47527:75;47542:12;47556:8;47566;47576:7;47585:16;47527:14;:75::i;:::-;46893:717;;;;;;;;:::o;16001:39::-;;;;:::o;14789:197::-;14828:158;;;;;;;;;;;;;;;;;;14789:197;:::o;2784:185::-;2177:12;;-1:-1:-1;;;;;2177:12:0;2163:10;:26;2155:35;;;;;;2853:12;;;;2845:20;;-1:-1:-1;;;;;2853:12:0;;;-1:-1:-1;;;;;;2845:20:0;;;;;;;2876:25;;;;;;;2917:44;;2853:12;;2941:5;;;;2917:44;;2853:12;;2917:44;2784:185::o;3507:41::-;3542:6;3507:41;:::o;9321:40::-;;;;:::o;44723:1423::-;16790:8;;44942:7;;-1:-1:-1;;;;;16790:8:0;:19;-1:-1:-1;16790:19:0;;;:42;;-1:-1:-1;16824:8:0;;-1:-1:-1;;;16824:8:0;;-1:-1:-1;;;;;16824:8:0;16813:19;;;16790:42;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;;;;44980:11;;16521;;:39;;;-1:-1:-1;;;16521:39:0;;44994:1;44980:15;;;16521:39;;;;;;;;44980:15;;16500:18;;-1:-1:-1;;;;;16521:11:0;;:25;;:39;;;;;;;;;;;;;;;:11;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;16521:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16521:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16521:39:0;16579:10;;16521:39;;-1:-1:-1;16579:27:0;-1:-1:-1;16579:27:0;16571:54;;;;;-1:-1:-1;;;16571:54:0;;;;;;;;;;;;-1:-1:-1;;;16571:54:0;;;;;;;;;;;;;;;9491:6;;-1:-1:-1;;;9491:6:0;;;;9490:7;9482:26;;;;;-1:-1:-1;;;9482:26:0;;;;;;;;;;;;-1:-1:-1;;;9482:26:0;;;;;;;;;;;;;;;45036:20;45059:7;45067:1;45059:10;;;;;;;;;;;;;;45036:33;;45080:22;45105:7;45113:1;45105:10;;;;;;;;;;;;;;;;;;;45159;45126:19;45148:22;;;:10;:22;;;;;;;45201:26;;;:10;:26;;;;;45105:10;;-1:-1:-1;45248:11:0;;;;:31;;;;;;;;;45240:63;;;;;-1:-1:-1;;;45240:63:0;;;;;;;;;;;;-1:-1:-1;;;45240:63:0;;;;;;;;;;;;;;;45340:15;45322:14;:33;45314:64;;;;;-1:-1:-1;;;45314:64:0;;;;;;;;;;;;-1:-1:-1;;;45314:64:0;;;;;;;;;;;;;;;45415:13;45397:15;:31;45389:51;;;;;-1:-1:-1;;;45389:51:0;;;;;;;;;;;;-1:-1:-1;;;45389:51:0;;;;;;;;;;;;;;;45453:87;45469:10;45481:15;45498:13;45513:14;45529:10;45453:15;:87::i;:::-;45559:17;;45553:73;;;-1:-1:-1;;;45553:73:0;;45591:10;45553:73;;;;45611:4;45553:73;;;;;;;;;;;;-1:-1:-1;;;;;45559:17:0;;;;45553:37;;:73;;;;;;;;;;;;;;;45559:17;;45553:73;;;5:2:-1;;;;30:1;27;20:12;5:2;45553:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45553:73:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;45653:10:0;:12;;;;;;;;;45687:10;-1:-1:-1;45676:22:0;;;:10;45553:73;45676:22;;;;;;;:31;;;45741:18;;;:10;:18;;;;;45772:32;;-1:-1:-1;;45772:32:0;;-1:-1:-1;;;;;45772:32:0;;;;-1:-1:-1;;45881:34:0;;;;;45942:11;;45653:12;;45741:18;;45942;;:15;:18::i;:::-;45928:11;:32;46055:83;;;-1:-1:-1;;;;;46055:83:0;;;;;;;;;;;;46108:14;;46082:6;;46070:10;;46055:83;;;;;;;;;;;9519:1;;;;;;16857;;44723:1423;;;;;;:::o;3143:46::-;;;-1:-1:-1;;;;;3143:46:0;;:::o;9251:25::-;;;-1:-1:-1;;;9251:25:0;;;;;:::o;20941:213::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;21032:17;;21026:73;;;-1:-1:-1;;;21026:73:0;;21064:10;21026:73;;;;21084:4;21026:73;;;;;;;;;;;;-1:-1:-1;;;;;21032:17:0;;;;21026:37;;:73;;;;;;;;;;;;;;;21032:17;;21026:73;;;5:2:-1;;;;30:1;27;20:12;5:2;21026:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21026:73:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;21123:10:0;;:23;;21138:7;21123:23;:14;:23;:::i;:::-;21110:10;:36;-1:-1:-1;20941:213:0:o;21215:454::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;21304:11;;21330;;21304:38;;;-1:-1:-1;;;21304:38:0;;;;;;;;;;21283:18;;-1:-1:-1;;;;;21304:11:0;;:25;;:38;;;;;;;;;;;;;;:11;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;21304:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21304:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21304:38:0;21372:10;;21304:38;;-1:-1:-1;21363:19:0;;;;;:61;;-1:-1:-1;21386:10:0;;21411:13;;21386:21;;21401:5;21386:21;:14;:21;:::i;:::-;:38;;21363:61;21355:70;;;;;;21459:1;21444:11;;:16;;:69;;;-1:-1:-1;21492:10:0;;:21;;21507:5;21492:21;:14;:21;:::i;:::-;21464:24;:11;;:22;:24::i;:::-;:49;;21444:69;21436:78;;;;;;21540:10;;:21;;21555:5;21540:21;:14;:21;:::i;:::-;21527:10;:34;21578:17;;21606:12;;21572:54;;;-1:-1:-1;;;21572:54:0;;-1:-1:-1;;;;;21606:12:0;;;21572:54;;;;;;;;;;;;21578:17;;;;;21572:33;;:54;;;;;21578:17;;21572:54;;;;;;;21578:17;;21572:54;;;5:2:-1;;;;30:1;27;20:12;5:2;21572:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21572:54:0;;;;1998:1;21215:454;:::o;10913:125::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;9836:6;;10820:7;;-1:-1:-1;;;9836:6:0;;;;:55;;;;-1:-1:-1;9847:10:0;;9875:15;;9847:24;;9862:8;9847:24;:14;:24;:::i;:::-;:43;;9836:55;9828:64;;;;;;11022:5;;-1:-1:-1;;;;;11022:5:0;10993:37;16091:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16091:40:0;;-1:-1:-1;;;16091:40:0;;;;;;-1:-1:-1;;;16091:40:0;;;;;;;;;;;;;:::o;10144:145::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;9491:6;;-1:-1:-1;;;9491:6:0;;;;9490:7;9482:26;;;;;-1:-1:-1;;;9482:26:0;;;;;;;;;;;;-1:-1:-1;;;9482:26:0;;;;;;;;;;;;;;;10212:4;10203:13;;-1:-1:-1;;;;10203:13:0;-1:-1:-1;;;10203:13:0;;;10240:15;10227:10;:28;10271:10;;;;10203:13;;10271:10;10144:145::o;21741:272::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;9836:6;;21797;;-1:-1:-1;;;9836:6:0;;;;:55;;;;-1:-1:-1;9847:10:0;;9875:15;;9847:24;;9862:8;9847:24;:14;:24;:::i;:::-;:43;;9836:55;9828:64;;;;;;21830:1;21816:11;:15;;;21860:10;;;21881:14;;;;21912:17;;21940:12;;21906:59;;;-1:-1:-1;;;21906:59:0;;-1:-1:-1;;;;;21940:12:0;;;21906:59;;;;;;;;;;;;21860:10;;21912:17;;;;;21906:33;;:59;;;;;21830:1;21906:59;;;;;;21830:1;21912:17;21906:59;;;5:2:-1;;;;30:1;27;20:12;31756:909:0;32119:286;32143:8;32166:9;32190:4;32209:6;32230:8;32253:11;32279:9;32303:7;32325:16;32356:10;32381:13;;;;;;;;;-1:-1:-1;;;;;32381:13:0;32119:9;:286::i;:::-;32418:239;32456:8;32479:9;32503:4;32522:6;32543:8;32566:9;32590;32614:7;32636:10;32418:23;:239::i;:::-;31756:909;;;;;;;;;;;:::o;15594:26::-;;;;:::o;1579:20::-;;;-1:-1:-1;;;;;1579:20:0;;:::o;29979:1131::-;16996:13;;-1:-1:-1;;;;;16996:13:0;16982:10;:27;16974:36;;;;;;30423:327;30451:8;30478:9;30506:4;30529:6;30554:8;30581:11;30611:9;30639:7;30665:16;30700:8;30727:12;30423:9;:327::i;:::-;30763:339;30807:8;30834:9;30862:4;30885:6;30910:8;30937:11;30967:9;30995:11;31025:9;31053:7;31079:12;30763:25;:339::i;:::-;29979:1131;;;;;;;;;;;;;:::o;14557:55::-;14601:11;14557:55;:::o;32852:677::-;32936:10;32914:19;32971:23;;;:10;:23;;;;;;;;;33025:18;;;:10;:18;;;;;;33064:17;;;33056:40;;;;;-1:-1:-1;;;33056:40:0;;;;;;;;;;;;-1:-1:-1;;;33056:40:0;;;;;;;;;;;;;;;33128:17;33113:11;;;;:32;;;;;;;;;33109:413;;;33186:15;33162:21;;;:39;33216:43;;-1:-1:-1;;33216:43:0;33230:29;33216:43;;;33281:39;;33313:6;;33301:10;;33281:39;;-1:-1:-1;;33281:39:0;33109:413;;;33357:31;33342:11;;;;:46;;;;;;;;;:67;;;;-1:-1:-1;33392:12:0;;-1:-1:-1;;;33392:12:0;;;;:17;33342:67;33338:184;;;33426:43;33443:4;33449:6;33457:11;33426:16;:43::i;:::-;32852:677;;;;:::o;20578:232::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;20713:23;14485:6;17188:15;:40;;:100;;;;;14601:11;17249:15;:39;;17188:100;17180:109;;;;;;-1:-1:-1;20754:22:0;:48;20578:232::o;4735:451::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;4809:14;;-1:-1:-1;;;;;4809:14:0;4801:37;;;;;;4857:10;;4849:24;;;;;;4920:15;3542:6;4892:10;;:24;:43;;:90;;;;;3690:6;4958:10;;:24;4939:15;:43;;4892:90;4884:99;;;;;;5038:14;;;4996:11;:57;;-1:-1:-1;;;;;;4996:57:0;;;-1:-1:-1;;;;;5038:14:0;;4996:57;;;;5064:27;;;5038:14;5102:10;:14;;;5134:44;;;;;;;;;;;;;;;;4735:451::o;3246:42::-;;;-1:-1:-1;;;;;3246:42:0;;:::o;33750:673::-;16996:13;;-1:-1:-1;;;;;16996:13:0;16982:10;:27;16974:36;;;;;;-1:-1:-1;;;;;33861:24:0;;33847:11;33861:24;;;:10;:24;;;;;;;;;33916:18;;;:10;:18;;;;;;33955:17;;;33947:40;;;;;-1:-1:-1;;;33947:40:0;;;;;;;;;;;;-1:-1:-1;;;33947:40:0;;;;;;;;;;;;;;;34019:17;34004:11;;;;:32;;;;;;;;;34000:416;;;34077:15;34053:21;;;:39;34107:45;;-1:-1:-1;;34107:45:0;34121:31;34107:45;;;34174:41;;34208:6;;34196:10;;34174:41;;-1:-1:-1;;34174:41:0;34000:416;;;34252:29;34237:11;;;;:44;;;;;;;;;:65;;;;-1:-1:-1;34285:12:0;;-1:-1:-1;;;34285:12:0;;;;:17;34237:65;34233:183;;;34319:44;34336:4;34342:6;34350:12;34319:16;:44::i;35668:669::-;35748:10;35726:19;35783:23;;;:10;:23;;;;;;;;;35837:18;;;:10;:18;;;;;;35876:17;;;35868:40;;;;;-1:-1:-1;;;35868:40:0;;;;;;;;;;;;-1:-1:-1;;;35868:40:0;;;;;;;;;;;;;;;35942:29;35927:11;;;;:44;;;;;;;;;35919:67;;;;;-1:-1:-1;;;35919:67:0;;;;;;;;;;;;-1:-1:-1;;;35919:67:0;;;;;;;;;;;;;;;36016:11;;;36059:13;;36016:11;36087;;;36113:13;;;;36141:12;;;;36193:21;;;;36016:209;;;-1:-1:-1;;;36016:209:0;;-1:-1:-1;;;36059:13:0;;;;36016:209;;;;;;;;;;;;;;;;;;;;;;;;;:11;36168:10;;;-1:-1:-1;;;;;36168:10:0;36016:209;;;;;;;;;;;;;-1:-1:-1;;;;;;;36016:11:0;;;;:28;;:209;;;;;;;;;;;;;;:11;:209;;;5:2:-1;;;;30:1;27;20:12;5:2;36016:209:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36016:209:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36016:209:0;36262:12;;36016:209;;-1:-1:-1;36238:91:0;;36262:12;;36254:6;;-1:-1:-1;;;36262:12:0;;;;36276:11;36289:27;36016:209;36238:9;:91::i;:::-;35668:669;;;;;:::o;10781:46::-;10820:7;10781:46;:::o;14621:159::-;14669:111;;;;;;;;;;;;;;;;;;14621:159;:::o;15504:26::-;;;;:::o;4404:251::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;4498:14;:39;;-1:-1:-1;;;;;4498:39:0;;-1:-1:-1;;;;;;4498:39:0;;;;;;;;4561:15;4548:10;:28;4594:53;;;;;;;;;;;;;;;;4404:251;:::o;34637:853::-;16996:13;;-1:-1:-1;;;;;16996:13:0;16982:10;:27;16974:36;;;;;;-1:-1:-1;;;;;34744:24:0;;34730:11;34744:24;;;:10;:24;;;;;;;;;34799:18;;;:10;:18;;;;;;34838:17;;;34830:40;;;;;-1:-1:-1;;;34830:40:0;;;;;;;;;;;;-1:-1:-1;;;34830:40:0;;;;;;;;;;;;;;;34904:31;34889:11;;;;:46;;;;;;;;;34881:69;;;;;-1:-1:-1;;;34881:69:0;;;;;;;;;;;;-1:-1:-1;;;34881:69:0;;;;;;;;;;;;;;;35106:11;;;35151:13;;35106:11;35179;;;35205:13;;;;35233:12;;;;35285:15;;;;35315:13;;;;;35343:21;;;;35106:269;;;-1:-1:-1;;;35106:269:0;;-1:-1:-1;;;35151:13:0;;;;35106:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;35260:10;;;-1:-1:-1;;;;;35260:10:0;35106:269;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;35106:11:0;;;;:30;;:269;;;;;;;;;;;;;;:11;:269;;;5:2:-1;;;;30:1;27;20:12;5:2;35106:269:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35106:269:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35106:269:0;35412:12;;35106:269;;-1:-1:-1;35388:94:0;;35412:12;;35404:6;;-1:-1:-1;;;35412:12:0;;;;35426;35440:29;35106:269;35388:9;:94::i;22375:272::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;22491:1;22479:9;-1:-1:-1;;;;;22479:13:0;;:39;;;;;22509:9;-1:-1:-1;;;;;22496:22:0;:9;-1:-1:-1;;;;;22496:22:0;;;22479:39;22471:48;;;;;;22530:8;:20;;-1:-1:-1;;22530:20:0;-1:-1:-1;;;;;22530:20:0;;;;;;;22561;;-1:-1:-1;;;22561:20:0;;;;;;;;;;;;;22597:42;;;22620:8;;;22597:42;;22630:8;;;;;;;22597:42;;;;;;;;;;;;;;;;;22375:272;;:::o;15433:27::-;;;-1:-1:-1;;;;;15433:27:0;;:::o;15351:28::-;;;-1:-1:-1;;;;;15351:28:0;;:::o;3374:26::-;;;;:::o;3655:41::-;3690:6;3655:41;:::o;1606:27::-;;;-1:-1:-1;;;;;1606:27:0;;:::o;15079:::-;;;;:::o;48165:667::-;48424:314;48452:8;48479:1;48499;48519;48539:8;48566:11;48596:9;48624:7;48650:16;48685:10;48714:13;;;;;;;;;-1:-1:-1;;;;;48714:13:0;48424:9;:314::i;:::-;48751:73;48766:10;48778:8;48788;48798:7;48807:16;48751:14;:73::i;:::-;48165:667;;;;;;;:::o;15802:23::-;;;-1:-1:-1;;;15802:23:0;;-1:-1:-1;;;;;15802:23:0;;:::o;22123:112::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;22199:12;:28;;-1:-1:-1;;;;;;22199:28:0;-1:-1:-1;;;;;22199:28:0;;;;;;;;;;22123:112::o;2541:169::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;2615:12;:24;;-1:-1:-1;;;;;;2615:24:0;-1:-1:-1;;;;;2615:24:0;;;;;;;;;-1:-1:-1;2685:5:0;;2655:47;;2615:24;;2685:5;;2655:47;;-1:-1:-1;2655:47:0;2541:169;:::o;15258:26::-;;;;:::o;19955:553::-;20073:15;20014:55;20046:22;;20014:27;;:31;;:55;;;;:::i;:::-;:74;;20006:83;;;;;;20175:15;20145:27;:45;20207:11;;20222:1;-1:-1:-1;20203:93:0;;20278:7;;20203:93;20308:15;20326:24;:11;;:22;:24::i;:::-;20377:1;20363:11;:15;20402:10;;20308:42;;-1:-1:-1;20402:26:0;;20308:42;20402:26;:14;:26;:::i;:::-;20389:10;:39;20447:17;;20475:12;;20441:59;;;-1:-1:-1;;;20441:59:0;;-1:-1:-1;;;;;20475:12:0;;;20441:59;;;;;;;;;;;;20447:17;;;;;20441:33;;:59;;;;;20447:17;;20441:59;;;;;;;20447:17;;20441:59;;;5:2:-1;;;;30:1;27;20:12;5:2;20441:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;19955:553:0;:::o;25206:911::-;25652:4;-1:-1:-1;;;;;25676:35:0;;;;25668:67;;;;;-1:-1:-1;;;25668:67:0;;;;;;;;;;;;-1:-1:-1;;;25668:67:0;;;;;;;;;;;;;;;25748:17;25768:233;25795:8;25822:9;25850:4;25873:6;25898:8;25925:11;25955:9;25983:7;25768:8;:233::i;:::-;25748:253;;26014:95;26039:9;26067:4;26090:8;26014:6;:95::i;50096:842::-;-1:-1:-1;;;;;50312:24:0;;;50298:11;50312:24;;;:10;:24;;;;;;;;;50367:18;;;:10;:18;;;;;50413:11;;:24;;-1:-1:-1;;;50413:24:0;;;;50312;;50367:18;;50298:11;50413;;;:22;;:24;;;;;50312;50413;;;;;:11;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;50413:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50413:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50413:24:0;50464:10;;50413:24;;-1:-1:-1;50464:10:0;;;-1:-1:-1;;;;;50464:10:0;50495:17;;;50487:40;;;;;-1:-1:-1;;;50487:40:0;;;;;;;;;;;;-1:-1:-1;;;50487:40:0;;;;;;;;;;;;;;;50557:1;50546:8;:12;;;50538:36;;;;;-1:-1:-1;;;50538:36:0;;;;;;;;;;;;-1:-1:-1;;;50538:36:0;;;;;;;;;;;;;;;50663:8;50650:9;50649:10;;:22;;:48;;;;;50687:10;50675:8;:22;;50649:48;50641:72;;;;;-1:-1:-1;;;50641:72:0;;;;;;;;;;;;-1:-1:-1;;;50641:72:0;;;;;;;;;;;;;;;50747:17;50732:11;;;;:32;;;;;;;;;50724:55;;;;;-1:-1:-1;;;50724:55:0;;;;;;;;;;;;-1:-1:-1;;;50724:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;50799:33:0;;50827:4;50799:33;50792:41;;;;50846:84;50856:4;50862:6;50870:8;50880:12;50894:25;50921:8;50846:9;:84::i;:::-;50096:842;;;;;;;;;:::o;49193:483::-;49496:119;;;49455:4;49496:119;;;;;;;;;;;;;;;;-1:-1:-1;;49496:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;49496:119:0;;;;;;;49486:130;;;;;;;49654:13;;49629:39;;49486:130;;49642:10;;-1:-1:-1;;;;;49654:13:0;49629:6;:39::i;8631:141::-;8715:5;;;8738:6;;;;8731:14;;;;8631:141;;;;:::o;8160:123::-;8218:7;8250:1;8245;:6;;8238:14;;;;-1:-1:-1;8270:5:0;;;8160:123::o;12063:113::-;12112:4;12141:1;12136;:6;;12129:14;;;;-1:-1:-1;12166:1:0;12063:113::o;36998:1846::-;-1:-1:-1;;;;;37312:24:0;;;37298:11;37312:24;;;:10;:24;;;;;;;;;37367:18;;;:10;:18;;;;;37413:11;;:24;;-1:-1:-1;;;37413:24:0;;;;37312;;37367:18;;37298:11;37413;;;:22;;:24;;;;;37312;37413;;;;;:11;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;37413:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37413:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37413:24:0;37464:10;;37413:24;;-1:-1:-1;37464:10:0;;;-1:-1:-1;;;;;37464:10:0;37495:17;;;37487:40;;;;;-1:-1:-1;;;37487:40:0;;;;;;;;;;;;-1:-1:-1;;;37487:40:0;;;;;;;;;;;;;;;37557:1;37546:8;:12;;;37538:36;;;;;-1:-1:-1;;;37538:36:0;;;;;;;;;;;;-1:-1:-1;;;37538:36:0;;;;;;;;;;;;;;;37603:27;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;37603:27:0;;;;;;37593:38;;;;;:51;;37585:76;;;;;-1:-1:-1;;;37585:76:0;;;;;;;;;;;;-1:-1:-1;;;37585:76:0;;;;;;;;;;;;;;;37694:8;37681:9;37680:10;;:22;;:48;;;;;37718:10;37706:8;:22;;37680:48;37672:72;;;;;-1:-1:-1;;;37672:72:0;;;;;;;;;;;;-1:-1:-1;;;37672:72:0;;;;;;;;;;;;;;;37801:11;;:47;;;-1:-1:-1;;;37801:47:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37801:11:0;;;;:22;;:47;;;;;;;;;;;;;;;:11;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;37801:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37801:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37801:47:0;37793:67;;;;;-1:-1:-1;;;37793:67:0;;;;;;;;;;;;-1:-1:-1;;;37793:67:0;;;;;;;;;;;;;;;37930:1;37879:47;37907:18;:6;:16;:18::i;:::-;37879:23;:9;37893:8;37879:23;:13;:23;:::i;:::-;:27;:47;:27;:47;:::i;:::-;:52;;37871:79;;;;;-1:-1:-1;;;37871:79:0;;;;;;;;;;;;-1:-1:-1;;;37871:79:0;;;;;;;;;;;;;;;38020:31;38005:11;;;;:46;;;;;;;;;:74;;;;-1:-1:-1;38055:12:0;;:24;;;;-1:-1:-1;;;38055:12:0;;;;:24;38005:74;38001:836;;;38096:13;;;:25;;;38136:43;38096:4;38158:6;38166:12;38136:15;:43::i;:::-;38001:836;;;38216:17;38201:11;;;;:32;;;;;;;;;:128;;;-1:-1:-1;38270:31:0;38255:11;;;;:46;;;;;;;;;:73;;;;-1:-1:-1;38305:12:0;;:23;;;;-1:-1:-1;;;38305:12:0;;;;:23;38255:73;38197:640;;;38346:43;;38360:29;;38346:4;;-1:-1:-1;;38346:43:0;;38360:29;38346:43;;;;;38428:15;38404:4;:21;;:39;;;;38473:8;38458:4;:12;;;:23;;;;;;;;;;;;;;;;;;38512:9;38496:4;:13;;;:25;;;;;;;;;;;;;;;;;;38550:4;38536;:11;;:18;;;;38585:6;38569:4;:13;;:22;;;;38621:8;38606:4;:12;;:23;;;;38660:9;38644:4;:13;;:25;;;;38710:1;38702:10;;38684:4;:15;;:28;;;;38766:6;38754:10;-1:-1:-1;;;;;38734:39:0;;;;;;;;;;;38197:640;;;38806:19;;;-1:-1:-1;;;38806:19:0;;;;;;;;;;;;-1:-1:-1;;;38806:19:0;;;;;;;;;;;;;;39576:2007;-1:-1:-1;;;;;39952:24:0;;;39938:11;39952:24;;;:10;:24;;;;;;;;;40007:18;;;:10;:18;;;;;40053:11;;:24;;-1:-1:-1;;;40053:24:0;;;;39952;;40007:18;;39938:11;40053;;;:22;;:24;;;;;39952;40053;;;;;:11;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;40053:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40053:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40053:24:0;40104:10;;40053:24;;-1:-1:-1;40104:10:0;;;-1:-1:-1;;;;;40104:10:0;40135:17;;;40127:40;;;;;-1:-1:-1;;;40127:40:0;;;;;;;;;;;;-1:-1:-1;;;40127:40:0;;;;;;;;;;;;;;;40197:1;40186:8;:12;;;40178:36;;;;;-1:-1:-1;;;40178:36:0;;;;;;;;;;;;-1:-1:-1;;;40178:36:0;;;;;;;;;;;;;;;40243:29;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;40243:29:0;;;;;;40233:40;;;;;:55;;40225:82;;;;;-1:-1:-1;;;40225:82:0;;;;;;;;;;;;-1:-1:-1;;;40225:82:0;;;;;;;;;;;;;;;40336:27;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;40336:27:0;;;;;;40326:38;;;;;:51;;40318:76;;;;;-1:-1:-1;;;40318:76:0;;;;;;;;;;;;-1:-1:-1;;;40318:76:0;;;;;;;;;;;;;;;40427:8;40414:9;40413:10;;:22;;:48;;;;;40451:10;40439:8;:22;;40413:48;40405:72;;;;;-1:-1:-1;;;40405:72:0;;;;;;;;;;;;-1:-1:-1;;;40405:72:0;;;;;;;;;;;;;;;40534:11;;;;;;;;;-1:-1:-1;;;;;40534:11:0;-1:-1:-1;;;;;40534:22:0;;40557:9;40568:4;40574:6;40534:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40534:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40534:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40534:47:0;40526:67;;;;;-1:-1:-1;;;40526:67:0;;;;;;;;;;;;-1:-1:-1;;;40526:67:0;;;;;;;;;;;;;;;40663:1;40612:47;40640:18;:6;:16;:18::i;:::-;40612:23;:9;40626:8;40612:23;:13;:23;:::i;:47::-;:52;;40604:79;;;;;-1:-1:-1;;;40604:79:0;;;;;;;;;;;;-1:-1:-1;;;40604:79:0;;;;;;;;;;;;;;;40752:29;40737:11;;;;:44;;;;;;;;;:72;;;;;40801:8;40785:24;;:4;:12;;;;;;;;;;;;:24;;;40737:72;40733:843;;;40826:15;;;:29;;;40870:43;40826:4;40892:6;40900:12;40870:15;:43::i;:::-;40733:843;;;40950:17;40935:11;;;;:32;;;;;;;;;:126;;;-1:-1:-1;41004:29:0;40989:11;;;;:44;;;;;;;;;:71;;;;;41052:8;41037:23;;:4;:12;;;;;;;;;;;;:23;;;40989:71;40931:645;;;41078:45;;41092:31;;41078:4;;-1:-1:-1;;41078:45:0;;41092:31;41078:45;;;;;41162:15;41138:4;:21;;:39;;;;41207:8;41192:4;:12;;;:23;;;;;;;;;;;;;;;;;;41246:9;41230:4;:13;;;:25;;;;;;;;;;;;;;;;;;41284:4;41270;:11;;:18;;;;41319:6;41303:4;:13;;:22;;;;41355:8;41340:4;:12;;:23;;;;41396:11;41378:4;:15;;:29;;;;41438:9;41422:4;:13;;:25;;;;41505:6;41491:12;-1:-1:-1;;;;;41469:43:0;;;;;;;;;;;40931:645;39576:2007;;;;;;;;;;;;;;;:::o;41788:717::-;42208:11;;:29;;;-1:-1:-1;;;42208:29:0;;;;42190:14;;-1:-1:-1;;;;;42208:11:0;;:27;;:29;;;;;;;;;;;;;;:11;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;42208:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42208:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42208:29:0;42312:11;;42207:30;;;;;-1:-1:-1;42312:11:0;;;-1:-1:-1;;;;;42312:11:0;;42351:6;;;42338:19;;42334:71;;;42388:5;42387:6;;42374:19;;42334:71;42415:82;42425:5;42432:7;42441:1;42444:12;42458:26;42486:10;22951:444;23173:31;;-1:-1:-1;;23173:31:0;;;23231:11;;:18;;23173:31;23231:15;:18::i;:::-;23217:11;:32;23283:11;;23262:43;;23269:12;;23283:11;;;-1:-1:-1;;;;;23283:11:0;23296:8;23262:6;:43::i;:::-;23350:7;23336:12;-1:-1:-1;;;;;23323:64:0;;23359:8;23369;23379:7;23323:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22951:444;;;;;;:::o;26830:699::-;27101:7;27126:15;14828:158;;;;;;;;;;;;;;;;;;;27154:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27154:230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;27154:230:0;;;;;27144:241;;;;;;27471:16;;-1:-1:-1;;;27415:105:0;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;27415:105:0;;;;;;;27405:116;;;;;;26830:699::o;26361:330::-;26512:9;26523;26534:7;26545:20;26560:4;26545:14;:20::i;:::-;26511:54;;;;;;26576:22;26601:25;26611:5;26618:1;26621;26624;26601:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26601:25:0;;;;;;;;26576:50;;26663:8;-1:-1:-1;;;;;26645:26:0;:14;-1:-1:-1;;;;;26645:26:0;;26637:46;;;;;-1:-1:-1;;;26637:46:0;;;;;;;;;;;;-1:-1:-1;;;26637:46:0;;;;;;;;;;;;;;11881:119;11930:3;-1:-1:-1;;;11953:1:0;:14;11946:22;;;8855:175;8911:6;8941:5;;;8965:6;;;;;;:16;;;8980:1;8975;:6;;8965:16;8964:38;;;;8991:1;8987;:5;:14;;;;;9000:1;8996;:5;8987:14;8957:46;;;;9021:1;8855:175;-1:-1:-1;;;8855:175:0:o;8371:::-;8427:6;8457:5;;;8481:6;;;;;;:16;;;8496:1;8491;:6;;8481:16;8480:38;;;;8507:1;8503;:5;:14;;;;;8516:1;8512;:5;8473:46;;;42690:469;42807:11;;;42849:14;;42807:11;42878:12;;;42905:14;;;;42934:13;;;;42988:16;;;;43019:14;;;;;42807:237;;;-1:-1:-1;;;42807:237:0;;-1:-1:-1;;;42849:14:0;;;;42807:237;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;42962;;;-1:-1:-1;;;;;42962:11:0;42807:237;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;42807:11:0;;;;:27;;:237;;;;;;;;;;;;;;:11;:237;;;5:2:-1;;;;30:1;27;20:12;5:2;42807:237:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42807:237:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42807:237:0;43083:13;;42807:237;;-1:-1:-1;43057:94:0;;43083:13;;43074:7;;-1:-1:-1;;;43083:13:0;;;;43098:12;43112:26;42807:237;43057:9;:94::i;23600:867::-;23688:12;23703:6;-1:-1:-1;;;;;23688:21:0;;;23720:17;23740:22;:10;;:20;:22::i;:::-;23720:42;;23794:11;;;;;;;;;-1:-1:-1;;;;;23794:11:0;-1:-1:-1;;;;;23794:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23794:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23794:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23794:24:0;23782:36;;;23775:44;;;;23865:1;23838:22;:8;23851;23838:22;:12;:22;:::i;:::-;23837:29;;23830:37;;;;23895:1;23884:8;:12;:40;;;;;23916:8;23900:13;:24;23884:40;23880:204;;;24059:13;24048:24;;23880:204;24110:11;;:25;;24126:8;24110:25;:15;:25;:::i;:::-;24096:11;:39;24148:17;24168:27;:13;24186:8;24168:27;:17;:27;:::i;:::-;24148:47;;24219:26;:13;:24;:26::i;:::-;24206:10;:39;24258:14;24275:35;:22;:8;24288;24275:22;:12;:22;:::i;:::-;:33;:35::i;:::-;-1:-1:-1;;;;;24321:28:0;;;;;;:14;:28;;;;;:41;;;;;;;;24258:52;;-1:-1:-1;24377:32:0;24373:87;;24426:22;24435:12;24426:8;:22::i;27739:433::-;27837:9;27848;27859:7;27892:10;:17;27913:2;27892:23;27884:43;;;;;-1:-1:-1;;;27884:43:0;;;;;;;;;;;;-1:-1:-1;;;27884:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;27991:2:0;27975:19;;27969:26;28036:2;28020:19;;28014:26;28085:2;28069:19;;28063:26;28091:4;28059:37;28125:1;28121:5;;28117:48;;;28151:2;28147:6;28117:48;27739:433;;;;;:::o;24608:378::-;-1:-1:-1;;;;;24683:24:0;;24664:16;24683:24;;;:14;:24;;;;;;24725:15;24718:23;;;;-1:-1:-1;;;;;24754:24:0;;;24781:1;24754:24;;;:14;:24;;;;;;:28;;;24801:17;;24795:56;;-1:-1:-1;;;24795:56:0;;;;;;;;;;;;;;;;;24801:17;;;24795:33;;:56;;;;;24781:1;24795:56;;;;;;24781:1;24801:17;24795:56;;;5:2:-1;;;;30:1;27;20:12

Swarm Source

bzzr://3c6923dfa52cb5447c4679690d20ae4c36d324b5d79687182c0b56dd20d1aa48

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.