ETH Price: $2,966.24 (-0.80%)
Gas: 7 Gwei

Contract

0x8c53CDBe9456743E24937096cA79545CFf3c113d
 

Overview

ETH Balance

0.13 ETH

Eth Value

$385.61 (@ $2,966.24/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Check Tickets174976942023-06-17 6:18:11387 days ago1686982691IN
0x8c53CDBe...CFf3c113d
0 ETH0.0008941318.0563443
Claim Rewards174963412023-06-17 1:45:35387 days ago1686966335IN
0x8c53CDBe...CFf3c113d
0 ETH0.0016789516.9435706
End Reveal174960252023-06-17 0:41:35387 days ago1686962495IN
0x8c53CDBe...CFf3c113d
0 ETH0.0010371617.47181315
End Reveal174960102023-06-17 0:38:35387 days ago1686962315IN
0x8c53CDBe...CFf3c113d
0 ETH0.0010381318.02198533
Transfer174195222023-06-06 6:05:23398 days ago1686031523IN
0x8c53CDBe...CFf3c113d
0.23359903 ETH0.0004686122.27261501
Check Tickets173657532023-05-29 16:13:11406 days ago1685376791IN
0x8c53CDBe...CFf3c113d
0 ETH0.001338856.36141884
Reveal173656902023-05-29 16:00:23406 days ago1685376023IN
0x8c53CDBe...CFf3c113d
0 ETH0.003194457.67635925
Buy Combo Ticket173653012023-05-29 14:41:35406 days ago1685371295IN
0x8c53CDBe...CFf3c113d
0.01 ETH0.0065372558.23367818
Buy Combo Ticket173652972023-05-29 14:40:47406 days ago1685371247IN
0x8c53CDBe...CFf3c113d
0.56 ETH0.0068101560.14604553
Buy Combo Ticket173652892023-05-29 14:39:11406 days ago1685371151IN
0x8c53CDBe...CFf3c113d
0.56 ETH0.0067503159.61756331
Buy Combo Ticket173652792023-05-29 14:37:11406 days ago1685371031IN
0x8c53CDBe...CFf3c113d
0.56 ETH0.0084903857.59041528
Check Tickets173582632023-05-28 14:59:35407 days ago1685285975IN
0x8c53CDBe...CFf3c113d
0 ETH0.0018347137.05077774
Reveal173582622023-05-28 14:59:23407 days ago1685285963IN
0x8c53CDBe...CFf3c113d
0 ETH0.0020358237.05077774
Check Tickets173508542023-05-27 14:01:59408 days ago1685196119IN
0x8c53CDBe...CFf3c113d
0 ETH0.0006337726.68063506
Reveal173508072023-05-27 13:52:35408 days ago1685195555IN
0x8c53CDBe...CFf3c113d
0 ETH0.00148327.06960522
Buy Combo Ticket173504992023-05-27 12:50:47408 days ago1685191847IN
0x8c53CDBe...CFf3c113d
0.08 ETH0.0030301528.08533186
Buy Combo Ticket173504952023-05-27 12:49:59408 days ago1685191799IN
0x8c53CDBe...CFf3c113d
0.08 ETH0.0031693429.37544379
Buy Combo Ticket173504872023-05-27 12:48:23408 days ago1685191703IN
0x8c53CDBe...CFf3c113d
0.08 ETH0.0029627827.46090312
Buy Combo Ticket173504762023-05-27 12:46:11408 days ago1685191571IN
0x8c53CDBe...CFf3c113d
0.08 ETH0.0027210525.22037733
Buy Combo Ticket173504642023-05-27 12:43:47408 days ago1685191427IN
0x8c53CDBe...CFf3c113d
0.08 ETH0.0029619923.69764316
0x8c53cdbe173504392023-05-27 12:38:47408 days ago1685191127IN
0x8c53CDBe...CFf3c113d
0.08 ETH0.0005322624.73705341
Check Tickets173432772023-05-26 12:29:59409 days ago1685104199IN
0x8c53CDBe...CFf3c113d
0 ETH0.0013838627.94613979
Reveal173432732023-05-26 12:29:11409 days ago1685104151IN
0x8c53CDBe...CFf3c113d
0 ETH0.0015559628.73750114
Check Tickets173358642023-05-25 11:28:23410 days ago1685014103IN
0x8c53CDBe...CFf3c113d
0 ETH0.0015668731.64198658
Reveal173358582023-05-25 11:27:11410 days ago1685014031IN
0x8c53CDBe...CFf3c113d
0 ETH0.001755931.83186685
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
175199562023-06-20 9:15:35384 days ago1687252535
0x8c53CDBe...CFf3c113d
84 ETH
175199562023-06-20 9:15:35384 days ago1687252535
0x8c53CDBe...CFf3c113d
28 ETH
175199562023-06-20 9:15:35384 days ago1687252535
0x8c53CDBe...CFf3c113d
14.79499999 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.5 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.003 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.01 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.003 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.01 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.003 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.01 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.003 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.01 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.003 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.01 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.003 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.01 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.003 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.01 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.003 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.01 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.003 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.01 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.003 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.01 ETH
175185052023-06-20 4:22:23384 days ago1687234943
0x8c53CDBe...CFf3c113d
0.003 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Lottery

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 1 of 3: Lottery.sol
pragma solidity ^0.5.2;

import "./Adminable.sol";

interface ILottoshi {
    function contribute(address referral) external payable;
    function decentralize() external;
}

contract Lottery is Adminable {
    struct Round {
        uint256 seed;
        uint256 perWinnerPrizes1;
        uint256 perWinnerPrizes2;
        uint256 prizes;
        uint128 ticketCount;
        uint128 checkedCount;
        uint56 result;
        bool revealed;
        mapping (address => bytes32) commitments;
        mapping (uint256 => Ticket) tickets;
        mapping (uint256 => ComboTicket) comboTickets;
    }

    struct Ticket {
        bool claimed;
        address payable owner;
        uint56 number;
    }

    struct ComboTicket {
        uint256 number1; // zone1Count,zone2Count,zone2Number,zone1Numbers
        uint256 number2;
    }

    struct Number {
        uint256 n0;
        uint256 n1;
        uint256 n2;
        uint256 n3;
        uint256 n4;
        uint256 n5;
        uint256 n6;
    }

    // production
    uint256 internal constant NORMAL_DURATION = 24 hours;
    uint256 internal constant REVEALING_DURATION = 50 minutes;
    uint256 internal constant CONFIRMING_DURATION = 10 minutes;
    uint256 internal constant OWNER_TIMEOUT = 10 days;

    uint256 internal constant COST_PER_TICKET = 0.01 ether;
    uint256 internal constant REVEAL_PRIZE = 0.5 ether;
    uint256 internal constant PERCENTAGE_TO_FUND = 3000;
    uint256 internal constant OFFSET = 10000;
    uint256 internal constant PERCENTAGE_OF_PRIZE1 = 5340; // 53.4%
    uint256 internal constant PERCENTAGE_OF_PRIZE2 = 660;  // 6.6%
    uint256[8] internal PRIZES = [
        COST_PER_TICKET * 1500,
        COST_PER_TICKET * 200,
        COST_PER_TICKET * 40,
        COST_PER_TICKET * 8,
        COST_PER_TICKET * 4,
        COST_PER_TICKET * 2,
        COST_PER_TICKET * 1,
        COST_PER_TICKET * 1
    ];

    mapping (uint256 => Round) public rounds;
    uint256 public roundId = 1;
    uint256 public lastAvailablePrize;
    uint256 public pendingPrize;
    uint256 public revealingUntil;
    uint256 public normalUntil;
    address payable public lottoshi;
    Status public status = Status.normal;
    bool public decentralized;

    event Buy(address indexed user, uint256 roundId, uint256 ticketId, address referral, uint56 number, uint256 number1, uint256 number2);
    event Result(uint256 roundId, uint256 result, uint256 perWinnerPrizes1, uint256 perWinnerPrizes2, uint256 prizes, uint128 ticketCount);
    event ClaimReward(uint256 roundId, uint256 ticketId);
    event Commit(uint256 roundId, address user);
    event Reveal(uint256 roundId, address user);
    event RevealPrize(uint256 roundId, address user);

    enum Status {
        normal,
        revealing,
        checking
    }

    constructor() public {
        normalUntil = uint32(getTime() + NORMAL_DURATION);
    }

    function() external payable {
    }

    function setLottoshiAddress(address payable addr) external onlyOwner {
        require(lottoshi == address(0), "already set");
        lottoshi = addr;
    }

    function backToNormal() external payable onlyAdmin {
        require(!decentralized, "method disabled");
        require(status == Status.revealing, "invalid status");
        uint256 cost = REVEAL_PRIZE * 100;
        require(msg.value >= cost, "insufficient money");
        status = Status.normal;
        --roundId;
        normalUntil = uint32(getTime() + NORMAL_DURATION);
        uint256 tmpRoundId = roundId;
        if (rounds[tmpRoundId].revealed) {
            rounds[tmpRoundId].revealed = false;
        }
        if (msg.value > cost) {
            msg.sender.transfer(msg.value - cost);
        }
    }

    function buyTickets(uint256[] calldata numbers, address referral) external payable {
        uint256 length = numbers.length;
        uint256 totalCost = length * COST_PER_TICKET;
        require(msg.value >= totalCost, "insufficient money");

        address ref = referral == msg.sender ? address(0) : referral;
        uint256 tmpRoundId = roundId;
        uint128 ticketCount = rounds[tmpRoundId].ticketCount;
        for (uint256 i = 0; i < length; i++) {
            uint256 number = numbers[i];
            validateNumber(number);
            ++ticketCount;
            rounds[tmpRoundId].tickets[ticketCount] = Ticket(false, msg.sender, uint56(number));
            emit Buy(msg.sender, tmpRoundId, ticketCount, ref, uint56(number), 0, 0);
        }
        rounds[tmpRoundId].ticketCount = ticketCount;

        ILottoshi(lottoshi).contribute.value(totalCost * PERCENTAGE_TO_FUND / OFFSET)(ref);
        if (msg.value - totalCost > 0) {
            msg.sender.transfer(msg.value - totalCost);
        }
    }

    function buyComboTicket(uint256 number1, uint256 number2, address referral) external payable {
        uint256 zone1Count = number1 >> 248;
        uint256 zone2Count = (number1 >> 240) & 0xff;
        require(zone1Count >= 6 && zone1Count <= 38, "invalid zone1Count");
        require(zone2Count >= 1 && zone2Count <= 8, "invalid zone2Count");
        uint256 count = combinations(zone1Count, 6) * zone2Count;
        uint256 totalCost = count * COST_PER_TICKET;
        require(msg.value >= totalCost, "insufficient money");
        validateComboTicket(number1, number2, zone1Count, zone2Count);

        address ref = referral == msg.sender ? address(0) : referral;
        uint256 tmpRoundId = roundId;
        uint128 ticketCount = rounds[tmpRoundId].ticketCount;
        ++ticketCount;
        rounds[tmpRoundId].tickets[ticketCount] = Ticket(false, msg.sender, 0);
        rounds[tmpRoundId].comboTickets[ticketCount].number1 = number1;
        if (number2 != 0) {
            rounds[tmpRoundId].comboTickets[ticketCount].number2 = number2;
        }
        emit Buy(msg.sender, tmpRoundId, ticketCount, ref, 0, number1, number2);
        rounds[tmpRoundId].ticketCount = ticketCount;
        ILottoshi(lottoshi).contribute.value(totalCost * PERCENTAGE_TO_FUND / OFFSET)(ref);
        if (msg.value - totalCost > 0) {
            msg.sender.transfer(msg.value - totalCost);
        }
    }

    function validateComboTicket(uint256 number1, uint256 number2, uint256 zone1Count, uint256 zone2Count) pure internal {
        uint256 n1 = (number1 >> 232) & 0xff;
        require(n1 >= 1, "invalid number");
        uint256 length = (zone2Count + 2) << 3;
        n1 = validateComboNumber(number1, n1, 24, length);
        require(n1 <= 8, "invalid number");

        n1 = (number1 >> (248 - length)) & 0xff;
        require(n1 >= 1, "invalid number");
        length = (zone1Count > 30 - zone2Count ? 32 : zone1Count + zone2Count + 2) << 3;
        n1 = validateComboNumber(number1, n1, (zone2Count + 3) << 3, length);
        if (zone1Count > 30 - zone2Count) {
            length = (zone1Count - 30 + zone2Count) << 3;
            n1 = validateComboNumber(number2, n1, (zone2Count + 3) << 3, length);
        }
        require(n1 <= 38, "invalid number");
    }

    function commit(bytes32 commitment) external {
        if (isAdmin(msg.sender) && !decentralized) {
            require(getTime() >= normalUntil, "invalid time");
            startRevealing();
            rounds[roundId - 1].commitments[address(0)] = commitment;
            emit Commit(roundId - 1, address(0));
        } else {
            rounds[roundId].commitments[msg.sender] = commitment;
            emit Commit(roundId, msg.sender);
        }
    }

    function endCommit() external {
        require(getTime() >= (decentralized ? normalUntil : normalUntil + OWNER_TIMEOUT), "invalid time");
        startRevealing();
        if (!decentralized) {
            decentralized = true;
            ILottoshi(lottoshi).decentralize();
        }
    }

    function startRevealing() internal {
        require(status == Status.normal, "invalid status");
        uint256 prize = getAvailablePrize();
        require(prize >= REVEAL_PRIZE, "insufficient money");
        ++roundId;
        status = Status.revealing;
        revealingUntil = getTime() + REVEALING_DURATION;
        lastAvailablePrize = prize - REVEAL_PRIZE;
    }

    function reveal(uint256 secret) external {
        require(status == Status.revealing, "invalid status");
        uint256 tmpRoundId = roundId - 1;
        if (isAdmin(msg.sender) && !decentralized) {
            require(getTime() >= revealingUntil + CONFIRMING_DURATION, "invalid time");
            require(getHash(secret) == rounds[tmpRoundId].commitments[address(0)], "invalid secret");
            rounds[tmpRoundId].commitments[address(0)] = 0;
            uint256 seed = rounds[tmpRoundId].seed;
            seed += uint256(getBlockHash(block.number - 20));
            seed += secret;
            startChecking(seed);
            rounds[tmpRoundId].seed = seed;
            emit Reveal(tmpRoundId, address(0));
        } else {
            require(getTime() < revealingUntil, "invalid time");
            require(getHash(secret) == rounds[tmpRoundId].commitments[msg.sender], "invalid secret");
            rounds[tmpRoundId].commitments[msg.sender] = 0;
            rounds[tmpRoundId].seed += secret;
            emit Reveal(tmpRoundId, msg.sender);
        }
        if (!rounds[tmpRoundId].revealed) {
            rounds[tmpRoundId].revealed = true;
            msg.sender.transfer(REVEAL_PRIZE);
            emit RevealPrize(tmpRoundId, msg.sender);
        }
    }

    function endReveal() external {
        require(status == Status.revealing, "invalid status");
        uint256 time = decentralized ? revealingUntil + CONFIRMING_DURATION : revealingUntil + CONFIRMING_DURATION + OWNER_TIMEOUT;
        require(getTime() >= time, "invalid time");
        uint256 seed = rounds[roundId - 1].seed;
        seed += uint256(getBlockHash(block.number - 20));
        rounds[roundId - 1].seed = seed;
        startChecking(seed);
        if (!decentralized) {
            decentralized = true;
            ILottoshi(lottoshi).decentralize();
        }
    }

    function startChecking(uint256 seed) internal {
        status = Status.checking;
        uint256[6] memory numbers = drawNumbers(seed);
        uint256 ns = random(seed + 6, 8) + 1;
        rounds[roundId - 1].result = uint56(
            (numbers[0] << 48) | (numbers[1] << 40) | (numbers[2] << 32) |
            (numbers[3] << 24) | (numbers[4] << 16) | (numbers[5] << 8) | ns
        );
    }

    function checkTickets(uint256 count) external {
        require (status == Status.checking, "invalid status");
        uint256 tmpRoundId = roundId - 1;
        Round memory round = rounds[tmpRoundId];
        if (round.ticketCount == 0) {
            status = Status.normal;
            normalUntil = getTime() + NORMAL_DURATION;
            emit Result(tmpRoundId, round.result, 0, 0, 0, 0);
            return;
        }
        require (count > 0, "invalid count");
        uint256 end = round.checkedCount + count;
        if (end > round.ticketCount) {
            end = round.ticketCount;
        }
        uint256[10] memory prizes = decodePrize(round.prizes);
        Number memory result = decodeNumberAsStruct(round.result);
        bool prizesChanged = false;
        for (uint256 i = round.checkedCount + 1; i <= end; ++i) {
            uint56 number = rounds[tmpRoundId].tickets[i].number;
            if (number == 0) {
                uint256[10] memory levels = getComboPrizeLevels(
                    rounds[tmpRoundId].comboTickets[i].number1, rounds[tmpRoundId].comboTickets[i].number2, result
                );
                for (uint256 j = 0; j < 10; ++j) {
                    uint256 prizeCount = levels[j];
                    if (prizeCount > 0) {
                        prizes[j] += prizeCount;
                        prizesChanged = true;
                    }
                }
            } else {
                uint256 level = getPrizeLevel(number, result);
                if (level > 0) {
                    ++prizes[level - 1];
                    prizesChanged = true;
                }
            }
        }
        round.checkedCount = uint128(end);
        if (prizesChanged) {
            rounds[tmpRoundId].prizes = encodePrize(prizes);
        }
        // all done
        if (round.checkedCount == round.ticketCount) {
            updatePrizes(tmpRoundId, round, prizes);
            status = Status.normal;
            normalUntil = uint32(getTime() + NORMAL_DURATION);
            emit Result(tmpRoundId, round.result, round.perWinnerPrizes1, round.perWinnerPrizes2, rounds[tmpRoundId].prizes, round.ticketCount);
        }
        rounds[tmpRoundId].checkedCount = round.checkedCount;
    }

    function updatePrizes(uint256 tmpRoundId, Round memory round, uint256[10] memory prizes) internal {
        uint256 fixedPrize;
        for (uint256 i = 0; i < 8; ++i) {
            fixedPrize += prizes[i + 2] * PRIZES[i];
        }
        require(getAvailablePrize() >= fixedPrize, "insufficient money");
        uint256 remainPrize = lastAvailablePrize;
        remainPrize = remainPrize >= fixedPrize ? remainPrize - fixedPrize : 0;
        uint256 prize1 = remainPrize * PERCENTAGE_OF_PRIZE1 / OFFSET;
        uint256 prize2 = remainPrize * PERCENTAGE_OF_PRIZE2 / OFFSET;
        uint256 length1 = prizes[0];
        uint256 length2 = prizes[1];
        round.perWinnerPrizes1 = length1 == 0 ? 0 : prize1 / length1;
        round.perWinnerPrizes2 = length2 == 0 ? 0 : prize2 / length2;
        uint256 totalPrize = fixedPrize + round.perWinnerPrizes2 * length2 + round.perWinnerPrizes1 * length1;
        if (totalPrize > 0) {
            pendingPrize += totalPrize;
        }
        if (round.perWinnerPrizes1 > 0) {
            rounds[tmpRoundId].perWinnerPrizes1 = round.perWinnerPrizes1;
        }
        if (round.perWinnerPrizes2 > 0) {
            rounds[tmpRoundId].perWinnerPrizes2 = round.perWinnerPrizes2;
        }
    }

    function claimRewards(uint256[] calldata inputs) external {
        require(inputs.length % 2 == 0 && inputs.length >= 2, "invalid length");
        uint256 tmpRoundId = inputs[0];
        require(rounds[tmpRoundId].checkedCount == rounds[tmpRoundId].ticketCount, "invalid status");
        uint256 totalPrize;
        address payable user = rounds[tmpRoundId].tickets[inputs[1]].owner;
        Number memory result = decodeNumberAsStruct(rounds[tmpRoundId].result);
        for (uint256 i = 0; i < inputs.length; i += 2) {
            if (tmpRoundId != inputs[i]) {
                tmpRoundId = inputs[i];
                require(rounds[tmpRoundId].checkedCount == rounds[tmpRoundId].ticketCount, "invalid status");
                result = decodeNumberAsStruct(rounds[tmpRoundId].result);
            }
            uint256 ticketId = inputs[i + 1];
            Ticket memory ticket = rounds[tmpRoundId].tickets[ticketId];
            if (ticket.claimed || ticket.owner == address(0) || user != ticket.owner) {
                continue;
            }
            uint256 prize;
            if (ticket.number == 0) {
                uint256[10] memory levels = getComboPrizeLevels(
                    rounds[tmpRoundId].comboTickets[ticketId].number1, rounds[tmpRoundId].comboTickets[ticketId].number2, result
                );
                for (uint256 level = 1; level <= 10; ++level) {
                    uint256 count = levels[level - 1];
                    if (count > 0) {
                        if (level == 1) {
                            prize += rounds[tmpRoundId].perWinnerPrizes1;
                        } else if (level == 2) {
                            prize += rounds[tmpRoundId].perWinnerPrizes2 * count;
                        } else {
                            prize += PRIZES[level - 3] * count;
                        }
                    }
                }
            } else {
                uint256 level = getPrizeLevel(ticket.number, result);
                if (level == 1) {
                    prize = rounds[tmpRoundId].perWinnerPrizes1;
                } else if (level == 2) {
                    prize = rounds[tmpRoundId].perWinnerPrizes2;
                } else if (level > 0) {
                    prize = PRIZES[level - 3];
                }
            }
            if (prize > 0) {
                totalPrize += prize;
                rounds[tmpRoundId].tickets[ticketId].claimed = true;
                emit ClaimReward(tmpRoundId, ticketId);
            }
        }
        require(totalPrize > 0, "no prize");
        require(pendingPrize >= totalPrize, "insufficient money");
        pendingPrize -= totalPrize;
        user.transfer(totalPrize);
    }

    function getCommitment(uint256 _roundId, address user) external view returns (bytes32) {
        return rounds[_roundId].commitments[user];
    }

    function getTicket(uint256 _roundId, uint256 ticketId) external view returns (bool, address, uint256, uint256, uint256) {
        Ticket memory ticket = rounds[_roundId].tickets[ticketId];
        ComboTicket memory comboTicket = rounds[_roundId].comboTickets[ticketId];
        return (ticket.claimed, ticket.owner, ticket.number, comboTicket.number1, comboTicket.number2);
    }

    function getAvailablePrize() public view returns (uint256) {
        return address(this).balance - pendingPrize;
    }

    function getSystemStatus() external view returns (uint256, Status, uint256, uint256, uint256, uint128, uint128) {
        uint256 tmpRoundId = roundId;
        if (status != Status.normal) {
            --tmpRoundId;
        }
        return (
            roundId,
            status,
            normalUntil,
            revealingUntil + CONFIRMING_DURATION,
            now,
            rounds[tmpRoundId].ticketCount,
            rounds[tmpRoundId].checkedCount
        );
    }

    function getPrizeLevel(uint256 number, Number memory result) internal pure returns (uint256) {
        uint256 hit = 0;
        uint256 n0 = result.n0;
        uint256 n1 = result.n1;
        uint256 n2 = result.n2;
        uint256 n3 = result.n3;
        uint256 n4 = result.n4;
        uint256 n5 = result.n5;
        for (uint256 i = 8; i <= 48; i += 8) {
            uint256 n = (number >> i) & 0xff;
            if (n < n3) {
                if (n == n0 || n == n1 || n == n2) {
                    ++hit;
                }
            } else {
                if (n == n3 || n == n4 || n == n5) {
                    ++hit;
                }
            }
        }
        if (hit == 0) {
            return 0;
        } else if (number & 0xff == result.n6) {
            if (hit == 1) {
                return 10;
            } else if (hit == 2) {
                return 8;
            } else if (hit == 3) {
                return 7;
            } else if (hit == 4) {
                return 5;
            } else if (hit == 5) {
                return 3;
            } else {
                return 1;
            }
        } else {
            if (hit < 3) {
                return 0;
            } else if (hit == 3) {
                return 9;
            } else if (hit == 4) {
                return 6;
            } else if (hit == 5) {
                return 4;
            } else {
                return 2;
            }
        }
    }

    function getComboPrizeLevels(uint256 number1, uint256 number2, Number memory result) internal pure returns (uint256[10] memory) {
        uint256[10] memory levels;
        uint256 zone1Count = number1 >> 248;
        uint256 zone2Count = (number1 >> 240) & 0xff;
        uint256 n6 = result.n6;
        uint256 length = (zone2Count + 2) << 3;
        uint256 zone2HitCombinations;
        for (uint256 i = 16; i < length; i += 8) {
            uint256 n = (number1 >> (248 - i)) & 0xff;
            if (n == n6) {
                zone2HitCombinations = 1;
                break;
            }
        }
        uint256 zone1Hit = getZone1Hit(zone1Count, zone2Count, number1, number2, result);
        if (zone1Hit > 0) {
            uint256 zone2NoHitCombinations = zone2Count - zone2HitCombinations;
            if (zone2HitCombinations == 1) {
                levels[9] = zone1Hit * combinations(zone1Count - zone1Hit, 5);
            }

            if (zone1Hit > 1) {
                if (zone2HitCombinations == 1) {
                    levels[7] = combinations(zone1Hit, 2) * combinations(zone1Count - zone1Hit, 4);
                }

                if (zone1Hit > 2) {
                    uint256 zone1Combinations = combinations(zone1Hit, 3) * combinations(zone1Count - zone1Hit, 3);
                    levels[6] = zone1Combinations * zone2HitCombinations;
                    levels[8] = zone1Combinations * zone2NoHitCombinations;

                    if (zone1Hit > 3) {
                        zone1Combinations = combinations(zone1Hit, 4) * combinations(zone1Count - zone1Hit, 2);
                        levels[4] = zone1Combinations * zone2HitCombinations;
                        levels[5] = zone1Combinations * zone2NoHitCombinations;

                        if (zone1Hit > 4) {
                            zone1Combinations = combinations(zone1Hit, 5) * combinations(zone1Count - zone1Hit, 1);
                            levels[2] = zone1Combinations * zone2HitCombinations;
                            levels[3] = zone1Combinations * zone2NoHitCombinations;

                            if (zone1Hit > 5) {
                                levels[0] = zone2HitCombinations;
                                levels[1] = zone2NoHitCombinations;
                            }
                        }
                    }
                }
            }
        }

        return levels;
    }

    function getZone1Hit(
        uint256 zone1Count, uint256 zone2Count, uint256 number1, uint256 number2, Number memory result
    ) internal pure returns (uint256) {
        uint256 hit = 0;
        uint256 n0 = result.n0;
        uint256 n1 = result.n1;
        uint256 n2 = result.n2;
        uint256 n3 = result.n3;
        uint256 n4 = result.n4;
        uint256 n5 = result.n5;
        uint256 length = (zone1Count > 30 - zone2Count ? 32 : zone1Count + zone2Count + 2) << 3;
        for (uint256 i = (zone2Count + 2) << 3; i < length; i += 8) {
            uint256 n = (number1 >> (248 - i)) & 0xff;
            if (n < n3) {
                if (n == n0 || n == n1 || n == n2) {
                    ++hit;
                }
            } else {
                if (n == n3 || n == n4 || n == n5) {
                    ++hit;
                }
            }
        }
        if (zone1Count > 30 - zone2Count) {
            length = (zone1Count - 30 + zone2Count) * 8;
            for (uint256 i = 0; i < length; i += 8) {
                uint256 n = (number2 >> (248 - i)) & 0xff;
                if (n < n3) {
                    if (n == n0 || n == n1 || n == n2) {
                        ++hit;
                    }
                } else {
                    if (n == n3 || n == n4 || n == n5) {
                        ++hit;
                    }
                }
            }
        }
        return hit;
    }

    function decodeNumberAsStruct(uint256 number) internal pure returns (Number memory) {
        Number memory numbers;
        numbers.n6 = number & 0xff;
        numbers.n5 = (number >> 8) & 0xff;
        numbers.n4 = (number >> 16) & 0xff;
        numbers.n3 = (number >> 24) & 0xff;
        numbers.n2 = (number >> 32) & 0xff;
        numbers.n1 = (number >> 40) & 0xff;
        numbers.n0 = (number >> 48) & 0xff;
        return numbers;
    }

    function decodePrize(uint256 prize) internal pure returns (uint256[10] memory) {
        return [
            (prize >> 240) & 0xffff,
            (prize >> 224) & 0xffff,
            (prize >> 208) & 0xffff,
            (prize >> 192) & 0xffff,
            (prize >> 160) & 0xffffffff,
            (prize >> 128) & 0xffffffff,
            (prize >> 96) & 0xffffffff,
            (prize >> 64) & 0xffffffff,
            (prize >> 32) & 0xffffffff,
            prize & 0xffffffff
        ];
    }

    function encodePrize(uint256[10] memory prizes) internal pure returns (uint256) {
        return (prizes[0] << 240) | (prizes[1] << 224) | (prizes[2] << 208) | (prizes[3] << 192) | (prizes[4] << 160) |
            (prizes[5] << 128) | (prizes[6] << 96) | (prizes[7] << 64) | (prizes[8] << 32) | prizes[9];
    }

    function drawNumbers(uint256 seed) internal pure returns (uint256[6] memory) {
        uint256[6] memory numbers;
        uint256[38] memory all;
        for (uint256 i = 0; i < 6; ++i) {
            uint256 j = random(seed + i, 38 - i) + i;
            uint256 a = all[i];
            uint256 b = all[j];
            all[j] = a == 0 ? i + 1 : a;
            all[i] = b == 0 ? j + 1 : b;
        }
        for (uint256 i = 0; i < 6; ++i) {
            numbers[i] = all[i];
        }
        for (uint256 i = 1; i < 6; ++i) {
            uint256 n = numbers[i];
            uint256 j;
            for (j = i; j > 0 && numbers[j - 1] > n; --j) {
                numbers[j] = numbers[j - 1];
            }
            numbers[j] = n;
        }
        return numbers;
    }

    function getHash(uint256 secret) internal pure returns (bytes32) {
        return keccak256(abi.encode(secret));
    }

    function random(uint256 seed, uint256 max) internal pure returns (uint256) {
        return uint256(getHash(seed)) % max;
    }

    function validateNumber(uint256 number) internal pure {
        uint256 n0 = (number >> 48) & 0xff;
        uint256 n1 = (number >> 40) & 0xff;
        uint256 n2 = (number >> 32) & 0xff;
        uint256 n3 = (number >> 24) & 0xff;
        uint256 n4 = (number >> 16) & 0xff;
        uint256 n5 = (number >> 8) & 0xff;
        uint256 n6 = number & 0xff;
        require(n6 >= 1 && n6 <= 8, "invalid number");
        require(n5 <= 38, "invalid number");
        require(n5 > n4, "invalid number");
        require(n4 > n3, "invalid number");
        require(n3 > n2, "invalid number");
        require(n2 > n1, "invalid number");
        require(n1 > n0, "invalid number");
        require(n0 >= 1, "invalid number");
    }

    function validateComboNumber(uint256 number, uint256 startN, uint256 start, uint256 end) internal pure returns (uint256) {
        uint256 n1 = startN;
        for (uint256 i = start; i < end; i += 8) {
            uint256 n2 = (number >> (248 - i)) & 0xff;
            require(n2 > n1, "invalid number");
            n1 = n2;
        }
        return n1;
    }

    function combinations(uint256 n, uint256 m) internal pure returns (uint256) {
        if (n < m) {
            return 0;
        } else if (n == m) {
            return 1;
        } else {
            uint256 r = m < n - m ? m : n - m;
            if (r == 1) {
                return n;
            }
            uint256 a = n - r + 1;
            for (uint256 i = a + 1; i <= n; ++i) {
                a *= i;
            }
            uint256 b = 1;
            for (uint256 i = b + 1; i <= r; ++i) {
                b *= i;
            }
            return a / b;
        }
    }

    function getTime() internal view returns (uint256) {
        return now;
    }

    function getBlockHash(uint256 number) internal view returns (bytes32) {
        return blockhash(number);
    }
}

File 2 of 3: Adminable.sol
pragma solidity ^0.5.2;

import "./Ownable.sol";

contract Adminable is Ownable {
    mapping (address => bool) public admins;

    modifier onlyAdmin() {
        require(isAdmin(msg.sender), "not admin");
        _;
    }

    function setAdmin(address user, bool value) external onlyOwner {
        admins[user] = value;
    }

    function isAdmin(address user) internal view returns (bool) {
      return admins[user] || isOwner();
    }
}

File 3 of 3: Ownable.sol
pragma solidity ^0.5.2;

/*
 * @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 GSN 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.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @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.
 *
 * 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.
 */
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 () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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 onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"status","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"count","type":"uint256"}],"name":"checkTickets","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"revealingUntil","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"numbers","type":"uint256[]"},{"name":"referral","type":"address"}],"name":"buyTickets","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"admins","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"},{"name":"value","type":"bool"}],"name":"setAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lottoshi","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSystemStatus","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint8"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint128"},{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"normalUntil","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decentralized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"inputs","type":"uint256[]"}],"name":"claimRewards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingPrize","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"number1","type":"uint256"},{"name":"number2","type":"uint256"},{"name":"referral","type":"address"}],"name":"buyComboTicket","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_roundId","type":"uint256"},{"name":"user","type":"address"}],"name":"getCommitment","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"rounds","outputs":[{"name":"seed","type":"uint256"},{"name":"perWinnerPrizes1","type":"uint256"},{"name":"perWinnerPrizes2","type":"uint256"},{"name":"prizes","type":"uint256"},{"name":"ticketCount","type":"uint128"},{"name":"checkedCount","type":"uint128"},{"name":"result","type":"uint56"},{"name":"revealed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"roundId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAvailablePrize","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"endReveal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_roundId","type":"uint256"},{"name":"ticketId","type":"uint256"}],"name":"getTicket","outputs":[{"name":"","type":"bool"},{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"secret","type":"uint256"}],"name":"reveal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"endCommit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"backToNormal","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"lastAvailablePrize","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"commitment","type":"bytes32"}],"name":"commit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"setLottoshiAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"roundId","type":"uint256"},{"indexed":false,"name":"ticketId","type":"uint256"},{"indexed":false,"name":"referral","type":"address"},{"indexed":false,"name":"number","type":"uint56"},{"indexed":false,"name":"number1","type":"uint256"},{"indexed":false,"name":"number2","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"roundId","type":"uint256"},{"indexed":false,"name":"result","type":"uint256"},{"indexed":false,"name":"perWinnerPrizes1","type":"uint256"},{"indexed":false,"name":"perWinnerPrizes2","type":"uint256"},{"indexed":false,"name":"prizes","type":"uint256"},{"indexed":false,"name":"ticketCount","type":"uint128"}],"name":"Result","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"roundId","type":"uint256"},{"indexed":false,"name":"ticketId","type":"uint256"}],"name":"ClaimReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"roundId","type":"uint256"},{"indexed":false,"name":"user","type":"address"}],"name":"Commit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"roundId","type":"uint256"},{"indexed":false,"name":"user","type":"address"}],"name":"Reveal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"roundId","type":"uint256"},{"indexed":false,"name":"user","type":"address"}],"name":"RevealPrize","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

61018060405267d02ab486cedc00006080908152671bc16d674ec8000060a05267058d15e17628000060c05267011c37937e08000060e052668e1bc9bf0400006101005266470de4df82000061012052662386f26fc1000061014081905261016052620000719060029060086200011e565b506001600b5560108054600160a01b60ff02191690553480156200009457600080fd5b506000620000a76200011560201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062015180620001056200011a60201b60201c565b0163ffffffff16600f556200017e565b335b90565b4290565b82600881019282156200014f579160200282015b828111156200014f57825182559160200191906001019062000132565b506200015d92915062000161565b5090565b6200011791905b808211156200015d576000815560010162000168565b6139c0806200018e6000396000f3fe6080604052600436106101c25760003560e01c806389fb2682116100f7578063a426e4c811610095578063dfefddde11610064578063dfefddde146106b8578063f14fcbc8146106cd578063f2fde38b146106f7578063fcc33cb51461072a576101c2565b8063a426e4c81461060c578063c2ca0ac514610671578063c8bc58d91461069b578063d924393e146106b0576101c2565b80638da5cb5b116100d15780638da5cb5b146105b85780638f32d59b146105cd57806399cdfd4d146105e2578063a35bb3a9146105f7576101c2565b806389fb2682146104eb5780638c65c81f146105245780638cd221c9146105a3576101c2565b806350c1d19d116101645780635eac62391161013e5780635eac6239146104125780636d0bf58d1461048f578063715018a6146104a457806376533946146104b9576101c2565b806350c1d19d1461037a5780635b28af6d146103e85780635b410881146103fd576101c2565b80633b0c3a7c116101a05780633b0c3a7c1461024e578063429b62e5146102c75780634b0bddd21461030e5780634c771b6714610349576101c2565b8063200d2ed2146101c457806322508e5d146101fd5780633501f77714610227575b005b3480156101d057600080fd5b506101d961075d565b604051808260028111156101e957fe5b60ff16815260200191505060405180910390f35b34801561020957600080fd5b506101c26004803603602081101561022057600080fd5b503561076d565b34801561023357600080fd5b5061023c610c2f565b60408051918252519081900360200190f35b6101c26004803603604081101561026457600080fd5b81019060208101813564010000000081111561027f57600080fd5b82018360208201111561029157600080fd5b803590602001918460208302840111640100000000831117156102b357600080fd5b9193509150356001600160a01b0316610c35565b3480156102d357600080fd5b506102fa600480360360208110156102ea57600080fd5b50356001600160a01b0316610eda565b604080519115158252519081900360200190f35b34801561031a57600080fd5b506101c26004803603604081101561033157600080fd5b506001600160a01b0381351690602001351515610eef565b34801561035557600080fd5b5061035e610f64565b604080516001600160a01b039092168252519081900360200190f35b34801561038657600080fd5b5061038f610f73565b604051808881526020018760028111156103a557fe5b60ff16815260208101969096525060408086019490945260608501929092526001600160801b0390811660808501521660a0830152519081900360c00192509050f35b3480156103f457600080fd5b5061023c61100a565b34801561040957600080fd5b506102fa611010565b34801561041e57600080fd5b506101c26004803603602081101561043557600080fd5b81019060208101813564010000000081111561045057600080fd5b82018360208201111561046257600080fd5b8035906020019184602083028401116401000000008311171561048457600080fd5b509092509050611020565b34801561049b57600080fd5b5061023c6115e0565b3480156104b057600080fd5b506101c26115e6565b6101c2600480360360608110156104cf57600080fd5b50803590602081013590604001356001600160a01b031661167a565b3480156104f757600080fd5b5061023c6004803603604081101561050e57600080fd5b50803590602001356001600160a01b0316611a15565b34801561053057600080fd5b5061054e6004803603602081101561054757600080fd5b5035611a42565b6040805198895260208901979097528787019590955260608701939093526001600160801b0391821660808701521660a085015266ffffffffffffff1660c0840152151560e083015251908190036101000190f35b3480156105af57600080fd5b5061023c611aa1565b3480156105c457600080fd5b5061035e611aa7565b3480156105d957600080fd5b506102fa611ab6565b3480156105ee57600080fd5b5061023c611ada565b34801561060357600080fd5b506101c2611ae3565b34801561061857600080fd5b5061063c6004803603604081101561062f57600080fd5b5080359060200135611c95565b6040805195151586526001600160a01b0390941660208601528484019290925260608401526080830152519081900360a00190f35b34801561067d57600080fd5b506101c26004803603602081101561069457600080fd5b5035611d66565b3480156106a757600080fd5b506101c2612127565b6101c261222b565b3480156106c457600080fd5b5061023c61243d565b3480156106d957600080fd5b506101c2600480360360208110156106f057600080fd5b5035612443565b34801561070357600080fd5b506101c26004803603602081101561071a57600080fd5b50356001600160a01b031661258d565b34801561073657600080fd5b506101c26004803603602081101561074d57600080fd5b50356001600160a01b03166125e0565b601054600160a01b900460ff1681565b6002601054600160a01b900460ff16600281111561078757fe5b146107d05760408051600160e51b62461bcd02815260206004820152600e6024820152600160901b6d696e76616c69642073746174757302604482015290519081900360640190fd5b600b54600019016107df6137d9565b506000818152600a6020908152604091829020825161010081018452815481526001820154928101929092526002810154928201929092526003820154606082015260048201546001600160801b0380821660808401819052600160801b9092041660a083015260059092015466ffffffffffffff811660c0830152600160381b900460ff16151560e0820152906108fc5760108054600160a01b60ff02191690556201518061088d61269e565b01600f5560c0808201516040805185815266ffffffffffffff90921660208301526000828201819052606083018190526080830181905260a0830152517f820e0f59df709ae6792dfd193d1985b127da2b323dcb5573354fb38b995561ed929181900390910190a15050610c2c565b600083116109545760408051600160e51b62461bcd02815260206004820152600d60248201527f696e76616c696420636f756e7400000000000000000000000000000000000000604482015290519081900360640190fd5b60a081015160808201516001600160801b0391821685019116811115610984575060808101516001600160801b03165b61098c61383b565b61099983606001516126a2565b90506109a361385a565b6109b98460c0015166ffffffffffffff1661274f565b60a08501519091506000906001016001600160801b03165b848111610adf576000878152600a60209081526040808320848452600701909152902054600160a81b900466ffffffffffffff1680610a9757610a1261383b565b6000898152600a6020908152604080832086845260080190915290208054600190910154610a419190876127b3565b905060005b600a811015610a905760008282600a8110610a5d57fe5b602002015190508015610a8757808883600a8110610a7757fe5b6020020180519091019052600195505b50600101610a46565b5050610ad6565b6000610aac8266ffffffffffffff1686612942565b90508015610ad4578560018203600a8110610ac357fe5b602002018051600190810190915293505b505b506001016109d1565b506001600160801b03841660a08601528015610b1157610afe83612afd565b6000878152600a60205260409020600301555b84608001516001600160801b03168560a001516001600160801b03161415610bf657610b3e868685612b81565b60108054600160a01b60ff021916905562015180610b5a61269e565b0163ffffffff16600f5560c0858101516020808801516040808a015160008c8152600a8552829020600301546080808d015184518f815266ffffffffffffff90981696880196909652868401949094526060860191909152918401919091526001600160801b0390911660a0830152517f820e0f59df709ae6792dfd193d1985b127da2b323dcb5573354fb38b995561ed929181900390910190a15b5050505060a001516000918252600a602052604090912060040180546001600160801b03928316600160801b0292169190911790555b50565b600e5481565b81662386f26fc10000810234811115610c865760408051600160e51b62461bcd0281526020600482015260126024820152600080516020613935833981519152604482015290519081900360640190fd5b60006001600160a01b0384163314610c9e5783610ca1565b60005b600b546000818152600a602052604081206004015492935090916001600160801b0316905b85811015610dee576000898983818110610cdc57fe5b905060200201359050610cee81612cee565b6040805160608082018352600080835233602080850182815266ffffffffffffff8881168789018181528d8752600a855289872060019d909d016001600160801b0381168089526007909e0186528a882099518a549551925160ff1990961690151517610100600160a81b0319166101006001600160a01b039384160217600160a81b600160e01b031916600160a81b95909416949094029290921790975587518c81529283019a909a52988b1681870152928301939093526080820181905260a0820152915190917fe441d5edf43005f305b0b45ca26f066fc1e04afa5b452d8e6a9b1f0ab40301029160c0918190039190910190a250600101610cc6565b506000828152600a6020526040902060040180546001600160801b0319166001600160801b0383161790556010546001600160a01b03166373e888fd612710610bb8870204856040518363ffffffff1660e01b815260040180826001600160a01b03166001600160a01b031681526020019150506000604051808303818588803b158015610e7b57600080fd5b505af1158015610e8f573d6000803e3d6000fd5b505050505060008434031115610ed05760405133903486900380156108fc02916000818181858888f19350505050158015610ece573d6000803e3d6000fd5b505b5050505050505050565b60016020526000908152604090205460ff1681565b610ef7611ab6565b610f395760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613955833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b6010546001600160a01b031681565b600080600080600080600080600b54905060006002811115610f9157fe5b601054600160a01b900460ff166002811115610fa957fe5b14610fb357600019015b600b54601054600f54600e546000948552600a602052604090942060040154929b600160a01b90920460ff169a50985061025890920196504295506001600160801b038082169550600160801b9091041692509050565b600f5481565b601054600160a81b900460ff1681565b60028106158015611032575060028110155b6110865760408051600160e51b62461bcd02815260206004820152600e60248201527f696e76616c6964206c656e677468000000000000000000000000000000000000604482015290519081900360640190fd5b60008282600081811061109557fe5b602090810292909201356000818152600a90935260409092206004015491925050600160801b81046001600160801b039081169116146111135760408051600160e51b62461bcd02815260206004820152600e6024820152600160901b6d696e76616c69642073746174757302604482015290519081900360640190fd5b6000818152600a602052604081208190600701818686600181811061113457fe5b90506020020135815260200190815260200160002060000160019054906101000a90046001600160a01b0316905061116a61385a565b6000848152600a602052604090206005015461118e9066ffffffffffffff1661274f565b905060005b85811015611509578686828181106111a757fe5b905060200201358514611265578686828181106111c057fe5b602090810292909201356000818152600a90935260409092206004015491965050600160801b81046001600160801b0390811691161461123e5760408051600160e51b62461bcd02815260206004820152600e6024820152600160901b6d696e76616c69642073746174757302604482015290519081900360640190fd5b6000858152600a60205260409020600501546112629066ffffffffffffff1661274f565b91505b600087878360010181811061127657fe5b905060200201359050611287613897565b506000868152600a602090815260408083208484526007018252918290208251606081018452905460ff8116151580835261010082046001600160a01b031693830193909352600160a81b900466ffffffffffffff1692810192909252806112fa575060208101516001600160a01b0316155b8061131b575080602001516001600160a01b0316856001600160a01b031614155b15611327575050611501565b6000816040015166ffffffffffffff16600014156114165761134761383b565b6000898152600a60209081526040808320878452600801909152902080546001909101546113769190886127b3565b905060015b600a811161140f5760008260018303600a811061139457fe5b6020020151905080156114065781600114156113c65760008b8152600a60205260409020600101549390930192611406565b81600214156113ed5760008b8152600a602052604090206002015481029390930192611406565b80600260038403600881106113fe57fe5b015402840193505b5060010161137b565b5050611492565b600061142f836040015166ffffffffffffff1687612942565b90508060011415611453576000898152600a60205260409020600101549150611490565b8060021415611475576000898152600a60205260409020600201549150611490565b8015611490576002600382036008811061148b57fe5b015491505b505b80156114fd576000888152600a60209081526040808320868452600701825291829020805460ff1916600117905581518a81529081018590528151988301987f179780be10c742bdbc92cd0af59e83edeb067cd1954ef4d647827d8504c7c2ca929181900390910190a15b5050505b600201611193565b50600083116115505760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b676e6f207072697a6502604482015290519081900360640190fd5b82600d5410156115985760408051600160e51b62461bcd0281526020600482015260126024820152600080516020613935833981519152604482015290519081900360640190fd5b600d805484900390556040516001600160a01b0383169084156108fc029085906000818181858888f193505050501580156115d7573d6000803e3d6000fd5b50505050505050565b600d5481565b6115ee611ab6565b6116305760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613955833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60f883901c60ff60f085901c1660068210801590611699575060268211155b6116ed5760408051600160e51b62461bcd02815260206004820152601260248201527f696e76616c6964207a6f6e6531436f756e740000000000000000000000000000604482015290519081900360640190fd5b600181101580156116ff575060088111155b6117535760408051600160e51b62461bcd02815260206004820152601260248201527f696e76616c6964207a6f6e6532436f756e740000000000000000000000000000604482015290519081900360640190fd5b600081611761846006612f5d565b029050662386f26fc100008102348111156117b45760408051600160e51b62461bcd0281526020600482015260126024820152600080516020613935833981519152604482015290519081900360640190fd5b6117c087878686612ff5565b60006001600160a01b03861633146117d857856117db565b60005b600b546000818152600a60209081526040808320600481015482516060810184528581523381860190815281850187815260016001600160801b03948516019384168852600785018752858820925183549251915160ff1990931690151517610100600160a81b0319166101006001600160a01b039092169190910217600160a81b600160e01b031916600160a81b66ffffffffffffff9092169190910217905560089091019092529091208b90559192509088156118c0576000828152600a602090815260408083206001600160801b038516845260080190915290206001018990555b604080518381526001600160801b03831660208201526001600160a01b0385168183015260006060820152608081018c905260a081018b9052905133917fe441d5edf43005f305b0b45ca26f066fc1e04afa5b452d8e6a9b1f0ab4030102919081900360c00190a26000828152600a6020526040902060040180546001600160801b0319166001600160801b0383161790556010546001600160a01b03166373e888fd612710610bb8870204856040518363ffffffff1660e01b815260040180826001600160a01b03166001600160a01b031681526020019150506000604051808303818588803b1580156119b457600080fd5b505af11580156119c8573d6000803e3d6000fd5b505050505060008434031115611a095760405133903486900380156108fc02916000818181858888f19350505050158015611a07573d6000803e3d6000fd5b505b50505050505050505050565b6000828152600a602090815260408083206001600160a01b03851684526006019091529020545b92915050565b600a6020526000908152604090208054600182015460028301546003840154600485015460059095015493949293919290916001600160801b0380831692600160801b9004169066ffffffffffffff811690600160381b900460ff1688565b600b5481565b6000546001600160a01b031690565b600080546001600160a01b0316611acb61319b565b6001600160a01b031614905090565b600d5430310390565b6001601054600160a01b900460ff166002811115611afd57fe5b14611b465760408051600160e51b62461bcd02815260206004820152600e6024820152600160901b6d696e76616c69642073746174757302604482015290519081900360640190fd5b601054600090600160a81b900460ff16611b6757600e54620d315801611b6f565b610258600e54015b905080611b7a61269e565b1015611bc25760408051600160e51b62461bcd02815260206004820152600c6024820152600160a01b6b696e76616c69642074696d6502604482015290519081900360640190fd5b600b54600019016000908152600a6020526040902054611be5601319430161319f565b600b54600019016000908152600a60205260409020910190819055611c09816131a3565b601054600160a81b900460ff16611c915760108054600160a81b60ff021916600160a81b179081905560408051600160e11b63419ab82902815290516001600160a01b039092169163833570529160048082019260009290919082900301818387803b158015611c7857600080fd5b505af1158015611c8c573d6000803e3d6000fd5b505050505b5050565b6000806000806000611ca5613897565b506000878152600a602090815260408083208984526007018252918290208251606081018452905460ff81161515825261010081046001600160a01b031692820192909252600160a81b90910466ffffffffffffff1691810191909152611d0a6138b7565b506000978852600a60209081526040808a20988a526008909801815297879020875180890189528154808252600190920154908a0181905282519983015192909801519899919866ffffffffffffff1697909650945092505050565b6001601054600160a01b900460ff166002811115611d8057fe5b14611dc95760408051600160e51b62461bcd02815260206004820152600e6024820152600160901b6d696e76616c69642073746174757302604482015290519081900360640190fd5b600b5460001901611dd93361327e565b8015611def5750601054600160a81b900460ff16155b15611f4c57610258600e5401611e0361269e565b1015611e4b5760408051600160e51b62461bcd02815260206004820152600c6024820152600160a01b6b696e76616c69642074696d6502604482015290519081900360640190fd5b6000818152600a60209081526040808320838052600601909152902054611e71836132a8565b14611eba5760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d1a5b9d985b1a59081cd958dc995d02604482015290519081900360640190fd5b6000818152600a60208181526040808420848052600681018352908420849055928490525254611eed601319430161319f565b018201611ef9816131a3565b6000828152600a6020908152604080832084905580518581529182019290925281517f18e3a2a1539c4d2325524f2c652bd26fea78b54a5861212876952caf2e00582b929181900390910190a150612075565b600e54611f5761269e565b10611f9e5760408051600160e51b62461bcd02815260206004820152600c6024820152600160a01b6b696e76616c69642074696d6502604482015290519081900360640190fd5b6000818152600a60209081526040808320338452600601909152902054611fc4836132a8565b1461200d5760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d1a5b9d985b1a59081cd958dc995d02604482015290519081900360640190fd5b6000818152600a6020818152604080842033808652600682018452828620869055948690529282528254860190925581518481529081019290925280517f18e3a2a1539c4d2325524f2c652bd26fea78b54a5861212876952caf2e00582b9281900390910190a15b6000818152600a6020526040902060050154600160381b900460ff16611c91576000818152600a6020526040808220600501805467ff000000000000001916600160381b179055513391906706f05b59d3b200009082818181858883f193505050501580156120e8573d6000803e3d6000fd5b506040805182815233602082015281517fc7ad212fc37b0fda8af53154f4fc8674770b9d813b1863178c39c4ed2128edc1929181900390910190a15050565b601054600160a81b900460ff1661214557620d2f00600f5401612149565b600f545b61215161269e565b10156121995760408051600160e51b62461bcd02815260206004820152600c6024820152600160a01b6b696e76616c69642074696d6502604482015290519081900360640190fd5b6121a16132cc565b601054600160a81b900460ff166122295760108054600160a81b60ff021916600160a81b179081905560408051600160e11b63419ab82902815290516001600160a01b039092169163833570529160048082019260009290919082900301818387803b15801561221057600080fd5b505af1158015612224573d6000803e3d6000fd5b505050505b565b6122343361327e565b6122775760408051600160e51b62461bcd0281526020600482015260096024820152600160b91b683737ba1030b236b4b702604482015290519081900360640190fd5b601054600160a81b900460ff16156122d95760408051600160e51b62461bcd02815260206004820152600f60248201527f6d6574686f642064697361626c65640000000000000000000000000000000000604482015290519081900360640190fd5b6001601054600160a01b900460ff1660028111156122f357fe5b1461233c5760408051600160e51b62461bcd02815260206004820152600e6024820152600160901b6d696e76616c69642073746174757302604482015290519081900360640190fd5b6802b5e3af16b18800003481111561238c5760408051600160e51b62461bcd0281526020600482015260126024820152600080516020613935833981519152604482015290519081900360640190fd5b60108054600160a01b60ff0219169055600b8054600019019055620151806123b261269e565b0163ffffffff16600f55600b546000818152600a6020526040902060050154600160381b900460ff1615612401576000818152600a60205260409020600501805467ff00000000000000191690555b81341115611c915760405133903484900380156108fc02916000818181858888f19350505050158015612438573d6000803e3d6000fd5b505050565b600c5481565b61244c3361327e565b80156124625750601054600160a81b900460ff16155b1561252857600f5461247261269e565b10156124ba5760408051600160e51b62461bcd02815260206004820152600c6024820152600160a01b6b696e76616c69642074696d6502604482015290519081900360640190fd5b6124c26132cc565b600b80546000199081016000908152600a602090815260408083208380526006018252808320869055935484519301835282015281517f775cbcccd7fe28145ecb9139488663063065c5a215ba96419500f1bb1217661e929181900390910190a1610c2c565b600b80546000908152600a60209081526040808320338085526006909101835292819020859055925483519081529081019190915281517f775cbcccd7fe28145ecb9139488663063065c5a215ba96419500f1bb1217661e929181900390910190a150565b612595611ab6565b6125d75760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613955833981519152604482015290519081900360640190fd5b610c2c816133c7565b6125e8611ab6565b61262a5760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613955833981519152604482015290519081900360640190fd5b6010546001600160a01b03161561267c5760408051600160e51b62461bcd02815260206004820152600b6024820152600160aa1b6a185b1c9958591e481cd95d02604482015290519081900360640190fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b4290565b6126aa61383b565b60405180610140016040528060f084901c61ffff16815260200160e084901c61ffff16815260200160d084901c61ffff16815260200160c084901c61ffff16815260200160a084901c63ffffffff168152602001608084901c63ffffffff168152602001606084901c63ffffffff168152602001604084901c63ffffffff168152602001602084901c63ffffffff1681526020018363ffffffff168152509050919050565b61275761385a565b61275f61385a565b60ff80841660c0830152600884901c811660a0830152601084901c81166080830152601884901c81166060830152602084811c82166040840152602885901c821690830152603084901c1681529050919050565b6127bb61383b565b6127c361383b565b60c083015160f886901c9060ff60f088901c16906002820160031b600060105b828110156128115760ff60f88290038c901c1684811415612808576001925050612811565b506008016127e3565b50600061282186868d8d8d61346a565b9050801561293357818503600183141561284b576128428288036005612f5d565b82026101208901525b600182111561293157826001141561287c5761286a8288036004612f5d565b612875836002612f5d565b0260e08901525b60028211156129315760006128948389036003612f5d565b61289f846003612f5d565b0284810260c08b01528281026101008b01529050600383111561292f576128c98389036002612f5d565b6128d4846004612f5d565b0284810260808b015282810260a08b01529050600483111561292f576128fd8389036001612f5d565b612908846005612f5d565b0284810260408b015282810260608b01529050600583111561292f57838952602089018290525b505b505b50949998505050505050505050565b8051602082015160408301516060840151608085015160a08601516000958695909490939092909160085b603081116129d75760ff8b821c16848110156129ab578781148061299057508681145b8061299a57508581145b156129a6578860010198505b6129ce565b848114806129b857508381145b806129c257508281145b156129ce578860010198505b5060080161296d565b50866129ed576000975050505050505050611a3c565b8860c001518a60ff161415612a89578660011415612a1557600a975050505050505050611a3c565b8660021415612a2e576008975050505050505050611a3c565b8660031415612a47576007975050505050505050611a3c565b8660041415612a60576005975050505050505050611a3c565b8660051415612a79576003975050505050505050611a3c565b6001975050505050505050611a3c565b6003871015612aa2576000975050505050505050611a3c565b8660031415612abb576009975050505050505050611a3c565b8660041415612ad4576006975050505050505050611a3c565b8660051415612aed576004975050505050505050611a3c565b6002975050505050505050611a3c565b61012081015160009060208360086020020151901b60408460076020020151901b60608560066020020151901b60808660056020020151901b60a08760046020020151901b60c08860036020020151901b60d08960026020020151901b60e08a60016020020151901b60f08b60006020020151901b17171717171717171792915050565b6000805b6008811015612bbf5760028160088110612b9b57fe5b01548382600201600a8110612bac57fe5b6020020151029190910190600101612b85565b5080612bc9611ada565b1015612c0d5760408051600160e51b62461bcd0281526020600482015260126024820152600080516020613935833981519152604482015290519081900360640190fd5b600c5481811015612c1f576000612c23565b8181035b835160208501519192506127106114dc84028190049261029485029190910491908115612c5957818481612c5357fe5b04612c5c565b60005b60208901528015612c7657808381612c7057fe5b04612c79565b60005b60408901819052602089015183029082028701018015612c9c57600d8054820190555b602089015115612cc0576020808a015160008c8152600a9092526040909120600101555b604089015115611a09576040808a015160008c8152600a602052919091206002015550505050505050505050565b60ff603082901c811690602883901c811690602084901c811690601885901c811690601086901c811690600887901c811690871660018110801590612d34575060088111155b612d765760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b6026821115612dbd5760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b828211612e025760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b838311612e475760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b848411612e8c5760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b858511612ed15760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b868611612f165760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b6001871015610ed05760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b600081831015612f6f57506000611a3c565b81831415612f7f57506001611a3c565b60008284038310612f9257828403612f94565b825b90508060011415612fa85783915050611a3c565b80840360018101906002015b858111612fc75790810290600101612fb4565b50600160025b838111612fe05790810290600101612fcd565b50808281612fea57fe5b049350505050611a3c565b60ff60e885901c1660018110156130445760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b6002820160031b61305886836018846135c6565b915060088211156130a15760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b8060f80386901c60ff16915060018210156130f45760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b600383601e03851161310b5783850160020161310e565b60205b901b90506131258683600386600301901b846135c6565b915082601e0384111561315457600383601e860301901b90506131518583600386600301901b846135c6565b91505b6026821115611c8c5760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b3390565b4090565b60108054600160a01b60ff021916600160a11b1790556131c16138d1565b6131ca82613637565b905060006131dc8360060160086137be565b60010190508060088360056020020151901b60108460046020020151901b60188560036020020151901b60208660026006811061321557fe5b6020020151901b60288760016020020151901b60308860006020020151901b171717171717600a60006001600b5403815260200190815260200160002060050160006101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550505050565b6001600160a01b03811660009081526001602052604081205460ff1680611a3c5750611a3c611ab6565b60408051602080820193909352815180820384018152908201909152805191012090565b6000601054600160a01b900460ff1660028111156132e657fe5b1461332f5760408051600160e51b62461bcd02815260206004820152600e6024820152600160901b6d696e76616c69642073746174757302604482015290519081900360640190fd5b6000613339611ada565b90506706f05b59d3b200008110156133895760408051600160e51b62461bcd0281526020600482015260126024820152600080516020613935833981519152604482015290519081900360640190fd5b600b8054600101905560108054600160a01b60ff021916600160a01b179055610bb86133b361269e565b01600e556706f05b59d3b1ffff1901600c55565b6001600160a01b03811661340f57604051600160e51b62461bcd02815260040180806020018281038252602681526020018061390f6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b8051602082015160408301516060840151608085015160a086015160009586959094909390929091866003601e8e90038f116134ab578d8f016002016134ae565b60205b901b905060028d0160031b5b818110156135295760ff60f88290038e901c16858110156134fd57888114806134e257508781145b806134ec57508681145b156134f8578960010199505b613520565b8581148061350a57508481145b8061351457508381145b15613520578960010199505b506008016134ba565b508c601e038e11156135b4575060088d8d01601d19010260005b818110156135b25760ff60f88290038d901c1685811015613586578881148061356b57508781145b8061357557508681145b15613581578960010199505b6135a9565b8581148061359357508481145b8061359d57508381145b156135a9578960010199505b50600801613543565b505b50959c9b505050505050505050505050565b600083835b8381101561362d5760ff60f882900388901c168281116136235760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b91506008016135cb565b5095945050505050565b61363f6138d1565b6136476138d1565b61364f6138ef565b60005b60068110156136e95760008161366d838801846026036137be565b019050600083836026811061367e57fe5b60200201519050600084836026811061369357fe5b6020020151905081156136a657816136ab565b836001015b8584602681106136b757fe5b602002015280156136c857806136cd565b826001015b8585602681106136d957fe5b6020020152505050600101613652565b5060005b60068110156137205781816026811061370257fe5b602002015183826006811061371357fe5b60200201526001016136ed565b5060015b60068110156137b557600083826006811061373b57fe5b60200201519050815b60008111801561376657508185600183036006811061375f57fe5b6020020151115b156137995784600182036006811061377a57fe5b602002015185826006811061378b57fe5b602002015260001901613744565b818582600681106137a657fe5b60200201525050600101613724565b50909392505050565b6000816137ca846132a8565b816137d157fe5b069392505050565b6040518061010001604052806000815260200160008152602001600081526020016000815260200160006001600160801b0316815260200160006001600160801b03168152602001600066ffffffffffffff1681526020016000151581525090565b604051806101400160405280600a906020820280388339509192915050565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b604051806040016040528060008152602001600081525090565b6040518060c001604052806006906020820280388339509192915050565b604051806104c00160405280602690602082028038833950919291505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373696e73756666696369656e74206d6f6e657900000000000000000000000000004f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572696e76616c6964206e756d626572000000000000000000000000000000000000a165627a7a72305820f9f84a50d3b76177bbdea03ffc10de5204f20f180bafc65c117b40b6a8efbeec0029

Deployed Bytecode

0x6080604052600436106101c25760003560e01c806389fb2682116100f7578063a426e4c811610095578063dfefddde11610064578063dfefddde146106b8578063f14fcbc8146106cd578063f2fde38b146106f7578063fcc33cb51461072a576101c2565b8063a426e4c81461060c578063c2ca0ac514610671578063c8bc58d91461069b578063d924393e146106b0576101c2565b80638da5cb5b116100d15780638da5cb5b146105b85780638f32d59b146105cd57806399cdfd4d146105e2578063a35bb3a9146105f7576101c2565b806389fb2682146104eb5780638c65c81f146105245780638cd221c9146105a3576101c2565b806350c1d19d116101645780635eac62391161013e5780635eac6239146104125780636d0bf58d1461048f578063715018a6146104a457806376533946146104b9576101c2565b806350c1d19d1461037a5780635b28af6d146103e85780635b410881146103fd576101c2565b80633b0c3a7c116101a05780633b0c3a7c1461024e578063429b62e5146102c75780634b0bddd21461030e5780634c771b6714610349576101c2565b8063200d2ed2146101c457806322508e5d146101fd5780633501f77714610227575b005b3480156101d057600080fd5b506101d961075d565b604051808260028111156101e957fe5b60ff16815260200191505060405180910390f35b34801561020957600080fd5b506101c26004803603602081101561022057600080fd5b503561076d565b34801561023357600080fd5b5061023c610c2f565b60408051918252519081900360200190f35b6101c26004803603604081101561026457600080fd5b81019060208101813564010000000081111561027f57600080fd5b82018360208201111561029157600080fd5b803590602001918460208302840111640100000000831117156102b357600080fd5b9193509150356001600160a01b0316610c35565b3480156102d357600080fd5b506102fa600480360360208110156102ea57600080fd5b50356001600160a01b0316610eda565b604080519115158252519081900360200190f35b34801561031a57600080fd5b506101c26004803603604081101561033157600080fd5b506001600160a01b0381351690602001351515610eef565b34801561035557600080fd5b5061035e610f64565b604080516001600160a01b039092168252519081900360200190f35b34801561038657600080fd5b5061038f610f73565b604051808881526020018760028111156103a557fe5b60ff16815260208101969096525060408086019490945260608501929092526001600160801b0390811660808501521660a0830152519081900360c00192509050f35b3480156103f457600080fd5b5061023c61100a565b34801561040957600080fd5b506102fa611010565b34801561041e57600080fd5b506101c26004803603602081101561043557600080fd5b81019060208101813564010000000081111561045057600080fd5b82018360208201111561046257600080fd5b8035906020019184602083028401116401000000008311171561048457600080fd5b509092509050611020565b34801561049b57600080fd5b5061023c6115e0565b3480156104b057600080fd5b506101c26115e6565b6101c2600480360360608110156104cf57600080fd5b50803590602081013590604001356001600160a01b031661167a565b3480156104f757600080fd5b5061023c6004803603604081101561050e57600080fd5b50803590602001356001600160a01b0316611a15565b34801561053057600080fd5b5061054e6004803603602081101561054757600080fd5b5035611a42565b6040805198895260208901979097528787019590955260608701939093526001600160801b0391821660808701521660a085015266ffffffffffffff1660c0840152151560e083015251908190036101000190f35b3480156105af57600080fd5b5061023c611aa1565b3480156105c457600080fd5b5061035e611aa7565b3480156105d957600080fd5b506102fa611ab6565b3480156105ee57600080fd5b5061023c611ada565b34801561060357600080fd5b506101c2611ae3565b34801561061857600080fd5b5061063c6004803603604081101561062f57600080fd5b5080359060200135611c95565b6040805195151586526001600160a01b0390941660208601528484019290925260608401526080830152519081900360a00190f35b34801561067d57600080fd5b506101c26004803603602081101561069457600080fd5b5035611d66565b3480156106a757600080fd5b506101c2612127565b6101c261222b565b3480156106c457600080fd5b5061023c61243d565b3480156106d957600080fd5b506101c2600480360360208110156106f057600080fd5b5035612443565b34801561070357600080fd5b506101c26004803603602081101561071a57600080fd5b50356001600160a01b031661258d565b34801561073657600080fd5b506101c26004803603602081101561074d57600080fd5b50356001600160a01b03166125e0565b601054600160a01b900460ff1681565b6002601054600160a01b900460ff16600281111561078757fe5b146107d05760408051600160e51b62461bcd02815260206004820152600e6024820152600160901b6d696e76616c69642073746174757302604482015290519081900360640190fd5b600b54600019016107df6137d9565b506000818152600a6020908152604091829020825161010081018452815481526001820154928101929092526002810154928201929092526003820154606082015260048201546001600160801b0380821660808401819052600160801b9092041660a083015260059092015466ffffffffffffff811660c0830152600160381b900460ff16151560e0820152906108fc5760108054600160a01b60ff02191690556201518061088d61269e565b01600f5560c0808201516040805185815266ffffffffffffff90921660208301526000828201819052606083018190526080830181905260a0830152517f820e0f59df709ae6792dfd193d1985b127da2b323dcb5573354fb38b995561ed929181900390910190a15050610c2c565b600083116109545760408051600160e51b62461bcd02815260206004820152600d60248201527f696e76616c696420636f756e7400000000000000000000000000000000000000604482015290519081900360640190fd5b60a081015160808201516001600160801b0391821685019116811115610984575060808101516001600160801b03165b61098c61383b565b61099983606001516126a2565b90506109a361385a565b6109b98460c0015166ffffffffffffff1661274f565b60a08501519091506000906001016001600160801b03165b848111610adf576000878152600a60209081526040808320848452600701909152902054600160a81b900466ffffffffffffff1680610a9757610a1261383b565b6000898152600a6020908152604080832086845260080190915290208054600190910154610a419190876127b3565b905060005b600a811015610a905760008282600a8110610a5d57fe5b602002015190508015610a8757808883600a8110610a7757fe5b6020020180519091019052600195505b50600101610a46565b5050610ad6565b6000610aac8266ffffffffffffff1686612942565b90508015610ad4578560018203600a8110610ac357fe5b602002018051600190810190915293505b505b506001016109d1565b506001600160801b03841660a08601528015610b1157610afe83612afd565b6000878152600a60205260409020600301555b84608001516001600160801b03168560a001516001600160801b03161415610bf657610b3e868685612b81565b60108054600160a01b60ff021916905562015180610b5a61269e565b0163ffffffff16600f5560c0858101516020808801516040808a015160008c8152600a8552829020600301546080808d015184518f815266ffffffffffffff90981696880196909652868401949094526060860191909152918401919091526001600160801b0390911660a0830152517f820e0f59df709ae6792dfd193d1985b127da2b323dcb5573354fb38b995561ed929181900390910190a15b5050505060a001516000918252600a602052604090912060040180546001600160801b03928316600160801b0292169190911790555b50565b600e5481565b81662386f26fc10000810234811115610c865760408051600160e51b62461bcd0281526020600482015260126024820152600080516020613935833981519152604482015290519081900360640190fd5b60006001600160a01b0384163314610c9e5783610ca1565b60005b600b546000818152600a602052604081206004015492935090916001600160801b0316905b85811015610dee576000898983818110610cdc57fe5b905060200201359050610cee81612cee565b6040805160608082018352600080835233602080850182815266ffffffffffffff8881168789018181528d8752600a855289872060019d909d016001600160801b0381168089526007909e0186528a882099518a549551925160ff1990961690151517610100600160a81b0319166101006001600160a01b039384160217600160a81b600160e01b031916600160a81b95909416949094029290921790975587518c81529283019a909a52988b1681870152928301939093526080820181905260a0820152915190917fe441d5edf43005f305b0b45ca26f066fc1e04afa5b452d8e6a9b1f0ab40301029160c0918190039190910190a250600101610cc6565b506000828152600a6020526040902060040180546001600160801b0319166001600160801b0383161790556010546001600160a01b03166373e888fd612710610bb8870204856040518363ffffffff1660e01b815260040180826001600160a01b03166001600160a01b031681526020019150506000604051808303818588803b158015610e7b57600080fd5b505af1158015610e8f573d6000803e3d6000fd5b505050505060008434031115610ed05760405133903486900380156108fc02916000818181858888f19350505050158015610ece573d6000803e3d6000fd5b505b5050505050505050565b60016020526000908152604090205460ff1681565b610ef7611ab6565b610f395760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613955833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b6010546001600160a01b031681565b600080600080600080600080600b54905060006002811115610f9157fe5b601054600160a01b900460ff166002811115610fa957fe5b14610fb357600019015b600b54601054600f54600e546000948552600a602052604090942060040154929b600160a01b90920460ff169a50985061025890920196504295506001600160801b038082169550600160801b9091041692509050565b600f5481565b601054600160a81b900460ff1681565b60028106158015611032575060028110155b6110865760408051600160e51b62461bcd02815260206004820152600e60248201527f696e76616c6964206c656e677468000000000000000000000000000000000000604482015290519081900360640190fd5b60008282600081811061109557fe5b602090810292909201356000818152600a90935260409092206004015491925050600160801b81046001600160801b039081169116146111135760408051600160e51b62461bcd02815260206004820152600e6024820152600160901b6d696e76616c69642073746174757302604482015290519081900360640190fd5b6000818152600a602052604081208190600701818686600181811061113457fe5b90506020020135815260200190815260200160002060000160019054906101000a90046001600160a01b0316905061116a61385a565b6000848152600a602052604090206005015461118e9066ffffffffffffff1661274f565b905060005b85811015611509578686828181106111a757fe5b905060200201358514611265578686828181106111c057fe5b602090810292909201356000818152600a90935260409092206004015491965050600160801b81046001600160801b0390811691161461123e5760408051600160e51b62461bcd02815260206004820152600e6024820152600160901b6d696e76616c69642073746174757302604482015290519081900360640190fd5b6000858152600a60205260409020600501546112629066ffffffffffffff1661274f565b91505b600087878360010181811061127657fe5b905060200201359050611287613897565b506000868152600a602090815260408083208484526007018252918290208251606081018452905460ff8116151580835261010082046001600160a01b031693830193909352600160a81b900466ffffffffffffff1692810192909252806112fa575060208101516001600160a01b0316155b8061131b575080602001516001600160a01b0316856001600160a01b031614155b15611327575050611501565b6000816040015166ffffffffffffff16600014156114165761134761383b565b6000898152600a60209081526040808320878452600801909152902080546001909101546113769190886127b3565b905060015b600a811161140f5760008260018303600a811061139457fe5b6020020151905080156114065781600114156113c65760008b8152600a60205260409020600101549390930192611406565b81600214156113ed5760008b8152600a602052604090206002015481029390930192611406565b80600260038403600881106113fe57fe5b015402840193505b5060010161137b565b5050611492565b600061142f836040015166ffffffffffffff1687612942565b90508060011415611453576000898152600a60205260409020600101549150611490565b8060021415611475576000898152600a60205260409020600201549150611490565b8015611490576002600382036008811061148b57fe5b015491505b505b80156114fd576000888152600a60209081526040808320868452600701825291829020805460ff1916600117905581518a81529081018590528151988301987f179780be10c742bdbc92cd0af59e83edeb067cd1954ef4d647827d8504c7c2ca929181900390910190a15b5050505b600201611193565b50600083116115505760408051600160e51b62461bcd0281526020600482015260086024820152600160c01b676e6f207072697a6502604482015290519081900360640190fd5b82600d5410156115985760408051600160e51b62461bcd0281526020600482015260126024820152600080516020613935833981519152604482015290519081900360640190fd5b600d805484900390556040516001600160a01b0383169084156108fc029085906000818181858888f193505050501580156115d7573d6000803e3d6000fd5b50505050505050565b600d5481565b6115ee611ab6565b6116305760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613955833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60f883901c60ff60f085901c1660068210801590611699575060268211155b6116ed5760408051600160e51b62461bcd02815260206004820152601260248201527f696e76616c6964207a6f6e6531436f756e740000000000000000000000000000604482015290519081900360640190fd5b600181101580156116ff575060088111155b6117535760408051600160e51b62461bcd02815260206004820152601260248201527f696e76616c6964207a6f6e6532436f756e740000000000000000000000000000604482015290519081900360640190fd5b600081611761846006612f5d565b029050662386f26fc100008102348111156117b45760408051600160e51b62461bcd0281526020600482015260126024820152600080516020613935833981519152604482015290519081900360640190fd5b6117c087878686612ff5565b60006001600160a01b03861633146117d857856117db565b60005b600b546000818152600a60209081526040808320600481015482516060810184528581523381860190815281850187815260016001600160801b03948516019384168852600785018752858820925183549251915160ff1990931690151517610100600160a81b0319166101006001600160a01b039092169190910217600160a81b600160e01b031916600160a81b66ffffffffffffff9092169190910217905560089091019092529091208b90559192509088156118c0576000828152600a602090815260408083206001600160801b038516845260080190915290206001018990555b604080518381526001600160801b03831660208201526001600160a01b0385168183015260006060820152608081018c905260a081018b9052905133917fe441d5edf43005f305b0b45ca26f066fc1e04afa5b452d8e6a9b1f0ab4030102919081900360c00190a26000828152600a6020526040902060040180546001600160801b0319166001600160801b0383161790556010546001600160a01b03166373e888fd612710610bb8870204856040518363ffffffff1660e01b815260040180826001600160a01b03166001600160a01b031681526020019150506000604051808303818588803b1580156119b457600080fd5b505af11580156119c8573d6000803e3d6000fd5b505050505060008434031115611a095760405133903486900380156108fc02916000818181858888f19350505050158015611a07573d6000803e3d6000fd5b505b50505050505050505050565b6000828152600a602090815260408083206001600160a01b03851684526006019091529020545b92915050565b600a6020526000908152604090208054600182015460028301546003840154600485015460059095015493949293919290916001600160801b0380831692600160801b9004169066ffffffffffffff811690600160381b900460ff1688565b600b5481565b6000546001600160a01b031690565b600080546001600160a01b0316611acb61319b565b6001600160a01b031614905090565b600d5430310390565b6001601054600160a01b900460ff166002811115611afd57fe5b14611b465760408051600160e51b62461bcd02815260206004820152600e6024820152600160901b6d696e76616c69642073746174757302604482015290519081900360640190fd5b601054600090600160a81b900460ff16611b6757600e54620d315801611b6f565b610258600e54015b905080611b7a61269e565b1015611bc25760408051600160e51b62461bcd02815260206004820152600c6024820152600160a01b6b696e76616c69642074696d6502604482015290519081900360640190fd5b600b54600019016000908152600a6020526040902054611be5601319430161319f565b600b54600019016000908152600a60205260409020910190819055611c09816131a3565b601054600160a81b900460ff16611c915760108054600160a81b60ff021916600160a81b179081905560408051600160e11b63419ab82902815290516001600160a01b039092169163833570529160048082019260009290919082900301818387803b158015611c7857600080fd5b505af1158015611c8c573d6000803e3d6000fd5b505050505b5050565b6000806000806000611ca5613897565b506000878152600a602090815260408083208984526007018252918290208251606081018452905460ff81161515825261010081046001600160a01b031692820192909252600160a81b90910466ffffffffffffff1691810191909152611d0a6138b7565b506000978852600a60209081526040808a20988a526008909801815297879020875180890189528154808252600190920154908a0181905282519983015192909801519899919866ffffffffffffff1697909650945092505050565b6001601054600160a01b900460ff166002811115611d8057fe5b14611dc95760408051600160e51b62461bcd02815260206004820152600e6024820152600160901b6d696e76616c69642073746174757302604482015290519081900360640190fd5b600b5460001901611dd93361327e565b8015611def5750601054600160a81b900460ff16155b15611f4c57610258600e5401611e0361269e565b1015611e4b5760408051600160e51b62461bcd02815260206004820152600c6024820152600160a01b6b696e76616c69642074696d6502604482015290519081900360640190fd5b6000818152600a60209081526040808320838052600601909152902054611e71836132a8565b14611eba5760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d1a5b9d985b1a59081cd958dc995d02604482015290519081900360640190fd5b6000818152600a60208181526040808420848052600681018352908420849055928490525254611eed601319430161319f565b018201611ef9816131a3565b6000828152600a6020908152604080832084905580518581529182019290925281517f18e3a2a1539c4d2325524f2c652bd26fea78b54a5861212876952caf2e00582b929181900390910190a150612075565b600e54611f5761269e565b10611f9e5760408051600160e51b62461bcd02815260206004820152600c6024820152600160a01b6b696e76616c69642074696d6502604482015290519081900360640190fd5b6000818152600a60209081526040808320338452600601909152902054611fc4836132a8565b1461200d5760408051600160e51b62461bcd02815260206004820152600e6024820152600160921b6d1a5b9d985b1a59081cd958dc995d02604482015290519081900360640190fd5b6000818152600a6020818152604080842033808652600682018452828620869055948690529282528254860190925581518481529081019290925280517f18e3a2a1539c4d2325524f2c652bd26fea78b54a5861212876952caf2e00582b9281900390910190a15b6000818152600a6020526040902060050154600160381b900460ff16611c91576000818152600a6020526040808220600501805467ff000000000000001916600160381b179055513391906706f05b59d3b200009082818181858883f193505050501580156120e8573d6000803e3d6000fd5b506040805182815233602082015281517fc7ad212fc37b0fda8af53154f4fc8674770b9d813b1863178c39c4ed2128edc1929181900390910190a15050565b601054600160a81b900460ff1661214557620d2f00600f5401612149565b600f545b61215161269e565b10156121995760408051600160e51b62461bcd02815260206004820152600c6024820152600160a01b6b696e76616c69642074696d6502604482015290519081900360640190fd5b6121a16132cc565b601054600160a81b900460ff166122295760108054600160a81b60ff021916600160a81b179081905560408051600160e11b63419ab82902815290516001600160a01b039092169163833570529160048082019260009290919082900301818387803b15801561221057600080fd5b505af1158015612224573d6000803e3d6000fd5b505050505b565b6122343361327e565b6122775760408051600160e51b62461bcd0281526020600482015260096024820152600160b91b683737ba1030b236b4b702604482015290519081900360640190fd5b601054600160a81b900460ff16156122d95760408051600160e51b62461bcd02815260206004820152600f60248201527f6d6574686f642064697361626c65640000000000000000000000000000000000604482015290519081900360640190fd5b6001601054600160a01b900460ff1660028111156122f357fe5b1461233c5760408051600160e51b62461bcd02815260206004820152600e6024820152600160901b6d696e76616c69642073746174757302604482015290519081900360640190fd5b6802b5e3af16b18800003481111561238c5760408051600160e51b62461bcd0281526020600482015260126024820152600080516020613935833981519152604482015290519081900360640190fd5b60108054600160a01b60ff0219169055600b8054600019019055620151806123b261269e565b0163ffffffff16600f55600b546000818152600a6020526040902060050154600160381b900460ff1615612401576000818152600a60205260409020600501805467ff00000000000000191690555b81341115611c915760405133903484900380156108fc02916000818181858888f19350505050158015612438573d6000803e3d6000fd5b505050565b600c5481565b61244c3361327e565b80156124625750601054600160a81b900460ff16155b1561252857600f5461247261269e565b10156124ba5760408051600160e51b62461bcd02815260206004820152600c6024820152600160a01b6b696e76616c69642074696d6502604482015290519081900360640190fd5b6124c26132cc565b600b80546000199081016000908152600a602090815260408083208380526006018252808320869055935484519301835282015281517f775cbcccd7fe28145ecb9139488663063065c5a215ba96419500f1bb1217661e929181900390910190a1610c2c565b600b80546000908152600a60209081526040808320338085526006909101835292819020859055925483519081529081019190915281517f775cbcccd7fe28145ecb9139488663063065c5a215ba96419500f1bb1217661e929181900390910190a150565b612595611ab6565b6125d75760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613955833981519152604482015290519081900360640190fd5b610c2c816133c7565b6125e8611ab6565b61262a5760408051600160e51b62461bcd0281526020600482018190526024820152600080516020613955833981519152604482015290519081900360640190fd5b6010546001600160a01b03161561267c5760408051600160e51b62461bcd02815260206004820152600b6024820152600160aa1b6a185b1c9958591e481cd95d02604482015290519081900360640190fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b4290565b6126aa61383b565b60405180610140016040528060f084901c61ffff16815260200160e084901c61ffff16815260200160d084901c61ffff16815260200160c084901c61ffff16815260200160a084901c63ffffffff168152602001608084901c63ffffffff168152602001606084901c63ffffffff168152602001604084901c63ffffffff168152602001602084901c63ffffffff1681526020018363ffffffff168152509050919050565b61275761385a565b61275f61385a565b60ff80841660c0830152600884901c811660a0830152601084901c81166080830152601884901c81166060830152602084811c82166040840152602885901c821690830152603084901c1681529050919050565b6127bb61383b565b6127c361383b565b60c083015160f886901c9060ff60f088901c16906002820160031b600060105b828110156128115760ff60f88290038c901c1684811415612808576001925050612811565b506008016127e3565b50600061282186868d8d8d61346a565b9050801561293357818503600183141561284b576128428288036005612f5d565b82026101208901525b600182111561293157826001141561287c5761286a8288036004612f5d565b612875836002612f5d565b0260e08901525b60028211156129315760006128948389036003612f5d565b61289f846003612f5d565b0284810260c08b01528281026101008b01529050600383111561292f576128c98389036002612f5d565b6128d4846004612f5d565b0284810260808b015282810260a08b01529050600483111561292f576128fd8389036001612f5d565b612908846005612f5d565b0284810260408b015282810260608b01529050600583111561292f57838952602089018290525b505b505b50949998505050505050505050565b8051602082015160408301516060840151608085015160a08601516000958695909490939092909160085b603081116129d75760ff8b821c16848110156129ab578781148061299057508681145b8061299a57508581145b156129a6578860010198505b6129ce565b848114806129b857508381145b806129c257508281145b156129ce578860010198505b5060080161296d565b50866129ed576000975050505050505050611a3c565b8860c001518a60ff161415612a89578660011415612a1557600a975050505050505050611a3c565b8660021415612a2e576008975050505050505050611a3c565b8660031415612a47576007975050505050505050611a3c565b8660041415612a60576005975050505050505050611a3c565b8660051415612a79576003975050505050505050611a3c565b6001975050505050505050611a3c565b6003871015612aa2576000975050505050505050611a3c565b8660031415612abb576009975050505050505050611a3c565b8660041415612ad4576006975050505050505050611a3c565b8660051415612aed576004975050505050505050611a3c565b6002975050505050505050611a3c565b61012081015160009060208360086020020151901b60408460076020020151901b60608560066020020151901b60808660056020020151901b60a08760046020020151901b60c08860036020020151901b60d08960026020020151901b60e08a60016020020151901b60f08b60006020020151901b17171717171717171792915050565b6000805b6008811015612bbf5760028160088110612b9b57fe5b01548382600201600a8110612bac57fe5b6020020151029190910190600101612b85565b5080612bc9611ada565b1015612c0d5760408051600160e51b62461bcd0281526020600482015260126024820152600080516020613935833981519152604482015290519081900360640190fd5b600c5481811015612c1f576000612c23565b8181035b835160208501519192506127106114dc84028190049261029485029190910491908115612c5957818481612c5357fe5b04612c5c565b60005b60208901528015612c7657808381612c7057fe5b04612c79565b60005b60408901819052602089015183029082028701018015612c9c57600d8054820190555b602089015115612cc0576020808a015160008c8152600a9092526040909120600101555b604089015115611a09576040808a015160008c8152600a602052919091206002015550505050505050505050565b60ff603082901c811690602883901c811690602084901c811690601885901c811690601086901c811690600887901c811690871660018110801590612d34575060088111155b612d765760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b6026821115612dbd5760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b828211612e025760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b838311612e475760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b848411612e8c5760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b858511612ed15760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b868611612f165760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b6001871015610ed05760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b600081831015612f6f57506000611a3c565b81831415612f7f57506001611a3c565b60008284038310612f9257828403612f94565b825b90508060011415612fa85783915050611a3c565b80840360018101906002015b858111612fc75790810290600101612fb4565b50600160025b838111612fe05790810290600101612fcd565b50808281612fea57fe5b049350505050611a3c565b60ff60e885901c1660018110156130445760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b6002820160031b61305886836018846135c6565b915060088211156130a15760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b8060f80386901c60ff16915060018210156130f45760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b600383601e03851161310b5783850160020161310e565b60205b901b90506131258683600386600301901b846135c6565b915082601e0384111561315457600383601e860301901b90506131518583600386600301901b846135c6565b91505b6026821115611c8c5760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b3390565b4090565b60108054600160a01b60ff021916600160a11b1790556131c16138d1565b6131ca82613637565b905060006131dc8360060160086137be565b60010190508060088360056020020151901b60108460046020020151901b60188560036020020151901b60208660026006811061321557fe5b6020020151901b60288760016020020151901b60308860006020020151901b171717171717600a60006001600b5403815260200190815260200160002060050160006101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550505050565b6001600160a01b03811660009081526001602052604081205460ff1680611a3c5750611a3c611ab6565b60408051602080820193909352815180820384018152908201909152805191012090565b6000601054600160a01b900460ff1660028111156132e657fe5b1461332f5760408051600160e51b62461bcd02815260206004820152600e6024820152600160901b6d696e76616c69642073746174757302604482015290519081900360640190fd5b6000613339611ada565b90506706f05b59d3b200008110156133895760408051600160e51b62461bcd0281526020600482015260126024820152600080516020613935833981519152604482015290519081900360640190fd5b600b8054600101905560108054600160a01b60ff021916600160a01b179055610bb86133b361269e565b01600e556706f05b59d3b1ffff1901600c55565b6001600160a01b03811661340f57604051600160e51b62461bcd02815260040180806020018281038252602681526020018061390f6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b8051602082015160408301516060840151608085015160a086015160009586959094909390929091866003601e8e90038f116134ab578d8f016002016134ae565b60205b901b905060028d0160031b5b818110156135295760ff60f88290038e901c16858110156134fd57888114806134e257508781145b806134ec57508681145b156134f8578960010199505b613520565b8581148061350a57508481145b8061351457508381145b15613520578960010199505b506008016134ba565b508c601e038e11156135b4575060088d8d01601d19010260005b818110156135b25760ff60f88290038d901c1685811015613586578881148061356b57508781145b8061357557508681145b15613581578960010199505b6135a9565b8581148061359357508481145b8061359d57508381145b156135a9578960010199505b50600801613543565b505b50959c9b505050505050505050505050565b600083835b8381101561362d5760ff60f882900388901c168281116136235760408051600160e51b62461bcd02815260206004820152600e6024820152600080516020613975833981519152604482015290519081900360640190fd5b91506008016135cb565b5095945050505050565b61363f6138d1565b6136476138d1565b61364f6138ef565b60005b60068110156136e95760008161366d838801846026036137be565b019050600083836026811061367e57fe5b60200201519050600084836026811061369357fe5b6020020151905081156136a657816136ab565b836001015b8584602681106136b757fe5b602002015280156136c857806136cd565b826001015b8585602681106136d957fe5b6020020152505050600101613652565b5060005b60068110156137205781816026811061370257fe5b602002015183826006811061371357fe5b60200201526001016136ed565b5060015b60068110156137b557600083826006811061373b57fe5b60200201519050815b60008111801561376657508185600183036006811061375f57fe5b6020020151115b156137995784600182036006811061377a57fe5b602002015185826006811061378b57fe5b602002015260001901613744565b818582600681106137a657fe5b60200201525050600101613724565b50909392505050565b6000816137ca846132a8565b816137d157fe5b069392505050565b6040518061010001604052806000815260200160008152602001600081526020016000815260200160006001600160801b0316815260200160006001600160801b03168152602001600066ffffffffffffff1681526020016000151581525090565b604051806101400160405280600a906020820280388339509192915050565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b604051806040016040528060008152602001600081525090565b6040518060c001604052806006906020820280388339509192915050565b604051806104c00160405280602690602082028038833950919291505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373696e73756666696369656e74206d6f6e657900000000000000000000000000004f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572696e76616c6964206e756d626572000000000000000000000000000000000000a165627a7a72305820f9f84a50d3b76177bbdea03ffc10de5204f20f180bafc65c117b40b6a8efbeec0029

Deployed Bytecode Sourcemap

175:27117:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2155:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2155:36:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10425:2248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10425:2248:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10425:2248:1;;:::i;2051:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2051:29:1;;;:::i;:::-;;;;;;;;;;;;;;;;3716:1017;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3716:1017:1;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;3716:1017:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3716:1017:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;3716:1017:1;;-1:-1:-1;3716:1017:1;-1:-1:-1;3716:1017:1;-1:-1:-1;;;;;3716:1017:1;;:::i;86:39:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;86:39:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;86:39:0;-1:-1:-1;;;;;86:39:0;;:::i;:::-;;;;;;;;;;;;;;;;;;228:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;228:100:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;228:100:0;;;;;;;;;;:::i;2118:31:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2118:31:1;;;:::i;:::-;;;;-1:-1:-1;;;;;2118:31:1;;;;;;;;;;;;;;17306:481;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17306:481:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17306:481:1;;;;;;;;;;;;;;;-1:-1:-1;;;;;17306:481:1;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17306:481:1;-1:-1:-1;17306:481:1;2086:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2086:26:1;;;:::i;2197:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2197:25:1;;;:::i;13924:2714::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13924:2714:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13924:2714:1;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;13924:2714:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13924:2714:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;13924:2714:1;;-1:-1:-1;13924:2714:1;-1:-1:-1;13924:2714:1;:::i;2018:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2018:27:1;;;:::i;2746:137:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2746:137:2;;;:::i;4739:1397:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4739:1397:1;;;;;;;;;;;-1:-1:-1;;;;;4739:1397:1;;:::i;16644:145::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16644:145:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16644:145:1;;;;;;-1:-1:-1;;;;;16644:145:1;;:::i;1901:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1901:40:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1901:40:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1901:40:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1947:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1947:26:1;;;:::i;1961:77:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1961:77:2;;;:::i;2312:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2312:92:2;;;:::i;17181:119:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17181:119:1;;;:::i;9434:583::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9434:583:1;;;:::i;16795:380::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16795:380:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16795:380:1;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;16795:380:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8151:1277;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8151:1277:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8151:1277:1;;:::i;7476:292::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7476:292:1;;;:::i;3093:617::-;;;:::i;1979:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1979:33:1;;;:::i;7013:457::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7013:457:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7013:457:1;;:::i;3032:107:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3032:107:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3032:107:2;-1:-1:-1;;;;;3032:107:2;;:::i;2930:157:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2930:157:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2930:157:1;-1:-1:-1;;;;;2930:157:1;;:::i;2155:36::-;;;-1:-1:-1;;;2155:36:1;;;;;:::o;10425:2248::-;10500:15;10490:6;;-1:-1:-1;;;10490:6:1;;;;:25;;;;;;;;;10481:53;;;;;-1:-1:-1;;;;;10481:53:1;;;;;;;;;;;;-1:-1:-1;;;;;10481:53:1;;;;;;;;;;;;;;;10565:7;;-1:-1:-1;;10565:11:1;10586:18;;:::i;:::-;-1:-1:-1;10607:18:1;;;;:6;:18;;;;;;;;;10586:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10586:39:1;;;;;;;;;-1:-1:-1;;;10586:39:1;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10586:39:1;;;;;;;;;;;10635:213;;10677:6;:22;;-1:-1:-1;;;;;;10677:22:1;;;1070:8;10727:9;:7;:9::i;:::-;:27;10713:11;:41;10792:12;;;;;10773:44;;;;;;;;;;;;;;10806:1;10773:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10831:7;;;;10635:213;10874:1;10866:5;:9;10857:36;;;;;-1:-1:-1;;;;;10857:36:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;10917:18;;;;10963:17;;;;-1:-1:-1;;;;;10917:26:1;;;;;;10957:23;;;10953:77;;;-1:-1:-1;11002:17:1;;;;-1:-1:-1;;;;;10996:23:1;10953:77;11039:25;;:::i;:::-;11067;11079:5;:12;;;11067:11;:25::i;:::-;11039:53;;11102:20;;:::i;:::-;11125:34;11146:5;:12;;;11125:34;;:20;:34::i;:::-;11222:18;;;;11102:57;;-1:-1:-1;11169:18:1;;11243:1;11222:22;-1:-1:-1;;;;;11210:34:1;11205:875;11251:3;11246:1;:8;11205:875;;11275:13;11291:18;;;:6;:18;;;;;;;;:29;;;:26;;:29;;;;;:36;-1:-1:-1;;;11291:36:1;;;;;11341:729;;11376:25;;:::i;:::-;11445:18;;;;:6;:18;;;;;;;;:34;;;:31;;:34;;;;;:42;;11489;;;;;11404:153;;11445:42;11533:6;11404:19;:153::i;:::-;11376:181;-1:-1:-1;11580:9:1;11575:263;11599:2;11595:1;:6;11575:263;;;11630:18;11651:6;11658:1;11651:9;;;;;;;;;;;;-1:-1:-1;11686:14:1;;11682:138;;11741:10;11728:6;11735:1;11728:9;;;;;;;;;;:23;;;;;;;11793:4;;-1:-1:-1;11682:138:1;-1:-1:-1;11603:3:1;;11575:263;;;;11341:729;;;;11876:13;11892:29;11906:6;11892:29;;11914:6;11892:13;:29::i;:::-;11876:45;-1:-1:-1;11943:9:1;;11939:117;;11978:6;11993:1;11985:5;:9;11978:17;;;;;;;;;;11976:19;;;;;;;;;;-1:-1:-1;11939:117:1;11341:729;;-1:-1:-1;11256:3:1;;11205:875;;;-1:-1:-1;;;;;;12089:33:1;;:18;;;:33;12132:91;;;;12193:19;12205:6;12193:11;:19::i;:::-;12165:18;;;;:6;:18;;;;;:25;;:47;12132:91;12278:5;:17;;;-1:-1:-1;;;;;12256:39:1;:5;:18;;;-1:-1:-1;;;;;12256:39:1;;12252:353;;;12311:39;12324:10;12336:5;12343:6;12311:12;:39::i;:::-;12364:6;:22;;-1:-1:-1;;;;;;12364:22:1;;;1070:8;12421:9;:7;:9::i;:::-;:27;12400:49;;:11;:49;12487:12;;;;;12501:22;;;;;12525;;;;;12549:18;;;;:6;:18;;;;;:25;;;12576:17;;;;;12468:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12468:126:1;;;;;;;;;;;;;;;;;;;12252:353;-1:-1:-1;;;;12648:18:1;;;12614;;;;:6;:18;;;;;;:31;;:52;;-1:-1:-1;;;;;12614:52:1;;;-1:-1:-1;;;12614:52:1;;;;;;;;;10425:2248;;:::o;2051:29::-;;;;:::o;3716:1017::-;3826:7;1311:10;3870:24;;3912:9;:22;-1:-1:-1;3912:22:1;3904:53;;;;;-1:-1:-1;;;;;3904:53:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3904:53:1;;;;;;;;;;;;;;;3968:11;-1:-1:-1;;;;;3982:22:1;;3994:10;3982:22;:46;;4020:8;3982:46;;;4015:1;3982:46;4059:7;;4038:18;4098;;;:6;:18;;;;;:30;;;3968:60;;-1:-1:-1;4059:7:1;;-1:-1:-1;;;;;4098:30:1;;4138:335;4162:6;4158:1;:10;4138:335;;;4189:14;4206:7;;4214:1;4206:10;;;;;;;;;;;;;4189:27;;4230:22;4245:6;4230:14;:22::i;:::-;4335:41;;;;;;;;;-1:-1:-1;4335:41:1;;;4349:10;4335:41;;;;;;;;;;;;;;;;;4293:18;;;:6;:18;;;;;4266:13;;;;;-1:-1:-1;;;;;4293:39:1;;;;;:26;;;;:39;;;;;:83;;;;;;;;-1:-1:-1;;4293:83:1;;;;;;;-1:-1:-1;;;;;;4293:83:1;;-1:-1:-1;;;;;4293:83:1;;;;;-1:-1:-1;;;;;;;;4293:83:1;-1:-1:-1;;;4293:83:1;;;;;;;;;;;;;;;4395:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4349:10;;4395:67;;;;;;;;;;;;;-1:-1:-1;4170:3:1;;4138:335;;;-1:-1:-1;4482:18:1;;;;:6;:18;;;;;:30;;:44;;-1:-1:-1;;;;;;4482:44:1;-1:-1:-1;;;;;4482:44:1;;;;;4547:8;;-1:-1:-1;;;;;4547:8:1;4537:30;1475:5;1430:4;4574:30;;:39;4615:3;4537:82;;;;;;;;;;;;;-1:-1:-1;;;;;4537:82:1;-1:-1:-1;;;;;4537:82:1;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4537:82:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4537:82:1;;;;;4657:1;4645:9;4633;:21;:25;4629:98;;;4674:42;;:10;;4694:9;:21;;;4674:42;;;;;;;;;4694:21;4674:10;:42;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4674:42:1;4629:98;3716:1017;;;;;;;;:::o;86:39:0:-;;;;;;;;;;;;;;;:::o;228:100::-;2165:9:2;:7;:9::i;:::-;2157:54;;;;;-1:-1:-1;;;;;2157:54:2;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2157:54:2;;;;;;;;;;;;;;;-1:-1:-1;;;;;301:12:0;;;;;;;;:6;:12;;;;;:20;;-1:-1:-1;;301:20:0;;;;;;;;;;228:100::o;2118:31:1:-;;;-1:-1:-1;;;;;2118:31:1;;:::o;17306:481::-;17356:7;17365:6;17373:7;17382;17391;17400;17409;17428:18;17449:7;;17428:28;;17480:13;17470:23;;;;;;;;:6;;-1:-1:-1;;;17470:6:1;;;;:23;;;;;;;;;17466:66;;-1:-1:-1;;17509:12:1;17466:66;17562:7;;17583:6;;17603:11;;17628:14;;17695:18;;;;:6;:18;;;;;;:30;;;17562:7;;-1:-1:-1;;;17583:6:1;;;;;;-1:-1:-1;17603:11:1;-1:-1:-1;1195:10:1;17628:36;;;;-1:-1:-1;17678:3:1;;-1:-1:-1;;;;;;17695:30:1;;;;-1:-1:-1;;;;17739:31:1;;;;;-1:-1:-1;17306:481:1;-1:-1:-1;17306:481:1:o;2086:26::-;;;;:::o;2197:25::-;;;-1:-1:-1;;;2197:25:1;;;;;:::o;13924:2714::-;14016:1;14000:6;:17;:22;:44;;;;-1:-1:-1;14043:1:1;14026:18;;;14000:44;13992:71;;;;;-1:-1:-1;;;;;13992:71:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;14073:18;14094:6;;14101:1;14094:9;;;;;;;;;;;;;;;;14156:18;;;;:6;:18;;;;;;;:30;;;14094:9;;-1:-1:-1;;;;;14121:31:1;;-1:-1:-1;;;;;14121:31:1;;;14156:30;;14121:65;14113:92;;;;;-1:-1:-1;;;;;14113:92:1;;;;;;;;;;;;-1:-1:-1;;;;;14113:92:1;;;;;;;;;;;;;;;14215:18;14266;;;:6;:18;;;;;14215;;14266:26;;14215:18;14293:6;;14300:1;14293:9;;;;;;;;;;;;;14266:37;;;;;;;;;;;:43;;;;;;;;;;-1:-1:-1;;;;;14266:43:1;14243:66;;14319:20;;:::i;:::-;14363:18;;;;:6;:18;;;;;:25;;;14342:47;;14363:25;;14342:20;:47::i;:::-;14319:70;-1:-1:-1;14404:9:1;14399:2050;14419:17;;;14399:2050;;;14478:6;;14485:1;14478:9;;;;;;;;;;;;;14464:10;:23;14460:268;;14520:6;;14527:1;14520:9;;;;;;;;;;;;;;;;14590:18;;;;:6;:18;;;;;;;:30;;;14520:9;;-1:-1:-1;;;;;14555:31:1;;-1:-1:-1;;;;;14555:31:1;;;14590:30;;14555:65;14547:92;;;;;-1:-1:-1;;;;;14547:92:1;;;;;;;;;;;;-1:-1:-1;;;;;14547:92:1;;;;;;;;;;;;;;;14687:18;;;;:6;:18;;;;;:25;;;14666:47;;14687:25;;14666:20;:47::i;:::-;14657:56;;14460:268;14741:16;14760:6;;14767:1;14771;14767:5;14760:13;;;;;;;;;;;;;14741:32;;14787:20;;:::i;:::-;-1:-1:-1;14810:18:1;;;;:6;:18;;;;;;;;:36;;;:26;;:36;;;;;;14787:59;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14787:59:1;;;;;;;;-1:-1:-1;;;14787:59:1;;;;;;;;;;;;14864:44;;-1:-1:-1;14882:12:1;;;;-1:-1:-1;;;;;14882:26:1;;14864:44;:68;;;;14920:6;:12;;;-1:-1:-1;;;;;14912:20:1;:4;-1:-1:-1;;;;;14912:20:1;;;14864:68;14860:115;;;14952:8;;;;14860:115;14988:13;15019:6;:13;;;:18;;15036:1;15019:18;15015:1219;;;15057:25;;:::i;:::-;15126:18;;;;:6;:18;;;;;;;;:41;;;:31;;:41;;;;;:49;;15177;;;;;15085:167;;15126:49;15228:6;15085:19;:167::i;:::-;15057:195;-1:-1:-1;15291:1:1;15270:549;15303:2;15294:5;:11;15270:549;;15338:13;15354:6;15369:1;15361:5;:9;15354:17;;;;;;;;;;;;-1:-1:-1;15397:9:1;;15393:408;;15438:5;15447:1;15438:10;15434:345;;;15489:18;;;;:6;:18;;;;;:35;;;15480:44;;;;;15434:345;;;15561:5;15570:1;15561:10;15557:222;;;15612:18;;;;:6;:18;;;;;:35;;;:43;;15603:52;;;;;15557:222;;;15747:5;15727:6;15742:1;15734:5;:9;15727:17;;;;;;;;;:25;15718:34;;;;15557:222;-1:-1:-1;15307:7:1;;15270:549;;;;15015:1219;;;;15857:13;15873:36;15887:6;:13;;;15873:36;;15902:6;15873:13;:36::i;:::-;15857:52;;15931:5;15940:1;15931:10;15927:293;;;15973:18;;;;:6;:18;;;;;:35;;;;-1:-1:-1;15927:293:1;;;16037:5;16046:1;16037:10;16033:187;;;16079:18;;;;:6;:18;;;;;:35;;;;-1:-1:-1;16033:187:1;;;16143:9;;16139:81;;16184:6;16199:1;16191:5;:9;16184:17;;;;;;;;;16176:25;;16139:81;15015:1219;;16251:9;;16247:192;;16317:18;;;;:6;:18;;;;;;;;:36;;;:26;;:36;;;;;;:51;;-1:-1:-1;;16317:51:1;16364:4;16317:51;;;16391:33;;;;;;;;;;;;;16280:19;;;;16391:33;;;;;;;;;;;16247:192;14399:2050;;;;14443:1;14438:6;14399:2050;;;;16479:1;16466:10;:14;16458:35;;;;;-1:-1:-1;;;;;16458:35:1;;;;;;;;;;;;-1:-1:-1;;;;;16458:35:1;;;;;;;;;;;;;;;16527:10;16511:12;;:26;;16503:57;;;;;-1:-1:-1;;;;;16503:57:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16503:57:1;;;;;;;;;;;;;;;16570:12;:26;;;;;;;16606:25;;-1:-1:-1;;;;;16606:13:1;;;:25;;;;;16586:10;;16570:12;16606:25;16570:12;16606:25;16586:10;16606:13;:25;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16606:25:1;13924:2714;;;;;;:::o;2018:27::-;;;;:::o;2746:137:2:-;2165:9;:7;:9::i;:::-;2157:54;;;;;-1:-1:-1;;;;;2157:54:2;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2157:54:2;;;;;;;;;;;;;;;2844:1;2828:6;;2807:40;;-1:-1:-1;;;;;2828:6:2;;;;2807:40;;2844:1;;2807:40;2874:1;2857:19;;-1:-1:-1;;;;;;2857:19:2;;;2746:137::o;4739:1397:1:-;4874:3;4863:14;;;4927:4;4920:3;4909:14;;;4908:23;4963:1;4949:15;;;;;:35;;;4982:2;4968:10;:16;;4949:35;4941:66;;;;;-1:-1:-1;;;;;4941:66:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;5039:1;5025:10;:15;;:34;;;;;5058:1;5044:10;:15;;5025:34;5017:65;;;;;-1:-1:-1;;;;;5017:65:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;5092:13;5138:10;5108:27;5121:10;5133:1;5108:12;:27::i;:::-;:40;;-1:-1:-1;1311:10:1;5178:23;;5219:9;:22;-1:-1:-1;5219:22:1;5211:53;;;;;-1:-1:-1;;;;;5211:53:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5211:53:1;;;;;;;;;;;;;;;5274:61;5294:7;5303;5312:10;5324;5274:19;:61::i;:::-;5346:11;-1:-1:-1;;;;;5360:22:1;;5372:10;5360:22;:46;;5398:8;5360:46;;;5393:1;5360:46;5437:7;;5416:18;5476;;;:6;:18;;;;;;;;:30;;;;5581:28;;;;;;;;;;5595:10;5581:28;;;;;;;;;;;;5476:30;-1:-1:-1;;;;;5476:30:1;;;5516:13;5539:39;;;;;:26;;;:39;;;;;:70;;;;;;;;-1:-1:-1;;5539:70:1;;;;;;;-1:-1:-1;;;;;;5539:70:1;5476:30;-1:-1:-1;;;;;5539:70:1;;;;;;;;-1:-1:-1;;;;;;;;5539:70:1;-1:-1:-1;;;5581:28:1;5539:70;;;;;;;;;;5619:31;;;;:44;;;;;;:62;;;5346:60;;-1:-1:-1;5437:7:1;5695:12;;5691:105;;5723:18;;;;:6;:18;;;;;;;;-1:-1:-1;;;;;5723:44:1;;;;:31;;:44;;;;;:52;;:62;;;5691:105;5810:66;;;;;;-1:-1:-1;;;;;5810:66:1;;;;;;-1:-1:-1;;;;;5810:66:1;;;;;;5856:1;5810:66;;;;;;;;;;;;;;;;;;5814:10;;5810:66;;;;;;;;;;5886:18;;;;:6;:18;;;;;:30;;:44;;-1:-1:-1;;;;;;5886:44:1;-1:-1:-1;;;;;5886:44:1;;;;;5950:8;;-1:-1:-1;;;;;5950:8:1;5940:30;1475:5;1430:4;5977:30;;:39;6018:3;5940:82;;;;;;;;;;;;;-1:-1:-1;;;;;5940:82:1;-1:-1:-1;;;;;5940:82:1;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5940:82:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5940:82:1;;;;;6060:1;6048:9;6036;:21;:25;6032:98;;;6077:42;;:10;;6097:9;:21;;;6077:42;;;;;;;;;6097:21;6077:10;:42;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6077:42:1;6032:98;4739:1397;;;;;;;;;;:::o;16644:145::-;16722:7;16748:16;;;:6;:16;;;;;;;;-1:-1:-1;;;;;16748:34:1;;;;:28;;:34;;;;;;16644:145;;;;;:::o;1901:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1901:40:1;;;;-1:-1:-1;;;1901:40:1;;;;;;;;-1:-1:-1;;;1901:40:1;;;;;:::o;1947:26::-;;;;:::o;1961:77:2:-;1999:7;2025:6;-1:-1:-1;;;;;2025:6:2;1961:77;:::o;2312:92::-;2352:4;2391:6;;-1:-1:-1;;;;;2391:6:2;2375:12;:10;:12::i;:::-;-1:-1:-1;;;;;2375:22:2;;2368:29;;2312:92;:::o;17181:119:1:-;17281:12;;17265:4;17257:21;:36;17181:119;:::o;9434:583::-;9492:16;9482:6;;-1:-1:-1;;;9482:6:1;;;;:26;;;;;;;;;9474:53;;;;;-1:-1:-1;;;;;9474:53:1;;;;;;;;;;;;-1:-1:-1;;;;;9474:53:1;;;;;;;;;;;;;;;9552:13;;9537:12;;-1:-1:-1;;;9552:13:1;;;;:107;;9607:14;;:52;;9552:107;;;1195:10;9568:14;;:36;9552:107;9537:122;;9690:4;9677:9;:7;:9::i;:::-;:17;;9669:42;;;;;-1:-1:-1;;;;;9669:42:1;;;;;;;;;;;;-1:-1:-1;;;;;9669:42:1;;;;;;;;;;;;;;;9743:7;;-1:-1:-1;;9743:11:1;9721:12;9736:19;;;:6;:19;;;;;:24;9786:31;-1:-1:-1;;9799:12:1;:17;9786:12;:31::i;:::-;9835:7;;-1:-1:-1;;9835:11:1;9778:40;9828:19;;;:6;:19;;;;;9770:48;;9828:31;;;;9869:19;9770:48;9869:13;:19::i;:::-;9903:13;;-1:-1:-1;;;9903:13:1;;;;9898:113;;9932:13;:20;;-1:-1:-1;;;;;;9932:20:1;-1:-1:-1;;;9932:20:1;;;;;9966:34;;;-1:-1:-1;;;;;9966:34:1;;;;-1:-1:-1;;;;;9976:8:1;;;;9966:32;;:34;;;;;9932:20;;9966:34;;;;;;;;9932:20;9976:8;9966:34;;;5:2:-1;;;;30:1;27;20:12;5:2;9966:34:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9966:34:1;;;;9898:113;9434:583;;:::o;16795:380::-;16873:4;16879:7;16888;16897;16906;16925:20;;:::i;:::-;-1:-1:-1;16948:16:1;;;;:6;:16;;;;;;;;:34;;;:24;;:34;;;;;;16925:57;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16925:57:1;;;;;;;;-1:-1:-1;;;16925:57:1;;;;;;;;;;;;16992:30;;:::i;:::-;-1:-1:-1;17025:16:1;;;;:6;:16;;;;;;;;:39;;;:29;;;;:39;;;;;;16992:72;;;;;;;;;;;;;;;;;;;;;;;17082:14;;17098:12;;;;17112:13;;;;;17082:14;;17098:12;;17074:94;;;16992:72;;-1:-1:-1;16992:72:1;-1:-1:-1;16795:380:1;-1:-1:-1;;;16795:380:1:o;8151:1277::-;8220:16;8210:6;;-1:-1:-1;;;8210:6:1;;;;:26;;;;;;;;;8202:53;;;;;-1:-1:-1;;;;;8202:53:1;;;;;;;;;;;;-1:-1:-1;;;;;8202:53:1;;;;;;;;;;;;;;;8286:7;;-1:-1:-1;;8286:11:1;8311:19;8319:10;8311:7;:19::i;:::-;:37;;;;-1:-1:-1;8335:13:1;;-1:-1:-1;;;8335:13:1;;;;8334:14;8311:37;8307:912;;;1195:10;8385:14;;:36;8372:9;:7;:9::i;:::-;:49;;8364:74;;;;;-1:-1:-1;;;;;8364:74:1;;;;;;;;;;;;-1:-1:-1;;;;;8364:74:1;;;;;;;;;;;;;;;8479:18;;;;:6;:18;;;;;;;;:42;;;:30;;:42;;;;;;8460:15;8468:6;8460:7;:15::i;:::-;:61;8452:88;;;;;-1:-1:-1;;;;;8452:88:1;;;;;;;;;;;;-1:-1:-1;;;;;8452:88:1;;;;;;;;;;;;;;;8599:1;8554:18;;;:6;:18;;;;;;;;:42;;;:30;;;:42;;;;;:46;;;8629:18;;;;;:23;8682:31;-1:-1:-1;;8695:12:1;:17;8682:12;:31::i;:::-;8666:48;8728:14;;8756:19;8728:14;8756:13;:19::i;:::-;8789:18;;;;:6;:18;;;;;;;;:30;;;8838;;;;;;;;;;;;;;;;;;;;;;;;;8307:912;;;;8919:14;;8907:9;:7;:9::i;:::-;:26;8899:51;;;;;-1:-1:-1;;;;;8899:51:1;;;;;;;;;;;;-1:-1:-1;;;;;8899:51:1;;;;;;;;;;;;;;;8991:18;;;;:6;:18;;;;;;;;9022:10;8991:42;;:30;;:42;;;;;;8972:15;8980:6;8972:7;:15::i;:::-;:61;8964:88;;;;;-1:-1:-1;;;;;8964:88:1;;;;;;;;;;;;-1:-1:-1;;;;;8964:88:1;;;;;;;;;;;;;;;9111:1;9066:18;;;:6;:18;;;;;;;;9097:10;9066:42;;;:30;;;:42;;;;;:46;;;9126:18;;;;;;;:33;;;;;;;9178:30;;;;;;;;;;;;;;;;;;;;;;;;8307:912;9233:18;;;;:6;:18;;;;;:27;;;-1:-1:-1;;;9233:27:1;;;;9228:194;;9276:18;;;;:6;:18;;;;;;:27;;:34;;-1:-1:-1;;9276:34:1;-1:-1:-1;;;9276:34:1;;;9324:33;:10;;9276:18;1368:9;;9276:18;9324:33;9276:18;9324:33;1368:9;9324:10;9276:18;9324:33;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;9376:35:1;;;;;;9400:10;9376:35;;;;;;;;;;;;;;;;;8151:1277;;:::o;7476:292::-;7538:13;;-1:-1:-1;;;7538:13:1;;;;:57;;1253:7;7568:11;;:27;7538:57;;;7554:11;;7538:57;7524:9;:7;:9::i;:::-;:72;;7516:97;;;;;-1:-1:-1;;;;;7516:97:1;;;;;;;;;;;;-1:-1:-1;;;;;7516:97:1;;;;;;;;;;;;;;;7623:16;:14;:16::i;:::-;7654:13;;-1:-1:-1;;;7654:13:1;;;;7649:113;;7683:13;:20;;-1:-1:-1;;;;;;7683:20:1;-1:-1:-1;;;7683:20:1;;;;;7717:34;;;-1:-1:-1;;;;;7717:34:1;;;;-1:-1:-1;;;;;7727:8:1;;;;7717:32;;:34;;;;;7683:20;;7717:34;;;;;;;;7683:20;7727:8;7717:34;;;5:2:-1;;;;30:1;27;20:12;5:2;7717:34:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7717:34:1;;;;7649:113;7476:292::o;3093:617::-;171:19:0;179:10;171:7;:19::i;:::-;163:41;;;;;-1:-1:-1;;;;;163:41:0;;;;;;;;;;;;-1:-1:-1;;;;;163:41:0;;;;;;;;;;;;;;;3163:13:1;;-1:-1:-1;;;3163:13:1;;;;3162:14;3154:42;;;;;-1:-1:-1;;;;;3154:42:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;3224:16;3214:6;;-1:-1:-1;;;3214:6:1;;;;:26;;;;;;;;;3206:53;;;;;-1:-1:-1;;;;;3206:53:1;;;;;;;;;;;;-1:-1:-1;;;;;3206:53:1;;;;;;;;;;;;;;;3284:18;3320:9;:17;-1:-1:-1;3320:17:1;3312:48;;;;;-1:-1:-1;;;;;3312:48:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;3312:48:1;;;;;;;;;;;;;;;3370:6;:22;;-1:-1:-1;;;;;;3370:22:1;;;3404:7;3402:9;;-1:-1:-1;;3402:9:1;;;1070:8;3442:9;:7;:9::i;:::-;:27;3421:49;;:11;:49;3501:7;;3480:18;3522;;;:6;:18;;;;;:27;;;-1:-1:-1;;;3522:27:1;;;;3518:93;;;3595:5;3565:18;;;:6;:18;;;;;:27;;:35;;-1:-1:-1;;3565:35:1;;;3518:93;3636:4;3624:9;:16;3620:84;;;3656:37;;:10;;3676:9;:16;;;3656:37;;;;;;;;;3676:16;3656:10;:37;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3656:37:1;214:1:0;;3093:617:1:o;1979:33::-;;;;:::o;7013:457::-;7072:19;7080:10;7072:7;:19::i;:::-;:37;;;;-1:-1:-1;7096:13:1;;-1:-1:-1;;;7096:13:1;;;;7095:14;7072:37;7068:396;;;7146:11;;7133:9;:7;:9::i;:::-;:24;;7125:49;;;;;-1:-1:-1;;;;;7125:49:1;;;;;;;;;;;;-1:-1:-1;;;;;7125:49:1;;;;;;;;;;;;;;;7188:16;:14;:16::i;:::-;7225:7;;;-1:-1:-1;;7225:11:1;;;7218:19;;;;:6;:19;;;;;;;;:43;;;:31;;:43;;;;;:56;;;7300:7;;7293:31;;7300:11;;7293:31;;;;;;;;;;;;;;;;;;7068:396;;;7362:7;;;7355:15;;;;:6;:15;;;;;;;;7383:10;7355:39;;;:27;;;;:39;;;;;;:52;;;7433:7;;7426:27;;;;;;;;;;;;;;;;;;;;;;;;;7013:457;:::o;3032:107:2:-;2165:9;:7;:9::i;:::-;2157:54;;;;;-1:-1:-1;;;;;2157:54:2;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2157:54:2;;;;;;;;;;;;;;;3104:28;3123:8;3104:18;:28::i;2930:157:1:-;2165:9:2;:7;:9::i;:::-;2157:54;;;;;-1:-1:-1;;;;;2157:54:2;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2157:54:2;;;;;;;;;;;;;;;3017:8:1;;-1:-1:-1;;;;;3017:8:1;:22;3009:46;;;;;-1:-1:-1;;;;;3009:46:1;;;;;;;;;;;;-1:-1:-1;;;;;3009:46:1;;;;;;;;;;;;;;;3065:8;:15;;-1:-1:-1;;;;;;3065:15:1;-1:-1:-1;;;;;3065:15:1;;;;;;;;;;2930:157::o;27095:78::-;27163:3;27095:78;:::o;23558:495::-;23617:18;;:::i;:::-;23647:399;;;;;;;;23678:3;23669:5;:12;;23685:6;23668:23;23647:399;;;;23715:3;23706:5;:12;;23722:6;23705:23;23647:399;;;;23752:3;23743:5;:12;;23759:6;23742:23;23647:399;;;;23789:3;23780:5;:12;;23796:6;23779:23;23647:399;;;;23826:3;23817:5;:12;;23833:10;23816:27;23647:399;;;;23867:3;23858:5;:12;;23874:10;23857:27;23647:399;;;;23908:2;23899:5;:11;;23914:10;23898:26;23647:399;;;;23948:2;23939:5;:11;;23954:10;23938:26;23647:399;;;;23988:2;23979:5;:11;;23994:10;23978:26;23647:399;;;;24018:5;24026:10;24018:18;23647:399;;;;;23558:495;;;:::o;23107:445::-;23176:13;;:::i;:::-;23201:21;;:::i;:::-;23254:4;23245:13;;;23232:10;;;:26;23292:1;23282:11;;;23281:20;;23268:10;;;:33;23335:2;23325:12;;;23324:21;;23311:10;;;:34;23379:2;23369:12;;;23368:21;;23355:10;;;:34;-1:-1:-1;23413:12:1;;;23412:21;;-1:-1:-1;23399:10:1;;:34;23467:2;23457:12;;;23456:21;;23443:10;;;:34;23511:2;23501:12;;;23500:21;23487:34;;23232:7;-1:-1:-1;23107:445:1;;;:::o;19255:2413::-;19363:18;;:::i;:::-;19393:25;;:::i;:::-;19540:9;;;;19460:3;19449:14;;;;19513:4;19506:3;19495:14;;;19494:23;;19590:1;19577:14;;19596:1;19576:21;19428:18;19662:2;19645:213;19670:6;19666:1;:10;19645:213;;;19737:4;19725:3;:7;;;19713:20;;;19712:29;19759:7;;;19755:93;;;19809:1;19786:24;;19828:5;;;19755:93;-1:-1:-1;19683:1:1;19678:6;19645:213;;;;19867:16;19886:61;19898:10;19910;19922:7;19931;19940:6;19886:11;:61::i;:::-;19867:80;-1:-1:-1;19961:12:1;;19957:1681;;20022:33;;;20097:1;20073:25;;20069:125;;;20141:38;20167:8;20154:10;:21;20177:1;20141:12;:38::i;:::-;20130:49;;20118:9;;;:61;20069:125;20223:1;20212:8;:12;20208:1420;;;20248:20;20272:1;20248:25;20244:150;;;20337:38;20363:8;20350:10;:21;20373:1;20337:12;:38::i;:::-;20309:25;20322:8;20332:1;20309:12;:25::i;:::-;:66;20297:9;;;:78;20244:150;20427:1;20416:8;:12;20412:1202;;;20452:25;20508:38;20534:8;20521:10;:21;20544:1;20508:12;:38::i;:::-;20480:25;20493:8;20503:1;20480:12;:25::i;:::-;:66;20580:40;;;20568:9;;;:52;20654:42;;;20642:9;;;:54;20480:66;-1:-1:-1;20734:1:1;20723:12;;20719:877;;;20811:38;20837:8;20824:10;:21;20847:1;20811:12;:38::i;:::-;20783:25;20796:8;20806:1;20783:12;:25::i;:::-;:66;20887:40;;;20875:9;;;:52;20965:42;;;20953:9;;;:54;20783:66;-1:-1:-1;20882:1:1;21038:12;;21034:540;;;21130:38;21156:8;21143:10;:21;21166:1;21130:12;:38::i;:::-;21102:25;21115:8;21125:1;21102:12;:25::i;:::-;:66;21210:40;;;21198:9;;;:52;21292:42;;;21280:9;;;:54;21102:66;-1:-1:-1;21380:1:1;21369:12;;21365:183;;;21417:32;;;:9;21483;;:34;;;21365:183;20412:1202;;19957:1681;;-1:-1:-1;21655:6:1;;19255:2413;-1:-1:-1;;;;;;;;;19255:2413:1:o;17793:1456::-;17934:9;;17966;;;;17998;;;;18030;;;;18062;;;;18094;;;;17877:7;;;;17934:9;;17966;;17998;;18030;;18130:1;18113:351;18138:2;18133:1;:7;18113:351;;18192:4;18177:11;;;18176:20;18214:6;;;18210:244;;;18249:2;18244:1;:7;:18;;;;18260:2;18255:1;:7;18244:18;:29;;;;18271:2;18266:1;:7;18244:29;18240:81;;;18297:5;;;;;18240:81;18210:244;;;18368:2;18363:1;:7;:18;;;;18379:2;18374:1;:7;18363:18;:29;;;;18390:2;18385:1;:7;18363:29;18359:81;;;18416:5;;;;;18359:81;-1:-1:-1;18147:1:1;18142:6;18113:351;;;-1:-1:-1;18477:8:1;18473:770;;18508:1;18501:8;;;;;;;;;;;18473:770;18547:6;:9;;;18530:6;18539:4;18530:13;:26;18526:717;;;18576:3;18583:1;18576:8;18572:347;;;18611:2;18604:9;;;;;;;;;;;18572:347;18638:3;18645:1;18638:8;18634:285;;;18673:1;18666:8;;;;;;;;;;;18634:285;18699:3;18706:1;18699:8;18695:224;;;18734:1;18727:8;;;;;;;;;;;18695:224;18760:3;18767:1;18760:8;18756:163;;;18795:1;18788:8;;;;;;;;;;;18756:163;18821:3;18828:1;18821:8;18817:102;;;18856:1;18849:8;;;;;;;;;;;18817:102;18903:1;18896:8;;;;;;;;;;;18526:717;18959:1;18953:3;:7;18949:284;;;18987:1;18980:8;;;;;;;;;;;18949:284;19013:3;19020:1;19013:8;19009:224;;;19048:1;19041:8;;;;;;;;;;;19009:224;19074:3;19081:1;19074:8;19070:163;;;19109:1;19102:8;;;;;;;;;;;19070:163;19135:3;19142:1;19135:8;19131:102;;;19170:1;19163:8;;;;;;;;;;;19131:102;19217:1;19210:8;;;;;;;;;;;24059:311;24354:9;;;;24130:7;;24354:9;:6;24342:1;24335:9;;;;:15;;24328:2;24315:6;24322:1;24315:9;;;;:15;;24308:2;24295:6;24302:1;24295:9;;;;:15;;24287:3;24274:6;24281:1;24274:9;;;;:16;;24254:3;24241:6;24248:1;24241:9;;;;:16;;24233:3;24220:6;24227:1;24220:9;;;;:16;;24212:3;24199:6;24206:1;24199:9;;;;:16;;24191:3;24178:6;24185:1;24178:9;;;;:16;;24170:3;24157:6;24164:1;24157:9;;;;:16;;24156:39;:60;:81;:102;:135;:155;:175;:195;:207;;24059:311;-1:-1:-1;;24059:311:1:o;12679:1239::-;12787:18;;12815:96;12839:1;12835;:5;12815:96;;;12891:6;12898:1;12891:9;;;;;;;;;12875:6;12882:1;12886;12882:5;12875:13;;;;;;;;;;;:25;12861:39;;;;;12842:3;;12815:96;;;;12951:10;12928:19;:17;:19::i;:::-;:33;;12920:64;;;;;-1:-1:-1;;;;;12920:64:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;12920:64:1;;;;;;;;;;;;;;;13016:18;;13058:25;;;;:56;;13113:1;13058:56;;;13100:10;13086:11;:24;13058:56;13282:9;;;13319;;;13044:70;;-1:-1:-1;1475:5:1;1535:4;13141:34;;:43;;;;1603:3;13211:34;;:43;;;;;13282:9;13363:12;;:35;;13391:7;13382:6;:16;;;;;;13363:35;;;13378:1;13363:35;13338:22;;;:60;13433:12;;:35;;13461:7;13452:6;:16;;;;;;13433:35;;;13448:1;13433:35;13408:22;;;:60;;;13547:22;;;;:32;;13512;;;13499:45;;:80;13593:14;;13589:71;;13623:12;:26;;;;;;13589:71;13673:22;;;;:26;13669:117;;13753:22;;;;;13715:18;;;;:6;:18;;;;;;;:35;;:60;13669:117;13799:22;;;;:26;13795:117;;13879:22;;;;;13841:18;;;;:6;:18;;;;;;:35;;:60;12679:1239;;;;;;;;;;:::o;25409:724::-;25503:4;25497:2;25487:12;;;25486:21;;;25541:2;25531:12;;;25530:21;;;25585:2;25575:12;;;25574:21;;;25629:2;25619:12;;;25618:21;;;25673:2;25663:12;;;25662:21;;;25717:1;25707:11;;;25706:20;;;25749:13;;25786:1;25780:7;;;;;:18;;;25797:1;25791:2;:7;;25780:18;25772:45;;;;;-1:-1:-1;;;;;25772:45:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25772:45:1;;;;;;;;;;;;;;;25841:2;25835;:8;;25827:35;;;;;-1:-1:-1;;;;;25827:35:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25827:35:1;;;;;;;;;;;;;;;25885:2;25880;:7;25872:34;;;;;-1:-1:-1;;;;;25872:34:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25872:34:1;;;;;;;;;;;;;;;25929:2;25924;:7;25916:34;;;;;-1:-1:-1;;;;;25916:34:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25916:34:1;;;;;;;;;;;;;;;25973:2;25968;:7;25960:34;;;;;-1:-1:-1;;;;;25960:34:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;25960:34:1;;;;;;;;;;;;;;;26017:2;26012;:7;26004:34;;;;;-1:-1:-1;;;;;26004:34:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26004:34:1;;;;;;;;;;;;;;;26061:2;26056;:7;26048:34;;;;;-1:-1:-1;;;;;26048:34:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26048:34:1;;;;;;;;;;;;;;;26106:1;26100:2;:7;;26092:34;;;;;-1:-1:-1;;;;;26092:34:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26092:34:1;;;;;;;;;;;;;;26506:583;26573:7;26600:1;26596;:5;26592:491;;;-1:-1:-1;26624:1:1;26617:8;;26592:491;26651:1;26646;:6;26642:441;;;-1:-1:-1;26675:1:1;26668:8;;26642:441;26707:9;26727:1;26723;:5;26719:1;:9;:21;;26739:1;26735;:5;26719:21;;;26731:1;26719:21;26707:33;;26758:1;26763;26758:6;26754:53;;;26791:1;26784:8;;;;;26754:53;26832:5;;;26840:1;26832:9;;;26872:5;;26855:76;26884:1;26879;:6;26855:76;;26910:6;;;;26887:3;;26855:76;;;-1:-1:-1;26956:1:1;26988:5;26971:76;27000:1;26995;:6;26971:76;;27026:6;;;;27003:3;;26971:76;;;;27071:1;27067;:5;;;;;;27060:12;;;;;;;6142:865;6301:4;6294:3;6283:14;;;6282:23;6329:1;6323:7;;;6315:34;;;;;-1:-1:-1;;;;;6315:34:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6315:34:1;;;;;;;;;;;;;;;6390:1;6377:14;;6396:1;6376:21;6412:44;6432:7;6441:2;6445;6376:21;6412:19;:44::i;:::-;6407:49;;6480:1;6474:2;:7;;6466:34;;;;;-1:-1:-1;;;;;6466:34:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6466:34:1;;;;;;;;;;;;;;;6535:6;6529:3;:12;6517:7;:25;;6546:4;6516:34;6511:39;;6574:1;6568:2;:7;;6560:34;;;;;-1:-1:-1;;;;;6560:34:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6560:34:1;;;;;;;;;;;;;;;6682:1;6632:10;6627:2;:15;6614:10;:28;:63;;6663:10;6650;:23;6676:1;6650:27;6614:63;;;6645:2;6614:63;6613:70;;6604:79;;6698:63;6718:7;6727:2;6751:1;6732:10;6745:1;6732:14;6731:21;;6754:6;6698:19;:63::i;:::-;6693:68;;6793:10;6788:2;:15;6775:10;:28;6771:185;;;6862:1;6847:10;6842:2;6829:10;:15;:28;6828:35;;6819:44;;6882:63;6902:7;6911:2;6935:1;6916:10;6929:1;6916:14;6915:21;;6938:6;6882:19;:63::i;:::-;6877:68;;6771:185;6979:2;6973;:8;;6965:35;;;;;-1:-1:-1;;;;;6965:35:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6965:35:1;;;;;;;;;;;;;;788:96:2;867:10;788:96;:::o;27179:111:1:-;27266:17;;27179:111::o;10023:396::-;10079:6;:24;;-1:-1:-1;;;;;;10079:24:1;-1:-1:-1;;;10079:24:1;;;10113:25;;:::i;:::-;10141:17;10153:4;10141:11;:17::i;:::-;10113:45;;10168:10;10181:19;10188:4;10195:1;10188:8;10198:1;10181:6;:19::i;:::-;10203:1;10181:23;;-1:-1:-1;10181:23:1;10395:1;10381:7;10389:1;10381:10;;;;:15;;10374:2;10360:7;10368:1;10360:10;;;;:16;;10353:2;10339:7;10347:1;10339:10;;;;:16;;10320:2;10306:7;10314:1;10306:10;;;;;;;;;;;:16;;10299:2;10285:7;10293:1;10285:10;;;;:16;;10278:2;10264:7;10272:1;10264:10;;;;:16;;10263:39;:60;:93;:114;:134;:139;10214:6;:19;10231:1;10221:7;;:11;10214:19;;;;;;;;;;;:26;;;:198;;;;;;;;;;;;;;;;;;10023:396;;;:::o;334:107:0:-;-1:-1:-1;;;;;409:12:0;;388:4;409:12;;;:6;:12;;;;;;;;;:25;;;425:9;:7;:9::i;25152:118:1:-;25244:18;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;25244:18:1;;;;;;25234:29;;;;;;25152:118::o;7774:371::-;7837:13;7827:6;;-1:-1:-1;;;7827:6:1;;;;:23;;;;;;;;;7819:50;;;;;-1:-1:-1;;;;;7819:50:1;;;;;;;;;;;;-1:-1:-1;;;;;7819:50:1;;;;;;;;;;;;;;;7879:13;7895:19;:17;:19::i;:::-;7879:35;;1368:9;7932:5;:21;;7924:52;;;;;-1:-1:-1;;;;;7924:52:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7924:52:1;;;;;;;;;;;;;;;7988:7;7986:9;;;;;;8005:6;:25;;-1:-1:-1;;;;;;8005:25:1;-1:-1:-1;;;8005:25:1;;;1131:10;8057:9;:7;:9::i;:::-;:30;8040:14;:47;-1:-1:-1;;8118:20:1;8097:18;:41;7774:371::o;3240:225:2:-;-1:-1:-1;;;;;3313:22:2;;3305:73;;;;-1:-1:-1;;;;;3305:73:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3414:6;;;3393:38;;-1:-1:-1;;;;;3393:38:2;;;;3414:6;;;3393:38;;;3441:6;:17;;-1:-1:-1;;;;;;3441:17:2;-1:-1:-1;;;;;3441:17:2;;;;;;;;;;3240:225::o;21674:1427:1:-;21885:9;;21917;;;;21949;;;;21981;;;;22013;;;;22045;;;;21828:7;;;;21885:9;;21917;;21949;;21981;;21828:7;22150:1;22095:2;:15;;;22082:28;;:63;;22131:10;22118;:23;22144:1;22118:27;22082:63;;;22113:2;22082:63;22081:70;;;-1:-1:-1;22192:1:1;22179:14;;22198:1;22178:21;22161:383;22205:6;22201:1;:10;22161:383;;;22272:4;22260:3;:7;;;22248:20;;;22247:29;22294:6;;;22290:244;;;22329:2;22324:1;:7;:18;;;;22340:2;22335:1;:7;22324:18;:29;;;;22351:2;22346:1;:7;22324:29;22320:81;;;22377:5;;;;;22320:81;22290:244;;;22448:2;22443:1;:7;:18;;;;22459:2;22454:1;:7;22443:18;:29;;;;22470:2;22465:1;:7;22443:29;22439:81;;;22496:5;;;;;22439:81;-1:-1:-1;22218:1:1;22213:6;22161:383;;;;22575:10;22570:2;:15;22557:10;:28;22553:522;;;-1:-1:-1;22643:1:1;22611:28;;;-1:-1:-1;;22611:28:1;22610:34;22663:9;22658:407;22682:6;22678:1;:10;22658:407;;;22753:4;22741:3;:7;;;22729:20;;;22728:29;22779:6;;;22775:276;;;22818:2;22813:1;:7;:18;;;;22829:2;22824:1;:7;22813:18;:29;;;;22840:2;22835:1;:7;22813:29;22809:89;;;22870:5;;;;;22809:89;22775:276;;;22953:2;22948:1;:7;:18;;;;22964:2;22959:1;:7;22948:18;:29;;;;22975:2;22970:1;:7;22948:29;22944:89;;;23005:5;;;;;22944:89;-1:-1:-1;22695:1:1;22690:6;22658:407;;;;22553:522;-1:-1:-1;23091:3:1;;21674:1427;-1:-1:-1;;;;;;;;;;;;21674:1427:1:o;26139:361::-;26251:7;26283:6;26316:5;26299:176;26327:3;26323:1;:7;26299:176;;;26391:4;26379:3;:7;;;26368:19;;;26367:28;26417:7;;;26409:34;;;;;-1:-1:-1;;;;;26409:34:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;26409:34:1;;;;;;;;;;;;;;;26462:2;-1:-1:-1;26337:1:1;26332:6;26299:176;;;-1:-1:-1;26491:2:1;26139:361;-1:-1:-1;;;;;26139:361:1:o;24376:770::-;24434:17;;:::i;:::-;24463:25;;:::i;:::-;24498:22;;:::i;:::-;24535:9;24530:243;24554:1;24550;:5;24530:243;;;24576:9;24615:1;24588:24;24602:1;24595:4;:8;24610:1;24605:2;:6;24588;:24::i;:::-;:28;24576:40;;24630:9;24642:3;24646:1;24642:6;;;;;;;;;;;24630:18;;24662:9;24674:3;24678:1;24674:6;;;;;;;;;;;;-1:-1:-1;24703:6:1;;:18;;24720:1;24703:18;;;24712:1;24716;24712:5;24703:18;24694:3;24698:1;24694:6;;;;;;;;;;:27;24744:6;;:18;;24761:1;24744:18;;;24753:1;24757;24753:5;24744:18;24735:3;24739:1;24735:6;;;;;;;;;;:27;-1:-1:-1;;;24557:3:1;;24530:243;;;-1:-1:-1;24787:9:1;24782:76;24806:1;24802;:5;24782:76;;;24841:3;24845:1;24841:6;;;;;;;;;;;24828:7;24836:1;24828:10;;;;;;;;;;:19;24809:3;;24782:76;;;-1:-1:-1;24884:1:1;24867:249;24891:1;24887;:5;24867:249;;;24913:9;24925:7;24933:1;24925:10;;;;;;;;;;;;-1:-1:-1;24981:1:1;24972:106;24988:1;24984;:5;:27;;;;;25010:1;24993:7;25005:1;25001;:5;24993:14;;;;;;;;;;;:18;24984:27;24972:106;;;25049:7;25061:1;25057;:5;25049:14;;;;;;;;;;;25036:7;25044:1;25036:10;;;;;;;;;;:27;-1:-1:-1;;25013:3:1;24972:106;;;25104:1;25091:7;25099:1;25091:10;;;;;;;;;;:14;-1:-1:-1;;24894:3:1;;24867:249;;;-1:-1:-1;25132:7:1;;24376:770;-1:-1:-1;;;24376:770:1:o;25276:127::-;25342:7;25393:3;25376:13;25384:4;25376:7;:13::i;:::-;25368:28;;;;;;;25276:127;-1:-1:-1;;;25276:127:1:o;175:27117::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;175:27117:1;;;;;;-1:-1:-1;;;;;175:27117:1;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;175:27117:1;;;-1:-1:-1;;175:27117:1:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;175:27117:1;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;175:27117:1;;;-1:-1:-1;;175:27117:1:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;175:27117:1;;;-1:-1:-1;;175:27117:1:o

Swarm Source

bzzr://f9f84a50d3b76177bbdea03ffc10de5204f20f180bafc65c117b40b6a8efbeec

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.