ETH Price: $3,314.92 (+1.21%)
Gas: 5 Gwei

Contract

0x7CB7281F674AEa6DB49AEe5c126AA72C7C149C2f
 

Overview

ETH Balance

0.224 ETH

Eth Value

$742.54 (@ $3,314.92/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Owner Withdraw182684522023-10-03 7:14:35300 days ago1696317275IN
0x7CB7281F...C7C149C2f
0 ETH0.000389096.76836156
Deduct Tickets182347622023-09-28 14:15:35305 days ago1695910535IN
0x7CB7281F...C7C149C2f
0 ETH0.0018882617.04364607
Deduct Tickets182325512023-09-28 6:47:23305 days ago1695883643IN
0x7CB7281F...C7C149C2f
0 ETH0.000861287.77401852
Purchase Tickets182325392023-09-28 6:44:59305 days ago1695883499IN
0x7CB7281F...C7C149C2f
0.02 ETH0.000468118.07671602
Purchase Tickets182301642023-09-27 22:46:35305 days ago1695854795IN
0x7CB7281F...C7C149C2f
0.02 ETH0.000401996.93590305
Deduct Tickets182301372023-09-27 22:41:11305 days ago1695854471IN
0x7CB7281F...C7C149C2f
0 ETH0.000902058.14202972
Purchase Tickets182301352023-09-27 22:40:47305 days ago1695854447IN
0x7CB7281F...C7C149C2f
0.02 ETH0.000491538.48077081
Gift Tickets182299932023-09-27 22:12:23305 days ago1695852743IN
0x7CB7281F...C7C149C2f
0 ETH0.0003315413.36025177
Claim182299932023-09-27 22:12:23305 days ago1695852743IN
0x7CB7281F...C7C149C2f
0 ETH0.0002889310
Deduct Tickets182299842023-09-27 22:10:35305 days ago1695852635IN
0x7CB7281F...C7C149C2f
0 ETH0.0013864911.99493226
Purchase Tickets182299822023-09-27 22:10:11305 days ago1695852611IN
0x7CB7281F...C7C149C2f
0.04 ETH0.0007447412.84950322
Gift Tickets182291662023-09-27 19:25:47305 days ago1695842747IN
0x7CB7281F...C7C149C2f
0 ETH0.0005067210.6272665
Gift Tickets182291642023-09-27 19:25:23305 days ago1695842723IN
0x7CB7281F...C7C149C2f
0 ETH0.0003865410.92497331
Gift Tickets182291622023-09-27 19:24:59305 days ago1695842699IN
0x7CB7281F...C7C149C2f
0 ETH0.0003739310.56844738
Gift Tickets182291612023-09-27 19:24:47305 days ago1695842687IN
0x7CB7281F...C7C149C2f
0 ETH0.0003800710.74200076
Deduct Tickets182282462023-09-27 16:20:23306 days ago1695831623IN
0x7CB7281F...C7C149C2f
0 ETH0.0016863515.22120194
Purchase Tickets182281522023-09-27 16:01:35306 days ago1695830495IN
0x7CB7281F...C7C149C2f
0.02 ETH0.0011814520.38431603
Deduct Tickets182277862023-09-27 14:47:47306 days ago1695826067IN
0x7CB7281F...C7C149C2f
0 ETH0.0019453317.55873971
Purchase Tickets182277722023-09-27 14:44:59306 days ago1695825899IN
0x7CB7281F...C7C149C2f
0.02 ETH0.001065218.37855429
Deduct Tickets182269162023-09-27 11:52:35306 days ago1695815555IN
0x7CB7281F...C7C149C2f
0 ETH0.001030639.30262738
Purchase Tickets182269122023-09-27 11:51:47306 days ago1695815507IN
0x7CB7281F...C7C149C2f
0.02 ETH0.000529739.13988056
Purchase Tickets182256672023-09-27 7:39:35306 days ago1695800375IN
0x7CB7281F...C7C149C2f
0.02 ETH0.000506298.73546049
Claim182255112023-09-27 7:07:59306 days ago1695798479IN
0x7CB7281F...C7C149C2f
0 ETH0.000278697.65808036
Gift Tickets182252132023-09-27 6:07:59306 days ago1695794879IN
0x7CB7281F...C7C149C2f
0 ETH0.000433988.26926857
Deduct Tickets182251462023-09-27 5:54:35306 days ago1695794075IN
0x7CB7281F...C7C149C2f
0 ETH0.001104177.37148297
View all transactions

Latest 4 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
182684522023-10-03 7:14:35300 days ago1696317275
0x7CB7281F...C7C149C2f
0.336 ETH
182255112023-09-27 7:07:59306 days ago1695798479
0x7CB7281F...C7C149C2f
0.04 ETH
182249112023-09-27 5:07:11306 days ago1695791231
0x7CB7281F...C7C149C2f
0.16 ETH
182249082023-09-27 5:06:35306 days ago1695791195
0x7CB7281F...C7C149C2f
0.08 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FlappyRoyale

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : flappy.sol
// OPEN SOURCE LICENSE.  RADICAL ACCELERATION.  BREAK THINGS RESPONSIBLY.
// FLAPPY ROYALE:  A TRUSTLESS IMPLEMENTATION FOR EVM BASED BATTLE ROYALE GAMES.
//                                     ................................                                
//                                     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*                               
//                                     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*                               
//                          @@@@@@@@@@@.....................(@@@@@     #@@@@@                          
//                          @@@@@@@@@@@.....................(@@@@@     #@@@@@                          
//                    #@@@@@...........................@@@@@(                @@@@@,                    
//                    #@@@@@...........................@@@@@(                @@@@@,                    
//         /@@@@@@@@@@@@@@@@@@@@@*.....................@@@@@(          #@@@@@     &@@@@@               
//         /@@@@@@@@@@@@@@@@@@@@@*.....................@@@@@(          #@@@@@     &@@@@@               
//    @@@@@#.....................&@@@@@................@@@@@(          #@@@@@     &@@@@@               
//    @@@@@#.....................&@@@@@................@@@@@(          #@@@@@     &@@@@@               
//    @@@@@#.....................%&&&&&,,,,,...........&&&&&(.....     (&&&&&     &@@@@@               
//    @@@@@#...........................@@@@@................(@@@@@                &@@@@@               
//    @@@@@#...........................@@@@@................(@@@@@                &@@@@@               
//    @@@@@#...........................@@@@@......................@@@@@@@@@@@@@@@@@@@@@@@@@@@          
//    @@@@@#...........................@@@@@......................@@@@@@@@@@@@@@@@@@@@@@@@@@@          
//         /@@@@@................&@@@@@.....................(@@@@@***************************@@@@@@    
//         /@@@@@................&@@@@@.....................(@@@@@***************************@@@@@@    
//               @@@@@@@@@@@@@@@@*.....................@@@@@%*****@@@@@@@@@@@@@@@@@@@@@@@@@@@          
//               @@@@@@@@@@@@@@@@*.....................@@@@@%*****@@@@@@@@@@@@@@@@@@@@@@@@@@@          
//                          @@@@@*..........................(@@@@@**********************@@@@@          
//                          @@@@@*..........................(@@@@@**********************@@@@@          
//                          &&&&&/**********................/&&&&&/////////////////////(@@@@@          
//                               &@@@@@@@@@@......................@@@@@@@@@@@@@@@@@@@@@@@@@@@          
//                               &@@@@@@@@@@......................@@@@@@@@@@@@@@@@@@@@@@@@@@@          
//                                          @@@@@@@@@@@@@@@@@@@@@@                                     
//                                          @@@@@@@@@@@@@@@@@@@@@@    
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract FlappyRoyale is Ownable, Pausable, ReentrancyGuard {
    using SafeMath for uint256;

    uint256 public price = 0.02 ether;
    uint256 public highstakePrice = 0.06 ether;
    bool public highStakesActive = false;
    uint256 public entrants = 100;
    uint256 public totalContributions = 0;
    uint256 public totalPrizes = 0;
    uint256 public unclaimedPrizes = 0;
    uint256 public withdrawnFunds = 0;
    uint256 public prizeEquation = 60; 
    uint256 public gameCounter = 0;
    uint256 public currentPlayerCount = 0; 
    address[] public currentPlayersList;  
    address public treasuryWallet = msg.sender;
    uint256 public lastGiveawayMint;

    uint256 public firstPrize = 40;
    uint256 public secondPrize = 20;
    uint256 public thirdPrize = 10;

    mapping(address => uint256) public tickets;
    mapping(address => uint256) public highStakeTickets;
    mapping(address => uint256) public deductedTickets;
    mapping(address => uint256) public pendingWithdrawals; 
    mapping(address => bool) public currentPlayers;  
    mapping(address => uint256) public winsFirst;
    mapping(address => uint256) public winsSecond;
    mapping(address => uint256) public winsThird;

    event LobbyFull(address[] players); 
    event LobbyFullHighStakes(address[] players); 
    event TicketDeducted(address indexed user, uint256 currentPlayerCount);
    event HighStakeTicketDeducted(address indexed user, uint256 currentPlayerCount);
    event TicketsPurchased(address indexed user, uint256 amount);
    event HighStakeTicketsPurchased(address indexed user, uint256 amount);
    event TicketsGranted(address indexed user1, address indexed user2);
    event TicketsGifted(address indexed sender, address indexed receiver, uint256 amount);
    event WinnersPayoutUpdated(address winner1, address winner2, address winner3, uint256 winner1Amount, uint256 winner2Amount, uint256 winner3Amount);
    event EntrantsUpdated(uint256 newEntrants);
    event FundsWithdrawn(uint256 amount);
    event PrizeEquationUpdated(uint256 newPrizeEquation);
    event AmountClaimed(address indexed user, uint256 amount);

    bool public isShutDown = false;
    bool public contractOpened = false;

    modifier onlyWhenHighStakesInactive() {
        require(!highStakesActive, "High Stakes are active");
        _;
    }

    modifier onlyWhenHighStakesActive() {
        require(highStakesActive, "High Stakes are not active");
        _;
    }

    modifier onlyEOA() {
        require(!isContract(msg.sender), "Caller must be an EOA");
        _;
    }

    modifier onlyTreasuryWallet() {
        require(msg.sender == treasuryWallet, "Not authorized");
        _;
    }

    function isContract(address account) public view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(account) }
        return size > 0;
    }
    function toggleHighStakes() external onlyTreasuryWallet {
        require(currentPlayerCount == entrants, "Current players list is not equal to entrants");
        highStakesActive = !highStakesActive;
    }

    function purchaseTickets(uint256 amount) external payable whenNotPaused  {        
        require(!isShutDown, "Ticket purchasing has been shut down");
        require(msg.value == amount.mul(price), "Incorrect ETH sent");

        totalContributions = totalContributions.add(msg.value);
        creditTickets(msg.sender, amount);

        emit TicketsPurchased(msg.sender, amount);
    }

    function creditTickets(address user, uint256 amount) internal {
        tickets[user] = tickets[user].add(amount);
    }

    function purchaseHighStakeTickets(uint256 amount) external payable whenNotPaused  {        
        require(!isShutDown, "Ticket purchasing has been shut down");
        require(msg.value == amount.mul(highstakePrice), "Incorrect ETH sent"); 
        
        totalContributions = totalContributions.add(msg.value);
        creditHighStakeTickets(msg.sender, amount);
        
        emit HighStakeTicketsPurchased(msg.sender, amount);
    }

    function creditHighStakeTickets(address user, uint256 amount) internal {
        highStakeTickets[user] = highStakeTickets[user].add(amount);
    }

    function deductTickets() external onlyEOA onlyWhenHighStakesInactive {        
        require(!isShutDown, "Game is shut down");
        require(contractOpened, "Contract not open yet");
        require(currentPlayerCount < entrants, "Lobby is full. Wait for payout.");
        require(tickets[msg.sender] > 0, "Insufficient tickets");
        require(gameCounter < 1, "Game is in progress please wait");
        require(!currentPlayers[msg.sender], "You've already joined the current lobby");

        if(!currentPlayers[msg.sender]) {
            tickets[msg.sender] = tickets[msg.sender].sub(1);
            deductedTickets[msg.sender] = deductedTickets[msg.sender].add(1);
            
            currentPlayerCount++;
            emit TicketDeducted(msg.sender, currentPlayerCount);
      
            currentPlayersList.push(msg.sender);
            currentPlayers[msg.sender] = true;

            if(currentPlayerCount == entrants) {
                emit LobbyFull(currentPlayersList);
                gameCounter = gameCounter.add(1); 
            }
        }
    }

    function deductHighStakeTickets() external onlyEOA onlyWhenHighStakesActive {        
        require(!isShutDown, "Game is shut down");
        require(contractOpened, "Contract not open yet");
        require(currentPlayerCount < entrants, "Lobby is full. Wait for payout.");
        require(highStakeTickets[msg.sender] > 0, "Insufficient high-stake tickets");
        require(!currentPlayers[msg.sender], "You've already joined the current lobby");

        if(!currentPlayers[msg.sender]) {
            highStakeTickets[msg.sender] = highStakeTickets[msg.sender].sub(1);
            deductedTickets[msg.sender] = deductedTickets[msg.sender].add(1);
        
            currentPlayerCount++;
            emit HighStakeTicketDeducted(msg.sender, currentPlayerCount);
         
            currentPlayersList.push(msg.sender);
            currentPlayers[msg.sender] = true;  
        
            if(currentPlayerCount == entrants) {
                emit LobbyFullHighStakes(currentPlayersList);
                gameCounter = gameCounter.add(1); 
            }
        }
    }

    function giftTickets(address receiver, uint256 amount) external {
        require(receiver != address(0), "Invalid receiver address");
        require(amount > 0, "Amount must be greater than 0");
        address sender = msg.sender;
        require(tickets[sender] >= amount, "Insufficient tickets to gift");

        tickets[sender] = tickets[sender].sub(amount); 
        tickets[receiver] = tickets[receiver].add(amount); 

        emit TicketsGifted(sender, receiver, amount);
    }

    function mintGiftTickets() external onlyTreasuryWallet {
        uint256 amountToMint = 10;
        require(block.timestamp - lastGiveawayMint >= 1 days, 
            "Can only mint 10 tickets per day");

        lastGiveawayMint = block.timestamp;
        tickets[owner()] = tickets[owner()].add(amountToMint);
    }

    function setWinnersPayoutStandard(address winner1, address winner2, address winner3) external onlyTreasuryWallet   {
        _setWinnersPayout(winner1, winner2, winner3, price);
    }

    function setWinnersPayoutHighStakes(address winner1, address winner2, address winner3) external onlyTreasuryWallet   {
        _setWinnersPayout(winner1, winner2, winner3, highstakePrice);
    }

   function _setWinnersPayout(address winner1, address winner2, address winner3, uint256 activePrice) internal {
        require(gameCounter > 0, "No completed games available for payout");
        require(prizeEquation >= 60 && prizeEquation <= 100, "Invalid prize equation percentage");

        uint256 totalPrize = activePrice.mul(entrants); 
        
        uint256 winner1Amount = totalPrize.mul(firstPrize).div(100); 
        uint256 winner2Amount = totalPrize.mul(secondPrize).div(100); 
        uint256 winner3Amount = totalPrize.mul(thirdPrize).div(100);

        pendingWithdrawals[winner1] = pendingWithdrawals[winner1].add(winner1Amount);
        pendingWithdrawals[winner2] = pendingWithdrawals[winner2].add(winner2Amount);
        pendingWithdrawals[winner3] = pendingWithdrawals[winner3].add(winner3Amount);
        totalPrizes = totalPrizes.add(winner1Amount).add(winner2Amount).add(winner3Amount);
        unclaimedPrizes = unclaimedPrizes.add(winner1Amount).add(winner2Amount).add(winner3Amount);

        emit WinnersPayoutUpdated(winner1, winner2, winner3, winner1Amount, winner2Amount, winner3Amount);

        winsFirst[winner1] = winsFirst[winner1].add(1);
        winsSecond[winner2] = winsSecond[winner2].add(1);
        winsThird[winner3] = winsThird[winner3].add(1);

        gameCounter = 0;
        currentPlayerCount = 0;
        delete currentPlayersList;
    }

    function setPrizePercentages(uint256 _firstPrize, uint256 _secondPrize, uint256 _thirdPrize) external onlyTreasuryWallet {
        require(_firstPrize >= 40, "First prize cannot be less than 40%");
        require(_secondPrize >= 20, "Second prize cannot be less than 20%");
        require(_thirdPrize >= 10, "Third prize cannot be less than 10%");
        require(_firstPrize.add(_secondPrize).add(_thirdPrize) <= 100, "Total prize percentages cannot exceed 100%");
        
        firstPrize = _firstPrize;
        secondPrize = _secondPrize;
        thirdPrize = _thirdPrize;
    }


    function claim() external nonReentrant {
        uint256 amount = pendingWithdrawals[msg.sender];
        require(amount > 0, "No funds to claim.");

        pendingWithdrawals[msg.sender] = 0;
        payable(msg.sender).transfer(amount);
        unclaimedPrizes = unclaimedPrizes.sub(amount);

        emit AmountClaimed(msg.sender, amount);
    }

    function updatePrizeEquation(uint256 newPrizeEquation) external onlyTreasuryWallet {
        require(newPrizeEquation >= 60 && newPrizeEquation <= 100, "Invalid prize equation percentage");

        prizeEquation = newPrizeEquation;

        emit PrizeEquationUpdated(newPrizeEquation);
    }

    function grantTickets(address user1, address user2) external onlyTreasuryWallet {
        require(user1 != address(0) && user2 != address(0), "Invalid address");
        tickets[user1] = tickets[user1].add(1);
        tickets[user2] = tickets[user2].add(1);
        emit TicketsGranted(user1, user2);
    }


    function updateEntrants(uint256 newEntrants) external onlyTreasuryWallet {
        if(contractOpened) {
            require(gameCounter > 0, "No completed games available for payout");
        }
        entrants = newEntrants;
        emit EntrantsUpdated(newEntrants);
    }
    
    function getCurrentPlayersList() external view returns (address[] memory) {
        return currentPlayersList;
    }

    function ownerWithdraw(uint256 amount) external onlyOwner {
        uint256 maxAmount = totalContributions.mul(40).div(100);
        require(withdrawnFunds.add(amount) <= maxAmount, "Exceeding withdrawal limit");

        withdrawnFunds = withdrawnFunds.add(amount);
        payable(msg.sender).transfer(amount);

        emit FundsWithdrawn(amount);
    }

    function delegateTreasuryWallet(address newTreasuryWallet) external onlyOwner {
        require(newTreasuryWallet != address(0), "Invalid address");
        treasuryWallet = newTreasuryWallet;
    }

    function renounceOwnership() public view override onlyOwner {
        revert("Renouncing ownership is not allowed");
    }

    function pauseTicketBuying() external onlyTreasuryWallet {
        require(!isShutDown, "Contract is already shut down");
        isShutDown = true;
    }

    function resumeTicketBuying() external onlyTreasuryWallet {
        require(isShutDown, "Contract is not shut down");
        isShutDown = false;
    }

    function startContract() external onlyOwner {
        contractOpened = true;
    }
}

File 2 of 6 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

File 3 of 6 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 4 of 6 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 5 of 6 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 6 of 6 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AmountClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newEntrants","type":"uint256"}],"name":"EntrantsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FundsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"currentPlayerCount","type":"uint256"}],"name":"HighStakeTicketDeducted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"HighStakeTicketsPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"players","type":"address[]"}],"name":"LobbyFull","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"players","type":"address[]"}],"name":"LobbyFullHighStakes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newPrizeEquation","type":"uint256"}],"name":"PrizeEquationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"currentPlayerCount","type":"uint256"}],"name":"TicketDeducted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TicketsGifted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user1","type":"address"},{"indexed":true,"internalType":"address","name":"user2","type":"address"}],"name":"TicketsGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TicketsPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"winner1","type":"address"},{"indexed":false,"internalType":"address","name":"winner2","type":"address"},{"indexed":false,"internalType":"address","name":"winner3","type":"address"},{"indexed":false,"internalType":"uint256","name":"winner1Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winner2Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winner3Amount","type":"uint256"}],"name":"WinnersPayoutUpdated","type":"event"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractOpened","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPlayerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"currentPlayers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"currentPlayersList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deductHighStakeTickets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deductTickets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"deductedTickets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasuryWallet","type":"address"}],"name":"delegateTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"entrants","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstPrize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPlayersList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"giftTickets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user1","type":"address"},{"internalType":"address","name":"user2","type":"address"}],"name":"grantTickets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"highStakeTickets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"highStakesActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"highstakePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isShutDown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastGiveawayMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintGiftTickets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseTicketBuying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingWithdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prizeEquation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"purchaseHighStakeTickets","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"purchaseTickets","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resumeTicketBuying","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"secondPrize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_firstPrize","type":"uint256"},{"internalType":"uint256","name":"_secondPrize","type":"uint256"},{"internalType":"uint256","name":"_thirdPrize","type":"uint256"}],"name":"setPrizePercentages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"winner1","type":"address"},{"internalType":"address","name":"winner2","type":"address"},{"internalType":"address","name":"winner3","type":"address"}],"name":"setWinnersPayoutHighStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"winner1","type":"address"},{"internalType":"address","name":"winner2","type":"address"},{"internalType":"address","name":"winner3","type":"address"}],"name":"setWinnersPayoutStandard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"thirdPrize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tickets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleHighStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalContributions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPrizes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unclaimedPrizes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newEntrants","type":"uint256"}],"name":"updateEntrants","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrizeEquation","type":"uint256"}],"name":"updatePrizeEquation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"winsFirst","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"winsSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"winsThird","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawnFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405266470de4df82000060025566d529ae9e8600006003556000600460006101000a81548160ff02191690831515021790555060646005556000600655600060075560006008556000600955603c600a556000600b556000600c5533600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060286010556014601155600a6012556000601b60006101000a81548160ff0219169083151502179055506000601b60016101000a81548160ff021916908315150217905550348015620000f057600080fd5b5062000111620001056200013860201b60201c565b6200014060201b60201c565b60008060146101000a81548160ff0219169083151502179055506001808190555062000204565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b614fcc80620002146000396000f3fe6080604052600436106102ff5760003560e01c80636dcbf2a311610190578063bbbf7fb8116100dc578063e872592111610095578063f3f437031161006f578063f3f4370314610ad0578063fb347c5214610b0d578063ff8de5ec14610b38578063ff94752514610b63576102ff565b8063e872592114610a53578063e944079b14610a7e578063f2fde38b14610aa7576102ff565b8063bbbf7fb814610955578063bd5c508a14610992578063c5625ae7146109a9578063d75075fa146109d4578063d8ec3a6f146109ff578063e3d98bd614610a16576102ff565b8063906280c311610149578063a035b1fe11610123578063a035b1fe146108bc578063a11dec9f146108e7578063a127760014610910578063a1d1f10d1461092c576102ff565b8063906280c31461084f5780639220abb11461087a5780639834cda4146108a5576102ff565b80636dcbf2a314610751578063715018a61461078e5780637b8ce08f146107a5578063835a8ed3146107ce5780638da5cb5b146107f957806390581bf414610824576102ff565b806333f707d11161024f578063495caa8d116102085780635c975abb116101e25780635c975abb146106bb5780635ce220c1146106e65780635d02787f146107235780635fb02f4d1461073a576102ff565b8063495caa8d146106505780634b9a714a146106675780634e71d92d146106a4576102ff565b806333f707d11461054057806337c08923146105695780633d70bc52146105945780633e01aaad146105bf5780634626402b146105e85780634755fda114610613576102ff565b80631e7b6938116102bc5780632c12ddd2116102965780632c12ddd2146104915780632e0be39a146104ad5780632e98520c146104d85780632fc8f46714610503576102ff565b80631e7b69381461041257806323c6fce41461043d57806325e6c30414610466576102ff565b80630743fe4e14610304578063090f9e041461032d5780630ab80e331461036a5780630fdf2de81461039557806316279055146103be5780631c46773d146103fb575b600080fd5b34801561031057600080fd5b5061032b600480360381019061032691906139b1565b610b8e565b005b34801561033957600080fd5b50610354600480360381019061034f91906139f1565b610e5b565b6040516103619190613a2d565b60405180910390f35b34801561037657600080fd5b5061037f610e73565b60405161038c9190613a2d565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b791906139f1565b610e79565b005b3480156103ca57600080fd5b506103e560048036038101906103e091906139f1565b610f34565b6040516103f29190613a63565b60405180910390f35b34801561040757600080fd5b50610410610f47565b005b34801561041e57600080fd5b506104276110dd565b6040516104349190613a2d565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f9190613a7e565b6110e3565b005b34801561047257600080fd5b5061047b61120f565b6040516104889190613a2d565b60405180910390f35b6104ab60048036038101906104a69190613a7e565b611215565b005b3480156104b957600080fd5b506104c2611339565b6040516104cf9190613a2d565b60405180910390f35b3480156104e457600080fd5b506104ed61133f565b6040516104fa9190613a2d565b60405180910390f35b34801561050f57600080fd5b5061052a600480360381019061052591906139f1565b611345565b6040516105379190613a2d565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190613a7e565b61135d565b005b34801561057557600080fd5b5061057e611486565b60405161058b9190613a2d565b60405180910390f35b3480156105a057600080fd5b506105a961148c565b6040516105b69190613a2d565b60405180910390f35b3480156105cb57600080fd5b506105e660048036038101906105e19190613aab565b611492565b005b3480156105f457600080fd5b506105fd611535565b60405161060a9190613b0d565b60405180910390f35b34801561061f57600080fd5b5061063a600480360381019061063591906139f1565b61155b565b6040516106479190613a2d565b60405180910390f35b34801561065c57600080fd5b50610665611573565b005b34801561067357600080fd5b5061068e600480360381019061068991906139f1565b611670565b60405161069b9190613a2d565b60405180910390f35b3480156106b057600080fd5b506106b9611688565b005b3480156106c757600080fd5b506106d0611817565b6040516106dd9190613a63565b60405180910390f35b3480156106f257600080fd5b5061070d60048036038101906107089190613a7e565b61182d565b60405161071a9190613b0d565b60405180910390f35b34801561072f57600080fd5b5061073861186c565b005b34801561074657600080fd5b5061074f61196e565b005b34801561075d57600080fd5b50610778600480360381019061077391906139f1565b611993565b6040516107859190613a2d565b60405180910390f35b34801561079a57600080fd5b506107a36119ab565b005b3480156107b157600080fd5b506107cc60048036038101906107c79190613a7e565b6119ee565b005b3480156107da57600080fd5b506107e3611b10565b6040516107f09190613a2d565b60405180910390f35b34801561080557600080fd5b5061080e611b16565b60405161081b9190613b0d565b60405180910390f35b34801561083057600080fd5b50610839611b3f565b6040516108469190613a63565b60405180910390f35b34801561085b57600080fd5b50610864611b52565b6040516108719190613a2d565b60405180910390f35b34801561088657600080fd5b5061088f611b58565b60405161089c9190613a2d565b60405180910390f35b3480156108b157600080fd5b506108ba611b5e565b005b3480156108c857600080fd5b506108d1611c5a565b6040516108de9190613a2d565b60405180910390f35b3480156108f357600080fd5b5061090e60048036038101906109099190613b28565b611c60565b005b61092a60048036038101906109259190613a7e565b611e3e565b005b34801561093857600080fd5b50610953600480360381019061094e9190613b7b565b611f62565b005b34801561096157600080fd5b5061097c600480360381019061097791906139f1565b612225565b6040516109899190613a2d565b60405180910390f35b34801561099e57600080fd5b506109a761223d565b005b3480156109b557600080fd5b506109be612812565b6040516109cb9190613a2d565b60405180910390f35b3480156109e057600080fd5b506109e9612818565b6040516109f69190613a63565b60405180910390f35b348015610a0b57600080fd5b50610a1461282b565b005b348015610a2257600080fd5b50610a3d6004803603810190610a3891906139f1565b612dba565b604051610a4a9190613a63565b60405180910390f35b348015610a5f57600080fd5b50610a68612dda565b604051610a759190613c79565b60405180910390f35b348015610a8a57600080fd5b50610aa56004803603810190610aa09190613aab565b612e68565b005b348015610ab357600080fd5b50610ace6004803603810190610ac991906139f1565b612f0b565b005b348015610adc57600080fd5b50610af76004803603810190610af291906139f1565b612f8e565b604051610b049190613a2d565b60405180910390f35b348015610b1957600080fd5b50610b22612fa6565b604051610b2f9190613a2d565b60405180910390f35b348015610b4457600080fd5b50610b4d612fac565b604051610b5a9190613a2d565b60405180910390f35b348015610b6f57600080fd5b50610b78612fb2565b604051610b859190613a63565b60405180910390f35b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490613cf8565b60405180910390fd5b60008111610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3790613d64565b60405180910390fd5b600033905081601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90613dd0565b60405180910390fd5b610d1982601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fc590919063ffffffff16565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610dae82601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f26941c4238c2ab25a144b8fc1eb9162820738d96a3c9be025d650db4e214130084604051610e4e9190613a2d565b60405180910390a3505050565b60156020528060005260406000206000915090505481565b60035481565b610e81612ff1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee790613e3c565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080823b905060008111915050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90613ea8565b60405180910390fd5b6000600a905062015180600f5442610fef9190613ef7565b1015611030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102790613f77565b60405180910390fd5b42600f819055506110908160136000611047611b16565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b6013600061109c611b16565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b60055481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90613ea8565b60405180910390fd5b601b60019054906101000a900460ff16156111ce576000600b54116111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c490614009565b60405180910390fd5b5b806005819055507f1689bcc7e7fd08af4cf38eb983dc287febf0f2b7c105f8a51ea8c7618143531d816040516112049190613a2d565b60405180910390a150565b60075481565b61121d61306f565b601b60009054906101000a900460ff161561126d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112649061409b565b60405180910390fd5b611282600354826130b990919063ffffffff16565b34146112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90614107565b60405180910390fd5b6112d834600654612fdb90919063ffffffff16565b6006819055506112e833826130cf565b3373ffffffffffffffffffffffffffffffffffffffff167fce55d51a74c760dc7fd517c6f83701c75762ecc197438f49de28ffe460eeb72c8260405161132e9190613a2d565b60405180910390a250565b600b5481565b60105481565b60186020528060005260406000206000915090505481565b611365612ff1565b6000611390606461138260286006546130b990919063ffffffff16565b61316890919063ffffffff16565b9050806113a883600954612fdb90919063ffffffff16565b11156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e090614173565b60405180910390fd5b6113fe82600954612fdb90919063ffffffff16565b6009819055503373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561144a573d6000803e3d6000fd5b507f4a37b25aab49761ecf63117fe82b98d750917451133cf797507bc9fb5b96044a8260405161147a9190613a2d565b60405180910390a15050565b60065481565b60115481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151990613ea8565b60405180910390fd5b61153083838360035461317e565b505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601a6020528060005260406000206000915090505481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa90613ea8565b60405180910390fd5b601b60009054906101000a900460ff1615611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164a906141df565b60405180910390fd5b6001601b60006101000a81548160ff021916908315150217905550565b60146020528060005260406000206000915090505481565b61169061371d565b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170e9061424b565b60405180910390fd5b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117a2573d6000803e3d6000fd5b506117b881600854612fc590919063ffffffff16565b6008819055503373ffffffffffffffffffffffffffffffffffffffff167f13dcfa08b5805e689424ccce1892676af568734e1561cc374b73c6c5e5f30400826040516118049190613a2d565b60405180910390a25061181561376c565b565b60008060149054906101000a900460ff16905090565b600d818154811061183d57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f390613ea8565b60405180910390fd5b600554600c5414611942576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611939906142dd565b60405180910390fd5b600460009054906101000a900460ff1615600460006101000a81548160ff021916908315150217905550565b611976612ff1565b6001601b60016101000a81548160ff021916908315150217905550565b60136020528060005260406000206000915090505481565b6119b3612ff1565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e59061436f565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7590613ea8565b60405180910390fd5b603c8110158015611a90575060648111155b611acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac690614401565b60405180910390fd5b80600a819055507fe139cfb188ea120c39fe64d94cd62af3844dcc6af49e390373393f27edc4ab6781604051611b059190613a2d565b60405180910390a150565b60125481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600460009054906101000a900460ff1681565b60095481565b600f5481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be590613ea8565b60405180910390fd5b601b60009054906101000a900460ff16611c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c349061446d565b60405180910390fd5b6000601b60006101000a81548160ff021916908315150217905550565b60025481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce790613ea8565b60405180910390fd5b6028831015611d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2b906144ff565b60405180910390fd5b6014821015611d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6f90614591565b60405180910390fd5b600a811015611dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db390614623565b60405180910390fd5b6064611de382611dd58587612fdb90919063ffffffff16565b612fdb90919063ffffffff16565b1115611e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1b906146b5565b60405180910390fd5b826010819055508160118190555080601281905550505050565b611e4661306f565b601b60009054906101000a900460ff1615611e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8d9061409b565b60405180910390fd5b611eab600254826130b990919063ffffffff16565b3414611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee390614107565b60405180910390fd5b611f0134600654612fdb90919063ffffffff16565b600681905550611f113382613775565b3373ffffffffffffffffffffffffffffffffffffffff167fe11731cb4f1eb3ec3dd09bdc96809bb07365f4c881cda3192b397a4bc0b6da4082604051611f579190613a2d565b60405180910390a250565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe990613ea8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561205c5750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61209b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209290613e3c565b60405180910390fd5b6120ee6001601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506121846001601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f2bbaca1354ea4174af015cc6012643e686145d9cfee0414d2c0ed840a1ca04fc60405160405180910390a35050565b60196020528060005260406000206000915090505481565b61224633610f34565b15612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d90614721565b60405180910390fd5b600460009054906101000a900460ff16156122d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cd9061478d565b60405180910390fd5b601b60009054906101000a900460ff1615612326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231d906147f9565b60405180910390fd5b601b60019054906101000a900460ff16612375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236c90614865565b60405180910390fd5b600554600c54106123bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b2906148d1565b60405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161243d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124349061493d565b60405180910390fd5b6001600b5410612482576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612479906149a9565b60405180910390fd5b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561250f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250690614a3b565b60405180910390fd5b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612810576125b36001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fc590919063ffffffff16565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506126496001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c600081548092919061269f90614a5b565b91905055503373ffffffffffffffffffffffffffffffffffffffff167fc7e8add138e49f46d19677ad306f460739bd3c94f7c2afd303caa90a3b976509600c546040516126ec9190613a2d565b60405180910390a2600d339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600554600c540361280f577fe8cdca242f8202ae412d2a2d900d52ea6aad38bc508d028831bc37a4c570f76e600d6040516127ea9190614b8f565b60405180910390a16128086001600b54612fdb90919063ffffffff16565b600b819055505b5b565b600c5481565b601b60019054906101000a900460ff1681565b61283433610f34565b15612874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286b90614721565b60405180910390fd5b600460009054906101000a900460ff166128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba90614bfd565b60405180910390fd5b601b60009054906101000a900460ff1615612913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290a906147f9565b60405180910390fd5b601b60019054906101000a900460ff16612962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295990614865565b60405180910390fd5b600554600c54106129a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299f906148d1565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2190614c69565b60405180910390fd5b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aae90614a3b565b60405180910390fd5b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612db857612b5b6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fc590919063ffffffff16565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612bf16001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c6000815480929190612c4790614a5b565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4cbabd28f8f38a9ad71eb794f4b769c609bbc2dd913cdbff777ad6c55282df37600c54604051612c949190613a2d565b60405180910390a2600d339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600554600c5403612db7577f606f95d7d280a6f49d9ddfef59b05d181894bf69ba014ad62507ecceed38c687600d604051612d929190614b8f565b60405180910390a1612db06001600b54612fdb90919063ffffffff16565b600b819055505b5b565b60176020528060005260406000206000915054906101000a900460ff1681565b6060600d805480602002602001604051908101604052809291908181526020018280548015612e5e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612e14575b5050505050905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eef90613ea8565b60405180910390fd5b612f0683838360025461317e565b505050565b612f13612ff1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7990614cfb565b60405180910390fd5b612f8b8161380e565b50565b60166020528060005260406000206000915090505481565b600a5481565b60085481565b601b60009054906101000a900460ff1681565b60008183612fd39190613ef7565b905092915050565b60008183612fe99190614d1b565b905092915050565b612ff96138d2565b73ffffffffffffffffffffffffffffffffffffffff16613017611b16565b73ffffffffffffffffffffffffffffffffffffffff161461306d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306490614d9b565b60405180910390fd5b565b613077611817565b156130b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ae90614e07565b60405180910390fd5b565b600081836130c79190614e27565b905092915050565b61312181601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600081836131769190614e98565b905092915050565b6000600b54116131c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ba90614009565b60405180910390fd5b603c600a54101580156131d957506064600a5411155b613218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320f90614401565b60405180910390fd5b600061322f600554836130b990919063ffffffff16565b9050600061325b606461324d601054856130b990919063ffffffff16565b61316890919063ffffffff16565b905060006132876064613279601154866130b990919063ffffffff16565b61316890919063ffffffff16565b905060006132b360646132a5601254876130b990919063ffffffff16565b61316890919063ffffffff16565b905061330783601660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061339c82601660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061343181601660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134ad8161349f8461349187600754612fdb90919063ffffffff16565b612fdb90919063ffffffff16565b612fdb90919063ffffffff16565b6007819055506134ec816134de846134d087600854612fdb90919063ffffffff16565b612fdb90919063ffffffff16565b612fdb90919063ffffffff16565b6008819055507f5b5e25cf98229fed07be659b639d9b41f7904a15ae24a73580c5fac99c5d650788888886868660405161352b96959493929190614ec9565b60405180910390a16135866001601860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061361c6001601960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136b26001601a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600b819055506000600c81905550600d600061371391906138da565b5050505050505050565b600260015403613762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375990614f76565b60405180910390fd5b6002600181905550565b60018081905550565b6137c781601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b50805460008255906000526020600020908101906138f891906138fb565b50565b5b808211156139145760008160009055506001016138fc565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139488261391d565b9050919050565b6139588161393d565b811461396357600080fd5b50565b6000813590506139758161394f565b92915050565b6000819050919050565b61398e8161397b565b811461399957600080fd5b50565b6000813590506139ab81613985565b92915050565b600080604083850312156139c8576139c7613918565b5b60006139d685828601613966565b92505060206139e78582860161399c565b9150509250929050565b600060208284031215613a0757613a06613918565b5b6000613a1584828501613966565b91505092915050565b613a278161397b565b82525050565b6000602082019050613a426000830184613a1e565b92915050565b60008115159050919050565b613a5d81613a48565b82525050565b6000602082019050613a786000830184613a54565b92915050565b600060208284031215613a9457613a93613918565b5b6000613aa28482850161399c565b91505092915050565b600080600060608486031215613ac457613ac3613918565b5b6000613ad286828701613966565b9350506020613ae386828701613966565b9250506040613af486828701613966565b9150509250925092565b613b078161393d565b82525050565b6000602082019050613b226000830184613afe565b92915050565b600080600060608486031215613b4157613b40613918565b5b6000613b4f8682870161399c565b9350506020613b608682870161399c565b9250506040613b718682870161399c565b9150509250925092565b60008060408385031215613b9257613b91613918565b5b6000613ba085828601613966565b9250506020613bb185828601613966565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613bf08161393d565b82525050565b6000613c028383613be7565b60208301905092915050565b6000602082019050919050565b6000613c2682613bbb565b613c308185613bc6565b9350613c3b83613bd7565b8060005b83811015613c6c578151613c538882613bf6565b9750613c5e83613c0e565b925050600181019050613c3f565b5085935050505092915050565b60006020820190508181036000830152613c938184613c1b565b905092915050565b600082825260208201905092915050565b7f496e76616c696420726563656976657220616464726573730000000000000000600082015250565b6000613ce2601883613c9b565b9150613ced82613cac565b602082019050919050565b60006020820190508181036000830152613d1181613cd5565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b6000613d4e601d83613c9b565b9150613d5982613d18565b602082019050919050565b60006020820190508181036000830152613d7d81613d41565b9050919050565b7f496e73756666696369656e74207469636b65747320746f206769667400000000600082015250565b6000613dba601c83613c9b565b9150613dc582613d84565b602082019050919050565b60006020820190508181036000830152613de981613dad565b9050919050565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b6000613e26600f83613c9b565b9150613e3182613df0565b602082019050919050565b60006020820190508181036000830152613e5581613e19565b9050919050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000613e92600e83613c9b565b9150613e9d82613e5c565b602082019050919050565b60006020820190508181036000830152613ec181613e85565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f028261397b565b9150613f0d8361397b565b9250828203905081811115613f2557613f24613ec8565b5b92915050565b7f43616e206f6e6c79206d696e74203130207469636b6574732070657220646179600082015250565b6000613f61602083613c9b565b9150613f6c82613f2b565b602082019050919050565b60006020820190508181036000830152613f9081613f54565b9050919050565b7f4e6f20636f6d706c657465642067616d657320617661696c61626c6520666f7260008201527f207061796f757400000000000000000000000000000000000000000000000000602082015250565b6000613ff3602783613c9b565b9150613ffe82613f97565b604082019050919050565b6000602082019050818103600083015261402281613fe6565b9050919050565b7f5469636b65742070757263686173696e6720686173206265656e20736875742060008201527f646f776e00000000000000000000000000000000000000000000000000000000602082015250565b6000614085602483613c9b565b915061409082614029565b604082019050919050565b600060208201905081810360008301526140b481614078565b9050919050565b7f496e636f7272656374204554482073656e740000000000000000000000000000600082015250565b60006140f1601283613c9b565b91506140fc826140bb565b602082019050919050565b60006020820190508181036000830152614120816140e4565b9050919050565b7f457863656564696e67207769746864726177616c206c696d6974000000000000600082015250565b600061415d601a83613c9b565b915061416882614127565b602082019050919050565b6000602082019050818103600083015261418c81614150565b9050919050565b7f436f6e747261637420697320616c7265616479207368757420646f776e000000600082015250565b60006141c9601d83613c9b565b91506141d482614193565b602082019050919050565b600060208201905081810360008301526141f8816141bc565b9050919050565b7f4e6f2066756e647320746f20636c61696d2e0000000000000000000000000000600082015250565b6000614235601283613c9b565b9150614240826141ff565b602082019050919050565b6000602082019050818103600083015261426481614228565b9050919050565b7f43757272656e7420706c6179657273206c697374206973206e6f74206571756160008201527f6c20746f20656e7472616e747300000000000000000000000000000000000000602082015250565b60006142c7602d83613c9b565b91506142d28261426b565b604082019050919050565b600060208201905081810360008301526142f6816142ba565b9050919050565b7f52656e6f756e63696e67206f776e657273686970206973206e6f7420616c6c6f60008201527f7765640000000000000000000000000000000000000000000000000000000000602082015250565b6000614359602383613c9b565b9150614364826142fd565b604082019050919050565b600060208201905081810360008301526143888161434c565b9050919050565b7f496e76616c6964207072697a65206571756174696f6e2070657263656e74616760008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006143eb602183613c9b565b91506143f68261438f565b604082019050919050565b6000602082019050818103600083015261441a816143de565b9050919050565b7f436f6e7472616374206973206e6f74207368757420646f776e00000000000000600082015250565b6000614457601983613c9b565b915061446282614421565b602082019050919050565b600060208201905081810360008301526144868161444a565b9050919050565b7f4669727374207072697a652063616e6e6f74206265206c657373207468616e2060008201527f3430250000000000000000000000000000000000000000000000000000000000602082015250565b60006144e9602383613c9b565b91506144f48261448d565b604082019050919050565b60006020820190508181036000830152614518816144dc565b9050919050565b7f5365636f6e64207072697a652063616e6e6f74206265206c657373207468616e60008201527f2032302500000000000000000000000000000000000000000000000000000000602082015250565b600061457b602483613c9b565b91506145868261451f565b604082019050919050565b600060208201905081810360008301526145aa8161456e565b9050919050565b7f5468697264207072697a652063616e6e6f74206265206c657373207468616e2060008201527f3130250000000000000000000000000000000000000000000000000000000000602082015250565b600061460d602383613c9b565b9150614618826145b1565b604082019050919050565b6000602082019050818103600083015261463c81614600565b9050919050565b7f546f74616c207072697a652070657263656e74616765732063616e6e6f74206560008201527f7863656564203130302500000000000000000000000000000000000000000000602082015250565b600061469f602a83613c9b565b91506146aa82614643565b604082019050919050565b600060208201905081810360008301526146ce81614692565b9050919050565b7f43616c6c6572206d75737420626520616e20454f410000000000000000000000600082015250565b600061470b601583613c9b565b9150614716826146d5565b602082019050919050565b6000602082019050818103600083015261473a816146fe565b9050919050565b7f48696768205374616b6573206172652061637469766500000000000000000000600082015250565b6000614777601683613c9b565b915061478282614741565b602082019050919050565b600060208201905081810360008301526147a68161476a565b9050919050565b7f47616d65206973207368757420646f776e000000000000000000000000000000600082015250565b60006147e3601183613c9b565b91506147ee826147ad565b602082019050919050565b60006020820190508181036000830152614812816147d6565b9050919050565b7f436f6e7472616374206e6f74206f70656e207965740000000000000000000000600082015250565b600061484f601583613c9b565b915061485a82614819565b602082019050919050565b6000602082019050818103600083015261487e81614842565b9050919050565b7f4c6f6262792069732066756c6c2e205761697420666f72207061796f75742e00600082015250565b60006148bb601f83613c9b565b91506148c682614885565b602082019050919050565b600060208201905081810360008301526148ea816148ae565b9050919050565b7f496e73756666696369656e74207469636b657473000000000000000000000000600082015250565b6000614927601483613c9b565b9150614932826148f1565b602082019050919050565b600060208201905081810360008301526149568161491a565b9050919050565b7f47616d6520697320696e2070726f677265737320706c65617365207761697400600082015250565b6000614993601f83613c9b565b915061499e8261495d565b602082019050919050565b600060208201905081810360008301526149c281614986565b9050919050565b7f596f7527766520616c7265616479206a6f696e6564207468652063757272656e60008201527f74206c6f62627900000000000000000000000000000000000000000000000000602082015250565b6000614a25602783613c9b565b9150614a30826149c9565b604082019050919050565b60006020820190508181036000830152614a5481614a18565b9050919050565b6000614a668261397b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a9857614a97613ec8565b5b600182019050919050565b600081549050919050565b60008190508160005260206000209050919050565b60008160001c9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614b03614afe83614ac3565b614ad0565b9050919050565b6000614b168254614af0565b9050919050565b6000600182019050919050565b6000614b3582614aa3565b614b3f8185613bc6565b9350614b4a83614aae565b8060005b83811015614b8257614b5f82614b0a565b614b698882613bf6565b9750614b7483614b1d565b925050600181019050614b4e565b5085935050505092915050565b60006020820190508181036000830152614ba98184614b2a565b905092915050565b7f48696768205374616b657320617265206e6f7420616374697665000000000000600082015250565b6000614be7601a83613c9b565b9150614bf282614bb1565b602082019050919050565b60006020820190508181036000830152614c1681614bda565b9050919050565b7f496e73756666696369656e7420686967682d7374616b65207469636b65747300600082015250565b6000614c53601f83613c9b565b9150614c5e82614c1d565b602082019050919050565b60006020820190508181036000830152614c8281614c46565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ce5602683613c9b565b9150614cf082614c89565b604082019050919050565b60006020820190508181036000830152614d1481614cd8565b9050919050565b6000614d268261397b565b9150614d318361397b565b9250828201905080821115614d4957614d48613ec8565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614d85602083613c9b565b9150614d9082614d4f565b602082019050919050565b60006020820190508181036000830152614db481614d78565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614df1601083613c9b565b9150614dfc82614dbb565b602082019050919050565b60006020820190508181036000830152614e2081614de4565b9050919050565b6000614e328261397b565b9150614e3d8361397b565b9250828202614e4b8161397b565b91508282048414831517614e6257614e61613ec8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ea38261397b565b9150614eae8361397b565b925082614ebe57614ebd614e69565b5b828204905092915050565b600060c082019050614ede6000830189613afe565b614eeb6020830188613afe565b614ef86040830187613afe565b614f056060830186613a1e565b614f126080830185613a1e565b614f1f60a0830184613a1e565b979650505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614f60601f83613c9b565b9150614f6b82614f2a565b602082019050919050565b60006020820190508181036000830152614f8f81614f53565b905091905056fea264697066735822122068c94b24120ad349302146823b60dbbf3f50b30927153549c5d9ebc2b4447f5e64736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c80636dcbf2a311610190578063bbbf7fb8116100dc578063e872592111610095578063f3f437031161006f578063f3f4370314610ad0578063fb347c5214610b0d578063ff8de5ec14610b38578063ff94752514610b63576102ff565b8063e872592114610a53578063e944079b14610a7e578063f2fde38b14610aa7576102ff565b8063bbbf7fb814610955578063bd5c508a14610992578063c5625ae7146109a9578063d75075fa146109d4578063d8ec3a6f146109ff578063e3d98bd614610a16576102ff565b8063906280c311610149578063a035b1fe11610123578063a035b1fe146108bc578063a11dec9f146108e7578063a127760014610910578063a1d1f10d1461092c576102ff565b8063906280c31461084f5780639220abb11461087a5780639834cda4146108a5576102ff565b80636dcbf2a314610751578063715018a61461078e5780637b8ce08f146107a5578063835a8ed3146107ce5780638da5cb5b146107f957806390581bf414610824576102ff565b806333f707d11161024f578063495caa8d116102085780635c975abb116101e25780635c975abb146106bb5780635ce220c1146106e65780635d02787f146107235780635fb02f4d1461073a576102ff565b8063495caa8d146106505780634b9a714a146106675780634e71d92d146106a4576102ff565b806333f707d11461054057806337c08923146105695780633d70bc52146105945780633e01aaad146105bf5780634626402b146105e85780634755fda114610613576102ff565b80631e7b6938116102bc5780632c12ddd2116102965780632c12ddd2146104915780632e0be39a146104ad5780632e98520c146104d85780632fc8f46714610503576102ff565b80631e7b69381461041257806323c6fce41461043d57806325e6c30414610466576102ff565b80630743fe4e14610304578063090f9e041461032d5780630ab80e331461036a5780630fdf2de81461039557806316279055146103be5780631c46773d146103fb575b600080fd5b34801561031057600080fd5b5061032b600480360381019061032691906139b1565b610b8e565b005b34801561033957600080fd5b50610354600480360381019061034f91906139f1565b610e5b565b6040516103619190613a2d565b60405180910390f35b34801561037657600080fd5b5061037f610e73565b60405161038c9190613a2d565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b791906139f1565b610e79565b005b3480156103ca57600080fd5b506103e560048036038101906103e091906139f1565b610f34565b6040516103f29190613a63565b60405180910390f35b34801561040757600080fd5b50610410610f47565b005b34801561041e57600080fd5b506104276110dd565b6040516104349190613a2d565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f9190613a7e565b6110e3565b005b34801561047257600080fd5b5061047b61120f565b6040516104889190613a2d565b60405180910390f35b6104ab60048036038101906104a69190613a7e565b611215565b005b3480156104b957600080fd5b506104c2611339565b6040516104cf9190613a2d565b60405180910390f35b3480156104e457600080fd5b506104ed61133f565b6040516104fa9190613a2d565b60405180910390f35b34801561050f57600080fd5b5061052a600480360381019061052591906139f1565b611345565b6040516105379190613a2d565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190613a7e565b61135d565b005b34801561057557600080fd5b5061057e611486565b60405161058b9190613a2d565b60405180910390f35b3480156105a057600080fd5b506105a961148c565b6040516105b69190613a2d565b60405180910390f35b3480156105cb57600080fd5b506105e660048036038101906105e19190613aab565b611492565b005b3480156105f457600080fd5b506105fd611535565b60405161060a9190613b0d565b60405180910390f35b34801561061f57600080fd5b5061063a600480360381019061063591906139f1565b61155b565b6040516106479190613a2d565b60405180910390f35b34801561065c57600080fd5b50610665611573565b005b34801561067357600080fd5b5061068e600480360381019061068991906139f1565b611670565b60405161069b9190613a2d565b60405180910390f35b3480156106b057600080fd5b506106b9611688565b005b3480156106c757600080fd5b506106d0611817565b6040516106dd9190613a63565b60405180910390f35b3480156106f257600080fd5b5061070d60048036038101906107089190613a7e565b61182d565b60405161071a9190613b0d565b60405180910390f35b34801561072f57600080fd5b5061073861186c565b005b34801561074657600080fd5b5061074f61196e565b005b34801561075d57600080fd5b50610778600480360381019061077391906139f1565b611993565b6040516107859190613a2d565b60405180910390f35b34801561079a57600080fd5b506107a36119ab565b005b3480156107b157600080fd5b506107cc60048036038101906107c79190613a7e565b6119ee565b005b3480156107da57600080fd5b506107e3611b10565b6040516107f09190613a2d565b60405180910390f35b34801561080557600080fd5b5061080e611b16565b60405161081b9190613b0d565b60405180910390f35b34801561083057600080fd5b50610839611b3f565b6040516108469190613a63565b60405180910390f35b34801561085b57600080fd5b50610864611b52565b6040516108719190613a2d565b60405180910390f35b34801561088657600080fd5b5061088f611b58565b60405161089c9190613a2d565b60405180910390f35b3480156108b157600080fd5b506108ba611b5e565b005b3480156108c857600080fd5b506108d1611c5a565b6040516108de9190613a2d565b60405180910390f35b3480156108f357600080fd5b5061090e60048036038101906109099190613b28565b611c60565b005b61092a60048036038101906109259190613a7e565b611e3e565b005b34801561093857600080fd5b50610953600480360381019061094e9190613b7b565b611f62565b005b34801561096157600080fd5b5061097c600480360381019061097791906139f1565b612225565b6040516109899190613a2d565b60405180910390f35b34801561099e57600080fd5b506109a761223d565b005b3480156109b557600080fd5b506109be612812565b6040516109cb9190613a2d565b60405180910390f35b3480156109e057600080fd5b506109e9612818565b6040516109f69190613a63565b60405180910390f35b348015610a0b57600080fd5b50610a1461282b565b005b348015610a2257600080fd5b50610a3d6004803603810190610a3891906139f1565b612dba565b604051610a4a9190613a63565b60405180910390f35b348015610a5f57600080fd5b50610a68612dda565b604051610a759190613c79565b60405180910390f35b348015610a8a57600080fd5b50610aa56004803603810190610aa09190613aab565b612e68565b005b348015610ab357600080fd5b50610ace6004803603810190610ac991906139f1565b612f0b565b005b348015610adc57600080fd5b50610af76004803603810190610af291906139f1565b612f8e565b604051610b049190613a2d565b60405180910390f35b348015610b1957600080fd5b50610b22612fa6565b604051610b2f9190613a2d565b60405180910390f35b348015610b4457600080fd5b50610b4d612fac565b604051610b5a9190613a2d565b60405180910390f35b348015610b6f57600080fd5b50610b78612fb2565b604051610b859190613a63565b60405180910390f35b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490613cf8565b60405180910390fd5b60008111610c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3790613d64565b60405180910390fd5b600033905081601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90613dd0565b60405180910390fd5b610d1982601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fc590919063ffffffff16565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610dae82601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f26941c4238c2ab25a144b8fc1eb9162820738d96a3c9be025d650db4e214130084604051610e4e9190613a2d565b60405180910390a3505050565b60156020528060005260406000206000915090505481565b60035481565b610e81612ff1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee790613e3c565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080823b905060008111915050919050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90613ea8565b60405180910390fd5b6000600a905062015180600f5442610fef9190613ef7565b1015611030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102790613f77565b60405180910390fd5b42600f819055506110908160136000611047611b16565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b6013600061109c611b16565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b60055481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90613ea8565b60405180910390fd5b601b60019054906101000a900460ff16156111ce576000600b54116111cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c490614009565b60405180910390fd5b5b806005819055507f1689bcc7e7fd08af4cf38eb983dc287febf0f2b7c105f8a51ea8c7618143531d816040516112049190613a2d565b60405180910390a150565b60075481565b61121d61306f565b601b60009054906101000a900460ff161561126d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112649061409b565b60405180910390fd5b611282600354826130b990919063ffffffff16565b34146112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90614107565b60405180910390fd5b6112d834600654612fdb90919063ffffffff16565b6006819055506112e833826130cf565b3373ffffffffffffffffffffffffffffffffffffffff167fce55d51a74c760dc7fd517c6f83701c75762ecc197438f49de28ffe460eeb72c8260405161132e9190613a2d565b60405180910390a250565b600b5481565b60105481565b60186020528060005260406000206000915090505481565b611365612ff1565b6000611390606461138260286006546130b990919063ffffffff16565b61316890919063ffffffff16565b9050806113a883600954612fdb90919063ffffffff16565b11156113e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e090614173565b60405180910390fd5b6113fe82600954612fdb90919063ffffffff16565b6009819055503373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561144a573d6000803e3d6000fd5b507f4a37b25aab49761ecf63117fe82b98d750917451133cf797507bc9fb5b96044a8260405161147a9190613a2d565b60405180910390a15050565b60065481565b60115481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151990613ea8565b60405180910390fd5b61153083838360035461317e565b505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601a6020528060005260406000206000915090505481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa90613ea8565b60405180910390fd5b601b60009054906101000a900460ff1615611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164a906141df565b60405180910390fd5b6001601b60006101000a81548160ff021916908315150217905550565b60146020528060005260406000206000915090505481565b61169061371d565b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111611717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170e9061424b565b60405180910390fd5b6000601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117a2573d6000803e3d6000fd5b506117b881600854612fc590919063ffffffff16565b6008819055503373ffffffffffffffffffffffffffffffffffffffff167f13dcfa08b5805e689424ccce1892676af568734e1561cc374b73c6c5e5f30400826040516118049190613a2d565b60405180910390a25061181561376c565b565b60008060149054906101000a900460ff16905090565b600d818154811061183d57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f390613ea8565b60405180910390fd5b600554600c5414611942576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611939906142dd565b60405180910390fd5b600460009054906101000a900460ff1615600460006101000a81548160ff021916908315150217905550565b611976612ff1565b6001601b60016101000a81548160ff021916908315150217905550565b60136020528060005260406000206000915090505481565b6119b3612ff1565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e59061436f565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7590613ea8565b60405180910390fd5b603c8110158015611a90575060648111155b611acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac690614401565b60405180910390fd5b80600a819055507fe139cfb188ea120c39fe64d94cd62af3844dcc6af49e390373393f27edc4ab6781604051611b059190613a2d565b60405180910390a150565b60125481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600460009054906101000a900460ff1681565b60095481565b600f5481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be590613ea8565b60405180910390fd5b601b60009054906101000a900460ff16611c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c349061446d565b60405180910390fd5b6000601b60006101000a81548160ff021916908315150217905550565b60025481565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce790613ea8565b60405180910390fd5b6028831015611d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2b906144ff565b60405180910390fd5b6014821015611d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6f90614591565b60405180910390fd5b600a811015611dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db390614623565b60405180910390fd5b6064611de382611dd58587612fdb90919063ffffffff16565b612fdb90919063ffffffff16565b1115611e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1b906146b5565b60405180910390fd5b826010819055508160118190555080601281905550505050565b611e4661306f565b601b60009054906101000a900460ff1615611e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8d9061409b565b60405180910390fd5b611eab600254826130b990919063ffffffff16565b3414611eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee390614107565b60405180910390fd5b611f0134600654612fdb90919063ffffffff16565b600681905550611f113382613775565b3373ffffffffffffffffffffffffffffffffffffffff167fe11731cb4f1eb3ec3dd09bdc96809bb07365f4c881cda3192b397a4bc0b6da4082604051611f579190613a2d565b60405180910390a250565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe990613ea8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561205c5750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61209b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209290613e3c565b60405180910390fd5b6120ee6001601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506121846001601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f2bbaca1354ea4174af015cc6012643e686145d9cfee0414d2c0ed840a1ca04fc60405160405180910390a35050565b60196020528060005260406000206000915090505481565b61224633610f34565b15612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d90614721565b60405180910390fd5b600460009054906101000a900460ff16156122d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cd9061478d565b60405180910390fd5b601b60009054906101000a900460ff1615612326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231d906147f9565b60405180910390fd5b601b60019054906101000a900460ff16612375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236c90614865565b60405180910390fd5b600554600c54106123bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b2906148d1565b60405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161243d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124349061493d565b60405180910390fd5b6001600b5410612482576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612479906149a9565b60405180910390fd5b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561250f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250690614a3b565b60405180910390fd5b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612810576125b36001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fc590919063ffffffff16565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506126496001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c600081548092919061269f90614a5b565b91905055503373ffffffffffffffffffffffffffffffffffffffff167fc7e8add138e49f46d19677ad306f460739bd3c94f7c2afd303caa90a3b976509600c546040516126ec9190613a2d565b60405180910390a2600d339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600554600c540361280f577fe8cdca242f8202ae412d2a2d900d52ea6aad38bc508d028831bc37a4c570f76e600d6040516127ea9190614b8f565b60405180910390a16128086001600b54612fdb90919063ffffffff16565b600b819055505b5b565b600c5481565b601b60019054906101000a900460ff1681565b61283433610f34565b15612874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286b90614721565b60405180910390fd5b600460009054906101000a900460ff166128c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ba90614bfd565b60405180910390fd5b601b60009054906101000a900460ff1615612913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290a906147f9565b60405180910390fd5b601b60019054906101000a900460ff16612962576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295990614865565b60405180910390fd5b600554600c54106129a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299f906148d1565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612a2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2190614c69565b60405180910390fd5b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aae90614a3b565b60405180910390fd5b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612db857612b5b6001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fc590919063ffffffff16565b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612bf16001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c6000815480929190612c4790614a5b565b91905055503373ffffffffffffffffffffffffffffffffffffffff167f4cbabd28f8f38a9ad71eb794f4b769c609bbc2dd913cdbff777ad6c55282df37600c54604051612c949190613a2d565b60405180910390a2600d339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600554600c5403612db7577f606f95d7d280a6f49d9ddfef59b05d181894bf69ba014ad62507ecceed38c687600d604051612d929190614b8f565b60405180910390a1612db06001600b54612fdb90919063ffffffff16565b600b819055505b5b565b60176020528060005260406000206000915054906101000a900460ff1681565b6060600d805480602002602001604051908101604052809291908181526020018280548015612e5e57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612e14575b5050505050905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eef90613ea8565b60405180910390fd5b612f0683838360025461317e565b505050565b612f13612ff1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7990614cfb565b60405180910390fd5b612f8b8161380e565b50565b60166020528060005260406000206000915090505481565b600a5481565b60085481565b601b60009054906101000a900460ff1681565b60008183612fd39190613ef7565b905092915050565b60008183612fe99190614d1b565b905092915050565b612ff96138d2565b73ffffffffffffffffffffffffffffffffffffffff16613017611b16565b73ffffffffffffffffffffffffffffffffffffffff161461306d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306490614d9b565b60405180910390fd5b565b613077611817565b156130b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ae90614e07565b60405180910390fd5b565b600081836130c79190614e27565b905092915050565b61312181601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b600081836131769190614e98565b905092915050565b6000600b54116131c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ba90614009565b60405180910390fd5b603c600a54101580156131d957506064600a5411155b613218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320f90614401565b60405180910390fd5b600061322f600554836130b990919063ffffffff16565b9050600061325b606461324d601054856130b990919063ffffffff16565b61316890919063ffffffff16565b905060006132876064613279601154866130b990919063ffffffff16565b61316890919063ffffffff16565b905060006132b360646132a5601254876130b990919063ffffffff16565b61316890919063ffffffff16565b905061330783601660008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061339c82601660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061343181601660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506134ad8161349f8461349187600754612fdb90919063ffffffff16565b612fdb90919063ffffffff16565b612fdb90919063ffffffff16565b6007819055506134ec816134de846134d087600854612fdb90919063ffffffff16565b612fdb90919063ffffffff16565b612fdb90919063ffffffff16565b6008819055507f5b5e25cf98229fed07be659b639d9b41f7904a15ae24a73580c5fac99c5d650788888886868660405161352b96959493929190614ec9565b60405180910390a16135866001601860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601860008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061361c6001601960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506136b26001601a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600b819055506000600c81905550600d600061371391906138da565b5050505050505050565b600260015403613762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375990614f76565b60405180910390fd5b6002600181905550565b60018081905550565b6137c781601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fdb90919063ffffffff16565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b50805460008255906000526020600020908101906138f891906138fb565b50565b5b808211156139145760008160009055506001016138fc565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139488261391d565b9050919050565b6139588161393d565b811461396357600080fd5b50565b6000813590506139758161394f565b92915050565b6000819050919050565b61398e8161397b565b811461399957600080fd5b50565b6000813590506139ab81613985565b92915050565b600080604083850312156139c8576139c7613918565b5b60006139d685828601613966565b92505060206139e78582860161399c565b9150509250929050565b600060208284031215613a0757613a06613918565b5b6000613a1584828501613966565b91505092915050565b613a278161397b565b82525050565b6000602082019050613a426000830184613a1e565b92915050565b60008115159050919050565b613a5d81613a48565b82525050565b6000602082019050613a786000830184613a54565b92915050565b600060208284031215613a9457613a93613918565b5b6000613aa28482850161399c565b91505092915050565b600080600060608486031215613ac457613ac3613918565b5b6000613ad286828701613966565b9350506020613ae386828701613966565b9250506040613af486828701613966565b9150509250925092565b613b078161393d565b82525050565b6000602082019050613b226000830184613afe565b92915050565b600080600060608486031215613b4157613b40613918565b5b6000613b4f8682870161399c565b9350506020613b608682870161399c565b9250506040613b718682870161399c565b9150509250925092565b60008060408385031215613b9257613b91613918565b5b6000613ba085828601613966565b9250506020613bb185828601613966565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613bf08161393d565b82525050565b6000613c028383613be7565b60208301905092915050565b6000602082019050919050565b6000613c2682613bbb565b613c308185613bc6565b9350613c3b83613bd7565b8060005b83811015613c6c578151613c538882613bf6565b9750613c5e83613c0e565b925050600181019050613c3f565b5085935050505092915050565b60006020820190508181036000830152613c938184613c1b565b905092915050565b600082825260208201905092915050565b7f496e76616c696420726563656976657220616464726573730000000000000000600082015250565b6000613ce2601883613c9b565b9150613ced82613cac565b602082019050919050565b60006020820190508181036000830152613d1181613cd5565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b6000613d4e601d83613c9b565b9150613d5982613d18565b602082019050919050565b60006020820190508181036000830152613d7d81613d41565b9050919050565b7f496e73756666696369656e74207469636b65747320746f206769667400000000600082015250565b6000613dba601c83613c9b565b9150613dc582613d84565b602082019050919050565b60006020820190508181036000830152613de981613dad565b9050919050565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b6000613e26600f83613c9b565b9150613e3182613df0565b602082019050919050565b60006020820190508181036000830152613e5581613e19565b9050919050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000613e92600e83613c9b565b9150613e9d82613e5c565b602082019050919050565b60006020820190508181036000830152613ec181613e85565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f028261397b565b9150613f0d8361397b565b9250828203905081811115613f2557613f24613ec8565b5b92915050565b7f43616e206f6e6c79206d696e74203130207469636b6574732070657220646179600082015250565b6000613f61602083613c9b565b9150613f6c82613f2b565b602082019050919050565b60006020820190508181036000830152613f9081613f54565b9050919050565b7f4e6f20636f6d706c657465642067616d657320617661696c61626c6520666f7260008201527f207061796f757400000000000000000000000000000000000000000000000000602082015250565b6000613ff3602783613c9b565b9150613ffe82613f97565b604082019050919050565b6000602082019050818103600083015261402281613fe6565b9050919050565b7f5469636b65742070757263686173696e6720686173206265656e20736875742060008201527f646f776e00000000000000000000000000000000000000000000000000000000602082015250565b6000614085602483613c9b565b915061409082614029565b604082019050919050565b600060208201905081810360008301526140b481614078565b9050919050565b7f496e636f7272656374204554482073656e740000000000000000000000000000600082015250565b60006140f1601283613c9b565b91506140fc826140bb565b602082019050919050565b60006020820190508181036000830152614120816140e4565b9050919050565b7f457863656564696e67207769746864726177616c206c696d6974000000000000600082015250565b600061415d601a83613c9b565b915061416882614127565b602082019050919050565b6000602082019050818103600083015261418c81614150565b9050919050565b7f436f6e747261637420697320616c7265616479207368757420646f776e000000600082015250565b60006141c9601d83613c9b565b91506141d482614193565b602082019050919050565b600060208201905081810360008301526141f8816141bc565b9050919050565b7f4e6f2066756e647320746f20636c61696d2e0000000000000000000000000000600082015250565b6000614235601283613c9b565b9150614240826141ff565b602082019050919050565b6000602082019050818103600083015261426481614228565b9050919050565b7f43757272656e7420706c6179657273206c697374206973206e6f74206571756160008201527f6c20746f20656e7472616e747300000000000000000000000000000000000000602082015250565b60006142c7602d83613c9b565b91506142d28261426b565b604082019050919050565b600060208201905081810360008301526142f6816142ba565b9050919050565b7f52656e6f756e63696e67206f776e657273686970206973206e6f7420616c6c6f60008201527f7765640000000000000000000000000000000000000000000000000000000000602082015250565b6000614359602383613c9b565b9150614364826142fd565b604082019050919050565b600060208201905081810360008301526143888161434c565b9050919050565b7f496e76616c6964207072697a65206571756174696f6e2070657263656e74616760008201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b60006143eb602183613c9b565b91506143f68261438f565b604082019050919050565b6000602082019050818103600083015261441a816143de565b9050919050565b7f436f6e7472616374206973206e6f74207368757420646f776e00000000000000600082015250565b6000614457601983613c9b565b915061446282614421565b602082019050919050565b600060208201905081810360008301526144868161444a565b9050919050565b7f4669727374207072697a652063616e6e6f74206265206c657373207468616e2060008201527f3430250000000000000000000000000000000000000000000000000000000000602082015250565b60006144e9602383613c9b565b91506144f48261448d565b604082019050919050565b60006020820190508181036000830152614518816144dc565b9050919050565b7f5365636f6e64207072697a652063616e6e6f74206265206c657373207468616e60008201527f2032302500000000000000000000000000000000000000000000000000000000602082015250565b600061457b602483613c9b565b91506145868261451f565b604082019050919050565b600060208201905081810360008301526145aa8161456e565b9050919050565b7f5468697264207072697a652063616e6e6f74206265206c657373207468616e2060008201527f3130250000000000000000000000000000000000000000000000000000000000602082015250565b600061460d602383613c9b565b9150614618826145b1565b604082019050919050565b6000602082019050818103600083015261463c81614600565b9050919050565b7f546f74616c207072697a652070657263656e74616765732063616e6e6f74206560008201527f7863656564203130302500000000000000000000000000000000000000000000602082015250565b600061469f602a83613c9b565b91506146aa82614643565b604082019050919050565b600060208201905081810360008301526146ce81614692565b9050919050565b7f43616c6c6572206d75737420626520616e20454f410000000000000000000000600082015250565b600061470b601583613c9b565b9150614716826146d5565b602082019050919050565b6000602082019050818103600083015261473a816146fe565b9050919050565b7f48696768205374616b6573206172652061637469766500000000000000000000600082015250565b6000614777601683613c9b565b915061478282614741565b602082019050919050565b600060208201905081810360008301526147a68161476a565b9050919050565b7f47616d65206973207368757420646f776e000000000000000000000000000000600082015250565b60006147e3601183613c9b565b91506147ee826147ad565b602082019050919050565b60006020820190508181036000830152614812816147d6565b9050919050565b7f436f6e7472616374206e6f74206f70656e207965740000000000000000000000600082015250565b600061484f601583613c9b565b915061485a82614819565b602082019050919050565b6000602082019050818103600083015261487e81614842565b9050919050565b7f4c6f6262792069732066756c6c2e205761697420666f72207061796f75742e00600082015250565b60006148bb601f83613c9b565b91506148c682614885565b602082019050919050565b600060208201905081810360008301526148ea816148ae565b9050919050565b7f496e73756666696369656e74207469636b657473000000000000000000000000600082015250565b6000614927601483613c9b565b9150614932826148f1565b602082019050919050565b600060208201905081810360008301526149568161491a565b9050919050565b7f47616d6520697320696e2070726f677265737320706c65617365207761697400600082015250565b6000614993601f83613c9b565b915061499e8261495d565b602082019050919050565b600060208201905081810360008301526149c281614986565b9050919050565b7f596f7527766520616c7265616479206a6f696e6564207468652063757272656e60008201527f74206c6f62627900000000000000000000000000000000000000000000000000602082015250565b6000614a25602783613c9b565b9150614a30826149c9565b604082019050919050565b60006020820190508181036000830152614a5481614a18565b9050919050565b6000614a668261397b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a9857614a97613ec8565b5b600182019050919050565b600081549050919050565b60008190508160005260206000209050919050565b60008160001c9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614b03614afe83614ac3565b614ad0565b9050919050565b6000614b168254614af0565b9050919050565b6000600182019050919050565b6000614b3582614aa3565b614b3f8185613bc6565b9350614b4a83614aae565b8060005b83811015614b8257614b5f82614b0a565b614b698882613bf6565b9750614b7483614b1d565b925050600181019050614b4e565b5085935050505092915050565b60006020820190508181036000830152614ba98184614b2a565b905092915050565b7f48696768205374616b657320617265206e6f7420616374697665000000000000600082015250565b6000614be7601a83613c9b565b9150614bf282614bb1565b602082019050919050565b60006020820190508181036000830152614c1681614bda565b9050919050565b7f496e73756666696369656e7420686967682d7374616b65207469636b65747300600082015250565b6000614c53601f83613c9b565b9150614c5e82614c1d565b602082019050919050565b60006020820190508181036000830152614c8281614c46565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ce5602683613c9b565b9150614cf082614c89565b604082019050919050565b60006020820190508181036000830152614d1481614cd8565b9050919050565b6000614d268261397b565b9150614d318361397b565b9250828201905080821115614d4957614d48613ec8565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614d85602083613c9b565b9150614d9082614d4f565b602082019050919050565b60006020820190508181036000830152614db481614d78565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614df1601083613c9b565b9150614dfc82614dbb565b602082019050919050565b60006020820190508181036000830152614e2081614de4565b9050919050565b6000614e328261397b565b9150614e3d8361397b565b9250828202614e4b8161397b565b91508282048414831517614e6257614e61613ec8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ea38261397b565b9150614eae8361397b565b925082614ebe57614ebd614e69565b5b828204905092915050565b600060c082019050614ede6000830189613afe565b614eeb6020830188613afe565b614ef86040830187613afe565b614f056060830186613a1e565b614f126080830185613a1e565b614f1f60a0830184613a1e565b979650505050505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614f60601f83613c9b565b9150614f6b82614f2a565b602082019050919050565b60006020820190508181036000830152614f8f81614f53565b905091905056fea264697066735822122068c94b24120ad349302146823b60dbbf3f50b30927153549c5d9ebc2b4447f5e64736f6c63430008120033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ 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.