APE Price: $0.22 (-3.26%)

Contract

0x2054709F89F18a4CCAC6132acE7b812E32608469

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo3,055,355.049616670457646396 APE

APE Value

$682,555.15 (@ $0.22/APE)

More Info

Private Name Tags

Multichain Info

N/A
Transaction Hash
Block
From
To
Withdraw324075192026-01-15 8:46:172 hrs ago1768466777IN
0x2054709F...E32608469
0 APE0.01442766101.68276
Deposit324069872026-01-15 8:17:042 hrs ago1768465024IN
0x2054709F...E32608469
55 APE0.01058517101.68276
Withdraw324059412026-01-15 7:23:543 hrs ago1768461834IN
0x2054709F...E32608469
0 APE0.01320909101.68276
Deposit324004252026-01-15 5:11:385 hrs ago1768453898IN
0x2054709F...E32608469
2 APE0.01058517101.68276
Deposit323975942026-01-15 4:08:526 hrs ago1768450132IN
0x2054709F...E32608469
5,590 APE0.01058517101.68276
Withdraw323971952026-01-15 3:55:416 hrs ago1768449341IN
0x2054709F...E32608469
0 APE0.01320909101.68276
Withdraw323970542026-01-15 3:51:387 hrs ago1768449098IN
0x2054709F...E32608469
0 APE0.01320909101.68276
Withdraw323967902026-01-15 3:43:447 hrs ago1768448624IN
0x2054709F...E32608469
0 APE0.01320909101.68276
Withdraw323964652026-01-15 3:36:227 hrs ago1768448182IN
0x2054709F...E32608469
0 APE0.01320909101.68276
Withdraw323963382026-01-15 3:33:287 hrs ago1768448008IN
0x2054709F...E32608469
0 APE0.01320909101.68276
Withdraw323956802026-01-15 3:12:237 hrs ago1768446743IN
0x2054709F...E32608469
0 APE0.01320909101.68276
Deposit323951202026-01-15 2:59:547 hrs ago1768445994IN
0x2054709F...E32608469
455 APE0.01058517101.68276
Withdraw323950222026-01-15 2:56:267 hrs ago1768445786IN
0x2054709F...E32608469
0 APE0.01320909101.68276
Withdraw323949502026-01-15 2:53:598 hrs ago1768445639IN
0x2054709F...E32608469
0 APE0.01320909101.68276
Withdraw323949442026-01-15 2:53:398 hrs ago1768445619IN
0x2054709F...E32608469
0 APE0.01320787101.68276
Withdraw323949282026-01-15 2:53:008 hrs ago1768445580IN
0x2054709F...E32608469
0 APE0.01321031101.68276
Withdraw323945632026-01-15 2:37:158 hrs ago1768444635IN
0x2054709F...E32608469
0 APE0.01320909101.68276
Withdraw323944122026-01-15 2:29:248 hrs ago1768444164IN
0x2054709F...E32608469
0 APE0.01320909101.68276
Withdraw323942272026-01-15 2:21:158 hrs ago1768443675IN
0x2054709F...E32608469
0 APE0.01320909101.68276
Deposit323859622026-01-14 20:23:2414 hrs ago1768422204IN
0x2054709F...E32608469
1,000 APE0.01058517101.68276
Withdraw323820492026-01-14 17:47:2517 hrs ago1768412845IN
0x2054709F...E32608469
0 APE0.01320787101.68276
Deposit323742482026-01-14 11:56:3322 hrs ago1768391793IN
0x2054709F...E32608469
3.4 APE0.01058517101.68276
Withdraw323735472026-01-14 11:32:0023 hrs ago1768390320IN
0x2054709F...E32608469
0 APE0.01494787101.68276
Deposit323733162026-01-14 11:23:5523 hrs ago1768389835IN
0x2054709F...E32608469
1,019.42 APE0.01058517101.68276
Deposit323723752026-01-14 10:56:5123 hrs ago1768388211IN
0x2054709F...E32608469
1,000 APE0.01058517101.68276
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
324101892026-01-15 10:55:207 secs ago1768474520
0x2054709F...E32608469
25.5 APE
324101732026-01-15 10:54:5433 secs ago1768474494
0x2054709F...E32608469
11.02211 APE
324101652026-01-15 10:54:4641 secs ago1768474486
0x2054709F...E32608469
1.663 APE
324101512026-01-15 10:54:161 min ago1768474456
0x2054709F...E32608469
6.72 APE
324101452026-01-15 10:54:061 min ago1768474446
0x2054709F...E32608469
24 APE
324100772026-01-15 10:50:324 mins ago1768474232
0x2054709F...E32608469
1.92 APE
324100692026-01-15 10:50:165 mins ago1768474216
0x2054709F...E32608469
4.8 APE
324100632026-01-15 10:50:085 mins ago1768474208
0x2054709F...E32608469
4.8 APE
324100512026-01-15 10:49:465 mins ago1768474186
0x2054709F...E32608469
4.87 APE
324100472026-01-15 10:49:226 mins ago1768474162
0x2054709F...E32608469
4.08 APE
324100442026-01-15 10:49:116 mins ago1768474151
0x2054709F...E32608469
0.2928 APE
324100392026-01-15 10:48:536 mins ago1768474133
0x2054709F...E32608469
18.432 APE
324100372026-01-15 10:48:446 mins ago1768474124
0x2054709F...E32608469
9.6 APE
324100252026-01-15 10:48:117 mins ago1768474091
0x2054709F...E32608469
5.34999999 APE
324100112026-01-15 10:47:327 mins ago1768474052
0x2054709F...E32608469
0.30290666 APE
324099952026-01-15 10:46:448 mins ago1768474004
0x2054709F...E32608469
9.1696 APE
324099902026-01-15 10:46:249 mins ago1768473984
0x2054709F...E32608469
0.5846 APE
324099842026-01-15 10:45:569 mins ago1768473956
0x2054709F...E32608469
0.5846 APE
324099702026-01-15 10:45:1410 mins ago1768473914
0x2054709F...E32608469
0.3904 APE
324099572026-01-15 10:44:5510 mins ago1768473895
0x2054709F...E32608469
0.976 APE
324099492026-01-15 10:44:3610 mins ago1768473876
0x2054709F...E32608469
0.1952 APE
324099132026-01-15 10:43:0312 mins ago1768473783
0x2054709F...E32608469
1.2125 APE
324099102026-01-15 10:42:5212 mins ago1768473772
0x2054709F...E32608469
0.28 APE
324097712026-01-15 10:35:1420 mins ago1768473314
0x2054709F...E32608469
10.736 APE
324097592026-01-15 10:34:5720 mins ago1768473297
0x2054709F...E32608469
25.376 APE
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
House

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at apescan.io on 2025-07-16
*/

//SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

interface IGovernanceManager {
    function RNG() external view returns (address);
    function owner() external view returns (address);
    function referralManager() external view returns (address);
    function feeReceiver() external view returns (address);
    function claimManager() external view returns (address);
    function house() external view returns (address);
    function isGame(address game) external view returns (bool);
    function userInfoTracker() external view returns (address);
    function canPlayForOthers(address addr) external view returns (bool);
    function paused() external view returns (bool);
    function isAdmin(address admin) external view returns (bool);
}

interface IRNG {
    function requestRandom(bytes32 userRandomNumber, uint8 numWords) external payable returns (uint64);
    function getFee() external view returns (uint256);
}

contract ApeOwnable {

    // Governance Manager
    IGovernanceManager public constant manager = IGovernanceManager(0x8632f22e5A921C751CFbBFF92F058A3b11E96b8a);

    modifier onlyOwner() {
        require(
            msg.sender == manager.owner(),
            'Only Owner'
        );
        _;
    }

    modifier onlyGame() {
        require(
            manager.isGame(msg.sender),
            'UnAuthorized'
        );
        _;
    }

    modifier onlyRNG() {
        require(
            msg.sender == manager.RNG(),
            'Only RNG Contract'
        );
        _;
    }

    modifier validatePlayer(address player) {
        if (player != msg.sender) {
            require(
                manager.canPlayForOthers(msg.sender),
                'UnAuthorized To Play For Others'
            );
        }
        _;
    }

    modifier notPaused() {
        require(
            manager.paused() == false,
            'All Games Paused'
        );
        _;
    }

    modifier onlyAdmin() {
        require(
            manager.isAdmin(msg.sender),
            'UnAuthorized'
        );
        _;
    }
}

interface IERC20 {

    function totalSupply() external view returns (uint256);
    
    function symbol() external view returns(string memory);
    
    function name() external view returns(string memory);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);
    
    /**
     * @dev Returns the number of decimal places
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeApprove: approve failed'
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeTransfer: transfer failed'
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::transferFrom: transferFrom failed'
        );
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
    }
}

interface IClaimManager {
    function credit(
        uint256 GAME_ID,
        address user
    ) external payable;
}

interface IHouse {
    
    /**
        House has profited from game, call this to send value into the house and emit the correct event for SubGraphs
     */
    function houseProfit(uint256 GAME_ID) external payable;

    /**
        Function Games Call to tell the house that a user has won the bet
     */
    function payout(uint256 GAME_ID, address user, uint256 value) external;
    
    /**
        Read function to determine the maximum payout allowed by the house at the current time
     */
    function maxPayout() external view returns (uint256);

    /**
        Randomness has been requested, withdrawals are paused until it is resolved by called `randomRequestResolved()`
     */
    function randomRequested() external;

    /**
        Resolves a random request from chainlink, allowing house users to withdraw
     */
    function randomRequestResolved() external;

}

interface IArbInfo {
    function configureAutomaticYield() external;
    function configureVoidYield() external;
    function configureDelegateYield(address delegate) external;
}

abstract contract OnChainYieldManager {
    IArbInfo private constant ArbInfo = IArbInfo(0x0000000000000000000000000000000000000065);

    function _configureAutomaticYield() internal {
        ArbInfo.configureAutomaticYield();
    }

    function _configureVoidYield() internal {
        ArbInfo.configureVoidYield();
    }

    function _configureDelegateYield(address _delegate) internal {
        ArbInfo.configureDelegateYield(_delegate);
    }
}


contract HouseDataTracking {

    struct PriceChange {
        uint256 price;
        uint256 timestamp;
    }

    uint256 internal priceChangeIndex;

    mapping ( uint256 => PriceChange ) private priceChanges;

    function log(uint256 price) internal {
        priceChanges[priceChangeIndex] = PriceChange(price, block.timestamp);
        unchecked {
            ++priceChangeIndex;
        }
    }

    function getPriceChange(uint256 index) external view returns (uint256, uint256) {
        return (priceChanges[index].price, priceChanges[index].timestamp);
    }

    function getPriceChangeCount() external view returns (uint256) {
        return priceChangeIndex;
    }

    function batchGetPriceChange(uint256 startIndex, uint256 endIndex) external view returns (uint256[] memory, uint256[] memory) {
        if (endIndex > priceChangeIndex) {
            endIndex = priceChangeIndex;
        }
        if (startIndex >= endIndex || priceChangeIndex == 0) {
            return (new uint256[](0), new uint256[](0));
        }

        uint256[] memory prices = new uint256[](endIndex - startIndex);
        uint256[] memory timestamps = new uint256[](endIndex - startIndex);

        for (uint256 i = startIndex; i < endIndex;) {
            prices[i - startIndex] = priceChanges[i].price;
            timestamps[i - startIndex] = priceChanges[i].timestamp;
            unchecked { ++i; }
        }

        return (prices, timestamps);
    }

    function getListOfPriceChanges(uint256[] calldata indexes) external view returns (uint256[] memory, uint256[] memory) {
        uint len = indexes.length;
        uint256[] memory prices = new uint256[](len);
        uint256[] memory timestamps = new uint256[](len);

        for (uint256 i = 0; i < len;) {
            prices[i] = priceChanges[indexes[i]].price;
            timestamps[i] = priceChanges[indexes[i]].timestamp;
            unchecked { ++i; }
        }

        return (prices, timestamps);
    }

    function getEvenlySplitPriceChanges(uint256 numDataPoints) external view returns (uint256[] memory, uint256[] memory) {
        if (priceChangeIndex == 0) {
            return (new uint256[](0), new uint256[](0));
        }

        if (numDataPoints > priceChangeIndex) {
            numDataPoints = priceChangeIndex;
        }

        uint256[] memory prices = new uint256[](numDataPoints);
        uint256[] memory timestamps = new uint256[](numDataPoints);

        // calculate step, how many price changes to skip
        uint256 step = priceChangeIndex / ( numDataPoints - 1 );

        for (uint256 i = 0; i < numDataPoints - 1;) {
            prices[i] = priceChanges[i * step].price;
            timestamps[i] = priceChanges[i * step].timestamp;
            unchecked { ++i; }
        }

        // set most recent prices
        prices[numDataPoints - 1] = priceChanges[priceChangeIndex - 1].price;
        timestamps[numDataPoints - 1] = priceChanges[priceChangeIndex - 1].timestamp;

        return (prices, timestamps);
    }

    function getApproxAverageEvenlySplitPriceChanges(uint256 numDataPoints, uint256 averageCount) external view returns (uint256[] memory, uint256[] memory) {
        if (priceChangeIndex == 0) {
            return (new uint256[](0), new uint256[](0));
        }

        if (numDataPoints > priceChangeIndex) {
            numDataPoints = priceChangeIndex;
        }

        // create arrays to store prices and timestamps
        uint256[] memory prices = new uint256[](numDataPoints);
        uint256[] memory timestamps = new uint256[](numDataPoints);

        // calculate step, how many price changes to skip
        uint256 step = priceChangeIndex / ( numDataPoints - 1 );
        if (step <= averageCount) {
            averageCount = step - 1;
        }

        // loop through data points, determining average price changes around each step
        for (uint256 i = 0; i < numDataPoints - 1;) {
            
            // find average price changes around each step
            uint256 sumPrice = 0;
            uint256 sumTimestamp = 0;
            for (uint j = 0; j < averageCount;) {
                unchecked { 
                    sumPrice += priceChanges[(i * step) + j].price;
                    sumTimestamp += priceChanges[(i * step) + j].timestamp;
                    ++j; 
                }
            }

            prices[i] = sumPrice / averageCount;
            timestamps[i] = sumTimestamp / averageCount;
            unchecked { ++i; }
        }

        // set most recent prices
        prices[numDataPoints - 1] = priceChanges[priceChangeIndex - 1].price;
        timestamps[numDataPoints - 1] = priceChanges[priceChangeIndex - 1].timestamp;

        return (prices, timestamps);
    }

    function getAverageTimeAndPrice(uint256[] calldata indexes) external view returns (uint256, uint256) {
        uint len = indexes.length;
        uint256 sumPrice;
        uint256 sumTimestamp;

        for (uint256 i = 0; i < len;) {
            unchecked {
                sumPrice += priceChanges[indexes[i]].price;
                sumTimestamp += priceChanges[indexes[i]].timestamp;
                ++i;
            }
        }

        return (sumPrice / len, sumTimestamp / len);
    }
}

interface IMigrator {
    function migrate(address user, bytes calldata data) external payable;
}

/**
    House Contract is responsible for managing House funds.
    Only games can interact with functions that affect the house balance.
 */
contract House is ApeOwnable, IHouse, IERC20, HouseDataTracking, OnChainYieldManager {

    // Trackable User Info
    struct UserInfo {
        uint256 balance;
        uint256 totalStaked;
        uint256 totalWithdrawn;
        uint256 unlockTime;
        bool isFeeExempt;
        uint256 maxContribution;
    }

    // User -> UserInfo
    mapping ( address => UserInfo ) public userInfo;

    // maps GAME_ID to max payout per game, if zero, use default maxPayoutPerGame variable
    mapping ( uint256 => uint256 ) public gameMaxPayout;

    // Whether or not staking is open to the public
    bool public publicStaking = true;

    // Fee Denom
    uint256 private constant FEE_DENOM = 10_000;

    // total supply of staked units
    uint256 public totalShares;

    // lock time
    uint256 public lockTime = 15 minutes;

    // precision factor
    uint256 private constant precision = 10**18;

    // Max Payout per game percentage
    uint256 public maxPayoutPerGame = 250; // 2.5% of total house balance

    // Exit Fee, reflected to house participants
    uint256 public exitFee = 200; // 2% exit fee, up to 10% max

    // Percentage of entry/exit fee that is reflected to the pool
    uint256 public reflectPercentage = 5000; // 50%

    // Halts Withdrawals While Randomness is being Requested
    uint256 public resolutionsPending;

    // Determines whether or not halting withdrawals while game resolutions are pending is permitted
    bool public enableInGamePausing = false;

    // The minimum price the house can fall to before PvH games are disabled
    // This value can be re-set if this occurs, allowing PvH games to continue
    // The idea for this is to allow time for devs to source a potential issue in a game that allowed the price to fall so low
    // This exists to protect house stakers from losing large sums of value too quickly
    uint256 public MIN_PRICE;

    // Migrator Contract, only will be set if there is a new house contract to migrate into
    IMigrator public migrator;

    // Log Index
    uint256 public logIndex = 5;

    // Reentrancy Guard
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;
    modifier nonReentrant() {
        require(_status != _ENTERED, "Reentrancy Guard call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }

    // Events
    event Deposit(address depositor, uint256 amount);
    event Withdraw(address withdrawer, uint256 amount);
    event Migrate(address withdrawer, uint256 amount);
    event HouseWon(uint256 GAME_ID, uint256 profit);
    event HouseLost(uint256 GAME_ID, address user, uint256 loss);

    constructor() {

        // set reentrancy
        _status = _NOT_ENTERED;

        // enable automatic yield
        _configureAutomaticYield();

        emit Transfer(address(0), address(0), 0);
    }

    function name() external pure override returns (string memory) {
        return "APE House";
    }
    function symbol() external pure override returns (string memory) {
        return "House APE";
    }
    function decimals() external pure override returns (uint8) {
        return 18;
    }
    function totalSupply() external view override returns (uint256) {
        return address(this).balance;
    }

    function maxPayout() public view returns (uint256) {
        return ( address(this).balance * maxPayoutPerGame ) / FEE_DENOM;
    }

    function getMaxPayoutForGame(uint256 GAME_ID) public view returns (uint256) {
        uint256 maxPayout_ = gameMaxPayout[GAME_ID] > 0 ? gameMaxPayout[GAME_ID] : maxPayoutPerGame;
        return ( address(this).balance * maxPayout_ ) / FEE_DENOM;
    }

    /** Shows The Value In Native Of The Users House Native Tokens */
    function balanceOf(address account) public view override returns (uint256) {
        return ReflectionsFromContractBalance(userInfo[account].balance);
    }

    function allowance(address, address) external pure override returns (uint256) { 
        return 0;
    }
    
    function approve(address, uint256) public override returns (bool) {
        emit Approval(msg.sender, address(0), 0);
        return true;
    }
  
    function transfer(address recipient, uint256 amount) external override returns (bool) {
        if (recipient == msg.sender) {
            withdraw(amount);
        }
        return true;
    }
    function transferFrom(address, address recipient, uint256 amount) external override returns (bool) {
        if (recipient == msg.sender) {
            withdraw(amount);
        }        
        return true;
    }

    function setLockTime(uint256 newLockTime) external onlyOwner {
        require(
            newLockTime <= 100 days,
            'Lock Time Too Long'
        );
        lockTime = newLockTime;
    }

    function setMaxContribution(address user, uint256 max) external onlyOwner {
        userInfo[user].maxContribution = max;
    }

    function setFeeExemption(address user, bool isExempt) external onlyOwner {
        userInfo[user].isFeeExempt = isExempt;
    }

    function setPublicStaking(bool isPublic) external onlyOwner {
        publicStaking = isPublic;
    }

    function setExitFee(uint256 exitFee_) external onlyOwner {
        require(
            exitFee_ <= FEE_DENOM / 10,
            'Exit Fee Too High'
        );
        exitFee = exitFee_;
    }

    function setReflectionPercentage(uint256 newPercent) external onlyOwner {
        require(
            newPercent <= FEE_DENOM,
            'Reflect Percent Too High'
        );
        reflectPercentage = newPercent;
    }

    /**
        Just in case resolutionsPending gets stuck above zero due to an error with VRF, etc
        Cannot increase the value greater than it currently is -- that would lock people in the House for forever
        Can only reduce the value
     */
    function hardSetResolutionsPending(uint256 resolutionsPending_) external onlyOwner {
        require(
            resolutionsPending_ < resolutionsPending,
            'Cannot Manually Increase This Value'
        );
        resolutionsPending = resolutionsPending_;
    }

    /**
        Enables Pausing withdrawals while games are awaiting resolution from VRF
     */
    function setEnableInGamePausing(bool isEnabled) external onlyOwner {
        enableInGamePausing = isEnabled;
        if (isEnabled) {
            resolutionsPending = 0;
        }
    }

    function recoverForeignToken(address token) external onlyOwner {
        IERC20(token).transfer(msg.sender, IERC20(token).balanceOf(address(this)));
    }
    
    function setMaxPayoutPerGame(uint256 newMaxPayout) external onlyOwner {
        require(
            newMaxPayout <= FEE_DENOM / 4,
            'Max Payout Percentage Too High'
        );
        maxPayoutPerGame = newMaxPayout;
    }

    function setGameMaxPayout(uint256 GAME_ID, uint256 newMaxPayout) external onlyOwner {
        require(
            newMaxPayout <= FEE_DENOM / 4,
            'Max Payout Percentage Too High'
        );
        gameMaxPayout[GAME_ID] = newMaxPayout;
    }

    function setMinPrice(uint256 percentOfCurrent) external onlyOwner {
        require(
            percentOfCurrent <= 999,
            'Min Price Cannot Exceed 99.9% Of Current Value'
        );
        MIN_PRICE = ( _calculatePrice() * percentOfCurrent ) / 1_000;
    }

    function setMigrator(address migrator_) external onlyOwner {
        migrator = IMigrator(migrator_);
    }

    function setLogIndex(uint256 newLogIndex) external onlyOwner {
        logIndex = newLogIndex;
    }

    function migrate(bytes calldata data) external nonReentrant {
        require(
            address(migrator) != address(0),
            'No Migrator'
        );

        // user amount
        uint256 userBalance = userInfo[msg.sender].balance;
        require(
            userBalance > 0,
            'Zero Balance'
        );

        // native amount from balance
        uint256 nativeAmount = ReflectionsFromContractBalance(userBalance);

        // burn user balance
        _burn(msg.sender, userBalance, nativeAmount);

        // increment total withdrawn
        unchecked {
            userInfo[msg.sender].totalWithdrawn += nativeAmount;
        }
        
        // emit Event
        emit Migrate(msg.sender, nativeAmount);

        // send value to user
        migrator.migrate{value: nativeAmount}(msg.sender, data);
    }

    /**
        Deposits Native From Sender
        Locks In Contract, Minting Native House Tokens
     */
    function deposit() external payable nonReentrant {
        require(
            msg.value > 0,
            'Zero Value'
        );
        require(
            address(migrator) == address(0),
            'Migration In Progress'
        );

        // Track Balance Before Deposit
        uint previousBalance = address(this).balance - msg.value;

        // mint appropriate balance to recipient
        if (totalShares == 0 || previousBalance == 0) {
            _registerFirstPurchase(msg.sender, msg.value);
        } else {
            _mintTo(msg.sender, msg.value, previousBalance);
        }

        if (publicStaking == false) {
            require(
                balanceOf(msg.sender) <= userInfo[msg.sender].maxContribution,
                'Max Contribution Exceeded'
            );
        }
    }

    /**
        Redeems `amount` of Native, As Seen From BalanceOf()
     */
    function withdraw(uint256 amount) public nonReentrant returns (uint256) {
        require(
            address(migrator) == address(0),
            'Migration In Progress'
        );

        // check for in-Game Pausing
        if (enableInGamePausing == true) {
            require(
                resolutionsPending == 0,
                'Game Resolutions Are Pending'
            );
        }

        // ensure lock time
        require(
            timeUntilUnlock(msg.sender) == 0,
            'Not Yet Time'
        );

        // get user balance as seen from balanceOf
        uint256 userBal = balanceOf(msg.sender);

        if (amount > userBal) {
            amount = userBal;
        }

        // Turn Native Amount Into Contract Balance Amount
        uint House_Amount = amount == userBal ? userInfo[msg.sender].balance : NativeToContractBalance(amount);

        require(
            userInfo[msg.sender].balance > 0 &&
            userInfo[msg.sender].balance >= House_Amount &&
            userBal >= amount &&
            amount > 0 &&
            House_Amount > 0,
            'Insufficient Funds'
        );

        // burn House Tokens From Sender
        _burn(msg.sender, House_Amount, amount);

        // increment total withdrawn
        unchecked {
            userInfo[msg.sender].totalWithdrawn += amount;
        }
        
        // emit Event
        emit Withdraw(msg.sender, amount);

        // if fees exist, apply them
        if (exitFee > 0 && userInfo[msg.sender].isFeeExempt == false) {

            // split up fee and nonReflected Fee
            uint256 fee = ( amount * exitFee ) / FEE_DENOM;
            uint256 nonReflectFee = ( fee * reflectPercentage ) / FEE_DENOM;

            if (nonReflectFee > 0) {
                // send fee to receiver
                TransferHelper.safeTransferETH(manager.feeReceiver(), nonReflectFee);
            }

            // send value to user
            TransferHelper.safeTransferETH(msg.sender, amount - fee);
        } else {
            // send value to user
            TransferHelper.safeTransferETH(msg.sender, amount);
        }

        // log price change
        log(_calculatePrice());
        
        // return send amount
        return amount;
    }

    receive() external payable {
        require(totalShares > 0, 'Zero Shares');
        require(_status != _ENTERED, "Reentrancy Guard call");
    }

    function randomRequested() external override nonReentrant onlyGame {
        require(
            _calculatePrice() >= MIN_PRICE,
            'PRICE TOO LOW, PvH GAMES PAUSED'
        );

        // randomly log price approximately every 8 games, no need to be exact
        if (block.number % logIndex == 0) {
            // log price change
            log(_calculatePrice());
        }

        if (enableInGamePausing == false) {
            return;
        }
        unchecked {
            ++resolutionsPending;
        }
    }

    function randomRequestResolved() external override nonReentrant onlyGame {
        if (enableInGamePausing == false) {
            return;
        }
        // subtract resolutions pending
        if (resolutionsPending > 0) {
            unchecked {
                --resolutionsPending;
            }
        }
    }

    /**
        Request A Payout from the house from a successful Game.
        Only callable by Game Contracts
     */
    function payout(uint256 GAME_ID, address user, uint256 value) external override nonReentrant onlyGame {

        // get max payout
        uint256 maxPayout_ = getMaxPayoutForGame(GAME_ID);

        // send amount
        uint256 sendAmount = value >= maxPayout_ ? maxPayout_ : value;

        // add to user's claim contract balance to avoid reentrancy
        IClaimManager(manager.claimManager()).credit{value: sendAmount}(
            GAME_ID,
            user
        );

        // emit house lost event
        emit HouseLost(GAME_ID, user, sendAmount);
    }

    function houseProfit(uint256 GAME_ID) external payable override onlyGame nonReentrant {
        emit HouseWon(GAME_ID, msg.value);
    }

    /**
        Registers the First Stake
     */
    function _registerFirstPurchase(address user, uint received) internal {
        
        // increment total staked
        userInfo[user].totalStaked += received;

        // mint House Tokens To Sender
        _mint(user, received, received);

        // log price change
        log(_calculatePrice());

        emit Deposit(user, received);
    }

    function _mintTo(address sender, uint256 received, uint256 previousBalance) internal {
        // Number Of House Tokens To Mint
        uint nToMint = ( totalShares * received ) / previousBalance;
        require(
            nToMint > 0,
            'Zero To Mint'
        );

        // increment total staked
        userInfo[sender].totalStaked += received;

        // mint House Tokens To Sender
        _mint(sender, nToMint, received);

        // log price change
        log(_calculatePrice());

        emit Deposit(sender, received);
    }


    /**
     * Burns `amount` of Contract Balance Token
     */
    function _burn(address from, uint256 amount, uint256 nativeAmount) private {

        // update balances
        userInfo[from].balance -= amount;
        totalShares -= amount;
        
        // emit Transfer
        emit Transfer(from, address(0), nativeAmount);
    }

    /**
     * Mints `amount` of Contract Balance Token
     */
    function _mint(address to, uint256 amount, uint256 nativeWorth) private {
        unchecked {
            userInfo[to].balance += amount;
            totalShares += amount;
        }
        userInfo[to].unlockTime = block.timestamp + lockTime;
        emit Transfer(address(0), to, nativeWorth);
    }

    /**
        Fetches the time until a user's staked amount can be withdrawn
     */
    function timeUntilUnlock(address user) public view returns (uint256) {
        return userInfo[user].unlockTime > block.timestamp ? userInfo[user].unlockTime - block.timestamp : 0;
    }

    /**
        Converts A Native Amount Into A House Amount
     */
    function NativeToContractBalance(uint256 amount) public view returns (uint256) {
        return ( ( amount * precision ) / _calculatePrice() );
    }

    /**
        Converts A House Amount Into A Native Amount
     */
    function ReflectionsFromContractBalance(uint256 amount) public view returns (uint256) {
        return ( ( amount * _calculatePrice() ) / precision );
    }

    /** Conversion Ratio For House -> Native */
    function calculatePrice() external view returns (uint256) {
        return _calculatePrice();
    }

    /** Returns Total Profit for User In Token From House */
    function getTotalProfits(address user) external view returns (int256) {
        uint top = balanceOf(user) + userInfo[user].totalWithdrawn;
        return int256(top) - int256(userInfo[user].totalStaked);
    }
    
    /** Conversion Ratio For House -> Native */
    function _calculatePrice() internal view returns (uint256) {
        return ( address(this).balance * precision ) / totalShares;
    }

}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"GAME_ID","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"}],"name":"HouseLost","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"GAME_ID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"}],"name":"HouseWon","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MIN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NativeToContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReflectionsFromContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"endIndex","type":"uint256"}],"name":"batchGetPriceChange","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"enableInGamePausing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exitFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"gameMaxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numDataPoints","type":"uint256"},{"internalType":"uint256","name":"averageCount","type":"uint256"}],"name":"getApproxAverageEvenlySplitPriceChanges","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indexes","type":"uint256[]"}],"name":"getAverageTimeAndPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numDataPoints","type":"uint256"}],"name":"getEvenlySplitPriceChanges","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indexes","type":"uint256[]"}],"name":"getListOfPriceChanges","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"GAME_ID","type":"uint256"}],"name":"getMaxPayoutForGame","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPriceChange","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceChangeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getTotalProfits","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"resolutionsPending_","type":"uint256"}],"name":"hardSetResolutionsPending","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"GAME_ID","type":"uint256"}],"name":"houseProfit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"lockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"logIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract IGovernanceManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayoutPerGame","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrator","outputs":[{"internalType":"contract IMigrator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"GAME_ID","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"payout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomRequestResolved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"randomRequested","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"recoverForeignToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reflectPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resolutionsPending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isEnabled","type":"bool"}],"name":"setEnableInGamePausing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"exitFee_","type":"uint256"}],"name":"setExitFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"isExempt","type":"bool"}],"name":"setFeeExemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"GAME_ID","type":"uint256"},{"internalType":"uint256","name":"newMaxPayout","type":"uint256"}],"name":"setGameMaxPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLockTime","type":"uint256"}],"name":"setLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLogIndex","type":"uint256"}],"name":"setLogIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"setMaxContribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxPayout","type":"uint256"}],"name":"setMaxPayoutPerGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"migrator_","type":"address"}],"name":"setMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentOfCurrent","type":"uint256"}],"name":"setMinPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPublic","type":"bool"}],"name":"setPublicStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"setReflectionPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"timeUntilUnlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"totalStaked","type":"uint256"},{"internalType":"uint256","name":"totalWithdrawn","type":"uint256"},{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"bool","name":"isFeeExempt","type":"bool"},{"internalType":"uint256","name":"maxContribution","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526004805460ff1990811660011790915561038460065560fa60075560c8600855611388600955600b805490911690556005600e55348015604357600080fd5b506001600f55604f608b565b60405160008082529081907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a360df565b60656001600160a01b0316637114177a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801560c657600080fd5b505af115801560d9573d6000803e3d6000fd5b50505050565b613759806100ee6000396000f3fe6080604052600436106103855760003560e01c806370a08231116101d1578063ae2f5d9311610102578063da99f729116100a0578063e5a583a91161006f578063e5a583a914610b09578063ec5bfc8c14610b29578063f804453214610b49578063ff3fd60414610b6957600080fd5b8063da99f72914610a9b578063dd62ed3e14610ab1578063e0176de814610ad4578063e13760e814610ae957600080fd5b8063c7471903116100dc578063c747190314610a48578063d0228e8f14610a5e578063d0e30db014610a7e578063d348b40914610a8657600080fd5b8063ae2f5d93146109f5578063b3cb6f1a14610a15578063b67c527314610a2857600080fd5b80638b3939f21161016f578063a01cc0e711610149578063a01cc0e714610989578063a9059cbb1461099f578063ad9f20a6146109bf578063ae04d45d146109d557600080fd5b80638b3939f21461092d5780638d7fe4781461094257806395d89b411461095757600080fd5b80637cd07e47116101ab5780637cd07e47146108b35780637fb1ffa7146108d35780638763d8e4146108ed5780638932a90d1461090d57600080fd5b806370a082311461085d578063751fd1791461087d5780637bc0c6511461089d57600080fd5b806323cf3118116102b65780633e8e0b3d116102545780636102b6e8116102235780636102b6e8146107e75780636284ae4114610807578063639254411461081d578063676feaf21461083d57600080fd5b80633e8e0b3d1461074d578063481c6a751461076d57806352bb326e146107a75780635ea8cd12146107c757600080fd5b8063313ce56711610290578063313ce567146106b157806337876814146106cd5780633a98ef39146106ed5780633b0b037a1461070357600080fd5b806323cf311814610651578063278984bf146106715780632e1a7d4d1461069157600080fd5b80630d668087116103235780631959a002116102fd5780631959a002146105785780631ab733a3146105fc5780631f581e2a1461061c57806323b872dd1461063157600080fd5b80630d668087146105225780630fe8893f1461053857806318160ddd1461056557600080fd5b806306fdde031161035f57806306fdde031461048757806307b11b76146104c2578063095ea7b3146104e2578063098729db1461050257600080fd5b8063018c195e146103f8578063040bef041461042f57806304decf2e1461045d57600080fd5b366103f3576000600554116103cf5760405162461bcd60e51b815260206004820152600b60248201526a5a65726f2053686172657360a81b60448201526064015b60405180910390fd5b6002600f54036103f15760405162461bcd60e51b81526004016103c6906131c8565b005b600080fd5b34801561040457600080fd5b506104186104133660046131f7565b610b89565b604051610426929190613255565b60405180910390f35b34801561043b57600080fd5b5061044f61044a366004613283565b610dfa565b604051908152602001610426565b34801561046957600080fd5b506004546104779060ff1681565b6040519015158152602001610426565b34801561049357600080fd5b5060408051808201909152600981526841504520486f75736560b81b60208201525b60405161042691906132c0565b3480156104ce57600080fd5b5061044f6104dd366004613283565b610e47565b3480156104ee57600080fd5b506104776104fd366004613308565b610e73565b34801561050e57600080fd5b5061044f61051d366004613283565b610eb6565b34801561052e57600080fd5b5061044f60065481565b34801561054457600080fd5b5061044f610553366004613283565b60036020526000908152604090205481565b34801561057157600080fd5b504761044f565b34801561058457600080fd5b506105cd610593366004613334565b60026020819052600091825260409091208054600182015492820154600383015460048401546005909401549294939192909160ff169086565b6040805196875260208701959095529385019290925260608401521515608083015260a082015260c001610426565b34801561060857600080fd5b5061044f610617366004613334565b610ed3565b34801561062857600080fd5b5060005461044f565b34801561063d57600080fd5b5061047761064c366004613351565b610f2d565b34801561065d57600080fd5b506103f161066c366004613334565b610f54565b34801561067d57600080fd5b506103f161068c366004613308565b611016565b34801561069d57600080fd5b5061044f6106ac366004613283565b6110d5565b3480156106bd57600080fd5b5060405160128152602001610426565b3480156106d957600080fd5b506104186106e8366004613392565b611480565b3480156106f957600080fd5b5061044f60055481565b34801561070f57600080fd5b5061073861071e366004613283565b600090815260016020819052604090912080549101549091565b60408051928352602083019190915201610426565b34801561075957600080fd5b506103f1610768366004613283565b6115cb565b34801561077957600080fd5b5061078f60008051602061370483398151915281565b6040516001600160a01b039091168152602001610426565b3480156107b357600080fd5b506103f16107c2366004613283565b6116cc565b3480156107d357600080fd5b506103f16107e2366004613283565b611771565b3480156107f357600080fd5b506103f1610802366004613417565b6118a0565b34801561081357600080fd5b5061044f60085481565b34801561082957600080fd5b506103f1610838366004613283565b611953565b34801561084957600080fd5b506103f16108583660046131f7565b611a55565b34801561086957600080fd5b5061044f610878366004613334565b611b63565b34801561088957600080fd5b506103f1610898366004613434565b611b85565b3480156108a957600080fd5b5061044f600a5481565b3480156108bf57600080fd5b50600d5461078f906001600160a01b031681565b3480156108df57600080fd5b50600b546104779060ff1681565b3480156108f957600080fd5b506103f1610908366004613417565b611c53565b34801561091957600080fd5b506103f161092836600461346d565b611d13565b34801561093957600080fd5b506103f1611ea8565b34801561094e57600080fd5b506103f1611f7d565b34801561096357600080fd5b50604080518082019091526009815268486f7573652041504560b81b60208201526104b5565b34801561099557600080fd5b5061044f60095481565b3480156109ab57600080fd5b506104776109ba366004613308565b6120c0565b3480156109cb57600080fd5b5061044f600c5481565b3480156109e157600080fd5b506103f16109f0366004613283565b6120e6565b348015610a0157600080fd5b506103f1610a103660046134d1565b6121d3565b6103f1610a23366004613283565b6123d6565b348015610a3457600080fd5b50610418610a433660046131f7565b6124c6565b348015610a5457600080fd5b5061044f60075481565b348015610a6a57600080fd5b5061044f610a79366004613334565b612622565b6103f1612672565b348015610a9257600080fd5b5061044f6127e2565b348015610aa757600080fd5b5061044f600e5481565b348015610abd57600080fd5b5061044f610acc3660046134f8565b600092915050565b348015610ae057600080fd5b5061044f6127f1565b348015610af557600080fd5b50610738610b04366004613392565b61280e565b348015610b1557600080fd5b506103f1610b24366004613283565b6128b2565b348015610b3557600080fd5b506103f1610b44366004613334565b6129a7565b348015610b5557600080fd5b506103f1610b64366004613283565b612b2c565b348015610b7557600080fd5b50610418610b84366004613283565b612c23565b606080600054600003610bdc5760005b604051908082528060200260200182016040528015610bc2578160200160208202803683370190505b506040805160008152602081019091529092509050610df3565b600054841115610bec5760005493505b60008467ffffffffffffffff811115610c0757610c07613526565b604051908082528060200260200182016040528015610c30578160200160208202803683370190505b50905060008567ffffffffffffffff811115610c4e57610c4e613526565b604051908082528060200260200182016040528015610c77578160200160208202803683370190505b5090506000610c87600188613552565b600054610c94919061357b565b9050858111610cab57610ca8600182613552565b95505b60005b610cb9600189613552565b811015610d515760008060005b89811015610cf85783850281016000908152600160208190526040909120805490820154940193929092019101610cc6565b50610d03898361357b565b868481518110610d1557610d1561358f565b6020908102919091010152610d2a898261357b565b858481518110610d3c57610d3c61358f565b60209081029190910101525050600101610cae565b50600160006001600054610d659190613552565b815260208101919091526040016000205483610d8260018a613552565b81518110610d9257610d9261358f565b602002602001018181525050600160006001600054610db19190613552565b81526020019081526020016000206001015482600189610dd19190613552565b81518110610de157610de161358f565b60209081029190910101525090925090505b9250929050565b6000818152600360205260408120548190610e1757600754610e27565b6000838152600360205260409020545b9050612710610e3682476135a5565b610e40919061357b565b9392505050565b6000610e51612e45565b610e63670de0b6b3a7640000846135a5565b610e6d919061357b565b92915050565b604051600080825290819033907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259060200160405180910390a350600192915050565b6000670de0b6b3a7640000610ec9612e45565b610e6390846135a5565b6001600160a01b0381166000908152600260208190526040822001548190610efa84611b63565b610f0491906135bc565b6001600160a01b038416600090815260026020526040902060010154909150610e4090826135cf565b6000336001600160a01b03841603610f4a57610f48826110d5565b505b5060019392505050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc491906135f6565b6001600160a01b0316336001600160a01b031614610ff45760405162461bcd60e51b81526004016103c690613613565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611062573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108691906135f6565b6001600160a01b0316336001600160a01b0316146110b65760405162461bcd60e51b81526004016103c690613613565b6001600160a01b03909116600090815260026020526040902060050155565b60006002600f54036110f95760405162461bcd60e51b81526004016103c6906131c8565b6002600f55600d546001600160a01b03161561114f5760405162461bcd60e51b81526020600482015260156024820152744d6967726174696f6e20496e2050726f677265737360581b60448201526064016103c6565b600b5460ff1615156001036111ae57600a54156111ae5760405162461bcd60e51b815260206004820152601c60248201527f47616d65205265736f6c7574696f6e73204172652050656e64696e670000000060448201526064016103c6565b6111b733612622565b156111f35760405162461bcd60e51b815260206004820152600c60248201526b4e6f74205965742054696d6560a01b60448201526064016103c6565b60006111fe33611b63565b90508083111561120c578092505b60008184146112235761121e84610e47565b611234565b336000908152600260205260409020545b33600090815260026020526040902054909150158015906112645750336000908152600260205260409020548111155b80156112705750838210155b801561127c5750600084115b80156112885750600081115b6112c95760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b60448201526064016103c6565b6112d4338286612e5d565b33600081815260026020818152604092839020909101805488019055815192835282018690527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364910160405180910390a1600060085411801561134a57503360009081526002602052604090206004015460ff16155b156114265760006127106008548661136291906135a5565b61136c919061357b565b905060006127106009548361138191906135a5565b61138b919061357b565b9050801561140c5761140c6000805160206137048339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140691906135f6565b82612eea565b61141f3361141a8489613552565b612eea565b5050611430565b6114303385612eea565b61147561143b612e45565b6040805180820182529182524260208084019182526000805481526001918290529283209351845590519281019290925580549091019055565b50506001600f555090565b6060808260008167ffffffffffffffff81111561149f5761149f613526565b6040519080825280602002602001820160405280156114c8578160200160208202803683370190505b50905060008267ffffffffffffffff8111156114e6576114e6613526565b60405190808252806020026020018201604052801561150f578160200160208202803683370190505b50905060005b838110156115be57600160008989848181106115335761153361358f565b9050602002013581526020019081526020016000206000015483828151811061155e5761155e61358f565b602002602001018181525050600160008989848181106115805761158061358f565b905060200201358152602001908152602001600020600101548282815181106115ab576115ab61358f565b6020908102919091010152600101611515565b5090969095509350505050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163b91906135f6565b6001600160a01b0316336001600160a01b03161461166b5760405162461bcd60e51b81526004016103c690613613565b611678600461271061357b565b8111156116c75760405162461bcd60e51b815260206004820152601e60248201527f4d6178205061796f75742050657263656e7461676520546f6f2048696768000060448201526064016103c6565b600755565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c91906135f6565b6001600160a01b0316336001600160a01b03161461176c5760405162461bcd60e51b81526004016103c690613613565b600e55565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e191906135f6565b6001600160a01b0316336001600160a01b0316146118115760405162461bcd60e51b81526004016103c690613613565b6103e781111561187a5760405162461bcd60e51b815260206004820152602e60248201527f4d696e2050726963652043616e6e6f74204578636565642039392e3925204f6660448201526d2043757272656e742056616c756560901b60648201526084016103c6565b6103e881611886612e45565b61189091906135a5565b61189a919061357b565b600c5550565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191091906135f6565b6001600160a01b0316336001600160a01b0316146119405760405162461bcd60e51b81526004016103c690613613565b6004805460ff1916911515919091179055565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561199f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c391906135f6565b6001600160a01b0316336001600160a01b0316146119f35760405162461bcd60e51b81526004016103c690613613565b600a548110611a505760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74204d616e75616c6c7920496e63726561736520546869732056616044820152626c756560e81b60648201526084016103c6565b600a55565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac591906135f6565b6001600160a01b0316336001600160a01b031614611af55760405162461bcd60e51b81526004016103c690613613565b611b02600461271061357b565b811115611b515760405162461bcd60e51b815260206004820152601e60248201527f4d6178205061796f75742050657263656e7461676520546f6f2048696768000060448201526064016103c6565b60009182526003602052604090912055565b6001600160a01b038116600090815260026020526040812054610e6d90610eb6565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf591906135f6565b6001600160a01b0316336001600160a01b031614611c255760405162461bcd60e51b81526004016103c690613613565b6001600160a01b03919091166000908152600260205260409020600401805460ff1916911515919091179055565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc391906135f6565b6001600160a01b0316336001600160a01b031614611cf35760405162461bcd60e51b81526004016103c690613613565b600b805460ff19168215801591909117909155611d10576000600a555b50565b6002600f5403611d355760405162461bcd60e51b81526004016103c6906131c8565b6002600f55600d546001600160a01b0316611d805760405162461bcd60e51b815260206004820152600b60248201526a27379026b4b3b930ba37b960a91b60448201526064016103c6565b3360009081526002602052604090205480611dcc5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b60448201526064016103c6565b6000611dd782610eb6565b9050611de4338383612e5d565b33600081815260026020818152604092839020909101805485019055815192835282018390527fa59785389b00cbd19745afbe8d59b28e3161395c6b1e3525861a2b0dede0b90d910160405180910390a1600d5460405163c3fbb6fd60e01b81526001600160a01b039091169063c3fbb6fd908390611e6b90339089908990600401613637565b6000604051808303818588803b158015611e8457600080fd5b505af1158015611e98573d6000803e3d6000fd5b50506001600f5550505050505050565b6002600f5403611eca5760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa158015611f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3c9190613677565b611f585760405162461bcd60e51b81526004016103c690613694565b600b5460ff1615611f7657600a5415611f7657600a80546000190190555b6001600f55565b6002600f5403611f9f5760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa158015611fed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120119190613677565b61202d5760405162461bcd60e51b81526004016103c690613694565b600c54612038612e45565b10156120865760405162461bcd60e51b815260206004820152601f60248201527f505249434520544f4f204c4f572c205076482047414d4553205041555345440060448201526064016103c6565b600e5461209390436136ba565b6000036120a5576120a561143b612e45565b600b5460ff1615611f7657600a805460010190556001600f55565b6000336001600160a01b038416036120dd576120db826110d5565b505b50600192915050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612132573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215691906135f6565b6001600160a01b0316336001600160a01b0316146121865760405162461bcd60e51b81526004016103c690613613565b6283d6008111156121ce5760405162461bcd60e51b81526020600482015260126024820152714c6f636b2054696d6520546f6f204c6f6e6760701b60448201526064016103c6565b600655565b6002600f54036121f55760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa158015612243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122679190613677565b6122835760405162461bcd60e51b81526004016103c690613694565b600061228e84610dfa565b90506000818310156122a057826122a2565b815b90506000805160206137048339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231491906135f6565b6040516304ff60cf60e51b8152600481018790526001600160a01b0386811660248301529190911690639fec19e09083906044016000604051808303818588803b15801561236157600080fd5b505af1158015612375573d6000803e3d6000fd5b5050604080518981526001600160a01b03891660208201529081018590527f3f1adb40444b6f3bd9a42ecbad6be967cb5f6381d5a80816bcb77723b6afc8be935060600191506123c29050565b60405180910390a150506001600f55505050565b604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa15801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190613677565b61245f5760405162461bcd60e51b81526004016103c690613694565b6002600f54036124815760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604080518281523460208201527f871f6417af6eea44386a75fde228e4dc3157276f821e8c2ebe645303ac8f0847910160405180910390a1506001600f55565b6060806000548311156124d95760005492505b82841015806124e85750600054155b156124f4576000610b99565b60006125008585613552565b67ffffffffffffffff81111561251857612518613526565b604051908082528060200260200182016040528015612541578160200160208202803683370190505b50905060006125508686613552565b67ffffffffffffffff81111561256857612568613526565b604051908082528060200260200182016040528015612591578160200160208202803683370190505b509050855b8581101561261657600081815260016020526040902054836125b88984613552565b815181106125c8576125c861358f565b6020908102919091018101919091526000828152600191829052604090200154826125f38984613552565b815181106126035761260361358f565b6020908102919091010152600101612596565b50909590945092505050565b6001600160a01b038116600090815260026020526040812060030154421061264b576000610e6d565b6001600160a01b038216600090815260026020526040902060030154610e6d904290613552565b6002600f54036126945760405162461bcd60e51b81526004016103c6906131c8565b6002600f55346126d35760405162461bcd60e51b815260206004820152600a6024820152695a65726f2056616c756560b01b60448201526064016103c6565b600d546001600160a01b0316156127245760405162461bcd60e51b81526020600482015260156024820152744d6967726174696f6e20496e2050726f677265737360581b60448201526064016103c6565b60006127303447613552565b905060055460001480612741575080155b15612755576127503334612fc9565b612760565b612760333483613056565b60045460ff1615156000036127da57336000818152600260205260409020600501549061278c90611b63565b11156127da5760405162461bcd60e51b815260206004820152601960248201527f4d617820436f6e747269627574696f6e2045786365656465640000000000000060448201526064016103c6565b506001600f55565b60006127ec612e45565b905090565b60006127106007544761280491906135a5565b6127ec919061357b565b600080828180805b8381101561288f57600160008989848181106128345761283461358f565b9050602002013581526020019081526020016000206000015483019250600160008989848181106128675761286761358f565b9050602002013581526020019081526020016000206001015482019150806001019050612816565b5061289a838361357b565b6128a4848361357b565b945094505050509250929050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292291906135f6565b6001600160a01b0316336001600160a01b0316146129525760405162461bcd60e51b81526004016103c690613613565b61295f600a61271061357b565b8111156129a25760405162461bcd60e51b815260206004820152601160248201527008af0d2e8408ccaca40a8dede4090d2ced607b1b60448201526064016103c6565b600855565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1791906135f6565b6001600160a01b0316336001600160a01b031614612a475760405162461bcd60e51b81526004016103c690613613565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015612a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab991906136ce565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015612b04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b289190613677565b5050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9c91906135f6565b6001600160a01b0316336001600160a01b031614612bcc5760405162461bcd60e51b81526004016103c690613613565b612710811115612c1e5760405162461bcd60e51b815260206004820152601860248201527f5265666c6563742050657263656e7420546f6f2048696768000000000000000060448201526064016103c6565b600955565b606080600054600003612c4e5750506040805160008082526020820190815281830190925292909150565b600054831115612c5e5760005492505b60008367ffffffffffffffff811115612c7957612c79613526565b604051908082528060200260200182016040528015612ca2578160200160208202803683370190505b50905060008467ffffffffffffffff811115612cc057612cc0613526565b604051908082528060200260200182016040528015612ce9578160200160208202803683370190505b5090506000612cf9600187613552565b600054612d06919061357b565b905060005b612d16600188613552565b811015612d9f5760016000612d2b84846135a5565b815260200190815260200160002060000154848281518110612d4f57612d4f61358f565b602090810291909101015260016000612d6884846135a5565b815260200190815260200160002060010154838281518110612d8c57612d8c61358f565b6020908102919091010152600101612d0b565b50600160006001600054612db39190613552565b815260208101919091526040016000205483612dd0600189613552565b81518110612de057612de061358f565b602002602001018181525050600160006001600054612dff9190613552565b81526020019081526020016000206001015482600188612e1f9190613552565b81518110612e2f57612e2f61358f565b6020908102919091010152509094909350915050565b600554600090612804670de0b6b3a7640000476135a5565b6001600160a01b03831660009081526002602052604081208054849290612e85908490613552565b925050819055508160056000828254612e9e9190613552565b90915550506040518181526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b604080516000808252602082019092526001600160a01b038416908390604051612f1491906136e7565b60006040518083038185875af1925050503d8060008114612f51576040519150601f19603f3d011682016040523d82523d6000602084013e612f56565b606091505b5050905080612fc45760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b60648201526084016103c6565b505050565b6001600160a01b03821660009081526002602052604081206001018054839290612ff49084906135bc565b909155506130059050828280613141565b61301061143b612e45565b604080516001600160a01b0384168152602081018390527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c910160405180910390a15050565b6000818360055461306791906135a5565b613071919061357b565b9050600081116130b25760405162461bcd60e51b815260206004820152600c60248201526b16995c9bc8151bc8135a5b9d60a21b60448201526064016103c6565b6001600160a01b038416600090815260026020526040812060010180548592906130dd9084906135bc565b909155506130ee9050848285613141565b6130f961143b612e45565b604080516001600160a01b0386168152602081018590527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c910160405180910390a150505050565b6001600160a01b0383166000908152600260205260409020805483019055600580548301905560065461317490426135bc565b6001600160a01b0384166000818152600260205260408082206003019390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612edd9085815260200190565b6020808252601590820152741499595b9d1c985b98de4811dd585c990818d85b1b605a1b604082015260600190565b6000806040838503121561320a57600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b8281101561324b57815186526020958601959091019060010161322d565b5093949350505050565b6040815260006132686040830185613219565b828103602084015261327a8185613219565b95945050505050565b60006020828403121561329557600080fd5b5035919050565b60005b838110156132b757818101518382015260200161329f565b50506000910152565b60208152600082518060208401526132df81604085016020870161329c565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611d1057600080fd5b6000806040838503121561331b57600080fd5b8235613326816132f3565b946020939093013593505050565b60006020828403121561334657600080fd5b8135610e40816132f3565b60008060006060848603121561336657600080fd5b8335613371816132f3565b92506020840135613381816132f3565b929592945050506040919091013590565b600080602083850312156133a557600080fd5b823567ffffffffffffffff8111156133bc57600080fd5b8301601f810185136133cd57600080fd5b803567ffffffffffffffff8111156133e457600080fd5b8560208260051b84010111156133f957600080fd5b6020919091019590945092505050565b8015158114611d1057600080fd5b60006020828403121561342957600080fd5b8135610e4081613409565b6000806040838503121561344757600080fd5b8235613452816132f3565b9150602083013561346281613409565b809150509250929050565b6000806020838503121561348057600080fd5b823567ffffffffffffffff81111561349757600080fd5b8301601f810185136134a857600080fd5b803567ffffffffffffffff8111156134bf57600080fd5b8560208284010111156133f957600080fd5b6000806000606084860312156134e657600080fd5b833592506020840135613381816132f3565b6000806040838503121561350b57600080fd5b8235613516816132f3565b91506020830135613462816132f3565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610e6d57610e6d61353c565b634e487b7160e01b600052601260045260246000fd5b60008261358a5761358a613565565b500490565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610e6d57610e6d61353c565b80820180821115610e6d57610e6d61353c565b81810360008312801583831316838312821617156135ef576135ef61353c565b5092915050565b60006020828403121561360857600080fd5b8151610e40816132f3565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b60006020828403121561368957600080fd5b8151610e4081613409565b6020808252600c908201526b155b905d5d1a1bdc9a5e995960a21b604082015260600190565b6000826136c9576136c9613565565b500690565b6000602082840312156136e057600080fd5b5051919050565b600082516136f981846020870161329c565b919091019291505056fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa2646970667358221220d25508a340ffed26ca756d805500d24df88be8a49b508a9cba78a633e8dea7ed64736f6c634300081c0033

Deployed Bytecode

0x6080604052600436106103855760003560e01c806370a08231116101d1578063ae2f5d9311610102578063da99f729116100a0578063e5a583a91161006f578063e5a583a914610b09578063ec5bfc8c14610b29578063f804453214610b49578063ff3fd60414610b6957600080fd5b8063da99f72914610a9b578063dd62ed3e14610ab1578063e0176de814610ad4578063e13760e814610ae957600080fd5b8063c7471903116100dc578063c747190314610a48578063d0228e8f14610a5e578063d0e30db014610a7e578063d348b40914610a8657600080fd5b8063ae2f5d93146109f5578063b3cb6f1a14610a15578063b67c527314610a2857600080fd5b80638b3939f21161016f578063a01cc0e711610149578063a01cc0e714610989578063a9059cbb1461099f578063ad9f20a6146109bf578063ae04d45d146109d557600080fd5b80638b3939f21461092d5780638d7fe4781461094257806395d89b411461095757600080fd5b80637cd07e47116101ab5780637cd07e47146108b35780637fb1ffa7146108d35780638763d8e4146108ed5780638932a90d1461090d57600080fd5b806370a082311461085d578063751fd1791461087d5780637bc0c6511461089d57600080fd5b806323cf3118116102b65780633e8e0b3d116102545780636102b6e8116102235780636102b6e8146107e75780636284ae4114610807578063639254411461081d578063676feaf21461083d57600080fd5b80633e8e0b3d1461074d578063481c6a751461076d57806352bb326e146107a75780635ea8cd12146107c757600080fd5b8063313ce56711610290578063313ce567146106b157806337876814146106cd5780633a98ef39146106ed5780633b0b037a1461070357600080fd5b806323cf311814610651578063278984bf146106715780632e1a7d4d1461069157600080fd5b80630d668087116103235780631959a002116102fd5780631959a002146105785780631ab733a3146105fc5780631f581e2a1461061c57806323b872dd1461063157600080fd5b80630d668087146105225780630fe8893f1461053857806318160ddd1461056557600080fd5b806306fdde031161035f57806306fdde031461048757806307b11b76146104c2578063095ea7b3146104e2578063098729db1461050257600080fd5b8063018c195e146103f8578063040bef041461042f57806304decf2e1461045d57600080fd5b366103f3576000600554116103cf5760405162461bcd60e51b815260206004820152600b60248201526a5a65726f2053686172657360a81b60448201526064015b60405180910390fd5b6002600f54036103f15760405162461bcd60e51b81526004016103c6906131c8565b005b600080fd5b34801561040457600080fd5b506104186104133660046131f7565b610b89565b604051610426929190613255565b60405180910390f35b34801561043b57600080fd5b5061044f61044a366004613283565b610dfa565b604051908152602001610426565b34801561046957600080fd5b506004546104779060ff1681565b6040519015158152602001610426565b34801561049357600080fd5b5060408051808201909152600981526841504520486f75736560b81b60208201525b60405161042691906132c0565b3480156104ce57600080fd5b5061044f6104dd366004613283565b610e47565b3480156104ee57600080fd5b506104776104fd366004613308565b610e73565b34801561050e57600080fd5b5061044f61051d366004613283565b610eb6565b34801561052e57600080fd5b5061044f60065481565b34801561054457600080fd5b5061044f610553366004613283565b60036020526000908152604090205481565b34801561057157600080fd5b504761044f565b34801561058457600080fd5b506105cd610593366004613334565b60026020819052600091825260409091208054600182015492820154600383015460048401546005909401549294939192909160ff169086565b6040805196875260208701959095529385019290925260608401521515608083015260a082015260c001610426565b34801561060857600080fd5b5061044f610617366004613334565b610ed3565b34801561062857600080fd5b5060005461044f565b34801561063d57600080fd5b5061047761064c366004613351565b610f2d565b34801561065d57600080fd5b506103f161066c366004613334565b610f54565b34801561067d57600080fd5b506103f161068c366004613308565b611016565b34801561069d57600080fd5b5061044f6106ac366004613283565b6110d5565b3480156106bd57600080fd5b5060405160128152602001610426565b3480156106d957600080fd5b506104186106e8366004613392565b611480565b3480156106f957600080fd5b5061044f60055481565b34801561070f57600080fd5b5061073861071e366004613283565b600090815260016020819052604090912080549101549091565b60408051928352602083019190915201610426565b34801561075957600080fd5b506103f1610768366004613283565b6115cb565b34801561077957600080fd5b5061078f60008051602061370483398151915281565b6040516001600160a01b039091168152602001610426565b3480156107b357600080fd5b506103f16107c2366004613283565b6116cc565b3480156107d357600080fd5b506103f16107e2366004613283565b611771565b3480156107f357600080fd5b506103f1610802366004613417565b6118a0565b34801561081357600080fd5b5061044f60085481565b34801561082957600080fd5b506103f1610838366004613283565b611953565b34801561084957600080fd5b506103f16108583660046131f7565b611a55565b34801561086957600080fd5b5061044f610878366004613334565b611b63565b34801561088957600080fd5b506103f1610898366004613434565b611b85565b3480156108a957600080fd5b5061044f600a5481565b3480156108bf57600080fd5b50600d5461078f906001600160a01b031681565b3480156108df57600080fd5b50600b546104779060ff1681565b3480156108f957600080fd5b506103f1610908366004613417565b611c53565b34801561091957600080fd5b506103f161092836600461346d565b611d13565b34801561093957600080fd5b506103f1611ea8565b34801561094e57600080fd5b506103f1611f7d565b34801561096357600080fd5b50604080518082019091526009815268486f7573652041504560b81b60208201526104b5565b34801561099557600080fd5b5061044f60095481565b3480156109ab57600080fd5b506104776109ba366004613308565b6120c0565b3480156109cb57600080fd5b5061044f600c5481565b3480156109e157600080fd5b506103f16109f0366004613283565b6120e6565b348015610a0157600080fd5b506103f1610a103660046134d1565b6121d3565b6103f1610a23366004613283565b6123d6565b348015610a3457600080fd5b50610418610a433660046131f7565b6124c6565b348015610a5457600080fd5b5061044f60075481565b348015610a6a57600080fd5b5061044f610a79366004613334565b612622565b6103f1612672565b348015610a9257600080fd5b5061044f6127e2565b348015610aa757600080fd5b5061044f600e5481565b348015610abd57600080fd5b5061044f610acc3660046134f8565b600092915050565b348015610ae057600080fd5b5061044f6127f1565b348015610af557600080fd5b50610738610b04366004613392565b61280e565b348015610b1557600080fd5b506103f1610b24366004613283565b6128b2565b348015610b3557600080fd5b506103f1610b44366004613334565b6129a7565b348015610b5557600080fd5b506103f1610b64366004613283565b612b2c565b348015610b7557600080fd5b50610418610b84366004613283565b612c23565b606080600054600003610bdc5760005b604051908082528060200260200182016040528015610bc2578160200160208202803683370190505b506040805160008152602081019091529092509050610df3565b600054841115610bec5760005493505b60008467ffffffffffffffff811115610c0757610c07613526565b604051908082528060200260200182016040528015610c30578160200160208202803683370190505b50905060008567ffffffffffffffff811115610c4e57610c4e613526565b604051908082528060200260200182016040528015610c77578160200160208202803683370190505b5090506000610c87600188613552565b600054610c94919061357b565b9050858111610cab57610ca8600182613552565b95505b60005b610cb9600189613552565b811015610d515760008060005b89811015610cf85783850281016000908152600160208190526040909120805490820154940193929092019101610cc6565b50610d03898361357b565b868481518110610d1557610d1561358f565b6020908102919091010152610d2a898261357b565b858481518110610d3c57610d3c61358f565b60209081029190910101525050600101610cae565b50600160006001600054610d659190613552565b815260208101919091526040016000205483610d8260018a613552565b81518110610d9257610d9261358f565b602002602001018181525050600160006001600054610db19190613552565b81526020019081526020016000206001015482600189610dd19190613552565b81518110610de157610de161358f565b60209081029190910101525090925090505b9250929050565b6000818152600360205260408120548190610e1757600754610e27565b6000838152600360205260409020545b9050612710610e3682476135a5565b610e40919061357b565b9392505050565b6000610e51612e45565b610e63670de0b6b3a7640000846135a5565b610e6d919061357b565b92915050565b604051600080825290819033907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259060200160405180910390a350600192915050565b6000670de0b6b3a7640000610ec9612e45565b610e6390846135a5565b6001600160a01b0381166000908152600260208190526040822001548190610efa84611b63565b610f0491906135bc565b6001600160a01b038416600090815260026020526040902060010154909150610e4090826135cf565b6000336001600160a01b03841603610f4a57610f48826110d5565b505b5060019392505050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc491906135f6565b6001600160a01b0316336001600160a01b031614610ff45760405162461bcd60e51b81526004016103c690613613565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611062573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108691906135f6565b6001600160a01b0316336001600160a01b0316146110b65760405162461bcd60e51b81526004016103c690613613565b6001600160a01b03909116600090815260026020526040902060050155565b60006002600f54036110f95760405162461bcd60e51b81526004016103c6906131c8565b6002600f55600d546001600160a01b03161561114f5760405162461bcd60e51b81526020600482015260156024820152744d6967726174696f6e20496e2050726f677265737360581b60448201526064016103c6565b600b5460ff1615156001036111ae57600a54156111ae5760405162461bcd60e51b815260206004820152601c60248201527f47616d65205265736f6c7574696f6e73204172652050656e64696e670000000060448201526064016103c6565b6111b733612622565b156111f35760405162461bcd60e51b815260206004820152600c60248201526b4e6f74205965742054696d6560a01b60448201526064016103c6565b60006111fe33611b63565b90508083111561120c578092505b60008184146112235761121e84610e47565b611234565b336000908152600260205260409020545b33600090815260026020526040902054909150158015906112645750336000908152600260205260409020548111155b80156112705750838210155b801561127c5750600084115b80156112885750600081115b6112c95760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b60448201526064016103c6565b6112d4338286612e5d565b33600081815260026020818152604092839020909101805488019055815192835282018690527f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364910160405180910390a1600060085411801561134a57503360009081526002602052604090206004015460ff16155b156114265760006127106008548661136291906135a5565b61136c919061357b565b905060006127106009548361138191906135a5565b61138b919061357b565b9050801561140c5761140c6000805160206137048339815191526001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140691906135f6565b82612eea565b61141f3361141a8489613552565b612eea565b5050611430565b6114303385612eea565b61147561143b612e45565b6040805180820182529182524260208084019182526000805481526001918290529283209351845590519281019290925580549091019055565b50506001600f555090565b6060808260008167ffffffffffffffff81111561149f5761149f613526565b6040519080825280602002602001820160405280156114c8578160200160208202803683370190505b50905060008267ffffffffffffffff8111156114e6576114e6613526565b60405190808252806020026020018201604052801561150f578160200160208202803683370190505b50905060005b838110156115be57600160008989848181106115335761153361358f565b9050602002013581526020019081526020016000206000015483828151811061155e5761155e61358f565b602002602001018181525050600160008989848181106115805761158061358f565b905060200201358152602001908152602001600020600101548282815181106115ab576115ab61358f565b6020908102919091010152600101611515565b5090969095509350505050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163b91906135f6565b6001600160a01b0316336001600160a01b03161461166b5760405162461bcd60e51b81526004016103c690613613565b611678600461271061357b565b8111156116c75760405162461bcd60e51b815260206004820152601e60248201527f4d6178205061796f75742050657263656e7461676520546f6f2048696768000060448201526064016103c6565b600755565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c91906135f6565b6001600160a01b0316336001600160a01b03161461176c5760405162461bcd60e51b81526004016103c690613613565b600e55565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e191906135f6565b6001600160a01b0316336001600160a01b0316146118115760405162461bcd60e51b81526004016103c690613613565b6103e781111561187a5760405162461bcd60e51b815260206004820152602e60248201527f4d696e2050726963652043616e6e6f74204578636565642039392e3925204f6660448201526d2043757272656e742056616c756560901b60648201526084016103c6565b6103e881611886612e45565b61189091906135a5565b61189a919061357b565b600c5550565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191091906135f6565b6001600160a01b0316336001600160a01b0316146119405760405162461bcd60e51b81526004016103c690613613565b6004805460ff1916911515919091179055565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561199f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c391906135f6565b6001600160a01b0316336001600160a01b0316146119f35760405162461bcd60e51b81526004016103c690613613565b600a548110611a505760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74204d616e75616c6c7920496e63726561736520546869732056616044820152626c756560e81b60648201526084016103c6565b600a55565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aa1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac591906135f6565b6001600160a01b0316336001600160a01b031614611af55760405162461bcd60e51b81526004016103c690613613565b611b02600461271061357b565b811115611b515760405162461bcd60e51b815260206004820152601e60248201527f4d6178205061796f75742050657263656e7461676520546f6f2048696768000060448201526064016103c6565b60009182526003602052604090912055565b6001600160a01b038116600090815260026020526040812054610e6d90610eb6565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf591906135f6565b6001600160a01b0316336001600160a01b031614611c255760405162461bcd60e51b81526004016103c690613613565b6001600160a01b03919091166000908152600260205260409020600401805460ff1916911515919091179055565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc391906135f6565b6001600160a01b0316336001600160a01b031614611cf35760405162461bcd60e51b81526004016103c690613613565b600b805460ff19168215801591909117909155611d10576000600a555b50565b6002600f5403611d355760405162461bcd60e51b81526004016103c6906131c8565b6002600f55600d546001600160a01b0316611d805760405162461bcd60e51b815260206004820152600b60248201526a27379026b4b3b930ba37b960a91b60448201526064016103c6565b3360009081526002602052604090205480611dcc5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b60448201526064016103c6565b6000611dd782610eb6565b9050611de4338383612e5d565b33600081815260026020818152604092839020909101805485019055815192835282018390527fa59785389b00cbd19745afbe8d59b28e3161395c6b1e3525861a2b0dede0b90d910160405180910390a1600d5460405163c3fbb6fd60e01b81526001600160a01b039091169063c3fbb6fd908390611e6b90339089908990600401613637565b6000604051808303818588803b158015611e8457600080fd5b505af1158015611e98573d6000803e3d6000fd5b50506001600f5550505050505050565b6002600f5403611eca5760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa158015611f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3c9190613677565b611f585760405162461bcd60e51b81526004016103c690613694565b600b5460ff1615611f7657600a5415611f7657600a80546000190190555b6001600f55565b6002600f5403611f9f5760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa158015611fed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120119190613677565b61202d5760405162461bcd60e51b81526004016103c690613694565b600c54612038612e45565b10156120865760405162461bcd60e51b815260206004820152601f60248201527f505249434520544f4f204c4f572c205076482047414d4553205041555345440060448201526064016103c6565b600e5461209390436136ba565b6000036120a5576120a561143b612e45565b600b5460ff1615611f7657600a805460010190556001600f55565b6000336001600160a01b038416036120dd576120db826110d5565b505b50600192915050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612132573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215691906135f6565b6001600160a01b0316336001600160a01b0316146121865760405162461bcd60e51b81526004016103c690613613565b6283d6008111156121ce5760405162461bcd60e51b81526020600482015260126024820152714c6f636b2054696d6520546f6f204c6f6e6760701b60448201526064016103c6565b600655565b6002600f54036121f55760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa158015612243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122679190613677565b6122835760405162461bcd60e51b81526004016103c690613694565b600061228e84610dfa565b90506000818310156122a057826122a2565b815b90506000805160206137048339815191526001600160a01b031663a9a36dcd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231491906135f6565b6040516304ff60cf60e51b8152600481018790526001600160a01b0386811660248301529190911690639fec19e09083906044016000604051808303818588803b15801561236157600080fd5b505af1158015612375573d6000803e3d6000fd5b5050604080518981526001600160a01b03891660208201529081018590527f3f1adb40444b6f3bd9a42ecbad6be967cb5f6381d5a80816bcb77723b6afc8be935060600191506123c29050565b60405180910390a150506001600f55505050565b604051636313629760e11b81523360048201526000805160206137048339815191529063c626c52e90602401602060405180830381865afa15801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190613677565b61245f5760405162461bcd60e51b81526004016103c690613694565b6002600f54036124815760405162461bcd60e51b81526004016103c6906131c8565b6002600f55604080518281523460208201527f871f6417af6eea44386a75fde228e4dc3157276f821e8c2ebe645303ac8f0847910160405180910390a1506001600f55565b6060806000548311156124d95760005492505b82841015806124e85750600054155b156124f4576000610b99565b60006125008585613552565b67ffffffffffffffff81111561251857612518613526565b604051908082528060200260200182016040528015612541578160200160208202803683370190505b50905060006125508686613552565b67ffffffffffffffff81111561256857612568613526565b604051908082528060200260200182016040528015612591578160200160208202803683370190505b509050855b8581101561261657600081815260016020526040902054836125b88984613552565b815181106125c8576125c861358f565b6020908102919091018101919091526000828152600191829052604090200154826125f38984613552565b815181106126035761260361358f565b6020908102919091010152600101612596565b50909590945092505050565b6001600160a01b038116600090815260026020526040812060030154421061264b576000610e6d565b6001600160a01b038216600090815260026020526040902060030154610e6d904290613552565b6002600f54036126945760405162461bcd60e51b81526004016103c6906131c8565b6002600f55346126d35760405162461bcd60e51b815260206004820152600a6024820152695a65726f2056616c756560b01b60448201526064016103c6565b600d546001600160a01b0316156127245760405162461bcd60e51b81526020600482015260156024820152744d6967726174696f6e20496e2050726f677265737360581b60448201526064016103c6565b60006127303447613552565b905060055460001480612741575080155b15612755576127503334612fc9565b612760565b612760333483613056565b60045460ff1615156000036127da57336000818152600260205260409020600501549061278c90611b63565b11156127da5760405162461bcd60e51b815260206004820152601960248201527f4d617820436f6e747269627574696f6e2045786365656465640000000000000060448201526064016103c6565b506001600f55565b60006127ec612e45565b905090565b60006127106007544761280491906135a5565b6127ec919061357b565b600080828180805b8381101561288f57600160008989848181106128345761283461358f565b9050602002013581526020019081526020016000206000015483019250600160008989848181106128675761286761358f565b9050602002013581526020019081526020016000206001015482019150806001019050612816565b5061289a838361357b565b6128a4848361357b565b945094505050509250929050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292291906135f6565b6001600160a01b0316336001600160a01b0316146129525760405162461bcd60e51b81526004016103c690613613565b61295f600a61271061357b565b8111156129a25760405162461bcd60e51b815260206004820152601160248201527008af0d2e8408ccaca40a8dede4090d2ced607b1b60448201526064016103c6565b600855565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1791906135f6565b6001600160a01b0316336001600160a01b031614612a475760405162461bcd60e51b81526004016103c690613613565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015612a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab991906136ce565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015612b04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b289190613677565b5050565b6000805160206137048339815191526001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9c91906135f6565b6001600160a01b0316336001600160a01b031614612bcc5760405162461bcd60e51b81526004016103c690613613565b612710811115612c1e5760405162461bcd60e51b815260206004820152601860248201527f5265666c6563742050657263656e7420546f6f2048696768000000000000000060448201526064016103c6565b600955565b606080600054600003612c4e5750506040805160008082526020820190815281830190925292909150565b600054831115612c5e5760005492505b60008367ffffffffffffffff811115612c7957612c79613526565b604051908082528060200260200182016040528015612ca2578160200160208202803683370190505b50905060008467ffffffffffffffff811115612cc057612cc0613526565b604051908082528060200260200182016040528015612ce9578160200160208202803683370190505b5090506000612cf9600187613552565b600054612d06919061357b565b905060005b612d16600188613552565b811015612d9f5760016000612d2b84846135a5565b815260200190815260200160002060000154848281518110612d4f57612d4f61358f565b602090810291909101015260016000612d6884846135a5565b815260200190815260200160002060010154838281518110612d8c57612d8c61358f565b6020908102919091010152600101612d0b565b50600160006001600054612db39190613552565b815260208101919091526040016000205483612dd0600189613552565b81518110612de057612de061358f565b602002602001018181525050600160006001600054612dff9190613552565b81526020019081526020016000206001015482600188612e1f9190613552565b81518110612e2f57612e2f61358f565b6020908102919091010152509094909350915050565b600554600090612804670de0b6b3a7640000476135a5565b6001600160a01b03831660009081526002602052604081208054849290612e85908490613552565b925050819055508160056000828254612e9e9190613552565b90915550506040518181526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050565b604080516000808252602082019092526001600160a01b038416908390604051612f1491906136e7565b60006040518083038185875af1925050503d8060008114612f51576040519150601f19603f3d011682016040523d82523d6000602084013e612f56565b606091505b5050905080612fc45760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b60648201526084016103c6565b505050565b6001600160a01b03821660009081526002602052604081206001018054839290612ff49084906135bc565b909155506130059050828280613141565b61301061143b612e45565b604080516001600160a01b0384168152602081018390527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c910160405180910390a15050565b6000818360055461306791906135a5565b613071919061357b565b9050600081116130b25760405162461bcd60e51b815260206004820152600c60248201526b16995c9bc8151bc8135a5b9d60a21b60448201526064016103c6565b6001600160a01b038416600090815260026020526040812060010180548592906130dd9084906135bc565b909155506130ee9050848285613141565b6130f961143b612e45565b604080516001600160a01b0386168152602081018590527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c910160405180910390a150505050565b6001600160a01b0383166000908152600260205260409020805483019055600580548301905560065461317490426135bc565b6001600160a01b0384166000818152600260205260408082206003019390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612edd9085815260200190565b6020808252601590820152741499595b9d1c985b98de4811dd585c990818d85b1b605a1b604082015260600190565b6000806040838503121561320a57600080fd5b50508035926020909101359150565b600081518084526020840193506020830160005b8281101561324b57815186526020958601959091019060010161322d565b5093949350505050565b6040815260006132686040830185613219565b828103602084015261327a8185613219565b95945050505050565b60006020828403121561329557600080fd5b5035919050565b60005b838110156132b757818101518382015260200161329f565b50506000910152565b60208152600082518060208401526132df81604085016020870161329c565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611d1057600080fd5b6000806040838503121561331b57600080fd5b8235613326816132f3565b946020939093013593505050565b60006020828403121561334657600080fd5b8135610e40816132f3565b60008060006060848603121561336657600080fd5b8335613371816132f3565b92506020840135613381816132f3565b929592945050506040919091013590565b600080602083850312156133a557600080fd5b823567ffffffffffffffff8111156133bc57600080fd5b8301601f810185136133cd57600080fd5b803567ffffffffffffffff8111156133e457600080fd5b8560208260051b84010111156133f957600080fd5b6020919091019590945092505050565b8015158114611d1057600080fd5b60006020828403121561342957600080fd5b8135610e4081613409565b6000806040838503121561344757600080fd5b8235613452816132f3565b9150602083013561346281613409565b809150509250929050565b6000806020838503121561348057600080fd5b823567ffffffffffffffff81111561349757600080fd5b8301601f810185136134a857600080fd5b803567ffffffffffffffff8111156134bf57600080fd5b8560208284010111156133f957600080fd5b6000806000606084860312156134e657600080fd5b833592506020840135613381816132f3565b6000806040838503121561350b57600080fd5b8235613516816132f3565b91506020830135613462816132f3565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b81810381811115610e6d57610e6d61353c565b634e487b7160e01b600052601260045260246000fd5b60008261358a5761358a613565565b500490565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610e6d57610e6d61353c565b80820180821115610e6d57610e6d61353c565b81810360008312801583831316838312821617156135ef576135ef61353c565b5092915050565b60006020828403121561360857600080fd5b8151610e40816132f3565b6020808252600a908201526927b7363c9027bbb732b960b11b604082015260600190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b60006020828403121561368957600080fd5b8151610e4081613409565b6020808252600c908201526b155b905d5d1a1bdc9a5e995960a21b604082015260600190565b6000826136c9576136c9613565565b500690565b6000602082840312156136e057600080fd5b5051919050565b600082516136f981846020870161329c565b919091019291505056fe0000000000000000000000008632f22e5a921c751cfbbff92f058a3b11e96b8aa2646970667358221220d25508a340ffed26ca756d805500d24df88be8a49b508a9cba78a633e8dea7ed64736f6c634300081c0033

Deployed Bytecode Sourcemap

14089:17141:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26247:1;26233:11;;:15;26225:39;;;;-1:-1:-1;;;26225:39:0;;216:2:1;26225:39:0;;;198:21:1;255:2;235:18;;;228:30;-1:-1:-1;;;274:18:1;;;267:41;325:18;;26225:39:0;;;;;;;;;16338:1;26283:7;;:19;26275:53;;;;-1:-1:-1;;;26275:53:0;;;;;;;:::i;:::-;14089:17141;;;;;11559:1761;;;;;;;;;;-1:-1:-1;11559:1761:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;17646:254;;;;;;;;;;-1:-1:-1;17646:254:0;;;;;:::i;:::-;;:::i;:::-;;;2327:25:1;;;2315:2;2300:18;17646:254:0;2181:177:1;14708:32:0;;;;;;;;;;-1:-1:-1;14708:32:0;;;;;;;;;;;2528:14:1;;2521:22;2503:41;;2491:2;2476:18;14708:32:0;2363:187:1;17079:100:0;;;;;;;;;;-1:-1:-1;17153:18:0;;;;;;;;;;;;-1:-1:-1;;;17153:18:0;;;;17079:100;;;;;;;:::i;30198:151::-;;;;;;;;;;-1:-1:-1;30198:151:0;;;;;:::i;:::-;;:::i;18263:147::-;;;;;;;;;;-1:-1:-1;18263:147:0;;;;;:::i;:::-;;:::i;30429:158::-;;;;;;;;;;-1:-1:-1;30429:158:0;;;;;:::i;:::-;;:::i;14909:36::-;;;;;;;;;;;;;;;;14595:51;;;;;;;;;;-1:-1:-1;14595:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;17386:111;;;;;;;;;;-1:-1:-1;17468:21:0;17386:111;;14447:47;;;;;;;;;;-1:-1:-1;14447:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4252:25:1;;;4308:2;4293:18;;4286:34;;;;4336:18;;;4329:34;;;;4394:2;4379:18;;4372:34;4450:14;4443:22;4437:3;4422:19;;4415:51;4497:3;4482:19;;4475:35;4239:3;4224:19;14447:47:0;3971:545:1;30815:213:0;;;;;;;;;;-1:-1:-1;30815:213:0;;;;;:::i;:::-;;:::i;9046:105::-;;;;;;;;;;-1:-1:-1;9100:7:0;9127:16;9046:105;;18624:219;;;;;;;;;;-1:-1:-1;18624:219:0;;;;;:::i;:::-;;:::i;21704:109::-;;;;;;;;;;-1:-1:-1;21704:109:0;;;;;:::i;:::-;;:::i;19063:129::-;;;;;;;;;;-1:-1:-1;19063:129:0;;;;;:::i;:::-;;:::i;23847:2332::-;;;;;;;;;;-1:-1:-1;23847:2332:0;;;;;:::i;:::-;;:::i;17293:87::-;;;;;;;;;;-1:-1:-1;17293:87:0;;17370:2;5356:36:1;;5344:2;5329:18;17293:87:0;5214:184:1;9953:524:0;;;;;;;;;;-1:-1:-1;9953:524:0;;;;;:::i;:::-;;:::i;14856:26::-;;;;;;;;;;;;;;;;8874:164;;;;;;;;;;-1:-1:-1;8874:164:0;;;;;:::i;:::-;8936:7;8973:19;;;:12;:19;;;;;;;;:25;;9000:29;;;8973:25;;8874:164;;;;;6192:25:1;;;6248:2;6233:18;;6226:34;;;;6165:18;8874:164:0;6018:248:1;20905:240:0;;;;;;;;;;-1:-1:-1;20905:240:0;;;;;:::i;:::-;;:::i;1012:107::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1012:107:0;;;;;-1:-1:-1;;;;;6460:32:1;;;6442:51;;6430:2;6415:18;1012:107:0;6271:228:1;21821:102:0;;;;;;;;;;-1:-1:-1;21821:102:0;;;;;:::i;:::-;;:::i;21421:275::-;;;;;;;;;;-1:-1:-1;21421:275:0;;;;;:::i;:::-;;:::i;19337:103::-;;;;;;;;;;-1:-1:-1;19337:103:0;;;;;:::i;:::-;;:::i;15197:28::-;;;;;;;;;;;;;;;;20152:278;;;;;;;;;;-1:-1:-1;20152:278:0;;;;;:::i;:::-;;:::i;21153:260::-;;;;;;;;;;-1:-1:-1;21153:260:0;;;;;:::i;:::-;;:::i;17979:158::-;;;;;;;;;;-1:-1:-1;17979:158:0;;;;;:::i;:::-;;:::i;19200:129::-;;;;;;;;;;-1:-1:-1;19200:129:0;;;;;:::i;:::-;;:::i;15448:33::-;;;;;;;;;;;;;;;;16141:25;;;;;;;;;;-1:-1:-1;16141:25:0;;;;-1:-1:-1;;;;;16141:25:0;;;15592:39;;;;;;;;;;-1:-1:-1;15592:39:0;;;;;;;;20538:191;;;;;;;;;;-1:-1:-1;20538:191:0;;;;;:::i;:::-;;:::i;21931:870::-;;;;;;;;;;-1:-1:-1;21931:870:0;;;;;:::i;:::-;;:::i;26903:328::-;;;;;;;;;;;;;:::i;26344:551::-;;;;;;;;;;;;;:::i;17185:102::-;;;;;;;;;;-1:-1:-1;17261:18:0;;;;;;;;;;;;-1:-1:-1;;;17261:18:0;;;;17185:102;;15331:39;;;;;;;;;;;;;;;;18420:198;;;;;;;;;;-1:-1:-1;18420:198:0;;;;;:::i;:::-;;:::i;16015:24::-;;;;;;;;;;;;;;;;18851:204;;;;;;;;;;-1:-1:-1;18851:204:0;;;;;:::i;:::-;;:::i;27363:582::-;;;;;;;;;;-1:-1:-1;27363:582:0;;;;;:::i;:::-;;:::i;27953:138::-;;;;;;:::i;:::-;;:::i;9159:786::-;;;;;;;;;;-1:-1:-1;9159:786:0;;;;;:::i;:::-;;:::i;15070:37::-;;;;;;;;;;;;;;;;29930:188;;;;;;;;;;-1:-1:-1;29930:188:0;;;;;:::i;:::-;;:::i;22920:839::-;;;:::i;30644:101::-;;;;;;;;;;;;;:::i;16193:27::-;;;;;;;;;;;;;;;;18145:106;;;;;;;;;;-1:-1:-1;18145:106:0;;;;;:::i;:::-;18214:7;18145:106;;;;;17505:133;;;;;;;;;;;;;:::i;13328:505::-;;;;;;;;;;-1:-1:-1;13328:505:0;;;;;:::i;:::-;;:::i;19448:198::-;;;;;;;;;;-1:-1:-1;19448:198:0;;;;;:::i;:::-;;:::i;20737:156::-;;;;;;;;;;-1:-1:-1;20737:156:0;;;;;:::i;:::-;;:::i;19654:229::-;;;;;;;;;;-1:-1:-1;19654:229:0;;;;;:::i;:::-;;:::i;10485:1066::-;;;;;;;;;;-1:-1:-1;10485:1066:0;;;;;:::i;:::-;;:::i;11559:1761::-;11676:16;11694;11727;;11747:1;11727:21;11723:97;;11787:1;11773:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11773:16:0;-1:-1:-1;11791:16:0;;;11805:1;11791:16;;;;;;;;11765:43;;-1:-1:-1;11791:16:0;-1:-1:-1;11765:43:0;;11723:97;11852:16;;11836:13;:32;11832:97;;;11901:16;;11885:32;;11832:97;11998:23;12038:13;12024:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12024:28:0;;11998:54;;12063:27;12107:13;12093:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12093:28:0;-1:-1:-1;12063:58:0;-1:-1:-1;12193:12:0;12229:17;12245:1;12229:13;:17;:::i;:::-;12208:16;;:40;;;;:::i;:::-;12193:55;;12271:12;12263:4;:20;12259:76;;12315:8;12322:1;12315:4;:8;:::i;:::-;12300:23;;12259:76;12441:9;12436:634;12460:17;12476:1;12460:13;:17;:::i;:::-;12456:1;:21;12436:634;;;12569:16;12604:20;12648:6;12643:274;12664:12;12660:1;:16;12643:274;;;12758:8;;;12757:14;;12744:28;;;;:12;:28;;;;;;;;:34;;12817:38;;;;12732:46;;;12801:54;;;;;12878:3;12643:274;;;-1:-1:-1;12945:23:0;12956:12;12945:8;:23;:::i;:::-;12933:6;12940:1;12933:9;;;;;;;;:::i;:::-;;;;;;;;;;:35;12999:27;13014:12;12999;:27;:::i;:::-;12983:10;12994:1;12983:13;;;;;;;;:::i;:::-;;;;;;;;;;:43;-1:-1:-1;;13053:3:0;;12436:634;;;;13145:12;:34;13177:1;13158:16;;:20;;;;:::i;:::-;13145:34;;;;;;;;;;;-1:-1:-1;13145:34:0;:40;13117:6;13124:17;13140:1;13124:13;:17;:::i;:::-;13117:25;;;;;;;;:::i;:::-;;;;;;:68;;;;;13228:12;:34;13260:1;13241:16;;:20;;;;:::i;:::-;13228:34;;;;;;;;;;;:44;;;13196:10;13223:1;13207:13;:17;;;;:::i;:::-;13196:29;;;;;;;;:::i;:::-;;;;;;;;;;:76;-1:-1:-1;13293:6:0;;-1:-1:-1;13301:10:0;-1:-1:-1;11559:1761:0;;;;;;:::o;17646:254::-;17713:7;17754:22;;;:13;:22;;;;;;17713:7;;17754:70;;17808:16;;17754:70;;;17783:22;;;;:13;:22;;;;;;17754:70;17733:91;-1:-1:-1;14804:6:0;17844:34;17733:91;17844:21;:34;:::i;:::-;17842:50;;;;:::i;:::-;17835:57;17646:254;-1:-1:-1;;;17646:254:0:o;30198:151::-;30268:7;30322:17;:15;:17::i;:::-;30299:18;15016:6;30299;:18;:::i;:::-;30297:42;;;;:::i;:::-;30288:53;30198:151;-1:-1:-1;;30198:151:0:o;18263:147::-;18345:35;;18323:4;2327:25:1;;;18323:4:0;;;18354:10;;18345:35;;2315:2:1;2300:18;18345:35:0;;;;;;;-1:-1:-1;18398:4:0;18263:147;;;;:::o;30429:158::-;30506:7;15016:6;30546:17;:15;:17::i;:::-;30537:26;;:6;:26;:::i;30815:213::-;-1:-1:-1;;;;;30925:14:0;;30877:6;30925:14;;;:8;:14;;;;;;;:29;;30877:6;;30907:15;30934:4;30907:9;:15::i;:::-;:47;;;;:::i;:::-;-1:-1:-1;;;;;30993:14:0;;;;;;:8;:14;;;;;:26;;;30896:58;;-1:-1:-1;30972:48:0;;30896:58;30972:48;:::i;18624:219::-;18717:4;18751:10;-1:-1:-1;;;;;18738:23:0;;;18734:72;;18778:16;18787:6;18778:8;:16::i;:::-;;18734:72;-1:-1:-1;18831:4:0;18624:219;;;;;:::o;21704:109::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;21774:8:::1;:31:::0;;-1:-1:-1;;;;;;21774:31:0::1;-1:-1:-1::0;;;;;21774:31:0;;;::::1;::::0;;;::::1;::::0;;21704:109::o;19063:129::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19148:14:0;;::::1;;::::0;;;:8:::1;:14;::::0;;;;:30:::1;;:36:::0;19063:129::o;23847:2332::-;23910:7;16338:1;16419:7;;:19;16411:53;;;;-1:-1:-1;;;16411:53:0;;;;;;;:::i;:::-;16338:1;16475:7;:18;23960:8:::1;::::0;-1:-1:-1;;;;;23960:8:0::1;23952:31:::0;23930:102:::1;;;::::0;-1:-1:-1;;;23930:102:0;;11243:2:1;23930:102:0::1;::::0;::::1;11225:21:1::0;11282:2;11262:18;;;11255:30;-1:-1:-1;;;11301:18:1;;;11294:51;11362:18;;23930:102:0::1;11041:345:1::0;23930:102:0::1;24087:19;::::0;::::1;;:27;;:19:::0;:27;24083:173:::1;;24157:18;::::0;:23;24131:113:::1;;;::::0;-1:-1:-1;;;24131:113:0;;11593:2:1;24131:113:0::1;::::0;::::1;11575:21:1::0;11632:2;11612:18;;;11605:30;11671;11651:18;;;11644:58;11719:18;;24131:113:0::1;11391:352:1::0;24131:113:0::1;24319:27;24335:10;24319:15;:27::i;:::-;:32:::0;24297:94:::1;;;::::0;-1:-1:-1;;;24297:94:0;;11950:2:1;24297:94:0::1;::::0;::::1;11932:21:1::0;11989:2;11969:18;;;11962:30;-1:-1:-1;;;12008:18:1;;;12001:42;12060:18;;24297:94:0::1;11748:336:1::0;24297:94:0::1;24456:15;24474:21;24484:10;24474:9;:21::i;:::-;24456:39;;24521:7;24512:6;:16;24508:65;;;24554:7;24545:16;;24508:65;24645:17;24675:7;24665:6;:17;:82;;24716:31;24740:6;24716:23;:31::i;:::-;24665:82;;;24694:10;24685:20;::::0;;;:8:::1;:20;::::0;;;;:28;24665:82:::1;24791:10;24813:1;24782:20:::0;;;:8:::1;:20;::::0;;;;:28;24645:102;;-1:-1:-1;24782:32:0;;;;:93:::1;;-1:-1:-1::0;24840:10:0::1;24831:20;::::0;;;:8:::1;:20;::::0;;;;:28;:44;-1:-1:-1;24831:44:0::1;24782:93;:127;;;;;24903:6;24892:7;:17;;24782:127;:154;;;;;24935:1;24926:6;:10;24782:154;:187;;;;;24968:1;24953:12;:16;24782:187;24760:255;;;::::0;-1:-1:-1;;;24760:255:0;;12291:2:1;24760:255:0::1;::::0;::::1;12273:21:1::0;12330:2;12310:18;;;12303:30;-1:-1:-1;;;12349:18:1;;;12342:48;12407:18;;24760:255:0::1;12089:342:1::0;24760:255:0::1;25070:39;25076:10;25088:12;25102:6;25070:5;:39::i;:::-;25194:10;25185:20;::::0;;;:8:::1;:20;::::0;;;;;;;;:35;;::::1;:45:::0;;;::::1;::::0;;25290:28;;12610:51:1;;;12677:18;;12670:34;;;25290:28:0::1;::::0;12583:18:1;25290:28:0::1;;;;;;;25383:1;25373:7;;:11;:56;;;;-1:-1:-1::0;25397:10:0::1;25388:20;::::0;;;:8:::1;:20;::::0;;;;:32:::1;;::::0;::::1;;:41;25373:56;25369:674;;;25498:11;14804:6;25523:7;;25514:6;:16;;;;:::i;:::-;25512:32;;;;:::i;:::-;25498:46;;25559:21;14804:6;25591:17;;25585:3;:23;;;;:::i;:::-;25583:39;;;;:::i;:::-;25559:63:::0;-1:-1:-1;25643:17:0;;25639:167:::1;;25722:68;-1:-1:-1::0;;;;;;;;;;;;;;;;25753:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25776:13;25722:30;:68::i;:::-;25857:56;25888:10;25900:12;25909:3:::0;25900:6;:12:::1;:::i;:::-;25857:30;:56::i;:::-;25431:494;;25369:674;;;25981:50;26012:10;26024:6;25981:30;:50::i;:::-;26084:22;26088:17;:15;:17::i;:::-;8758:35:::0;;;;;;;;;;;8777:15;8758:35;;;;;;;-1:-1:-1;8738:16:0;;8725:30;;:12;:30;;;;;;;:68;;;;;;;;;;;;;8829:18;;;;;;;8677:189;26084:22:::1;-1:-1:-1::0;;16294:1:0;16516:7;:22;-1:-1:-1;26165:6:0;23847:2332::o;9953:524::-;10035:16;;10093:7;10082:8;10093:7;10144:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10144:18:0;;10118:44;;10173:27;10217:3;10203:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10203:18:0;;10173:48;;10239:9;10234:196;10258:3;10254:1;:7;10234:196;;;10291:12;:24;10304:7;;10312:1;10304:10;;;;;;;:::i;:::-;;;;;;;10291:24;;;;;;;;;;;:30;;;10279:6;10286:1;10279:9;;;;;;;;:::i;:::-;;;;;;:42;;;;;10352:12;:24;10365:7;;10373:1;10365:10;;;;;;;:::i;:::-;;;;;;;10352:24;;;;;;;;;;;:34;;;10336:10;10347:1;10336:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;10413:3;;10234:196;;;-1:-1:-1;10450:6:0;;;;-1:-1:-1;9953:524:0;-1:-1:-1;;;;9953:524:0:o;20905:240::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;21024:13:::1;21036:1;14804:6;21024:13;:::i;:::-;21008:12;:29;;20986:109;;;::::0;-1:-1:-1;;;20986:109:0;;12917:2:1;20986:109:0::1;::::0;::::1;12899:21:1::0;12956:2;12936:18;;;12929:30;12995:32;12975:18;;;12968:60;13045:18;;20986:109:0::1;12715:354:1::0;20986:109:0::1;21106:16;:31:::0;20905:240::o;21821:102::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;21893:8:::1;:22:::0;21821:102::o;21421:275::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;21540:3:::1;21520:16;:23;;21498:119;;;::::0;-1:-1:-1;;;21498:119:0;;13276:2:1;21498:119:0::1;::::0;::::1;13258:21:1::0;13315:2;13295:18;;;13288:30;13354:34;13334:18;;;13327:62;-1:-1:-1;;;13405:18:1;;;13398:44;13459:19;;21498:119:0::1;13074:410:1::0;21498:119:0::1;21683:5;21662:16;21642:17;:15;:17::i;:::-;:36;;;;:::i;:::-;21640:48;;;;:::i;:::-;21628:9;:60:::0;-1:-1:-1;21421:275:0:o;19337:103::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;19408:13:::1;:24:::0;;-1:-1:-1;;19408:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;19337:103::o;20152:278::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;20290:18:::1;;20268:19;:40;20246:125;;;::::0;-1:-1:-1;;;20246:125:0;;13691:2:1;20246:125:0::1;::::0;::::1;13673:21:1::0;13730:2;13710:18;;;13703:30;13769:34;13749:18;;;13742:62;-1:-1:-1;;;13820:18:1;;;13813:33;13863:19;;20246:125:0::1;13489:399:1::0;20246:125:0::1;20382:18;:40:::0;20152:278::o;21153:260::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;21286:13:::1;21298:1;14804:6;21286:13;:::i;:::-;21270:12;:29;;21248:109;;;::::0;-1:-1:-1;;;21248:109:0;;12917:2:1;21248:109:0::1;::::0;::::1;12899:21:1::0;12956:2;12936:18;;;12929:30;12995:32;12975:18;;;12968:60;13045:18;;21248:109:0::1;12715:354:1::0;21248:109:0::1;21368:22;::::0;;;:13:::1;:22;::::0;;;;;:37;21153:260::o;17979:158::-;-1:-1:-1;;;;;18103:17:0;;18045:7;18103:17;;;:8;:17;;;;;:25;18072:57;;:30;:57::i;19200:129::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19284:14:0;;;::::1;;::::0;;;:8:::1;:14;::::0;;;;:26:::1;;:37:::0;;-1:-1:-1;;19284:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;19200:129::o;20538:191::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;20616:19:::1;:31:::0;;-1:-1:-1;;20616:31:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;20658:64:::1;;20709:1;20688:18;:22:::0;20658:64:::1;20538:191:::0;:::o;21931:870::-;16338:1;16419:7;;:19;16411:53;;;;-1:-1:-1;;;16411:53:0;;;;;;;:::i;:::-;16338:1;16475:7;:18;22032:8:::1;::::0;-1:-1:-1;;;;;22032:8:0::1;22002:92;;;::::0;-1:-1:-1;;;22002:92:0;;14095:2:1;22002:92:0::1;::::0;::::1;14077:21:1::0;14134:2;14114:18;;;14107:30;-1:-1:-1;;;14153:18:1;;;14146:41;14204:18;;22002:92:0::1;13893:335:1::0;22002:92:0::1;22162:10;22131:19;22153:20:::0;;;:8:::1;:20;::::0;;;;:28;22214:15;22192:77:::1;;;::::0;-1:-1:-1;;;22192:77:0;;14435:2:1;22192:77:0::1;::::0;::::1;14417:21:1::0;14474:2;14454:18;;;14447:30;-1:-1:-1;;;14493:18:1;;;14486:42;14545:18;;22192:77:0::1;14233:336:1::0;22192:77:0::1;22321:20;22344:43;22375:11;22344:30;:43::i;:::-;22321:66;;22430:44;22436:10;22448:11;22461:12;22430:5;:44::i;:::-;22559:10;22550:20;::::0;;;:8:::1;:20;::::0;;;;;;;;:35;;::::1;:51:::0;;;::::1;::::0;;22661:33;;12610:51:1;;;12677:18;;12670:34;;;22661:33:0::1;::::0;12583:18:1;22661:33:0::1;;;;;;;22738:8;::::0;:55:::1;::::0;-1:-1:-1;;;22738:55:0;;-1:-1:-1;;;;;22738:8:0;;::::1;::::0;:16:::1;::::0;22762:12;;22738:55:::1;::::0;22776:10:::1;::::0;22788:4;;;;22738:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;16294:1:0;16516:7;:22;-1:-1:-1;;;;;;;21931:870:0:o;26903:328::-;16338:1;16419:7;;:19;16411:53;;;;-1:-1:-1;;;16411:53:0;;;;;;;:::i;:::-;16338:1;16475:7;:18;1330:26:::1;::::0;-1:-1:-1;;;1330:26:0;;1345:10:::1;1330:26;::::0;::::1;6442:51:1::0;-1:-1:-1;;;;;;;;;;;1076:42:0;1330:14:::1;::::0;6415:18:1;;1330:26:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1308:88;;;;-1:-1:-1::0;;;1308:88:0::1;;;;;;;:::i;:::-;26991:19:::2;::::0;::::2;;:28;27036:7;26987:67;27109:18;::::0;:22;27105:119:::2;;27179:18;27177:20:::0;;-1:-1:-1;;27177:20:0;;;27105:119:::2;16294:1:::0;16516:7;:22;26903:328::o;26344:551::-;16338:1;16419:7;;:19;16411:53;;;;-1:-1:-1;;;16411:53:0;;;;;;;:::i;:::-;16338:1;16475:7;:18;1330:26:::1;::::0;-1:-1:-1;;;1330:26:0;;1345:10:::1;1330:26;::::0;::::1;6442:51:1::0;-1:-1:-1;;;;;;;;;;;1076:42:0;1330:14:::1;::::0;6415:18:1;;1330:26:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1308:88;;;;-1:-1:-1::0;;;1308:88:0::1;;;;;;;:::i;:::-;26465:9:::2;;26444:17;:15;:17::i;:::-;:30;;26422:111;;;::::0;-1:-1:-1;;;26422:111:0;;16065:2:1;26422:111:0::2;::::0;::::2;16047:21:1::0;16104:2;16084:18;;;16077:30;16143:33;16123:18;;;16116:61;16194:18;;26422:111:0::2;15863:355:1::0;26422:111:0::2;26645:8;::::0;26630:23:::2;::::0;:12:::2;:23;:::i;:::-;26657:1;26630:28:::0;26626:116:::2;;26708:22;26712:17;:15;:17::i;26708:22::-;26758:19;::::0;::::2;;:28;26803:7;26754:67;26858:18;26856:20:::0;;::::2;;::::0;;16294:1;16516:7;:22;26344:551::o;18420:198::-;18500:4;18534:10;-1:-1:-1;;;;;18521:23:0;;;18517:72;;18561:16;18570:6;18561:8;:16::i;:::-;;18517:72;-1:-1:-1;18606:4:0;18420:198;;;;:::o;18851:204::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;18960:8:::1;18945:11;:23;;18923:91;;;::::0;-1:-1:-1;;;18923:91:0;;16542:2:1;18923:91:0::1;::::0;::::1;16524:21:1::0;16581:2;16561:18;;;16554:30;-1:-1:-1;;;16600:18:1;;;16593:48;16658:18;;18923:91:0::1;16340:342:1::0;18923:91:0::1;19025:8;:22:::0;18851:204::o;27363:582::-;16338:1;16419:7;;:19;16411:53;;;;-1:-1:-1;;;16411:53:0;;;;;;;:::i;:::-;16338:1;16475:7;:18;1330:26:::1;::::0;-1:-1:-1;;;1330:26:0;;1345:10:::1;1330:26;::::0;::::1;6442:51:1::0;-1:-1:-1;;;;;;;;;;;1076:42:0;1330:14:::1;::::0;6415:18:1;;1330:26:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1308:88;;;;-1:-1:-1::0;;;1308:88:0::1;;;;;;;:::i;:::-;27505:18:::2;27526:28;27546:7;27526:19;:28::i;:::-;27505:49;;27591:18;27621:10;27612:5;:19;;:40;;27647:5;27612:40;;;27634:10;27612:40;27591:61;;-1:-1:-1::0;;;;;;;;;;;;;;;;27748:20:0::2;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27734:115;::::0;-1:-1:-1;;;27734:115:0;;::::2;::::0;::::2;16861:25:1::0;;;-1:-1:-1;;;;;16922:32:1;;;16902:18;;;16895:60;27734:44:0;;;::::2;::::0;::::2;::::0;27786:10;;16834:18:1;;27734:115:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;27901:36:0::2;::::0;;17168:25:1;;;-1:-1:-1;;;;;17229:32:1;;17224:2;17209:18;;17202:60;17278:18;;;17271:34;;;27901:36:0::2;::::0;-1:-1:-1;17156:2:1;17141:18;;-1:-1:-1;27901:36:0::2;::::0;-1:-1:-1;16966:345:1;27901:36:0::2;;;;;;;;-1:-1:-1::0;;16294:1:0;16516:7;:22;-1:-1:-1;;;27363:582:0:o;27953:138::-;1330:26;;-1:-1:-1;;;1330:26:0;;1345:10;1330:26;;;6442:51:1;-1:-1:-1;;;;;;;;;;;1076:42:0;1330:14;;6415:18:1;;1330:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1308:88;;;;-1:-1:-1;;;1308:88:0;;;;;;;:::i;:::-;16338:1:::1;16419:7;;:19:::0;16411:53:::1;;;;-1:-1:-1::0;;;16411:53:0::1;;;;;;;:::i;:::-;16338:1;16475:7;:18:::0;28055:28:::2;::::0;;6192:25:1;;;28073:9:0::2;6248:2:1::0;6233:18;;6226:34;28055:28:0::2;::::0;6165:18:1;28055:28:0::2;;;;;;;-1:-1:-1::0;16294:1:0::1;16516:7;:22:::0;27953:138::o;9159:786::-;9249:16;9267;9311;;9300:8;:27;9296:87;;;9355:16;;9344:27;;9296:87;9411:8;9397:10;:22;;:47;;;-1:-1:-1;9423:16:0;;:21;9397:47;9393:123;;;9483:1;9469:16;;9393:123;9528:23;9568:21;9579:10;9568:8;:21;:::i;:::-;9554:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9554:36:0;-1:-1:-1;9528:62:0;-1:-1:-1;9601:27:0;9645:21;9656:10;9645:8;:21;:::i;:::-;9631:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9631:36:0;-1:-1:-1;9601:66:0;-1:-1:-1;9697:10:0;9680:218;9713:8;9709:1;:12;9680:218;;;9764:15;;;;:12;:15;;;;;:21;9739:6;9746:14;9750:10;9777:1;9746:14;:::i;:::-;9739:22;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;;9829:15;;;;:12;:15;;;;;;;:25;;9800:10;9811:14;9815:10;9842:1;9811:14;:::i;:::-;9800:26;;;;;;;;:::i;:::-;;;;;;;;;;:54;9881:3;;9680:218;;;-1:-1:-1;9918:6:0;;;;-1:-1:-1;9159:786:0;-1:-1:-1;;;9159:786:0:o;29930:188::-;-1:-1:-1;;;;;30017:14:0;;29990:7;30017:14;;;:8;:14;;;;;:25;;;30045:15;-1:-1:-1;30017:93:0;;30109:1;30017:93;;;-1:-1:-1;;;;;30063:14:0;;;;;;:8;:14;;;;;:25;;;:43;;30091:15;;30063:43;:::i;22920:839::-;16338:1;16419:7;;:19;16411:53;;;;-1:-1:-1;;;16411:53:0;;;;;;;:::i;:::-;16338:1;16475:7;:18;23002:9:::1;22980:73;;;::::0;-1:-1:-1;;;22980:73:0;;17518:2:1;22980:73:0::1;::::0;::::1;17500:21:1::0;17557:2;17537:18;;;17530:30;-1:-1:-1;;;17576:18:1;;;17569:40;17626:18;;22980:73:0::1;17316:334:1::0;22980:73:0::1;23094:8;::::0;-1:-1:-1;;;;;23094:8:0::1;23086:31:::0;23064:102:::1;;;::::0;-1:-1:-1;;;23064:102:0;;11243:2:1;23064:102:0::1;::::0;::::1;11225:21:1::0;11282:2;11262:18;;;11255:30;-1:-1:-1;;;11301:18:1;;;11294:51;11362:18;;23064:102:0::1;11041:345:1::0;23064:102:0::1;23220:20;23243:33;23267:9;23243:21;:33;:::i;:::-;23220:56;;23343:11;;23358:1;23343:16;:40;;;-1:-1:-1::0;23363:20:0;;23343:40:::1;23339:198;;;23400:45;23423:10;23435:9;23400:22;:45::i;:::-;23339:198;;;23478:47;23486:10;23498:9;23509:15;23478:7;:47::i;:::-;23553:13;::::0;::::1;;:22;;:13;:22:::0;23549:203:::1;;23652:10;23643:20;::::0;;;:8:::1;:20;::::0;;;;:36:::1;;::::0;;23618:21:::1;::::0;:9:::1;:21::i;:::-;:61;;23592:148;;;::::0;-1:-1:-1;;;23592:148:0;;17857:2:1;23592:148:0::1;::::0;::::1;17839:21:1::0;17896:2;17876:18;;;17869:30;17935:27;17915:18;;;17908:55;17980:18;;23592:148:0::1;17655:349:1::0;23592:148:0::1;-1:-1:-1::0;16294:1:0;16516:7;:22;22920:839::o;30644:101::-;30693:7;30720:17;:15;:17::i;:::-;30713:24;;30644:101;:::o;17505:133::-;17547:7;14804:6;17600:16;;17576:21;:40;;;;:::i;:::-;17574:56;;;;:::i;13328:505::-;13411:7;;13451;13411;;;13536:234;13560:3;13556:1;:7;13536:234;;;13622:12;:24;13635:7;;13643:1;13635:10;;;;;;;:::i;:::-;;;;;;;13622:24;;;;;;;;;;;:30;;;13610:42;;;;13687:12;:24;13700:7;;13708:1;13700:10;;;;;;;:::i;:::-;;;;;;;13687:24;;;;;;;;;;;:34;;;13671:50;;;;13740:3;;;;;13536:234;;;-1:-1:-1;13790:14:0;13801:3;13790:8;:14;:::i;:::-;13806:18;13821:3;13806:12;:18;:::i;:::-;13782:43;;;;;;;13328:505;;;;;:::o;19448:198::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;19550:14:::1;19562:2;14804:6;19550:14;:::i;:::-;19538:8;:26;;19516:93;;;::::0;-1:-1:-1;;;19516:93:0;;18211:2:1;19516:93:0::1;::::0;::::1;18193:21:1::0;18250:2;18230:18;;;18223:30;-1:-1:-1;;;18269:18:1;;;18262:47;18326:18;;19516:93:0::1;18009:341:1::0;19516:93:0::1;19620:7;:18:::0;19448:198::o;20737:156::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;20846:38:::1;::::0;-1:-1:-1;;;20846:38:0;;20878:4:::1;20846:38;::::0;::::1;6442:51:1::0;-1:-1:-1;;;;;20811:22:0;::::1;::::0;::::1;::::0;20834:10:::1;::::0;20811:22;;20846:23:::1;::::0;6415:18:1;;20846:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20811:74;::::0;-1:-1:-1;;;;;;20811:74:0::1;::::0;;;;;;-1:-1:-1;;;;;12628:32:1;;;20811:74:0::1;::::0;::::1;12610:51:1::0;12677:18;;;12670:34;12583:18;;20811:74:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20737:156:::0;:::o;19654:229::-;-1:-1:-1;;;;;;;;;;;;;;;;1196:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1182:29:0;:10;-1:-1:-1;;;;;1182:29:0;;1160:89;;;;-1:-1:-1;;;1160:89:0;;;;;;;:::i;:::-;14804:6:::1;19759:10;:23;;19737:97;;;::::0;-1:-1:-1;;;19737:97:0;;18746:2:1;19737:97:0::1;::::0;::::1;18728:21:1::0;18785:2;18765:18;;;18758:30;18824:26;18804:18;;;18797:54;18868:18;;19737:97:0::1;18544:348:1::0;19737:97:0::1;19845:17;:30:::0;19654:229::o;10485:1066::-;10567:16;10585;10618;;10638:1;10618:21;10614:97;;-1:-1:-1;;10664:16:0;;;10678:1;10664:16;;;;;;10682;;;;;;;;;10664;;;-1:-1:-1;10485:1066:0:o;10614:97::-;10743:16;;10727:13;:32;10723:97;;;10792:16;;10776:32;;10723:97;10832:23;10872:13;10858:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10858:28:0;;10832:54;;10897:27;10941:13;10927:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10927:28:0;-1:-1:-1;10897:58:0;-1:-1:-1;11027:12:0;11063:17;11079:1;11063:13;:17;:::i;:::-;11042:16;;:40;;;;:::i;:::-;11027:55;;11100:9;11095:206;11119:17;11135:1;11119:13;:17;:::i;:::-;11115:1;:21;11095:206;;;11166:12;:22;11179:8;11183:4;11179:1;:8;:::i;:::-;11166:22;;;;;;;;;;;:28;;;11154:6;11161:1;11154:9;;;;;;;;:::i;:::-;;;;;;;;;;:40;11225:12;:22;11238:8;11242:4;11238:1;:8;:::i;:::-;11225:22;;;;;;;;;;;:32;;;11209:10;11220:1;11209:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;11284:3;;11095:206;;;;11376:12;:34;11408:1;11389:16;;:20;;;;:::i;:::-;11376:34;;;;;;;;;;;-1:-1:-1;11376:34:0;:40;11348:6;11355:17;11371:1;11355:13;:17;:::i;:::-;11348:25;;;;;;;;:::i;:::-;;;;;;:68;;;;;11459:12;:34;11491:1;11472:16;;:20;;;;:::i;:::-;11459:34;;;;;;;;;;;:44;;;11427:10;11454:1;11438:13;:17;;;;:::i;:::-;11427:29;;;;;;;;:::i;:::-;;;;;;;;;;:76;-1:-1:-1;11524:6:0;;11532:10;;-1:-1:-1;10485:1066:0;-1:-1:-1;;10485:1066:0:o;31089:136::-;31206:11;;31139:7;;31168:33;15016:6;31168:21;:33;:::i;29168:280::-;-1:-1:-1;;;;;29284:14:0;;;;;;:8;:14;;;;;:32;;29310:6;;29284:14;:32;;29310:6;;29284:32;:::i;:::-;;;;;;;;29342:6;29327:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;29400:40:0;;2327:25:1;;;29423:1:0;;-1:-1:-1;;;;;29400:40:0;;;;;2315:2:1;2300:18;29400:40:0;;;;;;;;29168:280;;;:::o;6522:217::-;6635:12;;;6595;6635;;;;;;;;;-1:-1:-1;;;;;6613:7:0;;;6628:5;;6613:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6594:54;;;6667:7;6659:72;;;;-1:-1:-1;;;6659:72:0;;19391:2:1;6659:72:0;;;19373:21:1;19430:2;19410:18;;;19403:30;19469:34;19449:18;;;19442:62;-1:-1:-1;;;19520:18:1;;;19513:50;19580:19;;6659:72:0;19189:416:1;6659:72:0;6583:156;6522:217;;:::o;28152:361::-;-1:-1:-1;;;;;28278:14:0;;;;;;:8;:14;;;;;:26;;:38;;28308:8;;28278:14;:38;;28308:8;;28278:38;:::i;:::-;;;;-1:-1:-1;28369:31:0;;-1:-1:-1;28375:4:0;28381:8;;28369:5;:31::i;:::-;28442:22;28446:17;:15;:17::i;28442:22::-;28482:23;;;-1:-1:-1;;;;;12628:32:1;;12610:51;;12692:2;12677:18;;12670:34;;;28482:23:0;;12583:18:1;28482:23:0;;;;;;;28152:361;;:::o;28521:570::-;28660:12;28704:15;28691:8;28677:11;;:22;;;;:::i;:::-;28675:44;;;;:::i;:::-;28660:59;;28762:1;28752:7;:11;28730:73;;;;-1:-1:-1;;;28730:73:0;;19812:2:1;28730:73:0;;;19794:21:1;19851:2;19831:18;;;19824:30;-1:-1:-1;;;19870:18:1;;;19863:42;19922:18;;28730:73:0;19610:336:1;28730:73:0;-1:-1:-1;;;;;28851:16:0;;;;;;:8;:16;;;;;:28;;:40;;28883:8;;28851:16;:40;;28883:8;;28851:40;:::i;:::-;;;;-1:-1:-1;28944:32:0;;-1:-1:-1;28950:6:0;28958:7;28967:8;28944:5;:32::i;:::-;29018:22;29022:17;:15;:17::i;29018:22::-;29058:25;;;-1:-1:-1;;;;;12628:32:1;;12610:51;;12692:2;12677:18;;12670:34;;;29058:25:0;;12583:18:1;29058:25:0;;;;;;;28606:485;28521:570;;;:::o;29523:309::-;-1:-1:-1;;;;;29631:12:0;;;;;;:8;:12;;;;;:30;;;;;;29676:11;:21;;;;;;29763:8;;29745:26;;:15;:26;:::i;:::-;-1:-1:-1;;;;;29719:12:0;;;;;;:8;:12;;;;;;:23;;:52;;;;29787:37;;29719:12;;;29787:37;;;;29812:11;2327:25:1;;2315:2;2300:18;;2181:177;354:345;556:2;538:21;;;595:2;575:18;;;568:30;-1:-1:-1;;;629:2:1;614:18;;607:51;690:2;675:18;;354:345::o;704:346::-;772:6;780;833:2;821:9;812:7;808:23;804:32;801:52;;;849:1;846;839:12;801:52;-1:-1:-1;;894:23:1;;;1014:2;999:18;;;986:32;;-1:-1:-1;704:346:1:o;1055:420::-;1108:3;1146:5;1140:12;1173:6;1168:3;1161:19;1205:4;1200:3;1196:14;1189:21;;1244:4;1237:5;1233:16;1267:1;1277:173;1291:6;1288:1;1285:13;1277:173;;;1352:13;;1340:26;;1395:4;1386:14;;;;1423:17;;;;1313:1;1306:9;1277:173;;;-1:-1:-1;1466:3:1;;1055:420;-1:-1:-1;;;;1055:420:1:o;1480:465::-;1737:2;1726:9;1719:21;1700:4;1763:56;1815:2;1804:9;1800:18;1792:6;1763:56;:::i;:::-;1867:9;1859:6;1855:22;1850:2;1839:9;1835:18;1828:50;1895:44;1932:6;1924;1895:44;:::i;:::-;1887:52;1480:465;-1:-1:-1;;;;;1480:465:1:o;1950:226::-;2009:6;2062:2;2050:9;2041:7;2037:23;2033:32;2030:52;;;2078:1;2075;2068:12;2030:52;-1:-1:-1;2123:23:1;;1950:226;-1:-1:-1;1950:226:1:o;2555:250::-;2640:1;2650:113;2664:6;2661:1;2658:13;2650:113;;;2740:11;;;2734:18;2721:11;;;2714:39;2686:2;2679:10;2650:113;;;-1:-1:-1;;2797:1:1;2779:16;;2772:27;2555:250::o;2810:396::-;2959:2;2948:9;2941:21;2922:4;2991:6;2985:13;3034:6;3029:2;3018:9;3014:18;3007:34;3050:79;3122:6;3117:2;3106:9;3102:18;3097:2;3089:6;3085:15;3050:79;:::i;:::-;3190:2;3169:15;-1:-1:-1;;3165:29:1;3150:45;;;;3197:2;3146:54;;2810:396;-1:-1:-1;;2810:396:1:o;3211:131::-;-1:-1:-1;;;;;3286:31:1;;3276:42;;3266:70;;3332:1;3329;3322:12;3347:367;3415:6;3423;3476:2;3464:9;3455:7;3451:23;3447:32;3444:52;;;3492:1;3489;3482:12;3444:52;3531:9;3518:23;3550:31;3575:5;3550:31;:::i;:::-;3600:5;3678:2;3663:18;;;;3650:32;;-1:-1:-1;;;3347:367:1:o;3719:247::-;3778:6;3831:2;3819:9;3810:7;3806:23;3802:32;3799:52;;;3847:1;3844;3837:12;3799:52;3886:9;3873:23;3905:31;3930:5;3905:31;:::i;4701:508::-;4778:6;4786;4794;4847:2;4835:9;4826:7;4822:23;4818:32;4815:52;;;4863:1;4860;4853:12;4815:52;4902:9;4889:23;4921:31;4946:5;4921:31;:::i;:::-;4971:5;-1:-1:-1;5028:2:1;5013:18;;5000:32;5041:33;5000:32;5041:33;:::i;:::-;4701:508;;5093:7;;-1:-1:-1;;;5173:2:1;5158:18;;;;5145:32;;4701:508::o;5403:610::-;5489:6;5497;5550:2;5538:9;5529:7;5525:23;5521:32;5518:52;;;5566:1;5563;5556:12;5518:52;5606:9;5593:23;5639:18;5631:6;5628:30;5625:50;;;5671:1;5668;5661:12;5625:50;5694:22;;5747:4;5739:13;;5735:27;-1:-1:-1;5725:55:1;;5776:1;5773;5766:12;5725:55;5816:2;5803:16;5842:18;5834:6;5831:30;5828:50;;;5874:1;5871;5864:12;5828:50;5927:7;5922:2;5912:6;5909:1;5905:14;5901:2;5897:23;5893:32;5890:45;5887:65;;;5948:1;5945;5938:12;5887:65;5979:2;5971:11;;;;;6001:6;;-1:-1:-1;5403:610:1;-1:-1:-1;;;5403:610:1:o;6504:118::-;6590:5;6583:13;6576:21;6569:5;6566:32;6556:60;;6612:1;6609;6602:12;6627:241;6683:6;6736:2;6724:9;6715:7;6711:23;6707:32;6704:52;;;6752:1;6749;6742:12;6704:52;6791:9;6778:23;6810:28;6832:5;6810:28;:::i;6873:382::-;6938:6;6946;6999:2;6987:9;6978:7;6974:23;6970:32;6967:52;;;7015:1;7012;7005:12;6967:52;7054:9;7041:23;7073:31;7098:5;7073:31;:::i;:::-;7123:5;-1:-1:-1;7180:2:1;7165:18;;7152:32;7193:30;7152:32;7193:30;:::i;:::-;7242:7;7232:17;;;6873:382;;;;;:::o;7486:586::-;7556:6;7564;7617:2;7605:9;7596:7;7592:23;7588:32;7585:52;;;7633:1;7630;7623:12;7585:52;7673:9;7660:23;7706:18;7698:6;7695:30;7692:50;;;7738:1;7735;7728:12;7692:50;7761:22;;7814:4;7806:13;;7802:27;-1:-1:-1;7792:55:1;;7843:1;7840;7833:12;7792:55;7883:2;7870:16;7909:18;7901:6;7898:30;7895:50;;;7941:1;7938;7931:12;7895:50;7986:7;7981:2;7972:6;7968:2;7964:15;7960:24;7957:37;7954:57;;;8007:1;8004;7997:12;8077:487;8154:6;8162;8170;8223:2;8211:9;8202:7;8198:23;8194:32;8191:52;;;8239:1;8236;8229:12;8191:52;8284:23;;;-1:-1:-1;8383:2:1;8368:18;;8355:32;8396:33;8355:32;8396:33;:::i;8569:388::-;8637:6;8645;8698:2;8686:9;8677:7;8673:23;8669:32;8666:52;;;8714:1;8711;8704:12;8666:52;8753:9;8740:23;8772:31;8797:5;8772:31;:::i;:::-;8822:5;-1:-1:-1;8879:2:1;8864:18;;8851:32;8892:33;8851:32;8892:33;:::i;8962:127::-;9023:10;9018:3;9014:20;9011:1;9004:31;9054:4;9051:1;9044:15;9078:4;9075:1;9068:15;9094:127;9155:10;9150:3;9146:20;9143:1;9136:31;9186:4;9183:1;9176:15;9210:4;9207:1;9200:15;9226:128;9293:9;;;9314:11;;;9311:37;;;9328:18;;:::i;9359:127::-;9420:10;9415:3;9411:20;9408:1;9401:31;9451:4;9448:1;9441:15;9475:4;9472:1;9465:15;9491:120;9531:1;9557;9547:35;;9562:18;;:::i;:::-;-1:-1:-1;9596:9:1;;9491:120::o;9616:127::-;9677:10;9672:3;9668:20;9665:1;9658:31;9708:4;9705:1;9698:15;9732:4;9729:1;9722:15;9748:168;9821:9;;;9852;;9869:15;;;9863:22;;9849:37;9839:71;;9890:18;;:::i;10111:125::-;10176:9;;;10197:10;;;10194:36;;;10210:18;;:::i;10241:200::-;10307:9;;;10280:4;10335:9;;10363:10;;10375:12;;;10359:29;10398:12;;;10390:21;;10356:56;10353:82;;;10415:18;;:::i;:::-;10353:82;10241:200;;;;:::o;10446:251::-;10516:6;10569:2;10557:9;10548:7;10544:23;10540:32;10537:52;;;10585:1;10582;10575:12;10537:52;10617:9;10611:16;10636:31;10661:5;10636:31;:::i;10702:334::-;10904:2;10886:21;;;10943:2;10923:18;;;10916:30;-1:-1:-1;;;10977:2:1;10962:18;;10955:40;11027:2;11012:18;;10702:334::o;14574:485::-;-1:-1:-1;;;;;14759:32:1;;14741:51;;14828:2;14823;14808:18;;14801:30;;;14847:18;;14840:34;;;14867:6;14916;14911:2;14896:18;;14883:48;14980:1;14951:22;;;14975:2;14947:31;;;14940:42;;;;15043:2;15022:15;;;-1:-1:-1;;15018:29:1;15003:45;14999:54;;14574:485;-1:-1:-1;;14574:485:1:o;15272:245::-;15339:6;15392:2;15380:9;15371:7;15367:23;15363:32;15360:52;;;15408:1;15405;15398:12;15360:52;15440:9;15434:16;15459:28;15481:5;15459:28;:::i;15522:336::-;15724:2;15706:21;;;15763:2;15743:18;;;15736:30;-1:-1:-1;;;15797:2:1;15782:18;;15775:42;15849:2;15834:18;;15522:336::o;16223:112::-;16255:1;16281;16271:35;;16286:18;;:::i;:::-;-1:-1:-1;16320:9:1;;16223:112::o;18355:184::-;18425:6;18478:2;18466:9;18457:7;18453:23;18449:32;18446:52;;;18494:1;18491;18484:12;18446:52;-1:-1:-1;18517:16:1;;18355:184;-1:-1:-1;18355:184:1:o;18897:287::-;19026:3;19064:6;19058:13;19080:66;19139:6;19134:3;19127:4;19119:6;19115:17;19080:66;:::i;:::-;19162:16;;;;;18897:287;-1:-1:-1;;18897:287:1:o

Swarm Source

ipfs://d25508a340ffed26ca756d805500d24df88be8a49b508a9cba78a633e8dea7ed

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
0x2054709F89F18a4CCAC6132acE7b812E32608469
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.