ETH Price: $3,050.66 (+2.36%)
Gas: 1 Gwei

Contract

0x0C073C92e7684031Cfc297b83eCc33619e864d18
 
Transaction Hash
Method
Block
From
To
Value
Approve Next Own...148534292022-05-27 9:41:46771 days ago1653644506IN
Xether.io: Games
0 ETH0.0004332218
Refund Bet122182812021-04-11 11:13:001182 days ago1618139580IN
Xether.io: Games
0 ETH0.00450676197
Place Bet122182812021-04-11 11:13:001182 days ago1618139580IN
Xether.io: Games
0.03 ETH0.001488859
Place Bet122180102021-04-11 10:11:381182 days ago1618135898IN
Xether.io: Games
0.04 ETH0.00809241321
Place Bet Roulet...121536572021-04-01 12:43:031192 days ago1617280983IN
Xether.io: Games
0.03 ETH0.0396768181.5
Place Bet Roulet...121534912021-04-01 12:03:591192 days ago1617278639IN
Xether.io: Games
0.03 ETH0.00385632180
Settle Bet121488512021-03-31 18:50:131193 days ago1617216613IN
Xether.io: Games
0 ETH0.01379538311.88
Place Bet121488472021-03-31 18:49:261193 days ago1617216566IN
Xether.io: Games
0.04 ETH0.04716608320
Place Bet Roulet...121488272021-03-31 18:46:361193 days ago1617216396IN
Xether.io: Games
0.01 ETH0.01495872320
Place Bet Roulet...121231752021-03-27 20:05:451197 days ago1616875545IN
Xether.io: Games
0.03 ETH0.0026745897
Settle Bet Roule...121231742021-03-27 20:05:171197 days ago1616875517IN
Xether.io: Games
0 ETH0.00438537106.7
Place Bet Roulet...121231732021-03-27 20:05:051197 days ago1616875505IN
Xether.io: Games
0.03 ETH0.0214221198
Settle Bet121194992021-03-27 6:24:061197 days ago1616826246IN
Xether.io: Games
0 ETH0.00408282102.2239421
Place Bet121194952021-03-27 6:23:091197 days ago1616826189IN
Xether.io: Games
0.01 ETH0.013708293
Settle Bet121194882021-03-27 6:21:281197 days ago1616826088IN
Xether.io: Games
0 ETH0.00472881102.3
Place Bet121194662021-03-27 6:17:361197 days ago1616825856IN
Xether.io: Games
0.02 ETH0.0152382100
Settle Bet121191972021-03-27 5:08:581197 days ago1616821738IN
Xether.io: Games
0 ETH0.0043827395
Place Bet121191872021-03-27 5:06:581197 days ago1616821618IN
Xether.io: Games
0.05 ETH0.0152389100
Settle Bet121191732021-03-27 5:04:271197 days ago1616821467IN
Xether.io: Games
0 ETH0.0043710894.60000864
Place Bet121191712021-03-27 5:03:491197 days ago1616821429IN
Xether.io: Games
0.07 ETH0.0147427100
Settle Bet121191692021-03-27 5:03:141197 days ago1616821394IN
Xether.io: Games
0 ETH0.0043459994.00000145
Place Bet121191662021-03-27 5:02:191197 days ago1616821339IN
Xether.io: Games
0.08 ETH0.0152377100
Settle Bet121191622021-03-27 5:01:091197 days ago1616821269IN
Xether.io: Games
0 ETH0.0043278793.6
Place Bet121191572021-03-27 5:00:461197 days ago1616821246IN
Xether.io: Games
0.06 ETH0.0134102388
Settle Bet121191492021-03-27 4:59:041197 days ago1616821144IN
Xether.io: Games
0 ETH0.0044016993.5000016
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
121488512021-03-31 18:50:131193 days ago1617216613
Xether.io: Games
0.05076923 ETH
121231742021-03-27 20:05:171197 days ago1616875517
Xether.io: Games
1 wei
121194992021-03-27 6:24:061197 days ago1616826246
Xether.io: Games
1 wei
121194882021-03-27 6:21:281197 days ago1616826088
Xether.io: Games
0.02167 ETH
121191972021-03-27 5:08:581197 days ago1616821738
Xether.io: Games
0.02475 ETH
121191732021-03-27 5:04:271197 days ago1616821467
Xether.io: Games
0.07623 ETH
121191692021-03-27 5:03:141197 days ago1616821394
Xether.io: Games
0.08712 ETH
121191622021-03-27 5:01:091197 days ago1616821269
Xether.io: Games
0.09504 ETH
121191492021-03-27 4:59:041197 days ago1616821144
Xether.io: Games
0.07375 ETH
121191442021-03-27 4:57:531197 days ago1616821073
Xether.io: Games
0.16225 ETH
121191332021-03-27 4:55:411197 days ago1616820941
Xether.io: Games
0.16225 ETH
121097472021-03-25 18:34:231199 days ago1616697263
Xether.io: Games
0.10002061 ETH
120930432021-03-23 4:50:311201 days ago1616475031
Xether.io: Games
1 wei
118706772021-02-16 22:59:001236 days ago1613516340
Xether.io: Games
1 wei
118703662021-02-16 21:50:021236 days ago1613512202
Xether.io: Games
1 wei
118553972021-02-14 14:35:371238 days ago1613313337
Xether.io: Games
1 wei
117822892021-02-03 8:45:301249 days ago1612341930
Xether.io: Games
1 wei
117817202021-02-03 6:39:531249 days ago1612334393
Xether.io: Games
1 wei
117660672021-01-31 20:50:381252 days ago1612126238
Xether.io: Games
490 ETH
117660082021-01-31 20:36:021252 days ago1612125362
Xether.io: Games
1 ETH
117349212021-01-27 1:38:321257 days ago1611711512
Xether.io: Games
1 wei
117331822021-01-26 19:12:121257 days ago1611688332
Xether.io: Games
1 wei
117327692021-01-26 17:40:241257 days ago1611682824
Xether.io: Games
1 wei
117303712021-01-26 9:06:131257 days ago1611651973
Xether.io: Games
0.295 ETH
117303402021-01-26 8:58:361257 days ago1611651516
Xether.io: Games
0.1584 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
XetherGames

Compiler Version
v0.5.6+commit.b259423e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-04-05
*/

pragma solidity 0.5.6;

// * xether.io - is a gambling ecosystem, which makes a difference by caring about its users.
// It’s our passion for perfection, as well as finding and creating neat solutions,
// that keeps us driven towards our goals.
//
// * Uses hybrid commit-reveal + block hash random number generation that is immune
//   to tampering by players, house and miners. Apart from being fully transparent,
//   this also allows arbitrarily high bets.


interface xEtherTokensContractInterface {
  function ecosystemDividends() external payable;
}

contract XetherGames {
    uint256 constant HOUSE_EDGE_MINIMUM_AMOUNT = 0.0003 ether;
    uint256 constant MIN_JACKPOT_BET = 0.1 ether;
    uint16 constant JACKPOT_MODULO = 1000;
    uint256 constant JACKPOT_FEE = 0.001 ether;
    uint256 constant MIN_BET = 0.01 ether;
    uint256 constant MAX_AMOUNT = 300000 ether;
    uint8 constant MAX_MODULO = 100;
    uint8 constant MAX_MASK_MODULO = 40;
    uint256 constant MAX_BET_MASK = 2 ** uint256(MAX_MASK_MODULO);
    uint8 constant BET_EXPIRATION_BLOCKS = 250;
    uint256 public DIVIDENDS_LIMIT = 1 ether;
    uint16 constant PERCENTAGES_BASE = 1000;
    address constant DUMMY_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    uint16 public luckyNumber = 777;

    uint8 public DIVIDENDS_PERCENT = 10; // 1% example: 15 will be 1.5%
    uint8 public ADVERTISE_PERCENT = 0; // 0%
    uint8 public HOUSE_EDGE_PERCENT = 10; // 1%

    uint8 constant ROULETTE_ID = 37;
    uint8 constant ROULETTE_STAKES_LIMIT = 36;
    uint8 public rouletteSkipComission = 1;
    uint256 public rouletteTableLimit = 1.8 ether;
    uint8 public ROULETTE_PERCENT = 10;

    uint8 constant PLINKO_BYTES = 16;
    uint256 constant PLINKO_ID = 2 ** uint256(PLINKO_BYTES);
    uint16[17] PLINKO1Ratios = [1000,800,600,300,200,130,100,80,50,80,100,130,200,300,600,800,1000];
    uint16[17] PLINKO2Ratios = [2000,700,500,300,200,110,100,60,100,60,100,110,200,300,500,700,2000];
    uint16[17] PLINKO3Ratios = [5000,800,300,200,140,120,110,100,40,100,110,120,140,200,300,800,5000];
    uint8 public plinkoSkipComission = 2;
    uint8 public PLINKO_PERCENT = HOUSE_EDGE_PERCENT;

    uint16 constant SLOTS_ID = 999;
    uint8 constant SLOTS_COUNT = 5;
    uint16[] SLOTSWinsRatios = [0, 50, 120, 200, 1500];
    uint32[] SLOTSWildRatios = [0, 110, 250, 400, 3000, 10000];

    xEtherTokensContractInterface public xEtherTokensContract;

    address payable public owner;
    address payable private nextOwner;

    uint256 public totalDividends = 0;
    uint256 public totalAdvertise = 0;

    uint256 public maxProfit = 5 ether;
    uint256 public maxProfitPlinko = 10 ether;
    uint256 public maxProfitRoulette = 3.6 ether;

    address public secretSigner;
    address public moderator;
    address public croupier;
    uint128 public jackpotSize;
    uint128 public lockedInBets;

    struct Bet {
        uint256 amount;
        uint128 locked;
        uint32 modulo;
        uint8 rollUnder;
        uint40 placeBlockNumber;
        uint256 clientSeed;
        uint40 mask;
        address payable gambler;
    }

    struct BetRoulette {
      uint256 totalBetAmount;
      uint128 locked;
      mapping (uint8 => uint256) amount;
      mapping (uint8 => uint8) rollUnder;
      uint40 placeBlockNumber;
      uint256 clientSeed;
      mapping (uint8 => uint40) mask;
      address payable gambler;
      uint8 betsCount;
    }

    mapping (uint => Bet) bets;
    mapping (uint => BetRoulette) betsRoulette;
    mapping (address => uint256) public bonusProgrammAccumulated;

    event FailedPayment(address beneficiary, uint commit, uint amount, string paymentType);
    event Payment(address beneficiary, uint commit, uint amount, string paymentType);
    event JackpotPayment(address indexed beneficiary, uint commit, uint amount);

    event PayDividendsSuccess(uint time, uint amount);
    event PayDividendsFailed(uint time, uint amount);

    event Commit(uint commit, uint clietSeed, uint amount);

    constructor () public {
        owner = msg.sender;
        secretSigner = DUMMY_ADDRESS;
        croupier = DUMMY_ADDRESS;
    }

    modifier onlyOwner {
        require (msg.sender == owner, "OnlyOwner methods called by non-owner.");
        _;
    }

    modifier onlyModeration {
        require (msg.sender == owner || msg.sender == moderator, "Moderation methods called by non-moderator.");
        _;
    }

    modifier onlyCroupier {
        require (msg.sender == croupier, "OnlyCroupier methods called by non-croupier.");
        _;
    }

    function approveNextOwner(address payable _nextOwner) external onlyOwner {
        require (_nextOwner != owner, "Cannot approve current owner.");
        nextOwner = _nextOwner;
    }

    function acceptNextOwner() external {
        require (msg.sender == nextOwner, "Can only accept preapproved new owner.");
        owner = nextOwner;
    }

    function () external payable {
    }

    function setNewPercents(
      uint8 newHouseEdgePercent,
      uint8 newDividendsPercent,
      uint8 newAdvertPercent
    ) external onlyOwner {
        // We guarantee that dividends will be minimum 0.5%
        require(newDividendsPercent >= 5);
        // Total percentages not greater then 3%
        require(newHouseEdgePercent + newDividendsPercent + newAdvertPercent <= 30);

        HOUSE_EDGE_PERCENT = newHouseEdgePercent;
        ADVERTISE_PERCENT = newAdvertPercent;
        DIVIDENDS_PERCENT = newDividendsPercent;
    }

    function setNewRoulettePercents(uint8 newRoulettePercent) external onlyModeration {
        require(0 <= newRoulettePercent && newRoulettePercent <= 10);
        ROULETTE_PERCENT = newRoulettePercent;
    }

    function setNewPlinkoPercents(uint8 newPlinkoPercent) external onlyModeration {
        require(0 <= newPlinkoPercent && newPlinkoPercent <= 10);
        PLINKO_PERCENT = newPlinkoPercent;
    }

    function setXEtherContract(address payable xEtherContract) external onlyOwner{
        xEtherTokensContract = xEtherTokensContractInterface(xEtherContract);
    }

    function setAddresses(address newCroupier, address newSecretSigner, address newModerator) external onlyOwner {
        secretSigner = newSecretSigner;
        croupier = newCroupier;
        moderator = newModerator;
    }

    function changeDividendsLimit(uint _newDividendsLimit) public onlyModeration {
        DIVIDENDS_LIMIT = _newDividendsLimit;
    }

    function setMaxProfit(uint _maxProfit) public onlyModeration {
        require (_maxProfit < MAX_AMOUNT, "maxProfit cant be great then top limit.");
        maxProfit = _maxProfit;
    }

    function setMaxProfitPlinko(uint _maxProfitPlinko) public onlyModeration {
        require (_maxProfitPlinko < MAX_AMOUNT, "maxProfitPlinko cant be great then top limit.");
        maxProfitPlinko = _maxProfitPlinko;
    }

    function setMaxProfitRoulette(uint _maxProfitRoulette) public onlyModeration {
        require (_maxProfitRoulette < MAX_AMOUNT, "maxProfitRoulette cant be great then top limit.");
        maxProfitRoulette = _maxProfitRoulette;
    }

    function setRouletteTableLimit(uint _newRouletteTableLimit) public onlyModeration {
        require (_newRouletteTableLimit < MAX_AMOUNT, "roultteTableLimit cant be great then top limit.");
        rouletteTableLimit = _newRouletteTableLimit;
    }

    function setComissionState(uint8 _newRouletteState, uint8 _newPlinkoState) public onlyModeration {
        rouletteSkipComission = _newRouletteState;
        plinkoSkipComission = _newPlinkoState;
    }

    function releaseLockedInBetAmount() external onlyModeration {
        lockedInBets = 0;
    }

    function increaseJackpot(uint increaseAmount) external onlyModeration {
        require (increaseAmount <= address(this).balance, "Increase amount larger than balance.");
        require (jackpotSize + lockedInBets + increaseAmount <= address(this).balance, "Not enough funds.");
        jackpotSize += uint128(increaseAmount);
    }

    function withdrawFunds(address payable beneficiary, uint withdrawAmount) external onlyOwner {
        require (withdrawAmount <= address(this).balance, "Increase amount larger than balance.");
        require (jackpotSize + lockedInBets + withdrawAmount <= address(this).balance, "Not enough funds.");
        sendFunds(beneficiary, withdrawAmount, withdrawAmount, 0, 'withdraw');
    }

    function withdrawAdvertiseFunds(address payable beneficiary, uint withdrawAmount) external onlyOwner {
        require (withdrawAmount <= totalAdvertise, "Increase amount larger than balance.");
        totalAdvertise -= withdrawAmount;
        sendFunds(beneficiary, withdrawAmount, withdrawAmount, 0, 'withdraw');
    }

    function getBonusProgrammLevel(address gambler) public view returns (uint8 discount) {
      uint accumulated = bonusProgrammAccumulated[gambler];
      discount = 0;

      if (accumulated >= 20 ether && accumulated < 100 ether) {
        discount = 1;
      } else if (accumulated >= 100 ether && accumulated < 500 ether) {
        discount = 2;
      } else if (accumulated >= 500 ether && accumulated < 1000 ether) {
        discount = 3;
      } else if (accumulated >= 1000 ether && accumulated < 5000 ether) {
        discount = 4;
      } else if (accumulated >= 5000 ether) {
        discount = 5;
      }
    }

    function kill() external onlyOwner {
        require (lockedInBets == 0, "All bets should be processed (settled or refunded) before self-destruct.");
        selfdestruct(owner);
    }

    function sendDividends() public payable {
        if (address(xEtherTokensContract) != address(0)) {
            uint tmpDividends = totalDividends;
            xEtherTokensContract.ecosystemDividends.value(tmpDividends)();
            totalDividends = 0;

            emit PayDividendsSuccess(now, tmpDividends);
        }
    }

    function placeBet(
        uint betMask,
        uint32 modulo,
        uint commitLastBlock,
        uint commit, uint256 clientSeed,
        bytes32 r, bytes32 s
    ) external payable {
        Bet storage bet = bets[commit];
        require (bet.gambler == address(0), "Bet should be in a 'clean' state.");

        uint amount = msg.value;
        if (modulo > MAX_MODULO) {
            require (modulo == PLINKO_ID || modulo == SLOTS_ID, "Modulo should be within range.");
        } else {
            require (modulo > 1 && modulo <= MAX_MODULO, "Modulo should be within range.");
        }

        require (amount >= MIN_BET && amount <= MAX_AMOUNT, "Amount should be within range.");
        require (betMask > 0 && betMask < MAX_BET_MASK, "Mask should be within range.");
        require (block.number <= commitLastBlock, "Commit has expired.");
        require (
          secretSigner == ecrecover(keccak256(abi.encodePacked(uint40(commitLastBlock), commit)), 27, r, s) ||
          secretSigner == ecrecover(keccak256(abi.encodePacked(uint40(commitLastBlock), commit)), 28, r, s),
          "ECDSA signature is not valid."
        );

        if (totalDividends >= DIVIDENDS_LIMIT) {
          sendDividends();
        }

        uint rollUnder;
        uint mask;

        (mask, rollUnder, bet.locked) = prepareBet(betMask, modulo, amount, commit, clientSeed, msg.sender);

        bet.amount = amount;
        bet.modulo = uint32(modulo);
        bet.rollUnder = uint8(rollUnder);
        bet.placeBlockNumber = uint40(block.number);
        bet.mask = uint40(mask);
        bet.clientSeed = clientSeed;
        bet.gambler = msg.sender;
    }

    function placeBetRoulette(
        uint[] calldata betMask,
        uint[] calldata betAmount,
        uint commitLastBlock,
        uint commit, uint256 clientSeed,
        bytes32 r, bytes32 s
    ) external payable {
        BetRoulette storage betRoulette = betsRoulette[commit];

        require(msg.value <= rouletteTableLimit, "Bets sum must be LTE table limit");
        betRoulette.betsCount = uint8(betMask.length);

        require (betRoulette.gambler == address(0), "Bet should be in a 'clean' state.");
        require (block.number <= commitLastBlock, "Commit has expired.");
        require (
          secretSigner == ecrecover(keccak256(abi.encodePacked(uint40(commitLastBlock), commit)), 27, r, s) ||
          secretSigner == ecrecover(keccak256(abi.encodePacked(uint40(commitLastBlock), commit)), 28, r, s),
          "ECDSA signature is not valid."
        );

        if (totalDividends >= DIVIDENDS_LIMIT) {
          sendDividends();
        }

        (betRoulette.betsCount, betRoulette.locked) = placeBetRouletteProcess(commit, betMask, betAmount);

        lockedInBets += betRoulette.locked;
        require (lockedInBets <= address(this).balance, "Cannot afford to lose this bet.");

        if (rouletteSkipComission != 1) {
          bonusProgrammAccumulated[msg.sender] += msg.value;
        }

        betRoulette.totalBetAmount = msg.value;
        betRoulette.placeBlockNumber = uint40(block.number);
        betRoulette.clientSeed = clientSeed;
        betRoulette.gambler = msg.sender;

        jackpotSize += msg.value >= MIN_JACKPOT_BET ? uint128(JACKPOT_FEE) : 0;

        emit Commit(commit, clientSeed, msg.value);
    }

    function placeBetRouletteProcess (
      uint commit, uint[] memory betMask, uint[] memory betAmount
    ) internal returns (uint8 betsCount, uint128 locked) {
      BetRoulette storage betRoulette = betsRoulette[commit];
      betsCount = 0;
      uint totalBetAmount = 0;
      uint8 addBets = betRoulette.betsCount;
      uint8 tmpBetCount = betRoulette.betsCount - 1;
      uint128 curLocked = 0;
      uint128 tmpLocked = 0;
      bool numIsAlredyLocked = false;
      uint8 bonuses = getBonusProgrammLevel(betRoulette.gambler);

      while (0 <= tmpBetCount) {
        require (betMask[tmpBetCount] > 0 && betMask[tmpBetCount] < MAX_BET_MASK, "Mask should be within range.");

        // Check track sectors bets
        if (betMask[tmpBetCount] == 38721851401) {  // Jeu 0
          require (betAmount[tmpBetCount] >= MIN_BET * 4 && betAmount[tmpBetCount] <= MAX_AMOUNT, "Amount should be within range.");

          totalBetAmount += betAmount[tmpBetCount];
          require (totalBetAmount <= msg.value, "Total bets amount should be LTE amount");

          // 12/15
          (betRoulette.mask[tmpBetCount], betRoulette.rollUnder[tmpBetCount], curLocked) = prepareBetRoulette(36864, betAmount[tmpBetCount] / 4, bonuses);
          betRoulette.amount[tmpBetCount] = betAmount[tmpBetCount] / 4;

          // 35/32
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(38654705664, betAmount[tmpBetCount] / 4, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 4;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          // 3/0
          addBets += 1;
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(9, betAmount[tmpBetCount] / 4, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 4;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          // 26
          addBets += 1;
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(67108864, betAmount[tmpBetCount] / 4, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 4;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          locked += curLocked;

          addBets += 1;
          betsCount += 4;
        } else if (betMask[tmpBetCount] == 39567790237) { // Voisins mask
          require (betAmount[tmpBetCount] >= MIN_BET * 9 && betAmount[tmpBetCount] <= MAX_AMOUNT, "Amount should be within range.");

          totalBetAmount += betAmount[tmpBetCount];
          require (totalBetAmount <= msg.value, "Total bets amount should be LTE amount");

          // 4/7
          (betRoulette.mask[tmpBetCount], betRoulette.rollUnder[tmpBetCount], curLocked) = prepareBetRoulette(
            144, betAmount[tmpBetCount] / 9, bonuses);
          betRoulette.amount[tmpBetCount] = betAmount[tmpBetCount] / 9;

          // 12/15
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(
            36864, betAmount[tmpBetCount] / 9, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 9;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          // 18/21
          addBets += 1;
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(
            2359296, betAmount[tmpBetCount] / 9, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 9;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          // 19/22
          addBets += 1;
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(
            4718592, betAmount[tmpBetCount] / 9, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 9;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          // 35/32
          addBets += 1;
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(
            38654705664, betAmount[tmpBetCount] / 9, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 9;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          // 25/26/28/29 (x2)
          addBets += 1;
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(
            905969664, betAmount[tmpBetCount] * 2 / 9, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] * 2 / 9;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          // 0/2/3 (x2)
          addBets += 1;
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(
            13, betAmount[tmpBetCount] * 2 / 9, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] * 2 / 9;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          locked += curLocked;

          addBets += 1;
          betsCount += 7;
        } else if (betMask[tmpBetCount] == 19328549442) { // Orphelins mask
          require (betAmount[tmpBetCount] >= MIN_BET * 5 && betAmount[tmpBetCount] <= MAX_AMOUNT, "Amount should be within range.");

          totalBetAmount += betAmount[tmpBetCount];
          require (totalBetAmount <= msg.value, "Total bets amount should be LTE amount");

          // 14/17
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], curLocked) = prepareBetRoulette(
            147456, betAmount[tmpBetCount] / 5, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 5;

          // 17/20
          addBets += 1;
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(
            1179648, betAmount[tmpBetCount] / 5, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 5;
          curLocked += tmpLocked;

          // 6/9
          (betRoulette.mask[tmpBetCount], betRoulette.rollUnder[tmpBetCount], tmpLocked) = prepareBetRoulette(
            576, betAmount[tmpBetCount] / 5, bonuses);
          betRoulette.amount[tmpBetCount] = betAmount[tmpBetCount] / 5;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          // 31/34
          addBets += 1;
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(
            19327352832, betAmount[tmpBetCount] / 5, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 5;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          // 1
          addBets += 1;
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(
            2, betAmount[tmpBetCount] / 5, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 5;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          locked += curLocked;

          addBets += 1;
          betsCount += 5;
        } else if (betMask[tmpBetCount] == 78542613792) { // Tier mask
          require (betAmount[tmpBetCount] >= MIN_BET * 6 && betAmount[tmpBetCount] <= MAX_AMOUNT, "Amount should be within range.");

          totalBetAmount += betAmount[tmpBetCount];
          require (totalBetAmount <= msg.value, "Total bets amount should be LTE amount");

          // 5/8
          (betRoulette.mask[tmpBetCount], betRoulette.rollUnder[tmpBetCount], curLocked) = prepareBetRoulette(
            288, betAmount[tmpBetCount] / 6, bonuses);
          betRoulette.amount[tmpBetCount] = betAmount[tmpBetCount] / 6;

          // 10/11
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(
            3072, betAmount[tmpBetCount] / 6, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 6;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          // 13/16
          addBets += 1;
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(
            73728, betAmount[tmpBetCount] / 6, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 6;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          // 23/24
          addBets += 1;
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(
            25165824, betAmount[tmpBetCount] / 6, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 6;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          // 27/30
          addBets += 1;
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(
            1207959552, betAmount[tmpBetCount] / 6, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 6;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          // 33/36
          addBets += 1;
          (betRoulette.mask[addBets], betRoulette.rollUnder[addBets], tmpLocked) = prepareBetRoulette(
            77309411328, betAmount[tmpBetCount] / 6, bonuses);
          betRoulette.amount[addBets] = betAmount[tmpBetCount] / 6;
          curLocked = (tmpLocked > curLocked) ? tmpLocked : curLocked;

          locked += curLocked;

          addBets += 1;
          betsCount += 6;
        } else {
          require (betAmount[tmpBetCount] >= MIN_BET && betAmount[tmpBetCount] <= MAX_AMOUNT, "Amount should be within range.");
          totalBetAmount += betAmount[tmpBetCount];
          require (totalBetAmount <= msg.value, "Total bets amount should be LTE amount");
          (betRoulette.mask[tmpBetCount], betRoulette.rollUnder[tmpBetCount], tmpLocked) = prepareBetRoulette(
            betMask[tmpBetCount], betAmount[tmpBetCount], bonuses);

          if (uint8(((betRoulette.mask[tmpBetCount] * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO) != 1) {
            locked += tmpLocked;
          } else {
            if (!numIsAlredyLocked) {
              numIsAlredyLocked = true;
              locked += tmpLocked;
            }
          }

          betRoulette.amount[tmpBetCount] = betAmount[tmpBetCount];
          betsCount += 1;
        }

        if (tmpBetCount == 0) break;
        tmpBetCount -= 1;
      }
    }

    function prepareBet(uint betMask, uint32 modulo, uint amount, uint commit, uint clientSeed, address gambler) private returns (uint mask, uint8 rollUnder, uint128 possibleWinAmount) {
        if (modulo <= MAX_MASK_MODULO) {
            rollUnder = uint8(((betMask * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO);
            mask = betMask;
        } else {
            require (betMask > 0 && betMask <= modulo, "High modulo range, betMask larger than modulo.");
            rollUnder = uint8(betMask);
        }

        uint jackpotFee;

        (possibleWinAmount, jackpotFee) = getDiceWinAmount(amount, modulo, rollUnder, gambler, true);
        require (possibleWinAmount <= amount + maxProfitPlinko, "maxProfitPlinko limit violation.");

        bonusProgrammAccumulated[gambler] += amount;
        lockedInBets += uint128(possibleWinAmount);
        jackpotSize += uint128(jackpotFee);

        require (jackpotSize + lockedInBets <= address(this).balance, "Cannot afford to lose this bet.");

        emit Commit(commit, clientSeed, amount);
    }

    function prepareBetRoulette(uint betMask, uint amount, uint8 bonuses) private returns (uint40 retMask, uint8 retRollUnder, uint128 possibleWinAmount) {
        uint8 rollUnder = uint8(((betMask * POPCNT_MULT) & POPCNT_MASK) % POPCNT_MODULO);
        uint mask = betMask;

        possibleWinAmount = getRouletteWinAmount(amount, 36, rollUnder, bonuses, true);
        require (possibleWinAmount <= amount + maxProfitRoulette, "maxProfitRoulette limit violation.");

        retMask = uint40(mask);
        retRollUnder = rollUnder;
    }

    function settleBet(uint reveal) external onlyCroupier {
        uint commit = uint(keccak256(abi.encodePacked(reveal)));

        Bet storage bet = bets[commit];
        uint placeBlockNumber = bet.placeBlockNumber;

        require (block.number > placeBlockNumber, "settleBet in the same block as placeBet, or before.");
        require (block.number <= placeBlockNumber + BET_EXPIRATION_BLOCKS, "Can't be queried by EVM.");

        if (bet.modulo == PLINKO_ID) {
            settleBetPlinko(bet, reveal);
        } else if (bet.modulo == SLOTS_ID) {
            settleBetSlots(bet, reveal);
        } else {
            settleBetCommon(bet, reveal);
        }

    }

    function settleBetRoulette(uint reveal) external onlyCroupier {
        uint commit = uint(keccak256(abi.encodePacked(reveal)));

        BetRoulette storage betRoulette = betsRoulette[commit];
        uint placeBlockNumber = betRoulette.placeBlockNumber;

        require (betRoulette.totalBetAmount > 0, "Bet already processed");
        require (block.number > placeBlockNumber, "settleBet in the same block as placeBet, or before.");
        require (block.number <= placeBlockNumber + BET_EXPIRATION_BLOCKS, "Can't be queried by EVM.");

        settleBetRoulette(betRoulette, reveal);
    }

    // Common bets
    function settleBetCommon(Bet storage bet, uint reveal) private {
        uint amount = bet.amount;
        uint8 rollUnder = bet.rollUnder;

        require (amount != 0, "Bet should be in an 'active' state");

        bet.amount = 0;
        bytes32 entropy = keccak256(abi.encodePacked(reveal, bet.clientSeed));
        uint dice = uint(entropy) % bet.modulo;
        uint diceWinAmount;
        uint _jackpotFee;
        uint diceWin;

        if (bet.modulo <= MAX_MASK_MODULO) {
            if ((2 ** dice) & bet.mask != 0) {
                (diceWinAmount, _jackpotFee) = getDiceWinAmount(amount, bet.modulo, rollUnder, bet.gambler, false);
                diceWin = diceWinAmount;
            }
        } else {
            if (dice < rollUnder) {
                (diceWinAmount, _jackpotFee) = getDiceWinAmount(amount, bet.modulo, rollUnder, bet.gambler, false);
                diceWin = diceWinAmount;
            }
        }

        lockedInBets -= uint128(bet.locked);

        uint jackpotWin = checkJackPotWin(entropy, amount, bet.modulo);
        if (jackpotWin > 0) {
            emit JackpotPayment(bet.gambler, uint(keccak256(abi.encodePacked(reveal))), jackpotWin);
        }

        sendFunds(
          bet.gambler,
          diceWin + jackpotWin == 0 ? 1 wei : diceWin + jackpotWin,
          diceWin,
          uint(keccak256(abi.encodePacked(reveal))),
          'payment'
        );
    }

    // Plinko
    function settleBetPlinko(Bet storage bet, uint reveal) private {
        uint amount = bet.amount;
        uint rollUnder = bet.rollUnder;

        require (amount != 0, "Bet should be in an 'active' state");

        bet.amount = 0;
        bytes32 entropy = keccak256(abi.encodePacked(reveal, bet.clientSeed));
        uint dice = uint(entropy) % bet.modulo;
        uint diceWin = _plinkoGetDiceWin(dice, amount, rollUnder, bet.gambler);

        lockedInBets -= uint128(bet.locked);

        uint jackpotWin = checkJackPotWin(entropy, amount, bet.modulo);
        if (jackpotWin > 0) {
            emit JackpotPayment(bet.gambler, uint(keccak256(abi.encodePacked(reveal))), jackpotWin);
        }

        sendFunds(
          bet.gambler,
          diceWin + jackpotWin == 0 ? 1 wei : diceWin + jackpotWin,
          diceWin,
          uint(keccak256(abi.encodePacked(reveal))),
          'payment'
        );
    }

    function _plinkoGetDiceWin(uint dice, uint amount, uint rollUnder, address gambler) internal view returns (uint) {
        uint bytesCount = 0;
        uint diceWin = 1;

        for (uint byteNum = 0; byteNum < PLINKO_BYTES; byteNum += 1) {
            if ((2 ** byteNum) & dice != 0) {
                bytesCount += 1;
            }
        }

        uint inCellRatio = _getPlinkoCellRatio(rollUnder, bytesCount);
        uint jackpotFee = amount >= MIN_JACKPOT_BET ? JACKPOT_FEE : 0;
        uint totalPercentages;

        if (plinkoSkipComission == 2) {
          totalPercentages = PLINKO_PERCENT + ADVERTISE_PERCENT + DIVIDENDS_PERCENT;
        } else {
          totalPercentages = HOUSE_EDGE_PERCENT + ADVERTISE_PERCENT + DIVIDENDS_PERCENT;
        }

        uint houseEdge = amount * (totalPercentages - getBonusProgrammLevel(gambler)) / PERCENTAGES_BASE;
        if (houseEdge < HOUSE_EDGE_MINIMUM_AMOUNT) {
            houseEdge = HOUSE_EDGE_MINIMUM_AMOUNT;
        }

        diceWin = (amount - houseEdge - jackpotFee) * inCellRatio / 100;

        return diceWin;
    }

    function _getPlinkoCellRatio(uint plinkoNum, uint cell) internal view returns (uint cellRatio) {
      if (plinkoNum == 1) {
        cellRatio = PLINKO1Ratios[cell];
      } else if (plinkoNum == 2) {
        cellRatio = PLINKO2Ratios[cell];
      } else {
        cellRatio = PLINKO3Ratios[cell];
      }
    }

    // Slots
    function settleBetSlots(Bet storage bet, uint reveal) private {
        uint amount = bet.amount;
        uint modulo = bet.modulo;

        require (amount != 0, "Bet should be in an 'active' state");

        bet.amount = 0;
        bytes32 entropy = keccak256(abi.encodePacked(reveal, bet.clientSeed));
        uint diceWin = _slotsWinAmount(entropy, amount, bet.gambler);

        lockedInBets -= uint128(bet.locked);

        uint jackpotWin = checkJackPotWin(entropy, amount, modulo);
        if (jackpotWin > 0) {
            emit JackpotPayment(bet.gambler, uint(keccak256(abi.encodePacked(reveal))), jackpotWin);
        }

        sendFunds(
          bet.gambler,
          diceWin + jackpotWin == 0 ? 1 wei : diceWin + jackpotWin,
          diceWin,
          uint(keccak256(abi.encodePacked(reveal))),
          'payment'
        );
    }

    function _slotsWinAmount(bytes32 entropy, uint amount, address gambler) internal view returns (uint winAmount) {
        uint8 wins;
        uint8 wild;

        (wins, wild) = _slotsCheckWin(entropy);

        winAmount = 0;

        uint jackpotFee = amount >= MIN_JACKPOT_BET ? JACKPOT_FEE : 0;
        uint totalPercentages = HOUSE_EDGE_PERCENT + ADVERTISE_PERCENT + DIVIDENDS_PERCENT;
        uint houseEdge = amount * (totalPercentages - getBonusProgrammLevel(gambler)) / PERCENTAGES_BASE;

        if (houseEdge < HOUSE_EDGE_MINIMUM_AMOUNT) {
            houseEdge = HOUSE_EDGE_MINIMUM_AMOUNT;
        }

        winAmount = (amount - houseEdge - jackpotFee) / 100 * SLOTSWinsRatios[wins];
        winAmount += (amount - houseEdge - jackpotFee) / 100 * SLOTSWildRatios[wild];
    }

    function _slotsCheckWin(bytes32 slots) internal pure returns(uint8 wins, uint8 wild) {
        uint curNum;
        uint prevNum;
        bytes1 charAtPos;
        uint8 firstNums;
        uint8 prevWins = 0;
        uint8 curWins = 0;

        wins = 0;
        wild = 0;

        for(uint8 i = 0; i < SLOTS_COUNT; i++) {
            charAtPos = charAt(slots, i + 2);
            firstNums = getLastN(charAtPos, 4);
            curNum = uint(firstNums);

            if (curNum > 8) {
                curNum = 16 - curNum;
            }

            if (curNum == 7) wild += 1;

            if (i == 0) {
                prevNum = curNum;
                continue;
            }

            if (prevNum == curNum) {
                curWins += 1;
            } else {
                prevWins = (curWins > prevWins) ? curWins : prevWins;
                curWins = 0;
            }

            prevNum = curNum;
        }

        wins = (curWins > prevWins) ? curWins : prevWins;
    }

    function settleBetRoulette(BetRoulette storage betRoulette, uint reveal) private {
        require (betRoulette.totalBetAmount != 0, "Bet should be in an 'active' state");
        address payable gambler = betRoulette.gambler;
        bytes32 entropy = keccak256(abi.encodePacked(reveal, betRoulette.clientSeed));
        uint diceWin = 0;
        uint diceWinAmount;
        uint feeToJP = betRoulette.totalBetAmount >= MIN_JACKPOT_BET ? JACKPOT_FEE / betRoulette.betsCount : 0;

        uint dice = uint(entropy) % ROULETTE_ID;

        uint8 bonuses = getBonusProgrammLevel(betRoulette.gambler);

        for(uint8 index = 0; index < betRoulette.betsCount; index += 1) {
          if ((2 ** dice) & betRoulette.mask[index] != 0) {
              diceWinAmount = getRouletteWinAmount(betRoulette.amount[index] - feeToJP, ROULETTE_ID - 1, betRoulette.rollUnder[index], bonuses, false);
              diceWin += diceWinAmount;
          }
        }

        lockedInBets -= betRoulette.locked;

        uint jackpotWin = checkJackPotWin(entropy, betRoulette.totalBetAmount, ROULETTE_ID);
        if (jackpotWin > 0) {
            emit JackpotPayment(gambler, uint(keccak256(abi.encodePacked(reveal))), jackpotWin);
        }

        sendFunds(
          gambler,
          diceWin + jackpotWin == 0 ? 1 wei : diceWin + jackpotWin,
          diceWin,
          uint(keccak256(abi.encodePacked(reveal))),
          'payment'
        );

        betRoulette.totalBetAmount = 0;
    }

    function refundBet(uint commit) external {
        Bet storage bet = bets[commit];
        uint amount = bet.amount;

        require (amount != 0, "Bet should be in an 'active' state");
        require (block.number > bet.placeBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM.");

        bet.amount = 0;
        lockedInBets -= uint128(bet.locked);

        if (amount >= MIN_JACKPOT_BET && jackpotSize > JACKPOT_FEE) {
          jackpotSize -= uint128(JACKPOT_FEE);
        }

        sendFunds(bet.gambler, amount, amount, commit, 'refund');
    }

    function refundBetRoulette(uint commit) external {
        BetRoulette storage betRoulette = betsRoulette[commit];
        uint amount = betRoulette.totalBetAmount;

        require (amount != 0, "Bet should be in an 'active' state");
        require (block.number > betRoulette.placeBlockNumber + BET_EXPIRATION_BLOCKS, "Blockhash can't be queried by EVM.");

        betRoulette.totalBetAmount = 0;

        for(uint8 index = 0; index < betRoulette.betsCount; index += 1) {
          betRoulette.amount[index] = 0;
        }

        lockedInBets -= betRoulette.locked;

        if (amount >= MIN_JACKPOT_BET && jackpotSize > JACKPOT_FEE) {
          jackpotSize -= uint128(JACKPOT_FEE);
        }

        sendFunds(betRoulette.gambler, amount, amount, commit, 'refund');
    }

    function getDiceWinAmount(uint amount, uint32 modulo, uint8 rollUnder, address gambler, bool init) private returns (uint128 winAmount, uint jackpotFee) {
        require (0 < rollUnder && rollUnder <= modulo, "Win probability out of range.");

        jackpotFee = amount >= MIN_JACKPOT_BET ? JACKPOT_FEE : 0;
        uint8 totalPercentages;

        if (plinkoSkipComission == 2) { // Plinko
          totalPercentages = PLINKO_PERCENT + ADVERTISE_PERCENT + DIVIDENDS_PERCENT;
        } else { // All other games
          totalPercentages = HOUSE_EDGE_PERCENT + ADVERTISE_PERCENT + DIVIDENDS_PERCENT;
        }

        uint houseEdge = amount * (totalPercentages - getBonusProgrammLevel(gambler)) / PERCENTAGES_BASE;
        if (houseEdge < HOUSE_EDGE_MINIMUM_AMOUNT) {
            houseEdge = HOUSE_EDGE_MINIMUM_AMOUNT;
        }

        require (houseEdge + jackpotFee <= amount, "Bet doesn't even cover house edge.");

        if (init) {
          totalDividends += amount * DIVIDENDS_PERCENT / PERCENTAGES_BASE;
          totalAdvertise += amount * ADVERTISE_PERCENT / PERCENTAGES_BASE;
        }

        if (modulo == PLINKO_ID) {
          // We lock maximum for selected plinko row
          if (rollUnder == 1) {
            modulo = 10; // equal to  PLINKO1Ratios[0] / 100
          } else if (rollUnder == 2) {
            modulo = 20; // equal to  PLINKO2Ratios[0] / 100
          } else {
            modulo = 50; // equal to  PLINKO3Ratios[0] / 100
          }

          rollUnder = 1;
        }

        if (modulo == SLOTS_ID) {
          modulo = 5; // We lock x5 for slots
          rollUnder = 1;
        }

        winAmount = uint128((amount - houseEdge - jackpotFee) * modulo / rollUnder);
    }

    function getRouletteWinAmount(uint amount, uint32 modulo, uint8 rollUnder, uint8 bonuses, bool init) private returns (uint128 winAmount) {
        require (0 < rollUnder && rollUnder <= modulo, "Win probability out of range.");
        uint houseEdge;

        if (rouletteSkipComission == 1) { // Roulette
          houseEdge = amount * ROULETTE_PERCENT / PERCENTAGES_BASE;
        } else {
          if (init) {
            totalDividends += amount * DIVIDENDS_PERCENT / PERCENTAGES_BASE;
            totalAdvertise += amount * ADVERTISE_PERCENT / PERCENTAGES_BASE;
          }

          houseEdge = amount * (HOUSE_EDGE_PERCENT + ADVERTISE_PERCENT + DIVIDENDS_PERCENT - bonuses) / PERCENTAGES_BASE;
        }

        if (houseEdge < HOUSE_EDGE_MINIMUM_AMOUNT) {
            houseEdge = HOUSE_EDGE_MINIMUM_AMOUNT;
        }
        require (houseEdge <= amount, "Bet doesn't even cover house edge.");

        winAmount = uint128((amount - houseEdge) * modulo / rollUnder);
    }

    function sendFunds(address payable beneficiary, uint amount, uint successLogAmount, uint commit, string memory paymentType) private {
        if (beneficiary.send(amount)) {
            emit Payment(beneficiary, commit, successLogAmount, paymentType);
        } else {
            emit FailedPayment(beneficiary, commit, amount, paymentType);
        }
    }

    function checkJackPotWin(bytes32 entropy, uint amount, uint modulo) internal returns (uint jackpotWin) {
        jackpotWin = 0;
        if (amount >= MIN_JACKPOT_BET) {
            uint jackpotRng = (uint(entropy) / modulo) % JACKPOT_MODULO;

            if (jackpotRng == luckyNumber) {
                jackpotWin = jackpotSize;
                jackpotSize = 0;
            }
        }
    }

    uint constant POPCNT_MULT = 0x0000000000002000000000100000000008000000000400000000020000000001;
    uint constant POPCNT_MASK = 0x0001041041041041041041041041041041041041041041041041041041041041;
    uint constant POPCNT_MODULO = 0x3F;

    function charAt(bytes32 b, uint char) private pure returns (bytes1) {
        return bytes1(uint8(uint(b) / (2**((31 - char) * 8))));
    }

    function getLastN(bytes1 a, uint8 n) private pure returns (uint8) {
        uint8 lastN = uint8(a) % uint8(2) ** n;
        return lastN;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"ADVERTISE_PERCENT","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"reveal","type":"uint256"}],"name":"settleBet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"bonusProgrammAccumulated","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"xEtherTokensContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rouletteSkipComission","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxProfitRoulette","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newCroupier","type":"address"},{"name":"newSecretSigner","type":"address"},{"name":"newModerator","type":"address"}],"name":"setAddresses","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rouletteTableLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"moderator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"gambler","type":"address"}],"name":"getBonusProgrammLevel","outputs":[{"name":"discount","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"xEtherContract","type":"address"}],"name":"setXEtherContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"kill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"secretSigner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"jackpotSize","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newDividendsLimit","type":"uint256"}],"name":"changeDividendsLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newPlinkoPercent","type":"uint8"}],"name":"setNewPlinkoPercents","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"croupier","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newRouletteTableLimit","type":"uint256"}],"name":"setRouletteTableLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"withdrawAmount","type":"uint256"}],"name":"withdrawAdvertiseFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"betMask","type":"uint256[]"},{"name":"betAmount","type":"uint256[]"},{"name":"commitLastBlock","type":"uint256"},{"name":"commit","type":"uint256"},{"name":"clientSeed","type":"uint256"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"placeBetRoulette","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_maxProfitPlinko","type":"uint256"}],"name":"setMaxProfitPlinko","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newRouletteState","type":"uint8"},{"name":"_newPlinkoState","type":"uint8"}],"name":"setComissionState","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_maxProfitRoulette","type":"uint256"}],"name":"setMaxProfitRoulette","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"commit","type":"uint256"}],"name":"refundBetRoulette","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalDividends","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalAdvertise","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newHouseEdgePercent","type":"uint8"},{"name":"newDividendsPercent","type":"uint8"},{"name":"newAdvertPercent","type":"uint8"}],"name":"setNewPercents","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"sendDividends","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"maxProfit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PLINKO_PERCENT","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"HOUSE_EDGE_PERCENT","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"luckyNumber","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"withdrawAmount","type":"uint256"}],"name":"withdrawFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"acceptNextOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nextOwner","type":"address"}],"name":"approveNextOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"increaseAmount","type":"uint256"}],"name":"increaseJackpot","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"plinkoSkipComission","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"releaseLockedInBetAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newRoulettePercent","type":"uint8"}],"name":"setNewRoulettePercents","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"betMask","type":"uint256"},{"name":"modulo","type":"uint32"},{"name":"commitLastBlock","type":"uint256"},{"name":"commit","type":"uint256"},{"name":"clientSeed","type":"uint256"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"placeBet","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"lockedInBets","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DIVIDENDS_LIMIT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"commit","type":"uint256"}],"name":"refundBet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"reveal","type":"uint256"}],"name":"settleBetRoulette","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"DIVIDENDS_PERCENT","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ROULETTE_PERCENT","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_maxProfit","type":"uint256"}],"name":"setMaxProfit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxProfitPlinko","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"beneficiary","type":"address"},{"indexed":false,"name":"commit","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"paymentType","type":"string"}],"name":"FailedPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"beneficiary","type":"address"},{"indexed":false,"name":"commit","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"paymentType","type":"string"}],"name":"Payment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"commit","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"JackpotPayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"time","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"PayDividendsSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"time","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"PayDividendsFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"commit","type":"uint256"},{"indexed":false,"name":"clietSeed","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Commit","type":"event"}]

670de0b6b3a7640000600055600180546501000000000061030961ffff199092169190911762ff00001916620a00001764ffff0000001916640a000000001765ff000000000019161790556718fae27693b4000060025560038054600a60ff199091161790556102a06040526103e8608081815261032060a081905261025860c081905261012c60e081905260c86101008190526082610120819052606461014081905260506101608190526032610180526101a0526101c0526101e0526102005261022052610240526102605261028091909152620000e49060049060116200035d565b5060408051610220810182526107d08082526102bc602083018190526101f493830184905261012c6060840181905260c860808501819052606e60a08601819052606460c08701819052603c60e0880181905261010088018290526101208801526101408701526101608601526101808501526101a08401526101c08301939093526101e0820192909252610200810191909152620001889060069060116200035d565b5060408051610220810182526113888082526103206020830181905261012c93830184905260c860608401819052608c60808501819052607860a08601819052606e60c08701819052606460e0880181905260286101008901526101208801526101408701526101608601526101808501526101a08401526101c08301939093526101e08201929092526102008101919091526200022b9060089060116200035d565b50600a8054600154640100000000900460ff166101000261ff001960ff19909216600217919091161790556040805160a081018252600081526032602082015260789181019190915260c860608201526105dc60808201526200029390600b906005620003fa565b506040805160c08101825260008152606e602082015260fa918101919091526101906060820152610bb8608082015261271060a0820152620002da90600c90600662000465565b5060006010556000601155674563918244f40000601255678ac7230489e800006013556731f5c4ed276800006014553480156200031657600080fd5b50600e80546001600160a01b0319908116331790915560158054821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee908117909155601780549092161790556200055e565b600283019183908215620003e85791602002820160005b83821115620003b657835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000374565b8015620003e65782816101000a81549061ffff0219169055600201602081600101049283019260010302620003b6565b505b50620003f692915062000515565b5090565b82805482825590600052602060002090600f01601090048101928215620003e857916020028201600083821115620003b657835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000374565b82805482825590600052602060002090600701600890048101928215620005075791602002820160005b83821115620004d357835183826101000a81548163ffffffff021916908361ffff16021790555092602001926004016020816003010492830192600103026200048f565b8015620005055782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620004d3565b505b50620003f69291506200053a565b6200053791905b80821115620003f657805461ffff191681556001016200051c565b90565b6200053791905b80821115620003f657805463ffffffff1916815560010162000541565b615efc806200056e6000396000f3fe6080604052600436106102ae5760003560e01c806398c7d1e311610175578063d6d30a51116100dc578063e0d44b7911610095578063f2d7afe81161006f578063f2d7afe8146109e5578063f8dbd7ee146109fa578063fbd668a914610a0f578063fc9f12a614610a39576102ae565b8063e0d44b791461097c578063e1fdb4b414610991578063e9c90d01146109bb576102ae565b8063d6d30a511461089f578063d930a45a146108c9578063d98f9740146108de578063db53404c146108f3578063dc023f1514610920578063df88126f14610967576102ae565b8063bd0f1df41161012e578063bd0f1df4146107c8578063becf40b6146107dd578063bf205ebc146107f2578063c10753291461081e578063d06c54fb14610857578063d579fd441461086c576102ae565b806398c7d1e314610718578063997664d714610742578063a5197d1014610757578063a84bf40e1461076c578063a8fc32de146107ab578063b539cd55146107b3576102ae565b80634d61537f1161021957806388475e4e116101d257806388475e4e1461056b5780638a0ba9e2146105a45780638ca022321461067a5780638da5cb5b146106a45780638f6ead62146106b957806392f8dc5e146106ee576102ae565b80634d61537f1461048f57806357246d23146104a45780635e05f374146104d55780636896a9d2146104ff5780636b5c5f391461052c57806380a1a0e514610541576102ae565b8063363bf9641161026b578063363bf964146103a5578063371e6ec4146103ea57806338743904146103ff57806338b48ac3146104145780633bad7e9c1461044757806341c0e1b51461047a576102ae565b80630149e4bb146102b057806316fd381a146102db5780631d70f55c1461030557806322ff5faa1461034a578063255858b31461037b57806333450c5d14610390575b005b3480156102bc57600080fd5b506102c5610a4e565b6040805160ff9092168252519081900360200190f35b3480156102e757600080fd5b506102ae600480360360208110156102fe57600080fd5b5035610a5e565b34801561031157600080fd5b506103386004803603602081101561032857600080fd5b50356001600160a01b0316610beb565b60408051918252519081900360200190f35b34801561035657600080fd5b5061035f610bfd565b604080516001600160a01b039092168252519081900360200190f35b34801561038757600080fd5b506102c5610c0c565b34801561039c57600080fd5b50610338610c1c565b3480156103b157600080fd5b506102ae600480360360608110156103c857600080fd5b506001600160a01b038135811691602081013582169160409091013516610c22565b3480156103f657600080fd5b50610338610cab565b34801561040b57600080fd5b5061035f610cb1565b34801561042057600080fd5b506102c56004803603602081101561043757600080fd5b50356001600160a01b0316610cc0565b34801561045357600080fd5b506102ae6004803603602081101561046a57600080fd5b50356001600160a01b0316610db2565b34801561048657600080fd5b506102ae610e20565b34801561049b57600080fd5b5061035f610ecc565b3480156104b057600080fd5b506104b9610edb565b604080516001600160801b039092168252519081900360200190f35b3480156104e157600080fd5b506102ae600480360360208110156104f857600080fd5b5035610eea565b34801561050b57600080fd5b506102ae6004803603602081101561052257600080fd5b503560ff16610f50565b34801561053857600080fd5b5061035f610fde565b34801561054d57600080fd5b506102ae6004803603602081101561056457600080fd5b5035610fed565b34801561057757600080fd5b506102ae6004803603604081101561058e57600080fd5b506001600160a01b03813516906020013561109e565b6102ae600480360360e08110156105ba57600080fd5b810190602081018135600160201b8111156105d457600080fd5b8201836020820111156105e657600080fd5b803590602001918460208302840111600160201b8311171561060757600080fd5b919390929091602081019035600160201b81111561062457600080fd5b82018360208201111561063657600080fd5b803590602001918460208302840111600160201b8311171561065757600080fd5b91935091508035906020810135906040810135906060810135906080013561116f565b34801561068657600080fd5b506102ae6004803603602081101561069d57600080fd5b5035611676565b3480156106b057600080fd5b5061035f611727565b3480156106c557600080fd5b506102ae600480360360408110156106dc57600080fd5b5060ff81358116916020013516611736565b3480156106fa57600080fd5b506102ae6004803603602081101561071157600080fd5b50356117c3565b34801561072457600080fd5b506102ae6004803603602081101561073b57600080fd5b5035611874565b34801561074e57600080fd5b50610338611a1c565b34801561076357600080fd5b50610338611a22565b34801561077857600080fd5b506102ae6004803603606081101561078f57600080fd5b5060ff8135811691602081013582169160409091013516611a28565b6102ae611ae2565b3480156107bf57600080fd5b50610338611b9d565b3480156107d457600080fd5b506102c5611ba3565b3480156107e957600080fd5b506102c5611bb1565b3480156107fe57600080fd5b50610807611bc1565b6040805161ffff9092168252519081900360200190f35b34801561082a57600080fd5b506102ae6004803603604081101561084157600080fd5b506001600160a01b038135169060200135611bcb565b34801561086357600080fd5b506102ae611cfb565b34801561087857600080fd5b506102ae6004803603602081101561088f57600080fd5b50356001600160a01b0316611d6b565b3480156108ab57600080fd5b506102ae600480360360208110156108c257600080fd5b5035611e3f565b3480156108d557600080fd5b506102c5611f7a565b3480156108ea57600080fd5b506102ae611f83565b3480156108ff57600080fd5b506102ae6004803603602081101561091657600080fd5b503560ff16611ff5565b6102ae600480360360e081101561093657600080fd5b5080359063ffffffff6020820135169060408101359060608101359060808101359060a08101359060c0013561207d565b34801561097357600080fd5b506104b96125d2565b34801561098857600080fd5b506103386125e8565b34801561099d57600080fd5b506102ae600480360360208110156109b457600080fd5b50356125ee565b3480156109c757600080fd5b506102ae600480360360208110156109de57600080fd5b5035612765565b3480156109f157600080fd5b506102c56128ec565b348015610a0657600080fd5b506102c56128fb565b348015610a1b57600080fd5b506102ae60048036036020811015610a3257600080fd5b5035612904565b348015610a4557600080fd5b506103386129b5565b6001546301000000900460ff1681565b6017546001600160a01b03163314610aaa57604051600160e51b62461bcd02815260040180806020018281038252602c815260200180615d4b602c913960400191505060405180910390fd5b6040805160208082018490528251808303820181529183018352815191810191909120600081815260199092529190206001810154600160a81b900464ffffffffff16438110610b2e57604051600160e51b62461bcd028152600401808060200182810382526033815260200180615cd86033913960400191505060405180910390fd5b60fa8101431115610b895760408051600160e51b62461bcd02815260206004820152601860248201527f43616e277420626520717565726965642062792045564d2e0000000000000000604482015290519081900360640190fd5b600182015463ffffffff600160801b90910416620100001415610bb557610bb082856129bb565b610be5565b600182015463ffffffff600160801b909104166103e71415610bdb57610bb08285612bbc565b610be58285612d8f565b50505050565b601b6020526000908152604090205481565b600d546001600160a01b031681565b600154600160281b900460ff1681565b60145481565b600e546001600160a01b03163314610c6e57604051600160e51b62461bcd028152600401808060200182810382526026815260200180615e096026913960400191505060405180910390fd5b601580546001600160a01b03199081166001600160a01b039485161790915560178054821694841694909417909355601680549093169116179055565b60025481565b6016546001600160a01b031681565b6001600160a01b0381166000908152601b60205260408120546801158e460913d000008110801590610cfa575068056bc75e2d6310000081105b15610d085760019150610dac565b68056bc75e2d631000008110158015610d295750681b1ae4d6e2ef50000081105b15610d375760029150610dac565b681b1ae4d6e2ef5000008110158015610d585750683635c9adc5dea0000081105b15610d665760039150610dac565b683635c9adc5dea000008110158015610d88575069010f0cf064dd5920000081105b15610d965760049150610dac565b69010f0cf064dd592000008110610dac57600591505b50919050565b600e546001600160a01b03163314610dfe57604051600160e51b62461bcd028152600401808060200182810382526026815260200180615e096026913960400191505060405180910390fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600e546001600160a01b03163314610e6c57604051600160e51b62461bcd028152600401808060200182810382526026815260200180615e096026913960400191505060405180910390fd5b601854600160801b90046001600160801b031615610ebe57604051600160e51b62461bcd028152600401808060200182810382526048815260200180615d9b6048913960600191505060405180910390fd5b600e546001600160a01b0316ff5b6015546001600160a01b031681565b6018546001600160801b031681565b600e546001600160a01b0316331480610f0d57506016546001600160a01b031633145b610f4b57604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b600055565b600e546001600160a01b0316331480610f7357506016546001600160a01b031633145b610fb157604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b600a8160ff161115610fc257600080fd5b600a805460ff9092166101000261ff0019909216919091179055565b6017546001600160a01b031681565b600e546001600160a01b031633148061101057506016546001600160a01b031633145b61104e57604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b693f870857a3e0e3800000811061109957604051600160e51b62461bcd02815260040180806020018281038252602f815260200180615ba0602f913960400191505060405180910390fd5b600255565b600e546001600160a01b031633146110ea57604051600160e51b62461bcd028152600401808060200182810382526026815260200180615e096026913960400191505060405180910390fd5b60115481111561112e57604051600160e51b62461bcd028152600401808060200182810382526024815260200180615d776024913960400191505060405180910390fd5b6011805482900390556040805180820190915260088152600160c01b67776974686472617702602082015261116b90839083908190600090613052565b5050565b6000848152601a602052604090206002543411156111d75760408051600160e51b62461bcd02815260206004820181905260248201527f426574732073756d206d757374206265204c5445207461626c65206c696d6974604482015290519081900360640190fd5b600781018054600160a01b60ff021916600160a01b60ff8c160217908190556001600160a01b03161561123e57604051600160e51b62461bcd028152600401808060200182810382526021815260200180615cb76021913960400191505060405180910390fd5b854311156112965760408051600160e51b62461bcd02815260206004820152601360248201527f436f6d6d69742068617320657870697265642e00000000000000000000000000604482015290519081900360640190fd5b6040805164ffffffffff881660d81b6020808301919091526025808301899052835180840390910181526045830180855281519183019190912060009091526065830180855252601b608583015260a5820186905260c58201859052915160019260e5808401939192601f1981019281900390910190855afa158015611320573d6000803e3d6000fd5b5050604051601f1901516015546001600160a01b039081169116149050806113eb57506040805164ffffffffff881660d81b6020808301919091526025808301899052835180840390910181526045830180855281519183019190912060009091526065830180855252601c608583015260a5820186905260c58201859052915160019260e5808401939192601f1981019281900390910190855afa1580156113cd573d6000803e3d6000fd5b5050604051601f1901516015546001600160a01b0390811691161490505b61143f5760408051600160e51b62461bcd02815260206004820152601d60248201527f4543445341207369676e6174757265206973206e6f742076616c69642e000000604482015290519081900360640190fd5b6000546010541061145257611452611ae2565b6114c0858b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d91829185019084908082843760009201919091525061320f92505050565b6001830180546001600160801b039283166001600160801b0319909116179081905560078401805460ff909416600160a01b02600160a01b60ff02199094169390931790925560188054600160801b80820484169484169490940183168402908316179081905530319290041611156115835760408051600160e51b62461bcd02815260206004820152601f60248201527f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e00604482015290519081900360640190fd5b60018054600160281b900460ff16146115ac57336000908152601b602052604090208054340190555b3480825560048201805464ffffffffff431664ffffffffff19909116179055600582018590556007820180546001600160a01b0319163317905567016345785d8a000011156115fc576000611605565b66038d7ea4c680005b601880546001600160801b031981166001600160801b0391821693909301169190911790556040805186815260208101869052348183015290517f7cb363f1be918dc2e8cadae9eb87766dacf1f4f49ae904291aa3e59fc593c413916060908290030190a150505050505050505050565b600e546001600160a01b031633148061169957506016546001600160a01b031633145b6116d757604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b693f870857a3e0e3800000811061172257604051600160e51b62461bcd02815260040180806020018281038252602d815260200180615bf5602d913960400191505060405180910390fd5b601355565b600e546001600160a01b031681565b600e546001600160a01b031633148061175957506016546001600160a01b031633145b61179757604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b6001805465ff00000000001916600160281b60ff94851602179055600a805460ff191691909216179055565b600e546001600160a01b03163314806117e657506016546001600160a01b031633145b61182457604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b693f870857a3e0e3800000811061186f57604051600160e51b62461bcd02815260040180806020018281038252602f815260200180615c22602f913960400191505060405180910390fd5b601455565b6000818152601a602052604090208054806118c357604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c956022913960400191505060405180910390fd5b600482015464ffffffffff90811660fa0116431161191557604051600160e51b62461bcd028152600401808060200182810382526022815260200180615e846022913960400191505060405180910390fd5b60008083555b600783015460ff600160a01b909104811690821610156119525760ff8116600090815260028401602052604081205560010161191b565b506001820154601880546001600160801b03808216938116600160801b92839004821603160291909117905567016345785d8a000081108015906119a9575060185466038d7ea4c680006001600160801b03909116115b156119d957601880546001600160801b031981166001600160801b0391821666038d7ea4c67fff19019091161790555b60078201546040805180820190915260068152600160d21b651c99599d5b99026020820152611a17916001600160a01b031690839081908790613052565b505050565b60105481565b60115481565b600e546001600160a01b03163314611a7457604051600160e51b62461bcd028152600401808060200182810382526026815260200180615e096026913960400191505060405180910390fd5b60058260ff161015611a8557600080fd5b601e818385010160ff161115611a9a57600080fd5b6001805460ff938416620100000262ff00001993851663010000000263ff0000001995909616600160201b0264ff000000001990921691909117939093169390931716179055565b600d546001600160a01b031615611b9b57601054600d5460408051600160e11b632f3c22c702815290516001600160a01b0390921691635e78458e918491600480830192600092919082900301818588803b158015611b4057600080fd5b505af1158015611b54573d6000803e3d6000fd5b505060006010555050604080514281526020810184905281517f384e13b223db78131ff8fc373c4e03bbab38d141226a80644700e32c974dfa8793509081900390910190a1505b565b60125481565b600a54610100900460ff1681565b600154600160201b900460ff1681565b60015461ffff1681565b600e546001600160a01b03163314611c1757604051600160e51b62461bcd028152600401808060200182810382526026815260200180615e096026913960400191505060405180910390fd5b3031811115611c5a57604051600160e51b62461bcd028152600401808060200182810382526024815260200180615d776024913960400191505060405180910390fd5b60185430316001600160801b03808316600160801b90930481169290920190911682011115611cca5760408051600160e51b62461bcd0281526020600482015260116024820152600160791b702737ba1032b737bab3b410333ab732399702604482015290519081900360640190fd5b61116b8282836000604051806040016040528060088152602001600160c01b67776974686472617702815250613052565b600f546001600160a01b03163314611d4757604051600160e51b62461bcd028152600401808060200182810382526026815260200180615bcf6026913960400191505060405180910390fd5b600f54600e80546001600160a01b0319166001600160a01b03909216919091179055565b600e546001600160a01b03163314611db757604051600160e51b62461bcd028152600401808060200182810382526026815260200180615e096026913960400191505060405180910390fd5b600e546001600160a01b0382811691161415611e1d5760408051600160e51b62461bcd02815260206004820152601d60248201527f43616e6e6f7420617070726f76652063757272656e74206f776e65722e000000604482015290519081900360640190fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600e546001600160a01b0316331480611e6257506016546001600160a01b031633145b611ea057604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b3031811115611ee357604051600160e51b62461bcd028152600401808060200182810382526024815260200180615d776024913960400191505060405180910390fd5b60185430316001600160801b03808316600160801b90930481169290920190911682011115611f535760408051600160e51b62461bcd0281526020600482015260116024820152600160791b702737ba1032b737bab3b410333ab732399702604482015290519081900360640190fd5b601880546001600160801b031981166001600160801b039182169390930116919091179055565b600a5460ff1681565b600e546001600160a01b0316331480611fa657506016546001600160a01b031633145b611fe457604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b601880546001600160801b03169055565b600e546001600160a01b031633148061201857506016546001600160a01b031633145b61205657604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b600a8160ff16111561206757600080fd5b6003805460ff191660ff92909216919091179055565b60008481526019602052604090206003810154600160281b90046001600160a01b0316156120df57604051600160e51b62461bcd028152600401808060200182810382526021815260200180615cb76021913960400191505060405180910390fd5b34606463ffffffff891611156121665763ffffffff881662010000148061210d575063ffffffff88166103e7145b6121615760408051600160e51b62461bcd02815260206004820152601e60248201527f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e0000604482015290519081900360640190fd5b6121d7565b60018863ffffffff161180156121835750606463ffffffff891611155b6121d75760408051600160e51b62461bcd02815260206004820152601e60248201527f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e0000604482015290519081900360640190fd5b662386f26fc1000081101580156121f85750693f870857a3e0e38000008111155b61223a5760408051600160e51b62461bcd02815260206004820152601e6024820152600080516020615d0b833981519152604482015290519081900360640190fd5b60008911801561224d5750600160281b89105b6122a15760408051600160e51b62461bcd02815260206004820152601c60248201527f4d61736b2073686f756c642062652077697468696e2072616e67652e00000000604482015290519081900360640190fd5b864311156122f95760408051600160e51b62461bcd02815260206004820152601360248201527f436f6d6d69742068617320657870697265642e00000000000000000000000000604482015290519081900360640190fd5b6040805164ffffffffff891660d81b60208083019190915260258083018a9052835180840390910181526045830180855281519183019190912060009091526065830180855252601b608583015260a5820187905260c58201869052915160019260e5808401939192601f1981019281900390910190855afa158015612383573d6000803e3d6000fd5b5050604051601f1901516015546001600160a01b0390811691161490508061244e57506040805164ffffffffff891660d81b60208083019190915260258083018a9052835180840390910181526045830180855281519183019190912060009091526065830180855252601c608583015260a5820187905260c58201869052915160019260e5808401939192601f1981019281900390910190855afa158015612430573d6000803e3d6000fd5b5050604051601f1901516015546001600160a01b0390811691161490505b6124a25760408051600160e51b62461bcd02815260206004820152601d60248201527f4543445341207369676e6174757265206973206e6f742076616c69642e000000604482015290519081900360640190fd5b600054601054106124b5576124b5611ae2565b6000806124c68b8b858b8b33614e22565b8160ff1691508660010160008291906101000a8154816001600160801b0302191690836001600160801b03160217905550819450829350505050828460000181905550898460010160106101000a81548163ffffffff021916908363ffffffff160217905550818460010160146101000a81548160ff021916908360ff160217905550438460010160156101000a81548164ffffffffff021916908364ffffffffff160217905550808460030160006101000a81548164ffffffffff021916908364ffffffffff160217905550868460020181905550338460030160056101000a8154816001600160a01b0302191690836001600160a01b031602179055505050505050505050505050565b601854600160801b90046001600160801b031681565b60005481565b600081815260196020526040902080548061263d57604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c956022913960400191505060405180910390fd5b600182015464ffffffffff600160a81b909104811660fa0116431161269657604051600160e51b62461bcd028152600401808060200182810382526022815260200180615e846022913960400191505060405180910390fd5b600082556001820154601880546001600160801b03808216938116600160801b92839004821603160291909117905567016345785d8a000081108015906126f0575060185466038d7ea4c680006001600160801b03909116115b1561272057601880546001600160801b031981166001600160801b0391821666038d7ea4c67fff19019091161790555b611a178260030160059054906101000a90046001600160a01b0316828386604051806040016040528060068152602001600160d21b651c99599d5b9902815250613052565b6017546001600160a01b031633146127b157604051600160e51b62461bcd02815260040180806020018281038252602c815260200180615d4b602c913960400191505060405180910390fd5b60408051602080820184905282518083038201815291830183528151918101919091206000818152601a9092529190206004810154815464ffffffffff909116906128465760408051600160e51b62461bcd02815260206004820152601560248201527f42657420616c72656164792070726f6365737365640000000000000000000000604482015290519081900360640190fd5b80431161288757604051600160e51b62461bcd028152600401808060200182810382526033815260200180615cd86033913960400191505060405180910390fd5b60fa81014311156128e25760408051600160e51b62461bcd02815260206004820152601860248201527f43616e277420626520717565726965642062792045564d2e0000000000000000604482015290519081900360640190fd5b610be5828561505e565b60015462010000900460ff1681565b60035460ff1681565b600e546001600160a01b031633148061292757506016546001600160a01b031633145b61296557604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b693f870857a3e0e380000081106129b057604051600160e51b62461bcd028152600401808060200182810382526027815260200180615e2f6027913960400191505060405180910390fd5b601255565b60135481565b81546001830154600160a01b900460ff1681612a0b57604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c956022913960400191505060405180910390fd5b6000808555600285015460408051602080820188905281830193909352815180820383018152606090910190915280519101206001860154909190600160801b900463ffffffff168281612a5b57fe5b0690506000612a838286868a60030160059054906101000a90046001600160a01b03166152e9565b600188018054601880546001600160801b03808216938116600160801b928390048216031681029290921790559054919250600091612acd9186918991900463ffffffff16615409565b90508015612b335760038801546040805160208082018b9052825180830382018152828401808552815191909201209052606081018490529051600160281b9092046001600160a01b031691600080516020615d2b833981519152916080908290030190a25b6003880154612bb290600160281b90046001600160a01b031682840115612b5c57828401612b5f565b60015b848a604051602001808281526020019150506040516020818303038152906040528051906020012060001c604051806040016040528060078152602001600160ca1b661c185e5b595b9d02815250613052565b5050505050505050565b81546001830154600160801b900463ffffffff1681612c0f57604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c956022913960400191505060405180910390fd5b6000808555600285015460408051602080820188905281830193909352815180820383018152606090910190915280519101206003860154909190612c679083908690600160281b90046001600160a01b031661546a565b6001870154601880546001600160801b03808216938116600160801b92839004821603160291909117905590506000612ca1838686615409565b90508015612d075760038701546040805160208082018a9052825180830382018152828401808552815191909201209052606081018490529051600160281b9092046001600160a01b031691600080516020615d2b833981519152916080908290030190a25b6003870154612d8690600160281b90046001600160a01b031682840115612d3057828401612d33565b60015b8489604051602001808281526020019150506040516020818303038152906040528051906020012060001c604051806040016040528060078152602001600160ca1b661c185e5b595b9d02815250613052565b50505050505050565b81546001830154600160a01b900460ff1681612ddf57604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c956022913960400191505060405180910390fd5b6000808555600285015460408051602080820188905281830193909352815180820383018152606090910190915280519101206001860154909190600160801b900463ffffffff168281612e2f57fe5b0690506000806000602860ff168960010160109054906101000a900463ffffffff1663ffffffff1611612ec4576003890154600285900a1664ffffffffff1615612ebf57612eac878a60010160109054906101000a900463ffffffff16888c60030160059054906101000a90046001600160a01b03166000615590565b6001600160801b03909116935091508290505b612f1b565b8560ff16841015612f1b57612f08878a60010160109054906101000a900463ffffffff16888c60030160059054906101000a90046001600160a01b03166000615590565b6001600160801b03909116935091508290505b600189018054601880546001600160801b03808216938116600160801b928390048216031681029290921790559054600091612f619188918b910463ffffffff16615409565b90508015612fc75760038a01546040805160208082018d9052825180830382018152828401808552815191909201209052606081018490529051600160281b9092046001600160a01b031691600080516020615d2b833981519152916080908290030190a25b60038a015461304690600160281b90046001600160a01b031682840115612ff057828401612ff3565b60015b848c604051602001808281526020019150506040516020818303038152906040528051906020012060001c604051806040016040528060078152602001600160ca1b661c185e5b595b9d02815250613052565b50505050505050505050565b6040516001600160a01b0386169085156108fc029086906000818181858888f1935050505015613144577fe0be3e380b9d096e907f7ef72465cfc68009c6e3e00d00799c10f946785b1b248583858460405180856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156131025781810151838201526020016130ea565b50505050905090810190601f16801561312f5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1613208565b7f5e93fffcba141e3bc2692d3006ceaef1fe77cf16237eda40090c2ee470c5c8e58583868460405180856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156131ca5781810151838201526020016131b2565b50505050905090810190601f1680156131f75780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a15b5050505050565b6000838152601a602052604081206007810154829190829060ff600160a01b820416906000198201908390819081908190613252906001600160a01b0316610cc0565b90505b60008c8660ff168151811061326657fe5b602002602001015111801561329757508b51600160281b908d9060ff881690811061328d57fe5b6020026020010151105b6132eb5760408051600160e51b62461bcd02815260206004820152601c60248201527f4d61736b2073686f756c642062652077697468696e2072616e67652e00000000604482015290519081900360640190fd5b8b8560ff16815181106132fa57fe5b602002602001015164090400900914156137ba57662386f26fc100006004028b8660ff168151811061332857fe5b60200260200101511015801561335e5750693f870857a3e0e38000008b8660ff168151811061335357fe5b602002602001015111155b6133a05760408051600160e51b62461bcd02815260206004820152601e6024820152600080516020615d0b833981519152604482015290519081900360640190fd5b8a8560ff16815181106133af57fe5b602002602001015187019650348711156133fd57604051600160e51b62461bcd028152600401808060200182810382526026815260200180615de36026913960400191505060405180910390fd5b61342a61900060048d8860ff168151811061341457fe5b60200260200101518161342357fe5b04836157c5565b8a60060160008960ff1660ff16815260200190815260200160002060008c60030160008b60ff1660ff1681526020019081526020016000206000849a508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060048b8660ff16815181106134b557fe5b6020026020010151816134c457fe5b60ff8716600081815260028c0160205260409020929091049091558b516134f991640900000000916004918f91811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060048b8660ff168151811061358457fe5b60200260200101518161359357fe5b60ff8816600090815260028b016020526040902091900490556001600160801b03808516908416116135c557836135c7565b825b93506001860195506135e5600960048d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060048b8660ff168151811061367057fe5b60200260200101518161367f57fe5b60ff8816600090815260028b016020526040902091900490556001600160801b03808516908416116136b157836136b3565b825b93506001860195506136d4630400000060048d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060048b8660ff168151811061375f57fe5b60200260200101518161376e57fe5b60ff8816600090815260028b016020526040902091900490556001600160801b03808516908416116137a057836137a2565b825b9350838901985060018601955060048a019950614dfa565b8b8560ff16815181106137c957fe5b60200260200101516409366c909d1415613f5357662386f26fc100006009028b8660ff16815181106137f757fe5b60200260200101511015801561382d5750693f870857a3e0e38000008b8660ff168151811061382257fe5b602002602001015111155b61386f5760408051600160e51b62461bcd02815260206004820152601e6024820152600080516020615d0b833981519152604482015290519081900360640190fd5b8a8560ff168151811061387e57fe5b602002602001015187019650348711156138cc57604051600160e51b62461bcd028152600401808060200182810382526026815260200180615de36026913960400191505060405180910390fd5b6138e2609060098d8860ff168151811061341457fe5b8a60060160008960ff1660ff16815260200190815260200160002060008c60030160008b60ff1660ff1681526020019081526020016000206000849a508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060098b8660ff168151811061396d57fe5b60200260200101518161397c57fe5b60ff8716600081815260028c0160205260409020929091049091558b516139ae91619000916009918f91811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060098b8660ff1681518110613a3957fe5b602002602001015181613a4857fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611613a7a5783613a7c565b825b9350600186019550613a9c6224000060098d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060098b8660ff1681518110613b2757fe5b602002602001015181613b3657fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611613b685783613b6a565b825b9350600186019550613b8a6248000060098d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060098b8660ff1681518110613c1557fe5b602002602001015181613c2457fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611613c565783613c58565b825b9350600186019550613c7a64090000000060098d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060098b8660ff1681518110613d0557fe5b602002602001015181613d1457fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611613d465783613d48565b825b9350600186019550613d7b633600000060098d8860ff1681518110613d6957fe5b60200260200101516002028161342357fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060098b8660ff1681518110613e0657fe5b602002602001015160020281613e1857fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611613e4a5783613e4c565b825b9350600186019550613e6a600d60098d8860ff1681518110613d6957fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060098b8660ff1681518110613ef557fe5b602002602001015160020281613f0757fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611613f395783613f3b565b825b9350838901985060018601955060078a019950614dfa565b8b8560ff1681518110613f6257fe5b602002602001015164048012424214156144ed57662386f26fc100006005028b8660ff1681518110613f9057fe5b602002602001015110158015613fc65750693f870857a3e0e38000008b8660ff1681518110613fbb57fe5b602002602001015111155b6140085760408051600160e51b62461bcd02815260206004820152601e6024820152600080516020615d0b833981519152604482015290519081900360640190fd5b8a8560ff168151811061401757fe5b6020026020010151870196503487111561406557604051600160e51b62461bcd028152600401808060200182810382526026815260200180615de36026913960400191505060405180910390fd5b61407d6202400060058d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff1681526020019081526020016000206000849a508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060058b8660ff168151811061410857fe5b60200260200101518161411757fe5b048860020160008860ff1660ff168152602001908152602001600020819055506001860195506141556212000060058d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060058b8660ff16815181106141e057fe5b6020026020010151816141ef57fe5b048860020160008860ff1660ff16815260200190815260200160002081905550828401935061422b61024060058d8860ff168151811061341457fe5b8a60060160008960ff1660ff16815260200190815260200160002060008c60030160008b60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060058b8660ff16815181106142b657fe5b6020026020010151816142c557fe5b60ff8716600090815260028b016020526040902091900490556001600160801b03808516908416116142f757836142f9565b825b935060018601955061431b64048000000060058d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060058b8660ff16815181106143a657fe5b6020026020010151816143b557fe5b60ff8816600090815260028b016020526040902091900490556001600160801b03808516908416116143e757836143e9565b825b9350600186019550614407600260058d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060058b8660ff168151811061449257fe5b6020026020010151816144a157fe5b60ff8816600090815260028b016020526040902091900490556001600160801b03808516908416116144d357836144d5565b825b9350838901985060018601955060058a019950614dfa565b8b8560ff16815181106144fc57fe5b6020026020010151641249812d201415614b8457662386f26fc100006006028b8660ff168151811061452a57fe5b6020026020010151101580156145605750693f870857a3e0e38000008b8660ff168151811061455557fe5b602002602001015111155b6145a25760408051600160e51b62461bcd02815260206004820152601e6024820152600080516020615d0b833981519152604482015290519081900360640190fd5b8a8560ff16815181106145b157fe5b602002602001015187019650348711156145ff57604051600160e51b62461bcd028152600401808060200182810382526026815260200180615de36026913960400191505060405180910390fd5b61461661012060068d8860ff168151811061341457fe5b8a60060160008960ff1660ff16815260200190815260200160002060008c60030160008b60ff1660ff1681526020019081526020016000206000849a508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060068b8660ff16815181106146a157fe5b6020026020010151816146b057fe5b60ff8716600081815260028c0160205260409020929091049091558b516146e291610c00916006918f91811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060068b8660ff168151811061476d57fe5b60200260200101518161477c57fe5b60ff8816600090815260028b016020526040902091900490556001600160801b03808516908416116147ae57836147b0565b825b93506001860195506147d06201200060068d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060068b8660ff168151811061485b57fe5b60200260200101518161486a57fe5b60ff8816600090815260028b016020526040902091900490556001600160801b038085169084161161489c578361489e565b825b93506001860195506148bf630180000060068d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060068b8660ff168151811061494a57fe5b60200260200101518161495957fe5b60ff8816600090815260028b016020526040902091900490556001600160801b038085169084161161498b578361498d565b825b93506001860195506149ae634800000060068d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060068b8660ff1681518110614a3957fe5b602002602001015181614a4857fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611614a7a5783614a7c565b825b9350600186019550614a9e64120000000060068d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060068b8660ff1681518110614b2957fe5b602002602001015181614b3857fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611614b6a5783614b6c565b825b9350838901985060018601955060068a019950614dfa565b662386f26fc100008b8660ff1681518110614b9b57fe5b602002602001015110158015614bd15750693f870857a3e0e38000008b8660ff1681518110614bc657fe5b602002602001015111155b614c135760408051600160e51b62461bcd02815260206004820152601e6024820152600080516020615d0b833981519152604482015290519081900360640190fd5b8a8560ff1681518110614c2257fe5b60200260200101518701965034871115614c7057604051600160e51b62461bcd028152600401808060200182810382526026815260200180615de36026913960400191505060405180910390fd5b614ca78c8660ff1681518110614c8257fe5b60200260200101518c8760ff1681518110614c9957fe5b6020026020010151836157c5565b8a60060160008960ff1660ff16815260200190815260200160002060008c60030160008b60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff160217905550505050603f7e010410410410410410410410410410410410410410410410410410410410417920000000001000000000080000000004000000000200000000018a60060160008960ff1660ff16815260200190815260200160002060009054906101000a900464ffffffffff1664ffffffffff16021681614d9b57fe5b0660ff16600114614daf5797820197614dbd565b81614dbd5797820197600191505b8a8560ff1681518110614dcc57fe5b60200260200101518860020160008760ff1660ff1681526020019081526020016000208190555060018a0199505b60ff8516614e0757614e12565b600185039450613255565b5050505050505050935093915050565b60008080602863ffffffff891611614e7f57603f7920000000001000000000080000000004000000000200000000018a027e0104104104104104104104104104104104104104104104104104104104104116069150889250614ed7565b600089118015614e9557508763ffffffff168911155b614ed357604051600160e51b62461bcd02815260040180806020018281038252602e815260200180615e56602e913960400191505060405180910390fd5b8891505b6000614ee7888a85886001615590565b601354919350915088016001600160801b0383161115614f515760408051600160e51b62461bcd02815260206004820181905260248201527f6d617850726f666974506c696e6b6f206c696d69742076696f6c6174696f6e2e604482015290519081900360640190fd5b6001600160a01b0385166000908152601b60205260409020805489019055601880546001600160801b03600160801b808304821686018216810292821692909217808216850182166001600160801b03199190911617928390553031838216929093048116919091011611156150115760408051600160e51b62461bcd02815260206004820152601f60248201527f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e00604482015290519081900360640190fd5b60408051888152602081018890528082018a905290517f7cb363f1be918dc2e8cadae9eb87766dacf1f4f49ae904291aa3e59fc593c4139181900360600190a15096509650969350505050565b815461509e57604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c956022913960400191505060405180910390fd5b60078201546005830154604080516020808201869052818301939093528151808203830181526060909101909152805191012083546001600160a01b03909216916000908190819067016345785d8a000011156150fc57600061511c565b6007870154600160a01b900460ff1666038d7ea4c680008161511a57fe5b045b6007880154909150602585069060009061513e906001600160a01b0316610cc0565b905060005b60078a015460ff600160a01b909104811690821610156151d75760ff8116600090815260068b016020526040902054600284900a1664ffffffffff16156151cf5760ff808216600090815260028c01602090815260408083205460038f019092528220546151bf93918890039260249291909116908690615878565b6001600160801b03169586019594505b600101615143565b506001890154601880546001600160801b03808216938116600160801b92839004821603160291909117905588546000906152159088906025615409565b9050801561526f576040805160208082018c90528251808303820181528284018085528151919092012090526060810183905290516001600160a01b038a1691600080516020615d2b833981519152919081900360800190a25b6152d9888783011561528357828801615286565b60015b888c604051602001808281526020019150506040516020818303038152906040528051906020012060001c604051806040016040528060078152602001600160ca1b661c185e5b595b9d02815250613052565b5050600090975550505050505050565b6000806001815b601081101561531557878160020a1660001461530d576001830192505b6001016152f0565b5060006153228684615a07565b9050600067016345785d8a000088101561533d576000615346565b66038d7ea4c680005b600a5490915060009060ff16600214156153885750600154600a54610100900460ff9081166301000000830482160162010000909204811691909101166153b1565b50600154600160201b810460ff9081166301000000830482160162010000909204811691909101165b60006103e86153bf89610cc0565b60ff1683038b02816153cd57fe5b049050660110d9316ec0008110156153e95750660110d9316ec0005b60648484838d030302816153f957fe5b049b9a5050505050505050505050565b600067016345785d8a000083106154635760006103e883868161542857fe5b048161543057fe5b600154919006915061ffff1681141561546157601880546001600160801b031981169091556001600160801b031691505b505b9392505050565b600080600061547886615a8e565b6000945090925090508267016345785d8a00008610156154995760006154a2565b66038d7ea4c680005b600154909150600160201b810460ff90811663010000008304821601620100009092048116919091011660006103e86154da88610cc0565b60ff1683038902816154e857fe5b049050660110d9316ec0008110156155045750660110d9316ec0005b600b8560ff168154811061551457fe5b60009182526020909120601082040154600f9091166002026101000a900461ffff166064828a0385900304029550600c8460ff168154811061555257fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff166064828a0385900304028601955050505050509392505050565b6000808460ff1660001080156155af57508563ffffffff168560ff1611155b6156035760408051600160e51b62461bcd02815260206004820152601d60248201527f57696e2070726f626162696c697479206f7574206f662072616e67652e000000604482015290519081900360640190fd5b67016345785d8a000087101561561a576000615623565b66038d7ea4c680005b600a5490915060009060ff16600214156156605750600154600a54610100900460ff90811663010000008304821601620100009092041601615684565b50600154600160201b810460ff908116630100000083048216016201000090920416015b60006103e861569287610cc0565b830360ff168a02816156a057fe5b049050660110d9316ec0008110156156bc5750660110d9316ec0005b88838201111561570057604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c516022913960400191505060405180910390fd5b841561574057600154601080546103e860ff62010000850481168e028290049092019092556011805463010000009094049091168c029190910490910190555b63ffffffff8816620100001415615785578660ff166001141561576657600a9750615780565b8660ff166002141561577b5760149750615780565b603297505b600196505b63ffffffff88166103e7141561579e5760059750600196505b8660ff168863ffffffff1684838c030302816157b657fe5b04935050509550959350505050565b60008080603f7e01041041041041041041041041041041041041041041041041041041041041792000000000100000000008000000000400000000020000000001880216068661581a87602484896001615878565b92506014548701836001600160801b0316111561586b57604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c736022913960400191505060405180910390fd5b9790965090945092505050565b60008360ff16600010801561589657508463ffffffff168460ff1611155b6158ea5760408051600160e51b62461bcd02815260206004820152601d60248201527f57696e2070726f626162696c697479206f7574206f662072616e67652e000000604482015290519081900360640190fd5b60018054600091600160281b90910460ff161415615916576003546103e89060ff16880204905061598a565b821561595657600154601080546103e860ff62010000850481168c028290049092019092556011805463010000009094049091168a029190910490910190555b6001546103e890600160201b810460ff90811663010000008304821601620100009092048116919091018690031688020490505b660110d9316ec0008110156159a35750660110d9316ec0005b868111156159e557604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c516022913960400191505060405180910390fd5b8460ff168663ffffffff1682890302816159fb57fe5b04979650505050505050565b60008260011415615a445760048260118110615a1f57fe5b601091828204019190066002029054906101000a900461ffff1661ffff169050615a88565b8260021415615a5a5760068260118110615a1f57fe5b60088260118110615a6757fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b92915050565b600080808080808080805b600560ff82161015615b3557615ab58a8260020160ff16615b58565b9450615ac2856004615b78565b93508360ff1696506008871115615ada578660100396505b8660071415615aea576001880197505b60ff8116615afa57869550615b2d565b86861415615b0d57600182019150615b29565b8260ff168260ff1611615b205782615b22565b815b9250600091505b8695505b600101615a99565b508160ff168160ff1611615b495781615b4b565b805b9750505050505050915091565b60006008601f8390030260020a8381615b6d57fe5b0460f81b9392505050565b6000808260ff16600260ff160a60ff168460f81c60ff1681615b9657fe5b0694935050505056fe726f756c7474655461626c654c696d69742063616e74206265206772656174207468656e20746f70206c696d69742e43616e206f6e6c792061636365707420707265617070726f766564206e6577206f776e65722e6d617850726f666974506c696e6b6f2063616e74206265206772656174207468656e20746f70206c696d69742e6d617850726f666974526f756c657474652063616e74206265206772656174207468656e20746f70206c696d69742e42657420646f65736e2774206576656e20636f76657220686f75736520656467652e6d617850726f666974526f756c65747465206c696d69742076696f6c6174696f6e2e4265742073686f756c6420626520696e20616e2027616374697665272073746174654265742073686f756c6420626520696e20612027636c65616e272073746174652e736574746c6542657420696e207468652073616d6520626c6f636b20617320706c6163654265742c206f72206265666f72652e416d6f756e742073686f756c642062652077697468696e2072616e67652e000016ea4dcfd06c1efb1dd2edf3c766c9a9b9c1d73cbd8ddf4359bd3961712299504f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e6f6e2d63726f75706965722e496e63726561736520616d6f756e74206c6172676572207468616e2062616c616e63652e416c6c20626574732073686f756c642062652070726f6365737365642028736574746c6564206f7220726566756e64656429206265666f72652073656c662d64657374727563742e546f74616c206265747320616d6f756e742073686f756c64206265204c544520616d6f756e744f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d6f776e65722e6d617850726f6669742063616e74206265206772656174207468656e20746f70206c696d69742e48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676572207468616e206d6f64756c6f2e426c6f636b686173682063616e277420626520717565726965642062792045564d2e4d6f6465726174696f6e206d6574686f64732063616c6c6564206279206e6f6e2d6d6f64657261746f722ea165627a7a72305820bc9d43aef8f6c18e47787228d2f7107318a36b538819d2381f37f3055bc2f6670029

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c806398c7d1e311610175578063d6d30a51116100dc578063e0d44b7911610095578063f2d7afe81161006f578063f2d7afe8146109e5578063f8dbd7ee146109fa578063fbd668a914610a0f578063fc9f12a614610a39576102ae565b8063e0d44b791461097c578063e1fdb4b414610991578063e9c90d01146109bb576102ae565b8063d6d30a511461089f578063d930a45a146108c9578063d98f9740146108de578063db53404c146108f3578063dc023f1514610920578063df88126f14610967576102ae565b8063bd0f1df41161012e578063bd0f1df4146107c8578063becf40b6146107dd578063bf205ebc146107f2578063c10753291461081e578063d06c54fb14610857578063d579fd441461086c576102ae565b806398c7d1e314610718578063997664d714610742578063a5197d1014610757578063a84bf40e1461076c578063a8fc32de146107ab578063b539cd55146107b3576102ae565b80634d61537f1161021957806388475e4e116101d257806388475e4e1461056b5780638a0ba9e2146105a45780638ca022321461067a5780638da5cb5b146106a45780638f6ead62146106b957806392f8dc5e146106ee576102ae565b80634d61537f1461048f57806357246d23146104a45780635e05f374146104d55780636896a9d2146104ff5780636b5c5f391461052c57806380a1a0e514610541576102ae565b8063363bf9641161026b578063363bf964146103a5578063371e6ec4146103ea57806338743904146103ff57806338b48ac3146104145780633bad7e9c1461044757806341c0e1b51461047a576102ae565b80630149e4bb146102b057806316fd381a146102db5780631d70f55c1461030557806322ff5faa1461034a578063255858b31461037b57806333450c5d14610390575b005b3480156102bc57600080fd5b506102c5610a4e565b6040805160ff9092168252519081900360200190f35b3480156102e757600080fd5b506102ae600480360360208110156102fe57600080fd5b5035610a5e565b34801561031157600080fd5b506103386004803603602081101561032857600080fd5b50356001600160a01b0316610beb565b60408051918252519081900360200190f35b34801561035657600080fd5b5061035f610bfd565b604080516001600160a01b039092168252519081900360200190f35b34801561038757600080fd5b506102c5610c0c565b34801561039c57600080fd5b50610338610c1c565b3480156103b157600080fd5b506102ae600480360360608110156103c857600080fd5b506001600160a01b038135811691602081013582169160409091013516610c22565b3480156103f657600080fd5b50610338610cab565b34801561040b57600080fd5b5061035f610cb1565b34801561042057600080fd5b506102c56004803603602081101561043757600080fd5b50356001600160a01b0316610cc0565b34801561045357600080fd5b506102ae6004803603602081101561046a57600080fd5b50356001600160a01b0316610db2565b34801561048657600080fd5b506102ae610e20565b34801561049b57600080fd5b5061035f610ecc565b3480156104b057600080fd5b506104b9610edb565b604080516001600160801b039092168252519081900360200190f35b3480156104e157600080fd5b506102ae600480360360208110156104f857600080fd5b5035610eea565b34801561050b57600080fd5b506102ae6004803603602081101561052257600080fd5b503560ff16610f50565b34801561053857600080fd5b5061035f610fde565b34801561054d57600080fd5b506102ae6004803603602081101561056457600080fd5b5035610fed565b34801561057757600080fd5b506102ae6004803603604081101561058e57600080fd5b506001600160a01b03813516906020013561109e565b6102ae600480360360e08110156105ba57600080fd5b810190602081018135600160201b8111156105d457600080fd5b8201836020820111156105e657600080fd5b803590602001918460208302840111600160201b8311171561060757600080fd5b919390929091602081019035600160201b81111561062457600080fd5b82018360208201111561063657600080fd5b803590602001918460208302840111600160201b8311171561065757600080fd5b91935091508035906020810135906040810135906060810135906080013561116f565b34801561068657600080fd5b506102ae6004803603602081101561069d57600080fd5b5035611676565b3480156106b057600080fd5b5061035f611727565b3480156106c557600080fd5b506102ae600480360360408110156106dc57600080fd5b5060ff81358116916020013516611736565b3480156106fa57600080fd5b506102ae6004803603602081101561071157600080fd5b50356117c3565b34801561072457600080fd5b506102ae6004803603602081101561073b57600080fd5b5035611874565b34801561074e57600080fd5b50610338611a1c565b34801561076357600080fd5b50610338611a22565b34801561077857600080fd5b506102ae6004803603606081101561078f57600080fd5b5060ff8135811691602081013582169160409091013516611a28565b6102ae611ae2565b3480156107bf57600080fd5b50610338611b9d565b3480156107d457600080fd5b506102c5611ba3565b3480156107e957600080fd5b506102c5611bb1565b3480156107fe57600080fd5b50610807611bc1565b6040805161ffff9092168252519081900360200190f35b34801561082a57600080fd5b506102ae6004803603604081101561084157600080fd5b506001600160a01b038135169060200135611bcb565b34801561086357600080fd5b506102ae611cfb565b34801561087857600080fd5b506102ae6004803603602081101561088f57600080fd5b50356001600160a01b0316611d6b565b3480156108ab57600080fd5b506102ae600480360360208110156108c257600080fd5b5035611e3f565b3480156108d557600080fd5b506102c5611f7a565b3480156108ea57600080fd5b506102ae611f83565b3480156108ff57600080fd5b506102ae6004803603602081101561091657600080fd5b503560ff16611ff5565b6102ae600480360360e081101561093657600080fd5b5080359063ffffffff6020820135169060408101359060608101359060808101359060a08101359060c0013561207d565b34801561097357600080fd5b506104b96125d2565b34801561098857600080fd5b506103386125e8565b34801561099d57600080fd5b506102ae600480360360208110156109b457600080fd5b50356125ee565b3480156109c757600080fd5b506102ae600480360360208110156109de57600080fd5b5035612765565b3480156109f157600080fd5b506102c56128ec565b348015610a0657600080fd5b506102c56128fb565b348015610a1b57600080fd5b506102ae60048036036020811015610a3257600080fd5b5035612904565b348015610a4557600080fd5b506103386129b5565b6001546301000000900460ff1681565b6017546001600160a01b03163314610aaa57604051600160e51b62461bcd02815260040180806020018281038252602c815260200180615d4b602c913960400191505060405180910390fd5b6040805160208082018490528251808303820181529183018352815191810191909120600081815260199092529190206001810154600160a81b900464ffffffffff16438110610b2e57604051600160e51b62461bcd028152600401808060200182810382526033815260200180615cd86033913960400191505060405180910390fd5b60fa8101431115610b895760408051600160e51b62461bcd02815260206004820152601860248201527f43616e277420626520717565726965642062792045564d2e0000000000000000604482015290519081900360640190fd5b600182015463ffffffff600160801b90910416620100001415610bb557610bb082856129bb565b610be5565b600182015463ffffffff600160801b909104166103e71415610bdb57610bb08285612bbc565b610be58285612d8f565b50505050565b601b6020526000908152604090205481565b600d546001600160a01b031681565b600154600160281b900460ff1681565b60145481565b600e546001600160a01b03163314610c6e57604051600160e51b62461bcd028152600401808060200182810382526026815260200180615e096026913960400191505060405180910390fd5b601580546001600160a01b03199081166001600160a01b039485161790915560178054821694841694909417909355601680549093169116179055565b60025481565b6016546001600160a01b031681565b6001600160a01b0381166000908152601b60205260408120546801158e460913d000008110801590610cfa575068056bc75e2d6310000081105b15610d085760019150610dac565b68056bc75e2d631000008110158015610d295750681b1ae4d6e2ef50000081105b15610d375760029150610dac565b681b1ae4d6e2ef5000008110158015610d585750683635c9adc5dea0000081105b15610d665760039150610dac565b683635c9adc5dea000008110158015610d88575069010f0cf064dd5920000081105b15610d965760049150610dac565b69010f0cf064dd592000008110610dac57600591505b50919050565b600e546001600160a01b03163314610dfe57604051600160e51b62461bcd028152600401808060200182810382526026815260200180615e096026913960400191505060405180910390fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600e546001600160a01b03163314610e6c57604051600160e51b62461bcd028152600401808060200182810382526026815260200180615e096026913960400191505060405180910390fd5b601854600160801b90046001600160801b031615610ebe57604051600160e51b62461bcd028152600401808060200182810382526048815260200180615d9b6048913960600191505060405180910390fd5b600e546001600160a01b0316ff5b6015546001600160a01b031681565b6018546001600160801b031681565b600e546001600160a01b0316331480610f0d57506016546001600160a01b031633145b610f4b57604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b600055565b600e546001600160a01b0316331480610f7357506016546001600160a01b031633145b610fb157604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b600a8160ff161115610fc257600080fd5b600a805460ff9092166101000261ff0019909216919091179055565b6017546001600160a01b031681565b600e546001600160a01b031633148061101057506016546001600160a01b031633145b61104e57604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b693f870857a3e0e3800000811061109957604051600160e51b62461bcd02815260040180806020018281038252602f815260200180615ba0602f913960400191505060405180910390fd5b600255565b600e546001600160a01b031633146110ea57604051600160e51b62461bcd028152600401808060200182810382526026815260200180615e096026913960400191505060405180910390fd5b60115481111561112e57604051600160e51b62461bcd028152600401808060200182810382526024815260200180615d776024913960400191505060405180910390fd5b6011805482900390556040805180820190915260088152600160c01b67776974686472617702602082015261116b90839083908190600090613052565b5050565b6000848152601a602052604090206002543411156111d75760408051600160e51b62461bcd02815260206004820181905260248201527f426574732073756d206d757374206265204c5445207461626c65206c696d6974604482015290519081900360640190fd5b600781018054600160a01b60ff021916600160a01b60ff8c160217908190556001600160a01b03161561123e57604051600160e51b62461bcd028152600401808060200182810382526021815260200180615cb76021913960400191505060405180910390fd5b854311156112965760408051600160e51b62461bcd02815260206004820152601360248201527f436f6d6d69742068617320657870697265642e00000000000000000000000000604482015290519081900360640190fd5b6040805164ffffffffff881660d81b6020808301919091526025808301899052835180840390910181526045830180855281519183019190912060009091526065830180855252601b608583015260a5820186905260c58201859052915160019260e5808401939192601f1981019281900390910190855afa158015611320573d6000803e3d6000fd5b5050604051601f1901516015546001600160a01b039081169116149050806113eb57506040805164ffffffffff881660d81b6020808301919091526025808301899052835180840390910181526045830180855281519183019190912060009091526065830180855252601c608583015260a5820186905260c58201859052915160019260e5808401939192601f1981019281900390910190855afa1580156113cd573d6000803e3d6000fd5b5050604051601f1901516015546001600160a01b0390811691161490505b61143f5760408051600160e51b62461bcd02815260206004820152601d60248201527f4543445341207369676e6174757265206973206e6f742076616c69642e000000604482015290519081900360640190fd5b6000546010541061145257611452611ae2565b6114c0858b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d91829185019084908082843760009201919091525061320f92505050565b6001830180546001600160801b039283166001600160801b0319909116179081905560078401805460ff909416600160a01b02600160a01b60ff02199094169390931790925560188054600160801b80820484169484169490940183168402908316179081905530319290041611156115835760408051600160e51b62461bcd02815260206004820152601f60248201527f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e00604482015290519081900360640190fd5b60018054600160281b900460ff16146115ac57336000908152601b602052604090208054340190555b3480825560048201805464ffffffffff431664ffffffffff19909116179055600582018590556007820180546001600160a01b0319163317905567016345785d8a000011156115fc576000611605565b66038d7ea4c680005b601880546001600160801b031981166001600160801b0391821693909301169190911790556040805186815260208101869052348183015290517f7cb363f1be918dc2e8cadae9eb87766dacf1f4f49ae904291aa3e59fc593c413916060908290030190a150505050505050505050565b600e546001600160a01b031633148061169957506016546001600160a01b031633145b6116d757604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b693f870857a3e0e3800000811061172257604051600160e51b62461bcd02815260040180806020018281038252602d815260200180615bf5602d913960400191505060405180910390fd5b601355565b600e546001600160a01b031681565b600e546001600160a01b031633148061175957506016546001600160a01b031633145b61179757604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b6001805465ff00000000001916600160281b60ff94851602179055600a805460ff191691909216179055565b600e546001600160a01b03163314806117e657506016546001600160a01b031633145b61182457604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b693f870857a3e0e3800000811061186f57604051600160e51b62461bcd02815260040180806020018281038252602f815260200180615c22602f913960400191505060405180910390fd5b601455565b6000818152601a602052604090208054806118c357604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c956022913960400191505060405180910390fd5b600482015464ffffffffff90811660fa0116431161191557604051600160e51b62461bcd028152600401808060200182810382526022815260200180615e846022913960400191505060405180910390fd5b60008083555b600783015460ff600160a01b909104811690821610156119525760ff8116600090815260028401602052604081205560010161191b565b506001820154601880546001600160801b03808216938116600160801b92839004821603160291909117905567016345785d8a000081108015906119a9575060185466038d7ea4c680006001600160801b03909116115b156119d957601880546001600160801b031981166001600160801b0391821666038d7ea4c67fff19019091161790555b60078201546040805180820190915260068152600160d21b651c99599d5b99026020820152611a17916001600160a01b031690839081908790613052565b505050565b60105481565b60115481565b600e546001600160a01b03163314611a7457604051600160e51b62461bcd028152600401808060200182810382526026815260200180615e096026913960400191505060405180910390fd5b60058260ff161015611a8557600080fd5b601e818385010160ff161115611a9a57600080fd5b6001805460ff938416620100000262ff00001993851663010000000263ff0000001995909616600160201b0264ff000000001990921691909117939093169390931716179055565b600d546001600160a01b031615611b9b57601054600d5460408051600160e11b632f3c22c702815290516001600160a01b0390921691635e78458e918491600480830192600092919082900301818588803b158015611b4057600080fd5b505af1158015611b54573d6000803e3d6000fd5b505060006010555050604080514281526020810184905281517f384e13b223db78131ff8fc373c4e03bbab38d141226a80644700e32c974dfa8793509081900390910190a1505b565b60125481565b600a54610100900460ff1681565b600154600160201b900460ff1681565b60015461ffff1681565b600e546001600160a01b03163314611c1757604051600160e51b62461bcd028152600401808060200182810382526026815260200180615e096026913960400191505060405180910390fd5b3031811115611c5a57604051600160e51b62461bcd028152600401808060200182810382526024815260200180615d776024913960400191505060405180910390fd5b60185430316001600160801b03808316600160801b90930481169290920190911682011115611cca5760408051600160e51b62461bcd0281526020600482015260116024820152600160791b702737ba1032b737bab3b410333ab732399702604482015290519081900360640190fd5b61116b8282836000604051806040016040528060088152602001600160c01b67776974686472617702815250613052565b600f546001600160a01b03163314611d4757604051600160e51b62461bcd028152600401808060200182810382526026815260200180615bcf6026913960400191505060405180910390fd5b600f54600e80546001600160a01b0319166001600160a01b03909216919091179055565b600e546001600160a01b03163314611db757604051600160e51b62461bcd028152600401808060200182810382526026815260200180615e096026913960400191505060405180910390fd5b600e546001600160a01b0382811691161415611e1d5760408051600160e51b62461bcd02815260206004820152601d60248201527f43616e6e6f7420617070726f76652063757272656e74206f776e65722e000000604482015290519081900360640190fd5b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b600e546001600160a01b0316331480611e6257506016546001600160a01b031633145b611ea057604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b3031811115611ee357604051600160e51b62461bcd028152600401808060200182810382526024815260200180615d776024913960400191505060405180910390fd5b60185430316001600160801b03808316600160801b90930481169290920190911682011115611f535760408051600160e51b62461bcd0281526020600482015260116024820152600160791b702737ba1032b737bab3b410333ab732399702604482015290519081900360640190fd5b601880546001600160801b031981166001600160801b039182169390930116919091179055565b600a5460ff1681565b600e546001600160a01b0316331480611fa657506016546001600160a01b031633145b611fe457604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b601880546001600160801b03169055565b600e546001600160a01b031633148061201857506016546001600160a01b031633145b61205657604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b600a8160ff16111561206757600080fd5b6003805460ff191660ff92909216919091179055565b60008481526019602052604090206003810154600160281b90046001600160a01b0316156120df57604051600160e51b62461bcd028152600401808060200182810382526021815260200180615cb76021913960400191505060405180910390fd5b34606463ffffffff891611156121665763ffffffff881662010000148061210d575063ffffffff88166103e7145b6121615760408051600160e51b62461bcd02815260206004820152601e60248201527f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e0000604482015290519081900360640190fd5b6121d7565b60018863ffffffff161180156121835750606463ffffffff891611155b6121d75760408051600160e51b62461bcd02815260206004820152601e60248201527f4d6f64756c6f2073686f756c642062652077697468696e2072616e67652e0000604482015290519081900360640190fd5b662386f26fc1000081101580156121f85750693f870857a3e0e38000008111155b61223a5760408051600160e51b62461bcd02815260206004820152601e6024820152600080516020615d0b833981519152604482015290519081900360640190fd5b60008911801561224d5750600160281b89105b6122a15760408051600160e51b62461bcd02815260206004820152601c60248201527f4d61736b2073686f756c642062652077697468696e2072616e67652e00000000604482015290519081900360640190fd5b864311156122f95760408051600160e51b62461bcd02815260206004820152601360248201527f436f6d6d69742068617320657870697265642e00000000000000000000000000604482015290519081900360640190fd5b6040805164ffffffffff891660d81b60208083019190915260258083018a9052835180840390910181526045830180855281519183019190912060009091526065830180855252601b608583015260a5820187905260c58201869052915160019260e5808401939192601f1981019281900390910190855afa158015612383573d6000803e3d6000fd5b5050604051601f1901516015546001600160a01b0390811691161490508061244e57506040805164ffffffffff891660d81b60208083019190915260258083018a9052835180840390910181526045830180855281519183019190912060009091526065830180855252601c608583015260a5820187905260c58201869052915160019260e5808401939192601f1981019281900390910190855afa158015612430573d6000803e3d6000fd5b5050604051601f1901516015546001600160a01b0390811691161490505b6124a25760408051600160e51b62461bcd02815260206004820152601d60248201527f4543445341207369676e6174757265206973206e6f742076616c69642e000000604482015290519081900360640190fd5b600054601054106124b5576124b5611ae2565b6000806124c68b8b858b8b33614e22565b8160ff1691508660010160008291906101000a8154816001600160801b0302191690836001600160801b03160217905550819450829350505050828460000181905550898460010160106101000a81548163ffffffff021916908363ffffffff160217905550818460010160146101000a81548160ff021916908360ff160217905550438460010160156101000a81548164ffffffffff021916908364ffffffffff160217905550808460030160006101000a81548164ffffffffff021916908364ffffffffff160217905550868460020181905550338460030160056101000a8154816001600160a01b0302191690836001600160a01b031602179055505050505050505050505050565b601854600160801b90046001600160801b031681565b60005481565b600081815260196020526040902080548061263d57604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c956022913960400191505060405180910390fd5b600182015464ffffffffff600160a81b909104811660fa0116431161269657604051600160e51b62461bcd028152600401808060200182810382526022815260200180615e846022913960400191505060405180910390fd5b600082556001820154601880546001600160801b03808216938116600160801b92839004821603160291909117905567016345785d8a000081108015906126f0575060185466038d7ea4c680006001600160801b03909116115b1561272057601880546001600160801b031981166001600160801b0391821666038d7ea4c67fff19019091161790555b611a178260030160059054906101000a90046001600160a01b0316828386604051806040016040528060068152602001600160d21b651c99599d5b9902815250613052565b6017546001600160a01b031633146127b157604051600160e51b62461bcd02815260040180806020018281038252602c815260200180615d4b602c913960400191505060405180910390fd5b60408051602080820184905282518083038201815291830183528151918101919091206000818152601a9092529190206004810154815464ffffffffff909116906128465760408051600160e51b62461bcd02815260206004820152601560248201527f42657420616c72656164792070726f6365737365640000000000000000000000604482015290519081900360640190fd5b80431161288757604051600160e51b62461bcd028152600401808060200182810382526033815260200180615cd86033913960400191505060405180910390fd5b60fa81014311156128e25760408051600160e51b62461bcd02815260206004820152601860248201527f43616e277420626520717565726965642062792045564d2e0000000000000000604482015290519081900360640190fd5b610be5828561505e565b60015462010000900460ff1681565b60035460ff1681565b600e546001600160a01b031633148061292757506016546001600160a01b031633145b61296557604051600160e51b62461bcd02815260040180806020018281038252602b815260200180615ea6602b913960400191505060405180910390fd5b693f870857a3e0e380000081106129b057604051600160e51b62461bcd028152600401808060200182810382526027815260200180615e2f6027913960400191505060405180910390fd5b601255565b60135481565b81546001830154600160a01b900460ff1681612a0b57604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c956022913960400191505060405180910390fd5b6000808555600285015460408051602080820188905281830193909352815180820383018152606090910190915280519101206001860154909190600160801b900463ffffffff168281612a5b57fe5b0690506000612a838286868a60030160059054906101000a90046001600160a01b03166152e9565b600188018054601880546001600160801b03808216938116600160801b928390048216031681029290921790559054919250600091612acd9186918991900463ffffffff16615409565b90508015612b335760038801546040805160208082018b9052825180830382018152828401808552815191909201209052606081018490529051600160281b9092046001600160a01b031691600080516020615d2b833981519152916080908290030190a25b6003880154612bb290600160281b90046001600160a01b031682840115612b5c57828401612b5f565b60015b848a604051602001808281526020019150506040516020818303038152906040528051906020012060001c604051806040016040528060078152602001600160ca1b661c185e5b595b9d02815250613052565b5050505050505050565b81546001830154600160801b900463ffffffff1681612c0f57604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c956022913960400191505060405180910390fd5b6000808555600285015460408051602080820188905281830193909352815180820383018152606090910190915280519101206003860154909190612c679083908690600160281b90046001600160a01b031661546a565b6001870154601880546001600160801b03808216938116600160801b92839004821603160291909117905590506000612ca1838686615409565b90508015612d075760038701546040805160208082018a9052825180830382018152828401808552815191909201209052606081018490529051600160281b9092046001600160a01b031691600080516020615d2b833981519152916080908290030190a25b6003870154612d8690600160281b90046001600160a01b031682840115612d3057828401612d33565b60015b8489604051602001808281526020019150506040516020818303038152906040528051906020012060001c604051806040016040528060078152602001600160ca1b661c185e5b595b9d02815250613052565b50505050505050565b81546001830154600160a01b900460ff1681612ddf57604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c956022913960400191505060405180910390fd5b6000808555600285015460408051602080820188905281830193909352815180820383018152606090910190915280519101206001860154909190600160801b900463ffffffff168281612e2f57fe5b0690506000806000602860ff168960010160109054906101000a900463ffffffff1663ffffffff1611612ec4576003890154600285900a1664ffffffffff1615612ebf57612eac878a60010160109054906101000a900463ffffffff16888c60030160059054906101000a90046001600160a01b03166000615590565b6001600160801b03909116935091508290505b612f1b565b8560ff16841015612f1b57612f08878a60010160109054906101000a900463ffffffff16888c60030160059054906101000a90046001600160a01b03166000615590565b6001600160801b03909116935091508290505b600189018054601880546001600160801b03808216938116600160801b928390048216031681029290921790559054600091612f619188918b910463ffffffff16615409565b90508015612fc75760038a01546040805160208082018d9052825180830382018152828401808552815191909201209052606081018490529051600160281b9092046001600160a01b031691600080516020615d2b833981519152916080908290030190a25b60038a015461304690600160281b90046001600160a01b031682840115612ff057828401612ff3565b60015b848c604051602001808281526020019150506040516020818303038152906040528051906020012060001c604051806040016040528060078152602001600160ca1b661c185e5b595b9d02815250613052565b50505050505050505050565b6040516001600160a01b0386169085156108fc029086906000818181858888f1935050505015613144577fe0be3e380b9d096e907f7ef72465cfc68009c6e3e00d00799c10f946785b1b248583858460405180856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156131025781810151838201526020016130ea565b50505050905090810190601f16801561312f5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1613208565b7f5e93fffcba141e3bc2692d3006ceaef1fe77cf16237eda40090c2ee470c5c8e58583868460405180856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156131ca5781810151838201526020016131b2565b50505050905090810190601f1680156131f75780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a15b5050505050565b6000838152601a602052604081206007810154829190829060ff600160a01b820416906000198201908390819081908190613252906001600160a01b0316610cc0565b90505b60008c8660ff168151811061326657fe5b602002602001015111801561329757508b51600160281b908d9060ff881690811061328d57fe5b6020026020010151105b6132eb5760408051600160e51b62461bcd02815260206004820152601c60248201527f4d61736b2073686f756c642062652077697468696e2072616e67652e00000000604482015290519081900360640190fd5b8b8560ff16815181106132fa57fe5b602002602001015164090400900914156137ba57662386f26fc100006004028b8660ff168151811061332857fe5b60200260200101511015801561335e5750693f870857a3e0e38000008b8660ff168151811061335357fe5b602002602001015111155b6133a05760408051600160e51b62461bcd02815260206004820152601e6024820152600080516020615d0b833981519152604482015290519081900360640190fd5b8a8560ff16815181106133af57fe5b602002602001015187019650348711156133fd57604051600160e51b62461bcd028152600401808060200182810382526026815260200180615de36026913960400191505060405180910390fd5b61342a61900060048d8860ff168151811061341457fe5b60200260200101518161342357fe5b04836157c5565b8a60060160008960ff1660ff16815260200190815260200160002060008c60030160008b60ff1660ff1681526020019081526020016000206000849a508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060048b8660ff16815181106134b557fe5b6020026020010151816134c457fe5b60ff8716600081815260028c0160205260409020929091049091558b516134f991640900000000916004918f91811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060048b8660ff168151811061358457fe5b60200260200101518161359357fe5b60ff8816600090815260028b016020526040902091900490556001600160801b03808516908416116135c557836135c7565b825b93506001860195506135e5600960048d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060048b8660ff168151811061367057fe5b60200260200101518161367f57fe5b60ff8816600090815260028b016020526040902091900490556001600160801b03808516908416116136b157836136b3565b825b93506001860195506136d4630400000060048d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060048b8660ff168151811061375f57fe5b60200260200101518161376e57fe5b60ff8816600090815260028b016020526040902091900490556001600160801b03808516908416116137a057836137a2565b825b9350838901985060018601955060048a019950614dfa565b8b8560ff16815181106137c957fe5b60200260200101516409366c909d1415613f5357662386f26fc100006009028b8660ff16815181106137f757fe5b60200260200101511015801561382d5750693f870857a3e0e38000008b8660ff168151811061382257fe5b602002602001015111155b61386f5760408051600160e51b62461bcd02815260206004820152601e6024820152600080516020615d0b833981519152604482015290519081900360640190fd5b8a8560ff168151811061387e57fe5b602002602001015187019650348711156138cc57604051600160e51b62461bcd028152600401808060200182810382526026815260200180615de36026913960400191505060405180910390fd5b6138e2609060098d8860ff168151811061341457fe5b8a60060160008960ff1660ff16815260200190815260200160002060008c60030160008b60ff1660ff1681526020019081526020016000206000849a508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060098b8660ff168151811061396d57fe5b60200260200101518161397c57fe5b60ff8716600081815260028c0160205260409020929091049091558b516139ae91619000916009918f91811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060098b8660ff1681518110613a3957fe5b602002602001015181613a4857fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611613a7a5783613a7c565b825b9350600186019550613a9c6224000060098d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060098b8660ff1681518110613b2757fe5b602002602001015181613b3657fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611613b685783613b6a565b825b9350600186019550613b8a6248000060098d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060098b8660ff1681518110613c1557fe5b602002602001015181613c2457fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611613c565783613c58565b825b9350600186019550613c7a64090000000060098d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060098b8660ff1681518110613d0557fe5b602002602001015181613d1457fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611613d465783613d48565b825b9350600186019550613d7b633600000060098d8860ff1681518110613d6957fe5b60200260200101516002028161342357fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060098b8660ff1681518110613e0657fe5b602002602001015160020281613e1857fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611613e4a5783613e4c565b825b9350600186019550613e6a600d60098d8860ff1681518110613d6957fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060098b8660ff1681518110613ef557fe5b602002602001015160020281613f0757fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611613f395783613f3b565b825b9350838901985060018601955060078a019950614dfa565b8b8560ff1681518110613f6257fe5b602002602001015164048012424214156144ed57662386f26fc100006005028b8660ff1681518110613f9057fe5b602002602001015110158015613fc65750693f870857a3e0e38000008b8660ff1681518110613fbb57fe5b602002602001015111155b6140085760408051600160e51b62461bcd02815260206004820152601e6024820152600080516020615d0b833981519152604482015290519081900360640190fd5b8a8560ff168151811061401757fe5b6020026020010151870196503487111561406557604051600160e51b62461bcd028152600401808060200182810382526026815260200180615de36026913960400191505060405180910390fd5b61407d6202400060058d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff1681526020019081526020016000206000849a508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060058b8660ff168151811061410857fe5b60200260200101518161411757fe5b048860020160008860ff1660ff168152602001908152602001600020819055506001860195506141556212000060058d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060058b8660ff16815181106141e057fe5b6020026020010151816141ef57fe5b048860020160008860ff1660ff16815260200190815260200160002081905550828401935061422b61024060058d8860ff168151811061341457fe5b8a60060160008960ff1660ff16815260200190815260200160002060008c60030160008b60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060058b8660ff16815181106142b657fe5b6020026020010151816142c557fe5b60ff8716600090815260028b016020526040902091900490556001600160801b03808516908416116142f757836142f9565b825b935060018601955061431b64048000000060058d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060058b8660ff16815181106143a657fe5b6020026020010151816143b557fe5b60ff8816600090815260028b016020526040902091900490556001600160801b03808516908416116143e757836143e9565b825b9350600186019550614407600260058d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060058b8660ff168151811061449257fe5b6020026020010151816144a157fe5b60ff8816600090815260028b016020526040902091900490556001600160801b03808516908416116144d357836144d5565b825b9350838901985060018601955060058a019950614dfa565b8b8560ff16815181106144fc57fe5b6020026020010151641249812d201415614b8457662386f26fc100006006028b8660ff168151811061452a57fe5b6020026020010151101580156145605750693f870857a3e0e38000008b8660ff168151811061455557fe5b602002602001015111155b6145a25760408051600160e51b62461bcd02815260206004820152601e6024820152600080516020615d0b833981519152604482015290519081900360640190fd5b8a8560ff16815181106145b157fe5b602002602001015187019650348711156145ff57604051600160e51b62461bcd028152600401808060200182810382526026815260200180615de36026913960400191505060405180910390fd5b61461661012060068d8860ff168151811061341457fe5b8a60060160008960ff1660ff16815260200190815260200160002060008c60030160008b60ff1660ff1681526020019081526020016000206000849a508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060068b8660ff16815181106146a157fe5b6020026020010151816146b057fe5b60ff8716600081815260028c0160205260409020929091049091558b516146e291610c00916006918f91811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060068b8660ff168151811061476d57fe5b60200260200101518161477c57fe5b60ff8816600090815260028b016020526040902091900490556001600160801b03808516908416116147ae57836147b0565b825b93506001860195506147d06201200060068d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060068b8660ff168151811061485b57fe5b60200260200101518161486a57fe5b60ff8816600090815260028b016020526040902091900490556001600160801b038085169084161161489c578361489e565b825b93506001860195506148bf630180000060068d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060068b8660ff168151811061494a57fe5b60200260200101518161495957fe5b60ff8816600090815260028b016020526040902091900490556001600160801b038085169084161161498b578361498d565b825b93506001860195506149ae634800000060068d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060068b8660ff1681518110614a3957fe5b602002602001015181614a4857fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611614a7a5783614a7c565b825b9350600186019550614a9e64120000000060068d8860ff168151811061341457fe5b8a60060160008a60ff1660ff16815260200190815260200160002060008c60030160008c60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff16021790555050505060068b8660ff1681518110614b2957fe5b602002602001015181614b3857fe5b60ff8816600090815260028b016020526040902091900490556001600160801b0380851690841611614b6a5783614b6c565b825b9350838901985060018601955060068a019950614dfa565b662386f26fc100008b8660ff1681518110614b9b57fe5b602002602001015110158015614bd15750693f870857a3e0e38000008b8660ff1681518110614bc657fe5b602002602001015111155b614c135760408051600160e51b62461bcd02815260206004820152601e6024820152600080516020615d0b833981519152604482015290519081900360640190fd5b8a8560ff1681518110614c2257fe5b60200260200101518701965034871115614c7057604051600160e51b62461bcd028152600401808060200182810382526026815260200180615de36026913960400191505060405180910390fd5b614ca78c8660ff1681518110614c8257fe5b60200260200101518c8760ff1681518110614c9957fe5b6020026020010151836157c5565b8a60060160008960ff1660ff16815260200190815260200160002060008c60030160008b60ff1660ff16815260200190815260200160002060008499508591906101000a81548160ff021916908360ff1602179055508491906101000a81548164ffffffffff021916908364ffffffffff160217905550505050603f7e010410410410410410410410410410410410410410410410410410410410417920000000001000000000080000000004000000000200000000018a60060160008960ff1660ff16815260200190815260200160002060009054906101000a900464ffffffffff1664ffffffffff16021681614d9b57fe5b0660ff16600114614daf5797820197614dbd565b81614dbd5797820197600191505b8a8560ff1681518110614dcc57fe5b60200260200101518860020160008760ff1660ff1681526020019081526020016000208190555060018a0199505b60ff8516614e0757614e12565b600185039450613255565b5050505050505050935093915050565b60008080602863ffffffff891611614e7f57603f7920000000001000000000080000000004000000000200000000018a027e0104104104104104104104104104104104104104104104104104104104104116069150889250614ed7565b600089118015614e9557508763ffffffff168911155b614ed357604051600160e51b62461bcd02815260040180806020018281038252602e815260200180615e56602e913960400191505060405180910390fd5b8891505b6000614ee7888a85886001615590565b601354919350915088016001600160801b0383161115614f515760408051600160e51b62461bcd02815260206004820181905260248201527f6d617850726f666974506c696e6b6f206c696d69742076696f6c6174696f6e2e604482015290519081900360640190fd5b6001600160a01b0385166000908152601b60205260409020805489019055601880546001600160801b03600160801b808304821686018216810292821692909217808216850182166001600160801b03199190911617928390553031838216929093048116919091011611156150115760408051600160e51b62461bcd02815260206004820152601f60248201527f43616e6e6f74206166666f726420746f206c6f73652074686973206265742e00604482015290519081900360640190fd5b60408051888152602081018890528082018a905290517f7cb363f1be918dc2e8cadae9eb87766dacf1f4f49ae904291aa3e59fc593c4139181900360600190a15096509650969350505050565b815461509e57604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c956022913960400191505060405180910390fd5b60078201546005830154604080516020808201869052818301939093528151808203830181526060909101909152805191012083546001600160a01b03909216916000908190819067016345785d8a000011156150fc57600061511c565b6007870154600160a01b900460ff1666038d7ea4c680008161511a57fe5b045b6007880154909150602585069060009061513e906001600160a01b0316610cc0565b905060005b60078a015460ff600160a01b909104811690821610156151d75760ff8116600090815260068b016020526040902054600284900a1664ffffffffff16156151cf5760ff808216600090815260028c01602090815260408083205460038f019092528220546151bf93918890039260249291909116908690615878565b6001600160801b03169586019594505b600101615143565b506001890154601880546001600160801b03808216938116600160801b92839004821603160291909117905588546000906152159088906025615409565b9050801561526f576040805160208082018c90528251808303820181528284018085528151919092012090526060810183905290516001600160a01b038a1691600080516020615d2b833981519152919081900360800190a25b6152d9888783011561528357828801615286565b60015b888c604051602001808281526020019150506040516020818303038152906040528051906020012060001c604051806040016040528060078152602001600160ca1b661c185e5b595b9d02815250613052565b5050600090975550505050505050565b6000806001815b601081101561531557878160020a1660001461530d576001830192505b6001016152f0565b5060006153228684615a07565b9050600067016345785d8a000088101561533d576000615346565b66038d7ea4c680005b600a5490915060009060ff16600214156153885750600154600a54610100900460ff9081166301000000830482160162010000909204811691909101166153b1565b50600154600160201b810460ff9081166301000000830482160162010000909204811691909101165b60006103e86153bf89610cc0565b60ff1683038b02816153cd57fe5b049050660110d9316ec0008110156153e95750660110d9316ec0005b60648484838d030302816153f957fe5b049b9a5050505050505050505050565b600067016345785d8a000083106154635760006103e883868161542857fe5b048161543057fe5b600154919006915061ffff1681141561546157601880546001600160801b031981169091556001600160801b031691505b505b9392505050565b600080600061547886615a8e565b6000945090925090508267016345785d8a00008610156154995760006154a2565b66038d7ea4c680005b600154909150600160201b810460ff90811663010000008304821601620100009092048116919091011660006103e86154da88610cc0565b60ff1683038902816154e857fe5b049050660110d9316ec0008110156155045750660110d9316ec0005b600b8560ff168154811061551457fe5b60009182526020909120601082040154600f9091166002026101000a900461ffff166064828a0385900304029550600c8460ff168154811061555257fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff166064828a0385900304028601955050505050509392505050565b6000808460ff1660001080156155af57508563ffffffff168560ff1611155b6156035760408051600160e51b62461bcd02815260206004820152601d60248201527f57696e2070726f626162696c697479206f7574206f662072616e67652e000000604482015290519081900360640190fd5b67016345785d8a000087101561561a576000615623565b66038d7ea4c680005b600a5490915060009060ff16600214156156605750600154600a54610100900460ff90811663010000008304821601620100009092041601615684565b50600154600160201b810460ff908116630100000083048216016201000090920416015b60006103e861569287610cc0565b830360ff168a02816156a057fe5b049050660110d9316ec0008110156156bc5750660110d9316ec0005b88838201111561570057604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c516022913960400191505060405180910390fd5b841561574057600154601080546103e860ff62010000850481168e028290049092019092556011805463010000009094049091168c029190910490910190555b63ffffffff8816620100001415615785578660ff166001141561576657600a9750615780565b8660ff166002141561577b5760149750615780565b603297505b600196505b63ffffffff88166103e7141561579e5760059750600196505b8660ff168863ffffffff1684838c030302816157b657fe5b04935050509550959350505050565b60008080603f7e01041041041041041041041041041041041041041041041041041041041041792000000000100000000008000000000400000000020000000001880216068661581a87602484896001615878565b92506014548701836001600160801b0316111561586b57604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c736022913960400191505060405180910390fd5b9790965090945092505050565b60008360ff16600010801561589657508463ffffffff168460ff1611155b6158ea5760408051600160e51b62461bcd02815260206004820152601d60248201527f57696e2070726f626162696c697479206f7574206f662072616e67652e000000604482015290519081900360640190fd5b60018054600091600160281b90910460ff161415615916576003546103e89060ff16880204905061598a565b821561595657600154601080546103e860ff62010000850481168c028290049092019092556011805463010000009094049091168a029190910490910190555b6001546103e890600160201b810460ff90811663010000008304821601620100009092048116919091018690031688020490505b660110d9316ec0008110156159a35750660110d9316ec0005b868111156159e557604051600160e51b62461bcd028152600401808060200182810382526022815260200180615c516022913960400191505060405180910390fd5b8460ff168663ffffffff1682890302816159fb57fe5b04979650505050505050565b60008260011415615a445760048260118110615a1f57fe5b601091828204019190066002029054906101000a900461ffff1661ffff169050615a88565b8260021415615a5a5760068260118110615a1f57fe5b60088260118110615a6757fe5b601091828204019190066002029054906101000a900461ffff1661ffff1690505b92915050565b600080808080808080805b600560ff82161015615b3557615ab58a8260020160ff16615b58565b9450615ac2856004615b78565b93508360ff1696506008871115615ada578660100396505b8660071415615aea576001880197505b60ff8116615afa57869550615b2d565b86861415615b0d57600182019150615b29565b8260ff168260ff1611615b205782615b22565b815b9250600091505b8695505b600101615a99565b508160ff168160ff1611615b495781615b4b565b805b9750505050505050915091565b60006008601f8390030260020a8381615b6d57fe5b0460f81b9392505050565b6000808260ff16600260ff160a60ff168460f81c60ff1681615b9657fe5b0694935050505056fe726f756c7474655461626c654c696d69742063616e74206265206772656174207468656e20746f70206c696d69742e43616e206f6e6c792061636365707420707265617070726f766564206e6577206f776e65722e6d617850726f666974506c696e6b6f2063616e74206265206772656174207468656e20746f70206c696d69742e6d617850726f666974526f756c657474652063616e74206265206772656174207468656e20746f70206c696d69742e42657420646f65736e2774206576656e20636f76657220686f75736520656467652e6d617850726f666974526f756c65747465206c696d69742076696f6c6174696f6e2e4265742073686f756c6420626520696e20616e2027616374697665272073746174654265742073686f756c6420626520696e20612027636c65616e272073746174652e736574746c6542657420696e207468652073616d6520626c6f636b20617320706c6163654265742c206f72206265666f72652e416d6f756e742073686f756c642062652077697468696e2072616e67652e000016ea4dcfd06c1efb1dd2edf3c766c9a9b9c1d73cbd8ddf4359bd3961712299504f6e6c7943726f7570696572206d6574686f64732063616c6c6564206279206e6f6e2d63726f75706965722e496e63726561736520616d6f756e74206c6172676572207468616e2062616c616e63652e416c6c20626574732073686f756c642062652070726f6365737365642028736574746c6564206f7220726566756e64656429206265666f72652073656c662d64657374727563742e546f74616c206265747320616d6f756e742073686f756c64206265204c544520616d6f756e744f6e6c794f776e6572206d6574686f64732063616c6c6564206279206e6f6e2d6f776e65722e6d617850726f6669742063616e74206265206772656174207468656e20746f70206c696d69742e48696768206d6f64756c6f2072616e67652c206265744d61736b206c6172676572207468616e206d6f64756c6f2e426c6f636b686173682063616e277420626520717565726965642062792045564d2e4d6f6465726174696f6e206d6574686f64732063616c6c6564206279206e6f6e2d6d6f64657261746f722ea165627a7a72305820bc9d43aef8f6c18e47787228d2f7107318a36b538819d2381f37f3055bc2f6670029

Swarm Source

bzzr://bc9d43aef8f6c18e47787228d2f7107318a36b538819d2381f37f3055bc2f667

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

Xether is a gambling ecosystem, which makes a difference by caring about its users.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.