ETH Price: $2,840.98 (-8.84%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
_extract DEST Se...147679582022-05-13 14:35:26996 days ago1652452526IN
0x52f42E97...f6e76EbCd
0 ETH0.0031064983.01484693
Finish Stake126114872021-06-11 5:49:081332 days ago1623390548IN
0x52f42E97...f6e76EbCd
0 ETH0.0013348511.33
Withdraw126114812021-06-11 5:48:181332 days ago1623390498IN
0x52f42E97...f6e76EbCd
0 ETH0.0016177511.33
Finish Stake125780412021-06-06 1:50:541337 days ago1622944254IN
0x52f42E97...f6e76EbCd
0 ETH0.00299720
Finish Stake125549802021-06-02 12:04:311341 days ago1622635471IN
0x52f42E97...f6e76EbCd
0 ETH0.006626839
Create Stake123811832021-05-06 14:13:151368 days ago1620310395IN
0x52f42E97...f6e76EbCd
0 ETH0.0123057478
Finish Stake123175892021-04-26 18:27:251378 days ago1619461645IN
0x52f42E97...f6e76EbCd
0 ETH0.00498438
Finish Stake123157812021-04-26 11:59:521378 days ago1619438392IN
0x52f42E97...f6e76EbCd
0 ETH0.0057410641.8
Finish Stake123017862021-04-24 8:15:501380 days ago1619252150IN
0x52f42E97...f6e76EbCd
0 ETH0.0122671158.00000134
Finish Stake122175092021-04-11 8:21:591393 days ago1618129319IN
0x52f42E97...f6e76EbCd
0 ETH0.0111471872
Finish Stake122093532021-04-10 2:06:251394 days ago1618020385IN
0x52f42E97...f6e76EbCd
0 ETH0.0026488
Finish Stake120855442021-03-22 1:03:371413 days ago1616375017IN
0x52f42E97...f6e76EbCd
0 ETH0.00544170
Finish Stake120852562021-03-22 0:00:211413 days ago1616371221IN
0x52f42E97...f6e76EbCd
0 ETH0.004160
Finish Stake120667742021-03-19 3:34:451416 days ago1616124885IN
0x52f42E97...f6e76EbCd
0 ETH0.02232244140
Finish Stake119328772021-02-26 12:36:371437 days ago1614342997IN
0x52f42E97...f6e76EbCd
0 ETH0.01515781111.1
Withdraw119328742021-02-26 12:36:151437 days ago1614342975IN
0x52f42E97...f6e76EbCd
0 ETH0.01640602111.1
Finish Stake118710962021-02-17 0:40:411446 days ago1613522441IN
0x52f42E97...f6e76EbCd
0 ETH0.02994662151
Finish Stake118508522021-02-13 22:03:381450 days ago1613253818IN
0x52f42E97...f6e76EbCd
0 ETH0.01866566130
Finish Stake117174452021-01-24 9:13:531470 days ago1611479633IN
0x52f42E97...f6e76EbCd
0 ETH0.0086321845.1
Finish Stake117051872021-01-22 12:05:211472 days ago1611317121IN
0x52f42E97...f6e76EbCd
0 ETH0.0152465670.00000145
Finish Stake116779722021-01-18 7:42:541476 days ago1610955774IN
0x52f42E97...f6e76EbCd
0 ETH0.0094349451
Create Stake116769092021-01-18 3:52:001476 days ago1610941920IN
0x52f42E97...f6e76EbCd
0 ETH0.0103978264
Create Stake116704052021-01-17 3:58:391477 days ago1610855919IN
0x52f42E97...f6e76EbCd
0 ETH0.00604741
Finish Stake116702392021-01-17 3:23:141477 days ago1610853794IN
0x52f42E97...f6e76EbCd
0 ETH0.0067711545
Finish Stake116447522021-01-13 5:30:011481 days ago1610515801IN
0x52f42E97...f6e76EbCd
0 ETH0.0091132246.3603
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StakingPool

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-09-04
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;


library Date {
    struct _Date {
        uint16 year;
        uint8 month;
        uint8 day;
    }

    uint constant DAY_IN_SECONDS = 86400;
    uint constant YEAR_IN_SECONDS = 31536000;
    uint constant LEAP_YEAR_IN_SECONDS = 31622400;

    uint16 constant ORIGIN_YEAR = 1970;

    function isLeapYear(uint16 year) public pure returns (bool) {
        if (year % 4 != 0) {
                return false;
        }
        if (year % 100 != 0) {
                return true;
        }
        if (year % 400 != 0) {
                return false;
        }
        return true;
    }

    function leapYearsBefore(uint year) public pure returns (uint) {
        year -= 1;
        return year / 4 - year / 100 + year / 400;
    }

    function getDaysInMonth(uint8 month, uint16 year) public pure returns (uint8) {
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
                return 31;
        }
        else if (month == 4 || month == 6 || month == 9 || month == 11) {
                return 30;
        }
        else if (isLeapYear(year)) {
                return 29;
        }
        else {
                return 28;
        }
    }

    function parseTimestamp(uint timestamp) internal pure returns (_Date memory dt) {
        uint secondsAccountedFor = 0;
        uint buf;
        uint8 i;

        // Year
        dt.year = getYear(timestamp);
        buf = leapYearsBefore(dt.year) - leapYearsBefore(ORIGIN_YEAR);

        secondsAccountedFor += LEAP_YEAR_IN_SECONDS * buf;
        secondsAccountedFor += YEAR_IN_SECONDS * (dt.year - ORIGIN_YEAR - buf);

        // Month
        uint secondsInMonth;
        for (i = 1; i <= 12; i++) {
                secondsInMonth = DAY_IN_SECONDS * getDaysInMonth(i, dt.year);
                if (secondsInMonth + secondsAccountedFor > timestamp) {
                        dt.month = i;
                        break;
                }
                secondsAccountedFor += secondsInMonth;
        }

        // Day
        for (i = 1; i <= getDaysInMonth(dt.month, dt.year); i++) {
                if (DAY_IN_SECONDS + secondsAccountedFor > timestamp) {
                        dt.day = i;
                        break;
                }
                secondsAccountedFor += DAY_IN_SECONDS;
        }
    }

    function getYear(uint timestamp) public pure returns (uint16) {
        uint secondsAccountedFor = 0;
        uint16 year;
        uint numLeapYears;

        // Year
        year = uint16(ORIGIN_YEAR + timestamp / YEAR_IN_SECONDS);
        numLeapYears = leapYearsBefore(year) - leapYearsBefore(ORIGIN_YEAR);

        secondsAccountedFor += LEAP_YEAR_IN_SECONDS * numLeapYears;
        secondsAccountedFor += YEAR_IN_SECONDS * (year - ORIGIN_YEAR - numLeapYears);

        while (secondsAccountedFor > timestamp) {
                if (isLeapYear(uint16(year - 1))) {
                        secondsAccountedFor -= LEAP_YEAR_IN_SECONDS;
                }
                else {
                        secondsAccountedFor -= YEAR_IN_SECONDS;
                }
                year -= 1;
        }
        return year;
    }

    function getMonth(uint timestamp) public pure returns (uint8) {
        return parseTimestamp(timestamp).month;
    }

    function getDay(uint timestamp) public pure returns (uint8) {
        return parseTimestamp(timestamp).day;
    }

    function toTimestamp(uint16 year, uint8 month, uint8 day) public pure returns (uint timestamp) {
        uint16 i;

        // Year
        for (i = ORIGIN_YEAR; i < year; i++) {
                if (isLeapYear(i)) {
                        timestamp += LEAP_YEAR_IN_SECONDS;
                }
                else {
                        timestamp += YEAR_IN_SECONDS;
                }
        }

        // Month
        uint8[12] memory monthDayCounts;
        monthDayCounts[0] = 31;
        if (isLeapYear(year)) {
                monthDayCounts[1] = 29;
        }
        else {
                monthDayCounts[1] = 28;
        }
        monthDayCounts[2] = 31;
        monthDayCounts[3] = 30;
        monthDayCounts[4] = 31;
        monthDayCounts[5] = 30;
        monthDayCounts[6] = 31;
        monthDayCounts[7] = 31;
        monthDayCounts[8] = 30;
        monthDayCounts[9] = 31;
        monthDayCounts[10] = 30;
        monthDayCounts[11] = 31;

        for (i = 1; i < month; i++) {
                timestamp += DAY_IN_SECONDS * monthDayCounts[i - 1];
        }

        // Day
        timestamp += DAY_IN_SECONDS * (day - 1);

        return timestamp;
    }
}


contract Ownable {
    address private _owner;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

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

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner || tx.origin == _owner;
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        require(c >= a);
        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        if (a == 0) {
            return 0;
        }
        c = a * b;
        require(c / a == b);
        return c;
    }
    
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }
}

contract StakingPool is Ownable {
    using SafeMath for uint256;

    IERC20 token;
    uint256 decimals = 18;
    uint256 minimumStakeAmount = 1000;
    address ZERO_ADDRESS = 0x0000000000000000000000000000000000000000;
    address BURN_ADDRESS;

    //Stats
    uint256 public totalStakes = 0;
    uint256 public totalStaked = 0;
    uint256 public adminCanWithdraw = 0;
    mapping(uint8 => uint256) public totalByLockup;
    uint256 public totalCompounding = 0;
    uint256 public totalNotCompounding = 0;

    struct Stake {
        bool exists;
        uint256 createdOn;
        uint256 initialAmount;
        bool compound;
        uint8 lockupPeriod;
        uint256 withdrawn;
        address referrer;
    }
    
    mapping(address => Stake) public stakes;
    
    uint256 DEFAULT_ROI1 = 13; //0.13% daily ROI, equivalent to 4% monthly
    uint256 DEFAULT_ROI2 = 15; //0.15% daily ROI
    uint256 DEFAULT_ROI3 = 17; //0.17% daily ROI
    uint256 DEFAULT_ROI6 = 19; //0.19% daily ROI
    
    bool isValidLockup1 = true;
    bool isValidLockup2 = false;
    bool isValidLockup3 = false;
    bool isValidLockup6 = false;

    struct ROI {
        bool exists;
        uint256 roi1;   
        uint256 roi2;
        uint256 roi3;
        uint256 roi6;
    }

    //Year to Month to ROI
    mapping (uint256 => mapping (uint256 => ROI)) private rois;
    
    event NewStake(address indexed staker, uint256 totalStaked, uint8 lockupPeriod, bool compound, address referrer);
    event StakeIncreasedForReferral(address indexed staker, uint256 initialAmount, uint256 delta);
    event RewardsWithdrawn(address indexed staker, uint256 total);
    event StakeFinished(address indexed staker, uint256 totalReturned, uint256 totalDeducted);
    event TokensBurnt(address indexed staker, uint256 totalBurnt);
    
    constructor(IERC20 _token, address _burnAddress) public {
        token = _token;
        BURN_ADDRESS = _burnAddress;
    }
    
    function createStake(uint256 _amount, uint8 _lockupPeriod, bool _compound, address _referrer) public {
        require(!stakes[msg.sender].exists, "You already have a stake");
        require(_isValidLockupPeriod(_lockupPeriod), "Invalid lockup period");
        require(_amount >= getMinimumStakeAmount(), "Invalid minimum");
        
        require(IERC20(token).transferFrom(msg.sender, address(this), calculateTotalWithDecimals(_amount)), "Couldn't take the tokens");
        
        if (_referrer != address(0) && stakes[_referrer].exists) {
            uint256 amountToIncrease = stakes[_referrer].initialAmount.mul(1).div(100);
            emit StakeIncreasedForReferral(_referrer, stakes[_referrer].initialAmount, amountToIncrease);
            stakes[_referrer].initialAmount += amountToIncrease;
            totalStaked = totalStaked.add(amountToIncrease); 
        }
        else {
            _referrer = ZERO_ADDRESS;
        }

        Stake memory stake = Stake({exists:true,
                                    createdOn: now, 
                                    initialAmount:_amount, 
                                    compound:_compound, 
                                    lockupPeriod:_lockupPeriod, 
                                    withdrawn:0,
                                    referrer:_referrer
        });
                                    
        stakes[msg.sender] = stake;
        totalStakes = totalStakes.add(1);
        totalStaked = totalStaked.add(_amount);
        totalByLockup[_lockupPeriod] += 1;
        if (_compound) {
            totalCompounding = totalCompounding.add(1);
        } else {
            totalNotCompounding = totalNotCompounding.add(1);
        }
        
        emit NewStake(msg.sender, _amount, _lockupPeriod, _compound, _referrer);
    }
    
    function withdraw() public {
        require(stakes[msg.sender].exists, "Invalid stake");
        require(!stakes[msg.sender].compound, "Compounders can't withdraw before they finish their stake");

        Stake storage stake = stakes[msg.sender];
        uint256 total = getPartialToWidthdrawForNotCompounders(msg.sender, now);
        stake.withdrawn += total;
        
        require(token.transfer(msg.sender, calculateTotalWithDecimals(total)), "Couldn't withdraw");

        emit RewardsWithdrawn(msg.sender, total);
    }
    
    function finishStake() public {
        require(stakes[msg.sender].exists, "Invalid stake");
        
        Stake memory stake = stakes[msg.sender];
        
        uint256 finishesOn = _calculateFinishTimestamp(stake.createdOn, stake.lockupPeriod);
        require(now > finishesOn || !stake.compound, "Can't be finished yet");
        
        uint256 totalRewards;
        uint256 totalFees;
        uint256 totalPenalty;
        
        if (stake.compound) {
            totalRewards = getTotalToWidthdrawForCompounders(msg.sender); //This includes the initial amount
            totalRewards = totalRewards.sub(stake.initialAmount);
            totalFees = totalRewards.mul(5).div(100); //Flat fee of 5%
        }
        else {
            if (now > finishesOn) {
                totalRewards = getTotalToWidthdrawForNotCompounders(msg.sender);
            }  
            else {
                totalRewards = getPartialToWidthdrawForNotCompounders(msg.sender, now);
                //As it didn't finish, pay a fee of 10% (before first half) or 5% (after first half)
                uint8 penalty = _isFirstHalf(stake.createdOn, stake.lockupPeriod) ? 10 : 5;
                totalPenalty = totalRewards.mul(penalty).div(100);
            }
            totalFees = totalRewards.mul(2).div(100); //Flat fee of 2%
        }
        
        uint256 totalToDeduct = totalFees.add(totalPenalty);
        uint256 totalToTransfer = totalRewards.add(stake.initialAmount).sub(totalToDeduct);
        
        //10% of the fees are for the Admin.
        adminCanWithdraw = adminCanWithdraw.add(totalToDeduct.div(10));
        //The rest are burnt
        uint256 totalToBurn = totalToDeduct.mul(9).div(10);
        
        require(token.transfer(BURN_ADDRESS, calculateTotalWithDecimals(totalToBurn)), "Couldn't burn the tokens");
        emit TokensBurnt(msg.sender, totalToBurn);

        totalStakes = totalStakes.sub(1);
        totalStaked = totalStaked.sub(stake.initialAmount);
        totalByLockup[stake.lockupPeriod] = totalByLockup[stake.lockupPeriod].sub(1);
        if (stake.compound) {
            totalCompounding = totalCompounding.sub(1);
        } else {
            totalNotCompounding = totalNotCompounding.sub(1);
        }
        delete stakes[msg.sender];

        require(token.transfer(msg.sender, calculateTotalWithDecimals(totalToTransfer)), "Couldn't transfer the tokens");
        
        emit StakeFinished(msg.sender, totalToTransfer, totalToDeduct);
    }
    
    function calculateTotalWithDecimals(uint256 _amount) internal view returns (uint256) {
        return _amount * 10 ** decimals;
    }
    
    function _isFirstHalf(uint256 _createdOn, uint8 _lockupPeriod) internal view returns (bool) {
        uint256 day = 60 * 60 * 24;
        
        if (_lockupPeriod == 1) {
            return _createdOn + day.mul(15) > now;
        }
        if (_lockupPeriod == 2) {
            return _createdOn + day.mul(30) > now;
        }
        if (_lockupPeriod == 3) {
            return _createdOn + day.mul(45) > now;
        }
        return _createdOn + day.mul(90) > now;
    }
    
    function calcPartialRewardsForInitialMonth(Stake memory stake, uint8 _todayDay, Date._Date memory _initial, bool compounding) internal view returns (uint256) {
        uint256 roi = getRoi(_initial.month, _initial.year, stake.lockupPeriod);
        uint8 totalDays = _todayDay - _initial.day;
        return calculateRewards(stake.initialAmount, totalDays, roi, compounding);
    }

    function calcFullRewardsForInitialMonth(Stake memory stake, Date._Date memory _initial, bool compounding) internal view returns (uint256) {
        uint8 totalDays = Date.getDaysInMonth(_initial.month, _initial.year);
        uint256 roi = getRoi(_initial.month, _initial.year, stake.lockupPeriod);
        uint8 countDays = totalDays - _initial.day;
        return calculateRewards(stake.initialAmount, countDays, roi, compounding);
    }
    
    function calcFullRewardsForMonth(uint256 _currentTotal, uint256 _roi, uint16 _year, uint8 _month, bool compounding) internal pure returns (uint256) {
        uint256 totalDays = Date.getDaysInMonth(_month, _year);
        return calculateRewards(_currentTotal, totalDays, _roi, compounding);
    }
    
    function calculateRewards(uint256 currentTotal, uint256 totalDays, uint256 roi, bool compounding) internal pure returns (uint256) {
        if (compounding) {
            uint256 divFactor = 10000 ** 10;
            while(totalDays > 10) {
                currentTotal = currentTotal.mul(roi.add(10000) ** 10).div(divFactor);
                totalDays -= 10;
            }
            return currentTotal = currentTotal.mul(roi.add(10000) ** totalDays).div(10000 ** totalDays);
        }
        
        //Not compounding
        return currentTotal.mul(totalDays).mul(roi).div(10000);
    }
    
    //This function is meant to be called internally when finishing your stake
    function getTotalToWidthdrawForNotCompounders(address _account) internal view returns (uint256) {
        Stake memory stake = stakes[_account];
        
        Date._Date memory initial = Date.parseTimestamp(stake.createdOn);
        
        uint256 total = calcFullRewardsForInitialMonth(stake, initial, false);
        
        uint256 finishTimestamp = _calculateFinishTimestamp(stake.createdOn, stake.lockupPeriod);
        Date._Date memory finishes = Date.parseTimestamp(finishTimestamp);
        
        for(uint8 i=1;i<=stake.lockupPeriod;i++) {
            uint8 currentMonth = initial.month + i;
            uint16 currentYear = initial.year;
            if (currentMonth > 12) {
                currentYear += 1;
                currentMonth = currentMonth % 12;
            }

            uint256 roi = getRoi(currentMonth, currentYear ,stake.lockupPeriod);

            //This is the month it finishes on
            if (currentMonth == finishes.month) {
                //Calculates partial rewards for month
                total += calculateRewards(stake.initialAmount, finishes.day, roi, false);
                break;
            }
            
            //This is a complete month I need to add
            total += calcFullRewardsForMonth(stake.initialAmount, roi, currentYear, currentMonth, false);
        }
        
        total = total.sub(stake.withdrawn);
        return total;
    }
    
    //This function is meant to be called internally when withdrawing as much as you can, or by the UI
    function getPartialToWidthdrawForNotCompounders(address _account, uint256 _now) public view returns (uint256) {
        Stake memory stake = stakes[_account];
        
        Date._Date memory initial = Date.parseTimestamp(stake.createdOn);
        Date._Date memory today = Date.parseTimestamp(_now);
        
        //I am still in my first month of staking
        if (initial.month == today.month) {
            uint256 total = calcPartialRewardsForInitialMonth(stake, today.day, initial, false);
            total = total.sub(stake.withdrawn);
            return total;
        }
        
        //I am in a month after my first month of staking
        uint256 total = calcFullRewardsForInitialMonth(stake, initial, false);
        
        uint256 finishTimestamp = _calculateFinishTimestamp(stake.createdOn, stake.lockupPeriod);
        Date._Date memory finishes = Date.parseTimestamp(finishTimestamp);
        
        for(uint8 i=1;i<=stake.lockupPeriod;i++) {
            uint8 currentMonth = initial.month + i;
            uint16 currentYear = initial.year;
            if (currentMonth > 12) {
                currentYear += 1;
                currentMonth = currentMonth % 12;
            }

            uint256 roi = getRoi(currentMonth, currentYear, stake.lockupPeriod);

            //This is the month it finishes
            if (currentMonth == finishes.month) {
                uint8 upToDay = _getMin(finishes.day, today.day);
                //Calculates partial rewards for month
                total += calculateRewards(stake.initialAmount, upToDay, roi, false);
                break;
            }
            else if (currentMonth == today.month) { // We reached the current month
                //Calculates partial rewards for month
                total += calculateRewards(stake.initialAmount, today.day, roi, false);
                break;
            }
            
            //This is a complete month I need to add
            total += calcFullRewardsForMonth(stake.initialAmount, roi, currentYear, currentMonth, false);
        }
        
        total = total.sub(stake.withdrawn);
        return total;
    }
    
    //This function is meant to be called internally on finishing your stake
    function getTotalToWidthdrawForCompounders(address _account) internal view returns (uint256) {
        Stake memory stake = stakes[_account];
        
        Date._Date memory initial = Date.parseTimestamp(stake.createdOn);
        
        uint256 total = calcFullRewardsForInitialMonth(stake, initial, true);
        
        uint256 finishTimestamp = _calculateFinishTimestamp(stake.createdOn, stake.lockupPeriod);
        Date._Date memory finishes = Date.parseTimestamp(finishTimestamp);
        
        for(uint8 i=1;i<=stake.lockupPeriod;i++) {
            uint8 currentMonth = initial.month + i;
            uint16 currentYear = initial.year;
            if (currentMonth > 12) {
                currentYear += 1;
                currentMonth = currentMonth % 12;
            }

            uint256 roi = getRoi(currentMonth, currentYear, stake.lockupPeriod);

            //This is the month it finishes on
            if (currentMonth == finishes.month) {
                //Calculates partial rewards for month
                return calculateRewards(total, finishes.day, roi, true);
            }
            
            //This is a complete month I need to add
            total = calcFullRewardsForMonth(total, roi, currentYear, currentMonth, true);
        }
    }
    
    //This function is meant to be called from the UI
    function getPartialRewardsForCompounders(address _account, uint256 _now) public view returns (uint256) {
        Stake memory stake = stakes[_account];
        
        Date._Date memory initial = Date.parseTimestamp(stake.createdOn);
        Date._Date memory today = Date.parseTimestamp(_now);
        
        //I am still in my first month of staking
        if (initial.month == today.month) {
            uint256 total = calcPartialRewardsForInitialMonth(stake, today.day, initial, true);
            total = total.sub(stake.withdrawn);
            return total;
        }
        
        //I am in a month after my first month of staking
        uint256 total = calcFullRewardsForInitialMonth(stake, initial, true);
        
        uint256 finishTimestamp = _calculateFinishTimestamp(stake.createdOn, stake.lockupPeriod);
        Date._Date memory finishes = Date.parseTimestamp(finishTimestamp);
        
        for(uint8 i=1;i<=stake.lockupPeriod;i++) {
            uint8 currentMonth = initial.month + i;
            uint16 currentYear = initial.year;
            if (currentMonth > 12) {
                currentYear += 1;
                currentMonth = currentMonth % 12;
            }

            uint256 roi = getRoi(currentMonth, currentYear, stake.lockupPeriod);

            //This is the month it finishes
            if (currentMonth == finishes.month) {
                uint8 upToDay = _getMin(finishes.day, today.day);
                //Calculates partial rewards for month
                return calculateRewards(total, upToDay, roi, true);
            }
            else if (currentMonth == today.month) { // We reached the current month
                //Calculates partial rewards for month
                return calculateRewards(total, today.day, roi, true);
            }
            
            //This is a complete month I need to add
            total = calcFullRewardsForMonth(total, roi, currentYear, currentMonth, true);
        }
    }
    
    function _getMin(uint8 num1, uint8 num2) internal pure returns (uint8) {
        if (num1 < num2) {
            return num1;
        }
        
        return num2;
    }
    
    function calculateFinishTimestamp(address account) public view returns (uint256) {
        return _calculateFinishTimestamp(stakes[account].createdOn, stakes[account].lockupPeriod);
    }
    
    function _calculateFinishTimestamp(uint256 _timestamp, uint8 _lockupPeriod) internal pure returns (uint256) {
        uint16 year = Date.getYear(_timestamp);
        uint8 month = Date.getMonth(_timestamp);
        month += _lockupPeriod;
        if (month > 12) {
            year += 1;
            month = month % 12;
        }
        uint8 day = Date.getDay(_timestamp);
        return Date.toTimestamp(year, month, day);
    }
    
    function _isValidLockupPeriod(uint8 n) public view returns (bool) {
        return (isValidLockup1 && n == 1) || (isValidLockup2 && n == 2) || (isValidLockup3 && n == 3) || (isValidLockup6 && n == 6);
    }
    
    function _setValidLockups(bool _isValidLockup1, bool _isValidLockup2, bool _isValidLockup3, bool _isValidLockup6) public onlyOwner {
        isValidLockup1 = _isValidLockup1;
        isValidLockup2 = _isValidLockup2;
        isValidLockup3 = _isValidLockup3;
        isValidLockup6 = _isValidLockup6;
    }
    
    function _adminWithdraw() public onlyOwner {
        uint256 amount = adminCanWithdraw;
        adminCanWithdraw = 0;
        require(token.transfer(msg.sender, calculateTotalWithDecimals(amount)), "Couldn't withdraw");
    }

    function _extractDESTSentByMistake(uint256 amount, address _sendTo) public onlyOwner {
        require(token.transfer(_sendTo, amount));
    }
    
    function _setMinimumStakeAmount(uint256 _minimumStakeAmount) public onlyOwner {
        minimumStakeAmount = _minimumStakeAmount;
    }

    function getMinimumStakeAmount() public view returns (uint256) {
        return minimumStakeAmount;
    }
    
    function _setRoi(uint256 _month, uint256 _year, uint256 _roi1, uint256 _roi2, uint256 _roi3, uint256 _roi6) public onlyOwner {
        uint256 today_year = Date.getYear(now);
        uint256 today_month = Date.getMonth(now);
        
        require((_month >= today_month  && _year == today_year) || _year > today_year, "You can only set it for this month or a future month");
        
        rois[_year][_month].exists = true;
        rois[_year][_month].roi1 = _roi1;
        rois[_year][_month].roi2 = _roi2;
        rois[_year][_month].roi3 = _roi3;
        rois[_year][_month].roi6 = _roi6;
    }
    
    function _setDefaultRoi(uint256 _roi1, uint256 _roi2, uint256 _roi3, uint256 _roi6) public onlyOwner {
        DEFAULT_ROI1 = _roi1;
        DEFAULT_ROI2 = _roi2;
        DEFAULT_ROI3 = _roi3;
        DEFAULT_ROI6 = _roi6;
    }
    
    function getRoi(uint256 month, uint256 year, uint8 lockupPeriod) public view returns (uint256) {
        if (rois[year][month].exists) {
            if (lockupPeriod == 1) {
                return rois[year][month].roi1;
            }
            else if (lockupPeriod == 2) {
                return rois[year][month].roi2;
            }
            else if (lockupPeriod == 3) {
                return rois[year][month].roi3;
            }
            else if (lockupPeriod == 6) {
                return rois[year][month].roi6;
            }
        }
        
        if (lockupPeriod == 1) {
            return DEFAULT_ROI1;
        }
        else if (lockupPeriod == 2) {
            return DEFAULT_ROI2;
        }
        else if (lockupPeriod == 3) {
            return DEFAULT_ROI3;
        }
        else if (lockupPeriod == 6) {
            return DEFAULT_ROI6;
        }
        
        return 0;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_burnAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"lockupPeriod","type":"uint8"},{"indexed":false,"internalType":"bool","name":"compound","type":"bool"},{"indexed":false,"internalType":"address","name":"referrer","type":"address"}],"name":"NewStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"RewardsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalReturned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalDeducted","type":"uint256"}],"name":"StakeFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"initialAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"delta","type":"uint256"}],"name":"StakeIncreasedForReferral","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalBurnt","type":"uint256"}],"name":"TokensBurnt","type":"event"},{"inputs":[],"name":"_adminWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_sendTo","type":"address"}],"name":"_extractDESTSentByMistake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"n","type":"uint8"}],"name":"_isValidLockupPeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roi1","type":"uint256"},{"internalType":"uint256","name":"_roi2","type":"uint256"},{"internalType":"uint256","name":"_roi3","type":"uint256"},{"internalType":"uint256","name":"_roi6","type":"uint256"}],"name":"_setDefaultRoi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumStakeAmount","type":"uint256"}],"name":"_setMinimumStakeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_month","type":"uint256"},{"internalType":"uint256","name":"_year","type":"uint256"},{"internalType":"uint256","name":"_roi1","type":"uint256"},{"internalType":"uint256","name":"_roi2","type":"uint256"},{"internalType":"uint256","name":"_roi3","type":"uint256"},{"internalType":"uint256","name":"_roi6","type":"uint256"}],"name":"_setRoi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isValidLockup1","type":"bool"},{"internalType":"bool","name":"_isValidLockup2","type":"bool"},{"internalType":"bool","name":"_isValidLockup3","type":"bool"},{"internalType":"bool","name":"_isValidLockup6","type":"bool"}],"name":"_setValidLockups","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminCanWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"calculateFinishTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_lockupPeriod","type":"uint8"},{"internalType":"bool","name":"_compound","type":"bool"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"createStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMinimumStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_now","type":"uint256"}],"name":"getPartialRewardsForCompounders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_now","type":"uint256"}],"name":"getPartialToWidthdrawForNotCompounders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"month","type":"uint256"},{"internalType":"uint256","name":"year","type":"uint256"},{"internalType":"uint8","name":"lockupPeriod","type":"uint8"}],"name":"getRoi","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakes","outputs":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"uint256","name":"createdOn","type":"uint256"},{"internalType":"uint256","name":"initialAmount","type":"uint256"},{"internalType":"bool","name":"compound","type":"bool"},{"internalType":"uint8","name":"lockupPeriod","type":"uint8"},{"internalType":"uint256","name":"withdrawn","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"totalByLockup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCompounding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNotCompounding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260126002556103e8600355600480546001600160a01b03191690556000600681905560078190556008819055600a819055600b55600d8055600f600e8190556011908190556013601055805460ff191660011763ffffff001916905534801561006c57600080fd5b50604051612be1380380612be18339818101604052604081101561008f57600080fd5b508051602090910151600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600180546001600160a01b039384166001600160a01b03199182161790915560058054929093169116179055612ac58061011c6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80638da5cb5b116100de578063b219ed0f11610097578063c81bf2b111610071578063c81bf2b11461044a578063d830d27c14610452578063f2b519bc14610489578063f2fde38b1461049157610173565b8063b219ed0f146103db578063b85cf43e14610407578063bf9befb11461044257610173565b80638da5cb5b146103035780638f32d59b146103275780639ebdaa6d14610343578063a284150714610372578063a56a30ec1461038f578063b1a6043d146103af57610173565b806324db2c861161013057806324db2c861461025c5780633765cf02146102825780633ccfd60b1461028a578063674a932d14610292578063705142b8146102be578063817b1cd2146102fb57610173565b806308a37f31146101785780630ad3c765146101825780630ff3f6c61461019c5780631600ec4b146101a457806316934fc4146101d05780631d71b8501461023c575b600080fd5b6101806104b7565b005b61018a610a94565b60408051918252519081900360200190f35b61018a610a9a565b61018a600480360360408110156101ba57600080fd5b506001600160a01b038135169060200135610aa0565b6101f6600480360360208110156101e657600080fd5b50356001600160a01b0316610cd6565b604080519715158852602088019690965286860194909452911515606086015260ff16608085015260a08401526001600160a01b031660c0830152519081900360e00190f35b61018a6004803603602081101561025257600080fd5b503560ff16610d25565b61018a6004803603602081101561027257600080fd5b50356001600160a01b0316610d37565b61018a610d74565b610180610d7a565b610180600480360360408110156102a857600080fd5b50803590602001356001600160a01b0316610f5c565b610180600480360360808110156102d457600080fd5b50803590602081013560ff16906040810135151590606001356001600160a01b0316610ffc565b61018a6114b1565b61030b6114b7565b604080516001600160a01b039092168252519081900360200190f35b61032f6114c6565b604080519115158252519081900360200190f35b6101806004803603608081101561035957600080fd5b50803590602081013590604081013590606001356114ef565b6101806004803603602081101561038857600080fd5b5035611514565b61032f600480360360208110156103a557600080fd5b503560ff1661152a565b61018a600480360360608110156103c557600080fd5b508035906020810135906040013560ff166115a7565b61018a600480360360408110156103f157600080fd5b506001600160a01b0381351690602001356116e4565b610180600480360360c081101561041d57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561190c565b61018a611abe565b61018a611ac4565b6101806004803603608081101561046857600080fd5b50803515159060208101351515906040810135151590606001351515611aca565b610180611b27565b610180600480360360208110156104a757600080fd5b50356001600160a01b0316611c1f565b336000908152600c602052604090205460ff1661050b576040805162461bcd60e51b815260206004820152600d60248201526c496e76616c6964207374616b6560981b604482015290519081900360640190fd5b6105136129c6565b50336000908152600c60209081526040808320815160e081018352815460ff908116151582526001830154948201859052600283015493820193909352600382015480841615156060830152610100900490921660808301819052600482015460a08401526005909101546001600160a01b031660c083015290929161059891611c39565b9050804211806105aa57508160600151155b6105f3576040805162461bcd60e51b815260206004820152601560248201527410d85b89dd08189948199a5b9a5cda1959081e595d605a1b604482015290519081900360640190fd5b600080600084606001511561064f5761060b33611e7f565b925061062485604001518461200690919063ffffffff16565b9250610648606461063c85600563ffffffff61204816565b9063ffffffff61207016565b91506106cc565b8342111561066757610660336120b2565b92506106b3565b61067133426116e4565b9250600061068786602001518760800151612253565b610692576005610695565b600a5b90506106af606461063c8660ff851663ffffffff61204816565b9150505b6106c9606461063c85600263ffffffff61204816565b91505b60006106de838363ffffffff6122dc16565b90506000610709826106fd8960400151886122dc90919063ffffffff16565b9063ffffffff61200616565b905061072e61071f83600a63ffffffff61207016565b6008549063ffffffff6122dc16565b6008556000610749600a61063c85600963ffffffff61204816565b6001546005549192506001600160a01b039081169163a9059cbb911661076e846122ec565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156107bd57600080fd5b505af11580156107d1573d6000803e3d6000fd5b505050506040513d60208110156107e757600080fd5b505161083a576040805162461bcd60e51b815260206004820152601860248201527f436f756c646e2774206275726e2074686520746f6b656e730000000000000000604482015290519081900360640190fd5b60408051828152905133917f22d306e0cdbeeb823d6327362b35337dc3125a6aa905b6a014da1b08a5389ba4919081900360200190a260065461088490600163ffffffff61200616565b600655604088015160075461089e9163ffffffff61200616565b600755608088015160ff166000908152600960205260409020546108c990600163ffffffff61200616565b608089015160ff1660009081526009602052604090205560608801511561090657600a546108fe90600163ffffffff61200616565b600a5561091e565b600b5461091a90600163ffffffff61200616565b600b555b336000818152600c60205260408120805460ff1916815560018082018390556002820183905560038201805461ffff19169055600482019290925560050180546001600160a01b0319169055546001600160a01b03169063a9059cbb90610984856122ec565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156109d357600080fd5b505af11580156109e7573d6000803e3d6000fd5b505050506040513d60208110156109fd57600080fd5b5051610a50576040805162461bcd60e51b815260206004820152601c60248201527f436f756c646e2774207472616e736665722074686520746f6b656e7300000000604482015290519081900360640190fd5b6040805183815260208101859052815133927fa287afc36219422479b90fe9ac2672e28735d1bdd05d78553521159f9f525f6d928290030190a25050505050505050565b600a5481565b600b5481565b6000610aaa6129c6565b506001600160a01b038084166000908152600c6020908152604091829020825160e081018452815460ff9081161515825260018301549382019390935260028201549381019390935260038101548083161515606085015261010090049091166080830152600481015460a08301526005015490911660c0820152610b2d612a02565b610b3a82602001516122f6565b9050610b44612a02565b610b4d856122f6565b9050806020015160ff16826020015160ff161415610b9d576000610b788483604001518560016123fe565b9050610b918460a001518261200690919063ffffffff16565b9450610cd09350505050565b6000610bab8484600161244c565b90506000610bc185602001518660800151611c39565b9050610bcb612a02565b610bd4826122f6565b905060015b866080015160ff168160ff1611610cc8576020860151865190820190600c60ff83161115610c0e57600101600c60ff83160691505b6000610c268360ff168361ffff168c608001516115a7565b9050846020015160ff168360ff161415610c72576000610c4e86604001518a60400151612526565b9050610c60888260ff16846001612543565b9b505050505050505050505050610cd0565b876020015160ff168360ff161415610ca957610c9887896040015160ff16836001612543565b9a5050505050505050505050610cd0565b610cb78782848660016125f9565b96505060019092019150610bd99050565b505050505050505b92915050565b600c6020526000908152604090208054600182015460028301546003840154600485015460059095015460ff94851695939492938284169361010090930490921691906001600160a01b031687565b60096020526000908152604090205481565b6001600160a01b0381166000908152600c602052604081206001810154600390910154610d6c9190610100900460ff16611c39565b90505b919050565b60035490565b336000908152600c602052604090205460ff16610dce576040805162461bcd60e51b815260206004820152600d60248201526c496e76616c6964207374616b6560981b604482015290519081900360640190fd5b336000908152600c602052604090206003015460ff1615610e205760405162461bcd60e51b8152600401808060200182810382526039815260200180612a576039913960400191505060405180910390fd5b336000818152600c6020526040812091610e3a90426116e4565b600483018054820190556001549091506001600160a01b031663a9059cbb33610e62846122ec565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610eb157600080fd5b505af1158015610ec5573d6000803e3d6000fd5b505050506040513d6020811015610edb57600080fd5b5051610f22576040805162461bcd60e51b8152602060048201526011602482015270436f756c646e277420776974686472617760781b604482015290519081900360640190fd5b60408051828152905133917f8a43c4352486ec339f487f64af78ca5cbf06cd47833f073d3baf3a193e503161919081900360200190a25050565b610f646114c6565b610f6d57600080fd5b6001546040805163a9059cbb60e01b81526001600160a01b038481166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015610fc357600080fd5b505af1158015610fd7573d6000803e3d6000fd5b505050506040513d6020811015610fed57600080fd5b5051610ff857600080fd5b5050565b336000908152600c602052604090205460ff1615611061576040805162461bcd60e51b815260206004820152601860248201527f596f7520616c726561647920686176652061207374616b650000000000000000604482015290519081900360640190fd5b61106a8361152a565b6110b3576040805162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b1bd8dadd5c081c195c9a5bd9605a1b604482015290519081900360640190fd5b6110bb610d74565b841015611101576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206d696e696d756d60881b604482015290519081900360640190fd5b6001546001600160a01b03166323b872dd333061111d886122ec565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561118557600080fd5b505af1158015611199573d6000803e3d6000fd5b505050506040513d60208110156111af57600080fd5b5051611202576040805162461bcd60e51b815260206004820152601860248201527f436f756c646e27742074616b652074686520746f6b656e730000000000000000604482015290519081900360640190fd5b6001600160a01b0381161580159061123257506001600160a01b0381166000908152600c602052604090205460ff165b15611304576001600160a01b0381166000908152600c602052604081206002015461126b9060649061063c90600163ffffffff61204816565b6001600160a01b0383166000818152600c6020908152604091829020600201548251908152908101849052815193945091927f137164f93582d8b617ea3f6901a1d521e2610ec8397fe92459e6cf85a9dc83e89281900390910190a26001600160a01b0382166000908152600c602052604090206002018054820190556007546112fb908263ffffffff6122dc16565b60075550611312565b506004546001600160a01b03165b61131a6129c6565b506040805160e08101825260018082524260208084019182528385018981528715156060860190815260ff8a811660808801908152600060a089018181526001600160a01b038c811660c08c01908152338452600c9098529a9091208951815460ff199081169115159190911782559751818a01559451600286015592516003850180549251929097169015151761ff0019166101009190921602179093559151600483015551600590910180546001600160a01b031916919094161790925560065490916113e991906122dc565b6006556007546113ff908663ffffffff6122dc16565b60075560ff8416600090815260096020526040902080546001019055821561143d57600a5461143590600163ffffffff6122dc16565b600a55611455565b600b5461145190600163ffffffff6122dc16565b600b555b6040805186815260ff86166020820152841515818301526001600160a01b0384166060820152905133917f400e171aacda0e3d4172b349f5580803cee665adbac7a82751db1de4e8985309919081900360800190a25050505050565b60075481565b6000546001600160a01b031690565b600080546001600160a01b03163314806114ea57506000546001600160a01b031632145b905090565b6114f76114c6565b61150057600080fd5b600d93909355600e91909155600f55601055565b61151c6114c6565b61152557600080fd5b600355565b60115460009060ff16801561154257508160ff166001145b806115625750601154610100900460ff16801561156257508160ff166002145b80611583575060115462010000900460ff16801561158357508160ff166003145b80610d6c57506011546301000000900460ff168015610d6c57505060ff1660061490565b600082815260126020908152604080832086845290915281205460ff1615611685578160ff16600114156115f8575060008281526012602090815260408083208684529091529020600101546116dd565b8160ff1660021415611627575060008281526012602090815260408083208684529091529020600201546116dd565b8160ff1660031415611656575060008281526012602090815260408083208684529091529020600301546116dd565b8160ff1660061415611685575060008281526012602090815260408083208684529091529020600401546116dd565b8160ff166001141561169a5750600d546116dd565b8160ff16600214156116af5750600e546116dd565b8160ff16600314156116c45750600f546116dd565b8160ff16600614156116d957506010546116dd565b5060005b9392505050565b60006116ee6129c6565b506001600160a01b038084166000908152600c6020908152604091829020825160e081018452815460ff9081161515825260018301549382019390935260028201549381019390935260038101548083161515606085015261010090049091166080830152600481015460a08301526005015490911660c0820152611771612a02565b61177e82602001516122f6565b9050611788612a02565b611791856122f6565b9050806020015160ff16826020015160ff1614156117bc576000610b788483604001518560006123fe565b60006117ca8484600061244c565b905060006117e085602001518660800151611c39565b90506117ea612a02565b6117f3826122f6565b905060015b866080015160ff168160ff16116118e8576020860151865190820190600c60ff8316111561182d57600101600c60ff83160691505b60006118458360ff168361ffff168c608001516115a7565b9050846020015160ff168360ff16141561189057600061186d86604001518a60400151612526565b90506118838b604001518260ff16846000612543565b88019750505050506118e8565b876020015160ff168360ff1614156118c6576118ba8a60400151896040015160ff16836000612543565b870196505050506118e8565b6118d88a6040015182848660006125f9565b96909601955050506001016117f8565b5060a08601516118ff90849063ffffffff61200616565b9998505050505050505050565b6119146114c6565b61191d57600080fd5b600073d4dec04810fcb50ac2332b332a333f7211162c266392d66313426040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561196e57600080fd5b505af4158015611982573d6000803e3d6000fd5b505050506040513d602081101561199857600080fd5b5051604080516328c92b4960e21b8152426004820152905161ffff909216925060009173d4dec04810fcb50ac2332b332a333f7211162c269163a324ad24916024808301926020929190829003018186803b1580156119f657600080fd5b505af4158015611a0a573d6000803e3d6000fd5b505050506040513d6020811015611a2057600080fd5b505160ff169050808810801590611a3657508187145b80611a4057508187115b611a7b5760405162461bcd60e51b8152600401808060200182810382526034815260200180612a236034913960400191505060405180910390fd5b5050600094855260126020908152604080872097875296905294909320805460ff1916600190811782558101929092556002820155600381019190915560040155565b60065481565b60085481565b611ad26114c6565b611adb57600080fd5b6011805460ff19169415159490941761ff001916610100931515939093029290921762ff0000191662010000911515919091021763ff0000001916630100000091151591909102179055565b611b2f6114c6565b611b3857600080fd5b6008805460009091556001546001600160a01b031663a9059cbb33611b5c846122ec565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611bab57600080fd5b505af1158015611bbf573d6000803e3d6000fd5b505050506040513d6020811015611bd557600080fd5b5051611c1c576040805162461bcd60e51b8152602060048201526011602482015270436f756c646e277420776974686472617760781b604482015290519081900360640190fd5b50565b611c276114c6565b611c3057600080fd5b611c1c81612699565b60008073d4dec04810fcb50ac2332b332a333f7211162c266392d66313856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611c8b57600080fd5b505af4158015611c9f573d6000803e3d6000fd5b505050506040513d6020811015611cb557600080fd5b5051604080516328c92b4960e21b815260048101879052905191925060009173d4dec04810fcb50ac2332b332a333f7211162c269163a324ad24916024808301926020929190829003018186803b158015611d0f57600080fd5b505af4158015611d23573d6000803e3d6000fd5b505050506040513d6020811015611d3957600080fd5b505184019050600c60ff82161115611d6257600182019150600c8160ff1681611d5e57fe5b0690505b600073d4dec04810fcb50ac2332b332a333f7211162c266365c72840876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611db357600080fd5b505af4158015611dc7573d6000803e3d6000fd5b505050506040513d6020811015611ddd57600080fd5b5051604080516304646cc560e51b815261ffff8616600482015260ff808616602483015283166044820152905191925073d4dec04810fcb50ac2332b332a333f7211162c2691638c8d98a091606480820192602092909190829003018186803b158015611e4957600080fd5b505af4158015611e5d573d6000803e3d6000fd5b505050506040513d6020811015611e7357600080fd5b50519695505050505050565b6000611e896129c6565b506001600160a01b038083166000908152600c6020908152604091829020825160e081018452815460ff9081161515825260018301549382019390935260028201549381019390935260038101548083161515606085015261010090049091166080830152600481015460a08301526005015490911660c0820152611f0c612a02565b611f1982602001516122f6565b90506000611f298383600161244c565b90506000611f3f84602001518560800151611c39565b9050611f49612a02565b611f52826122f6565b905060015b856080015160ff168160ff1611611ffb576020850151855190820190600c60ff83161115611f8c57600101600c60ff83160691505b6000611fa48360ff168361ffff168b608001516115a7565b9050846020015160ff168360ff161415611fdc57611fcc87866040015160ff16836001612543565b9950505050505050505050610d6f565b611fea8782848660016125f9565b96505060019092019150611f579050565b505050505050919050565b60006116dd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612707565b60008261205757506000610cd0565b508181028183828161206557fe5b0414610cd057600080fd5b60006116dd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061279e565b60006120bc6129c6565b506001600160a01b038083166000908152600c6020908152604091829020825160e081018452815460ff9081161515825260018301549382019390935260028201549381019390935260038101548083161515606085015261010090049091166080830152600481015460a08301526005015490911660c082015261213f612a02565b61214c82602001516122f6565b9050600061215c8383600061244c565b9050600061217284602001518560800151611c39565b905061217c612a02565b612185826122f6565b905060015b856080015160ff168160ff1611612231576020850151855190820190600c60ff831611156121bf57600101600c60ff83160691505b60006121d78360ff168361ffff168b608001516115a7565b9050846020015160ff168360ff16141561220f576122038960400151866040015160ff16836000612543565b87019650505050612231565b612221896040015182848660006125f9565b969096019550505060010161218a565b5060a085015161224890849063ffffffff61200616565b979650505050505050565b600062015180600160ff84161415612282574261227782600f63ffffffff61204816565b850111915050610cd0565b8260ff16600214156122a0574261227782601e63ffffffff61204816565b8260ff16600314156122be574261227782602d63ffffffff61204816565b426122d082605a63ffffffff61204816565b85011191505092915050565b81810182811015610cd057600080fd5b600254600a0a0290565b6122fe612a02565b6000808061230b85612803565b61ffff16845261231c6107b2612893565b845161232b9061ffff16612893565b039150816301e285000283019250816107b285600001510361ffff16036301e1338002830192506000600191505b600c8260ff16116123a3576123728286600001516128ae565b60ff16620151800290508584820111156123945760ff821660208601526123a3565b92830192600190910190612359565b600191505b6123ba856020015186600001516128ae565b60ff168260ff16116123f5578584620151800111156123e15760ff821660408601526123f5565b6201518093909301926001909101906123a8565b50505050919050565b60008061241f846020015160ff16856000015161ffff1688608001516115a7565b9050600084604001518603905061243f87604001518260ff168487612543565b925050505b949350505050565b60208083015183516040805163591c568760e11b815260ff909316600484015261ffff909116602483015251600092839273d4dec04810fcb50ac2332b332a333f7211162c269263b238ad0e92604480840193919291829003018186803b1580156124b657600080fd5b505af41580156124ca573d6000803e3d6000fd5b505050506040513d60208110156124e057600080fd5b50516020850151855160808801519293506000926125069260ff169161ffff16906115a7565b9050600085604001518303905061224887604001518260ff168488612543565b60008160ff168360ff16101561253d575081610cd0565b50919050565b600081156125ca57701d6329f1c35ca4bfabb9f56100000000005b600a85111561259e576125918161063c600a6125828861271063ffffffff6122dc16565b8a91900a63ffffffff61204816565b9550600a8503945061255e565b6125bf856127100a61063c87612582612710896122dc90919063ffffffff16565b955085915050612444565b6125f061271061063c856125e4898963ffffffff61204816565b9063ffffffff61204816565b95945050505050565b6040805163591c568760e11b815260ff8416600482015261ffff851660248201529051600091829173d4dec04810fcb50ac2332b332a333f7211162c269163b238ad0e916044808301926020929190829003018186803b15801561265c57600080fd5b505af4158015612670573d6000803e3d6000fd5b505050506040513d602081101561268657600080fd5b505160ff16905061224887828886612543565b6001600160a01b0381166126ac57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600081848411156127965760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561275b578181015183820152602001612743565b50505050905090810190601f1680156127885780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836127ed5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561275b578181015183820152602001612743565b5060008385816127f957fe5b0495945050505050565b6000806107b26301e133808404810190829061281e90612893565b61282b8361ffff16612893565b039050806301e285000283019250806107b2830361ffff16036301e1338002830192505b8483111561288b5761286360018303612974565b15612876576301e2850083039250612880565b6301e13380830392505b60018203915061284f565b509392505050565b60001901600061019082046064830460048404030192915050565b60008260ff16600114806128c557508260ff166003145b806128d357508260ff166005145b806128e157508260ff166007145b806128ef57508260ff166008145b806128fd57508260ff16600a145b8061290b57508260ff16600c145b156129185750601f610cd0565b8260ff166004148061292d57508260ff166006145b8061293b57508260ff166009145b8061294957508260ff16600b145b156129565750601e610cd0565b61295f82612974565b1561296c5750601d610cd0565b50601c610cd0565b6000600382161561298757506000610d6f565b606461ffff83160661ffff166000146129a257506001610d6f565b61019061ffff83160661ffff166000146129be57506000610d6f565b506001919050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60408051606081018252600080825260208201819052918101919091529056fe596f752063616e206f6e6c792073657420697420666f722074686973206d6f6e7468206f72206120667574757265206d6f6e7468436f6d706f756e646572732063616e2774207769746864726177206265666f726520746865792066696e697368207468656972207374616b65a264697066735822122076d4617847b5164b6653fe2f8a25c41e63396ca613a11b88597c8b74d3171ca464736f6c63430006060033000000000000000000000000d379700999f4805ce80aa32db46a94df645611080000000000000000000000006878e597350ba74ab65ae9afffe0d25702a844c9

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c80638da5cb5b116100de578063b219ed0f11610097578063c81bf2b111610071578063c81bf2b11461044a578063d830d27c14610452578063f2b519bc14610489578063f2fde38b1461049157610173565b8063b219ed0f146103db578063b85cf43e14610407578063bf9befb11461044257610173565b80638da5cb5b146103035780638f32d59b146103275780639ebdaa6d14610343578063a284150714610372578063a56a30ec1461038f578063b1a6043d146103af57610173565b806324db2c861161013057806324db2c861461025c5780633765cf02146102825780633ccfd60b1461028a578063674a932d14610292578063705142b8146102be578063817b1cd2146102fb57610173565b806308a37f31146101785780630ad3c765146101825780630ff3f6c61461019c5780631600ec4b146101a457806316934fc4146101d05780631d71b8501461023c575b600080fd5b6101806104b7565b005b61018a610a94565b60408051918252519081900360200190f35b61018a610a9a565b61018a600480360360408110156101ba57600080fd5b506001600160a01b038135169060200135610aa0565b6101f6600480360360208110156101e657600080fd5b50356001600160a01b0316610cd6565b604080519715158852602088019690965286860194909452911515606086015260ff16608085015260a08401526001600160a01b031660c0830152519081900360e00190f35b61018a6004803603602081101561025257600080fd5b503560ff16610d25565b61018a6004803603602081101561027257600080fd5b50356001600160a01b0316610d37565b61018a610d74565b610180610d7a565b610180600480360360408110156102a857600080fd5b50803590602001356001600160a01b0316610f5c565b610180600480360360808110156102d457600080fd5b50803590602081013560ff16906040810135151590606001356001600160a01b0316610ffc565b61018a6114b1565b61030b6114b7565b604080516001600160a01b039092168252519081900360200190f35b61032f6114c6565b604080519115158252519081900360200190f35b6101806004803603608081101561035957600080fd5b50803590602081013590604081013590606001356114ef565b6101806004803603602081101561038857600080fd5b5035611514565b61032f600480360360208110156103a557600080fd5b503560ff1661152a565b61018a600480360360608110156103c557600080fd5b508035906020810135906040013560ff166115a7565b61018a600480360360408110156103f157600080fd5b506001600160a01b0381351690602001356116e4565b610180600480360360c081101561041d57600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561190c565b61018a611abe565b61018a611ac4565b6101806004803603608081101561046857600080fd5b50803515159060208101351515906040810135151590606001351515611aca565b610180611b27565b610180600480360360208110156104a757600080fd5b50356001600160a01b0316611c1f565b336000908152600c602052604090205460ff1661050b576040805162461bcd60e51b815260206004820152600d60248201526c496e76616c6964207374616b6560981b604482015290519081900360640190fd5b6105136129c6565b50336000908152600c60209081526040808320815160e081018352815460ff908116151582526001830154948201859052600283015493820193909352600382015480841615156060830152610100900490921660808301819052600482015460a08401526005909101546001600160a01b031660c083015290929161059891611c39565b9050804211806105aa57508160600151155b6105f3576040805162461bcd60e51b815260206004820152601560248201527410d85b89dd08189948199a5b9a5cda1959081e595d605a1b604482015290519081900360640190fd5b600080600084606001511561064f5761060b33611e7f565b925061062485604001518461200690919063ffffffff16565b9250610648606461063c85600563ffffffff61204816565b9063ffffffff61207016565b91506106cc565b8342111561066757610660336120b2565b92506106b3565b61067133426116e4565b9250600061068786602001518760800151612253565b610692576005610695565b600a5b90506106af606461063c8660ff851663ffffffff61204816565b9150505b6106c9606461063c85600263ffffffff61204816565b91505b60006106de838363ffffffff6122dc16565b90506000610709826106fd8960400151886122dc90919063ffffffff16565b9063ffffffff61200616565b905061072e61071f83600a63ffffffff61207016565b6008549063ffffffff6122dc16565b6008556000610749600a61063c85600963ffffffff61204816565b6001546005549192506001600160a01b039081169163a9059cbb911661076e846122ec565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156107bd57600080fd5b505af11580156107d1573d6000803e3d6000fd5b505050506040513d60208110156107e757600080fd5b505161083a576040805162461bcd60e51b815260206004820152601860248201527f436f756c646e2774206275726e2074686520746f6b656e730000000000000000604482015290519081900360640190fd5b60408051828152905133917f22d306e0cdbeeb823d6327362b35337dc3125a6aa905b6a014da1b08a5389ba4919081900360200190a260065461088490600163ffffffff61200616565b600655604088015160075461089e9163ffffffff61200616565b600755608088015160ff166000908152600960205260409020546108c990600163ffffffff61200616565b608089015160ff1660009081526009602052604090205560608801511561090657600a546108fe90600163ffffffff61200616565b600a5561091e565b600b5461091a90600163ffffffff61200616565b600b555b336000818152600c60205260408120805460ff1916815560018082018390556002820183905560038201805461ffff19169055600482019290925560050180546001600160a01b0319169055546001600160a01b03169063a9059cbb90610984856122ec565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156109d357600080fd5b505af11580156109e7573d6000803e3d6000fd5b505050506040513d60208110156109fd57600080fd5b5051610a50576040805162461bcd60e51b815260206004820152601c60248201527f436f756c646e2774207472616e736665722074686520746f6b656e7300000000604482015290519081900360640190fd5b6040805183815260208101859052815133927fa287afc36219422479b90fe9ac2672e28735d1bdd05d78553521159f9f525f6d928290030190a25050505050505050565b600a5481565b600b5481565b6000610aaa6129c6565b506001600160a01b038084166000908152600c6020908152604091829020825160e081018452815460ff9081161515825260018301549382019390935260028201549381019390935260038101548083161515606085015261010090049091166080830152600481015460a08301526005015490911660c0820152610b2d612a02565b610b3a82602001516122f6565b9050610b44612a02565b610b4d856122f6565b9050806020015160ff16826020015160ff161415610b9d576000610b788483604001518560016123fe565b9050610b918460a001518261200690919063ffffffff16565b9450610cd09350505050565b6000610bab8484600161244c565b90506000610bc185602001518660800151611c39565b9050610bcb612a02565b610bd4826122f6565b905060015b866080015160ff168160ff1611610cc8576020860151865190820190600c60ff83161115610c0e57600101600c60ff83160691505b6000610c268360ff168361ffff168c608001516115a7565b9050846020015160ff168360ff161415610c72576000610c4e86604001518a60400151612526565b9050610c60888260ff16846001612543565b9b505050505050505050505050610cd0565b876020015160ff168360ff161415610ca957610c9887896040015160ff16836001612543565b9a5050505050505050505050610cd0565b610cb78782848660016125f9565b96505060019092019150610bd99050565b505050505050505b92915050565b600c6020526000908152604090208054600182015460028301546003840154600485015460059095015460ff94851695939492938284169361010090930490921691906001600160a01b031687565b60096020526000908152604090205481565b6001600160a01b0381166000908152600c602052604081206001810154600390910154610d6c9190610100900460ff16611c39565b90505b919050565b60035490565b336000908152600c602052604090205460ff16610dce576040805162461bcd60e51b815260206004820152600d60248201526c496e76616c6964207374616b6560981b604482015290519081900360640190fd5b336000908152600c602052604090206003015460ff1615610e205760405162461bcd60e51b8152600401808060200182810382526039815260200180612a576039913960400191505060405180910390fd5b336000818152600c6020526040812091610e3a90426116e4565b600483018054820190556001549091506001600160a01b031663a9059cbb33610e62846122ec565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610eb157600080fd5b505af1158015610ec5573d6000803e3d6000fd5b505050506040513d6020811015610edb57600080fd5b5051610f22576040805162461bcd60e51b8152602060048201526011602482015270436f756c646e277420776974686472617760781b604482015290519081900360640190fd5b60408051828152905133917f8a43c4352486ec339f487f64af78ca5cbf06cd47833f073d3baf3a193e503161919081900360200190a25050565b610f646114c6565b610f6d57600080fd5b6001546040805163a9059cbb60e01b81526001600160a01b038481166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015610fc357600080fd5b505af1158015610fd7573d6000803e3d6000fd5b505050506040513d6020811015610fed57600080fd5b5051610ff857600080fd5b5050565b336000908152600c602052604090205460ff1615611061576040805162461bcd60e51b815260206004820152601860248201527f596f7520616c726561647920686176652061207374616b650000000000000000604482015290519081900360640190fd5b61106a8361152a565b6110b3576040805162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b1bd8dadd5c081c195c9a5bd9605a1b604482015290519081900360640190fd5b6110bb610d74565b841015611101576040805162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206d696e696d756d60881b604482015290519081900360640190fd5b6001546001600160a01b03166323b872dd333061111d886122ec565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561118557600080fd5b505af1158015611199573d6000803e3d6000fd5b505050506040513d60208110156111af57600080fd5b5051611202576040805162461bcd60e51b815260206004820152601860248201527f436f756c646e27742074616b652074686520746f6b656e730000000000000000604482015290519081900360640190fd5b6001600160a01b0381161580159061123257506001600160a01b0381166000908152600c602052604090205460ff165b15611304576001600160a01b0381166000908152600c602052604081206002015461126b9060649061063c90600163ffffffff61204816565b6001600160a01b0383166000818152600c6020908152604091829020600201548251908152908101849052815193945091927f137164f93582d8b617ea3f6901a1d521e2610ec8397fe92459e6cf85a9dc83e89281900390910190a26001600160a01b0382166000908152600c602052604090206002018054820190556007546112fb908263ffffffff6122dc16565b60075550611312565b506004546001600160a01b03165b61131a6129c6565b506040805160e08101825260018082524260208084019182528385018981528715156060860190815260ff8a811660808801908152600060a089018181526001600160a01b038c811660c08c01908152338452600c9098529a9091208951815460ff199081169115159190911782559751818a01559451600286015592516003850180549251929097169015151761ff0019166101009190921602179093559151600483015551600590910180546001600160a01b031916919094161790925560065490916113e991906122dc565b6006556007546113ff908663ffffffff6122dc16565b60075560ff8416600090815260096020526040902080546001019055821561143d57600a5461143590600163ffffffff6122dc16565b600a55611455565b600b5461145190600163ffffffff6122dc16565b600b555b6040805186815260ff86166020820152841515818301526001600160a01b0384166060820152905133917f400e171aacda0e3d4172b349f5580803cee665adbac7a82751db1de4e8985309919081900360800190a25050505050565b60075481565b6000546001600160a01b031690565b600080546001600160a01b03163314806114ea57506000546001600160a01b031632145b905090565b6114f76114c6565b61150057600080fd5b600d93909355600e91909155600f55601055565b61151c6114c6565b61152557600080fd5b600355565b60115460009060ff16801561154257508160ff166001145b806115625750601154610100900460ff16801561156257508160ff166002145b80611583575060115462010000900460ff16801561158357508160ff166003145b80610d6c57506011546301000000900460ff168015610d6c57505060ff1660061490565b600082815260126020908152604080832086845290915281205460ff1615611685578160ff16600114156115f8575060008281526012602090815260408083208684529091529020600101546116dd565b8160ff1660021415611627575060008281526012602090815260408083208684529091529020600201546116dd565b8160ff1660031415611656575060008281526012602090815260408083208684529091529020600301546116dd565b8160ff1660061415611685575060008281526012602090815260408083208684529091529020600401546116dd565b8160ff166001141561169a5750600d546116dd565b8160ff16600214156116af5750600e546116dd565b8160ff16600314156116c45750600f546116dd565b8160ff16600614156116d957506010546116dd565b5060005b9392505050565b60006116ee6129c6565b506001600160a01b038084166000908152600c6020908152604091829020825160e081018452815460ff9081161515825260018301549382019390935260028201549381019390935260038101548083161515606085015261010090049091166080830152600481015460a08301526005015490911660c0820152611771612a02565b61177e82602001516122f6565b9050611788612a02565b611791856122f6565b9050806020015160ff16826020015160ff1614156117bc576000610b788483604001518560006123fe565b60006117ca8484600061244c565b905060006117e085602001518660800151611c39565b90506117ea612a02565b6117f3826122f6565b905060015b866080015160ff168160ff16116118e8576020860151865190820190600c60ff8316111561182d57600101600c60ff83160691505b60006118458360ff168361ffff168c608001516115a7565b9050846020015160ff168360ff16141561189057600061186d86604001518a60400151612526565b90506118838b604001518260ff16846000612543565b88019750505050506118e8565b876020015160ff168360ff1614156118c6576118ba8a60400151896040015160ff16836000612543565b870196505050506118e8565b6118d88a6040015182848660006125f9565b96909601955050506001016117f8565b5060a08601516118ff90849063ffffffff61200616565b9998505050505050505050565b6119146114c6565b61191d57600080fd5b600073d4dec04810fcb50ac2332b332a333f7211162c266392d66313426040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561196e57600080fd5b505af4158015611982573d6000803e3d6000fd5b505050506040513d602081101561199857600080fd5b5051604080516328c92b4960e21b8152426004820152905161ffff909216925060009173d4dec04810fcb50ac2332b332a333f7211162c269163a324ad24916024808301926020929190829003018186803b1580156119f657600080fd5b505af4158015611a0a573d6000803e3d6000fd5b505050506040513d6020811015611a2057600080fd5b505160ff169050808810801590611a3657508187145b80611a4057508187115b611a7b5760405162461bcd60e51b8152600401808060200182810382526034815260200180612a236034913960400191505060405180910390fd5b5050600094855260126020908152604080872097875296905294909320805460ff1916600190811782558101929092556002820155600381019190915560040155565b60065481565b60085481565b611ad26114c6565b611adb57600080fd5b6011805460ff19169415159490941761ff001916610100931515939093029290921762ff0000191662010000911515919091021763ff0000001916630100000091151591909102179055565b611b2f6114c6565b611b3857600080fd5b6008805460009091556001546001600160a01b031663a9059cbb33611b5c846122ec565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611bab57600080fd5b505af1158015611bbf573d6000803e3d6000fd5b505050506040513d6020811015611bd557600080fd5b5051611c1c576040805162461bcd60e51b8152602060048201526011602482015270436f756c646e277420776974686472617760781b604482015290519081900360640190fd5b50565b611c276114c6565b611c3057600080fd5b611c1c81612699565b60008073d4dec04810fcb50ac2332b332a333f7211162c266392d66313856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611c8b57600080fd5b505af4158015611c9f573d6000803e3d6000fd5b505050506040513d6020811015611cb557600080fd5b5051604080516328c92b4960e21b815260048101879052905191925060009173d4dec04810fcb50ac2332b332a333f7211162c269163a324ad24916024808301926020929190829003018186803b158015611d0f57600080fd5b505af4158015611d23573d6000803e3d6000fd5b505050506040513d6020811015611d3957600080fd5b505184019050600c60ff82161115611d6257600182019150600c8160ff1681611d5e57fe5b0690505b600073d4dec04810fcb50ac2332b332a333f7211162c266365c72840876040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611db357600080fd5b505af4158015611dc7573d6000803e3d6000fd5b505050506040513d6020811015611ddd57600080fd5b5051604080516304646cc560e51b815261ffff8616600482015260ff808616602483015283166044820152905191925073d4dec04810fcb50ac2332b332a333f7211162c2691638c8d98a091606480820192602092909190829003018186803b158015611e4957600080fd5b505af4158015611e5d573d6000803e3d6000fd5b505050506040513d6020811015611e7357600080fd5b50519695505050505050565b6000611e896129c6565b506001600160a01b038083166000908152600c6020908152604091829020825160e081018452815460ff9081161515825260018301549382019390935260028201549381019390935260038101548083161515606085015261010090049091166080830152600481015460a08301526005015490911660c0820152611f0c612a02565b611f1982602001516122f6565b90506000611f298383600161244c565b90506000611f3f84602001518560800151611c39565b9050611f49612a02565b611f52826122f6565b905060015b856080015160ff168160ff1611611ffb576020850151855190820190600c60ff83161115611f8c57600101600c60ff83160691505b6000611fa48360ff168361ffff168b608001516115a7565b9050846020015160ff168360ff161415611fdc57611fcc87866040015160ff16836001612543565b9950505050505050505050610d6f565b611fea8782848660016125f9565b96505060019092019150611f579050565b505050505050919050565b60006116dd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612707565b60008261205757506000610cd0565b508181028183828161206557fe5b0414610cd057600080fd5b60006116dd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061279e565b60006120bc6129c6565b506001600160a01b038083166000908152600c6020908152604091829020825160e081018452815460ff9081161515825260018301549382019390935260028201549381019390935260038101548083161515606085015261010090049091166080830152600481015460a08301526005015490911660c082015261213f612a02565b61214c82602001516122f6565b9050600061215c8383600061244c565b9050600061217284602001518560800151611c39565b905061217c612a02565b612185826122f6565b905060015b856080015160ff168160ff1611612231576020850151855190820190600c60ff831611156121bf57600101600c60ff83160691505b60006121d78360ff168361ffff168b608001516115a7565b9050846020015160ff168360ff16141561220f576122038960400151866040015160ff16836000612543565b87019650505050612231565b612221896040015182848660006125f9565b969096019550505060010161218a565b5060a085015161224890849063ffffffff61200616565b979650505050505050565b600062015180600160ff84161415612282574261227782600f63ffffffff61204816565b850111915050610cd0565b8260ff16600214156122a0574261227782601e63ffffffff61204816565b8260ff16600314156122be574261227782602d63ffffffff61204816565b426122d082605a63ffffffff61204816565b85011191505092915050565b81810182811015610cd057600080fd5b600254600a0a0290565b6122fe612a02565b6000808061230b85612803565b61ffff16845261231c6107b2612893565b845161232b9061ffff16612893565b039150816301e285000283019250816107b285600001510361ffff16036301e1338002830192506000600191505b600c8260ff16116123a3576123728286600001516128ae565b60ff16620151800290508584820111156123945760ff821660208601526123a3565b92830192600190910190612359565b600191505b6123ba856020015186600001516128ae565b60ff168260ff16116123f5578584620151800111156123e15760ff821660408601526123f5565b6201518093909301926001909101906123a8565b50505050919050565b60008061241f846020015160ff16856000015161ffff1688608001516115a7565b9050600084604001518603905061243f87604001518260ff168487612543565b925050505b949350505050565b60208083015183516040805163591c568760e11b815260ff909316600484015261ffff909116602483015251600092839273d4dec04810fcb50ac2332b332a333f7211162c269263b238ad0e92604480840193919291829003018186803b1580156124b657600080fd5b505af41580156124ca573d6000803e3d6000fd5b505050506040513d60208110156124e057600080fd5b50516020850151855160808801519293506000926125069260ff169161ffff16906115a7565b9050600085604001518303905061224887604001518260ff168488612543565b60008160ff168360ff16101561253d575081610cd0565b50919050565b600081156125ca57701d6329f1c35ca4bfabb9f56100000000005b600a85111561259e576125918161063c600a6125828861271063ffffffff6122dc16565b8a91900a63ffffffff61204816565b9550600a8503945061255e565b6125bf856127100a61063c87612582612710896122dc90919063ffffffff16565b955085915050612444565b6125f061271061063c856125e4898963ffffffff61204816565b9063ffffffff61204816565b95945050505050565b6040805163591c568760e11b815260ff8416600482015261ffff851660248201529051600091829173d4dec04810fcb50ac2332b332a333f7211162c269163b238ad0e916044808301926020929190829003018186803b15801561265c57600080fd5b505af4158015612670573d6000803e3d6000fd5b505050506040513d602081101561268657600080fd5b505160ff16905061224887828886612543565b6001600160a01b0381166126ac57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600081848411156127965760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561275b578181015183820152602001612743565b50505050905090810190601f1680156127885780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836127ed5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561275b578181015183820152602001612743565b5060008385816127f957fe5b0495945050505050565b6000806107b26301e133808404810190829061281e90612893565b61282b8361ffff16612893565b039050806301e285000283019250806107b2830361ffff16036301e1338002830192505b8483111561288b5761286360018303612974565b15612876576301e2850083039250612880565b6301e13380830392505b60018203915061284f565b509392505050565b60001901600061019082046064830460048404030192915050565b60008260ff16600114806128c557508260ff166003145b806128d357508260ff166005145b806128e157508260ff166007145b806128ef57508260ff166008145b806128fd57508260ff16600a145b8061290b57508260ff16600c145b156129185750601f610cd0565b8260ff166004148061292d57508260ff166006145b8061293b57508260ff166009145b8061294957508260ff16600b145b156129565750601e610cd0565b61295f82612974565b1561296c5750601d610cd0565b50601c610cd0565b6000600382161561298757506000610d6f565b606461ffff83160661ffff166000146129a257506001610d6f565b61019061ffff83160661ffff166000146129be57506000610d6f565b506001919050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b60408051606081018252600080825260208201819052918101919091529056fe596f752063616e206f6e6c792073657420697420666f722074686973206d6f6e7468206f72206120667574757265206d6f6e7468436f6d706f756e646572732063616e2774207769746864726177206265666f726520746865792066696e697368207468656972207374616b65a264697066735822122076d4617847b5164b6653fe2f8a25c41e63396ca613a11b88597c8b74d3171ca464736f6c63430006060033

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

000000000000000000000000d379700999f4805ce80aa32db46a94df645611080000000000000000000000006878e597350ba74ab65ae9afffe0d25702a844c9

-----Decoded View---------------
Arg [0] : _token (address): 0xd379700999F4805Ce80aa32DB46A94dF64561108
Arg [1] : _burnAddress (address): 0x6878E597350Ba74ab65ae9aFfFe0D25702A844c9

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d379700999f4805ce80aa32db46a94df64561108
Arg [1] : 0000000000000000000000006878e597350ba74ab65ae9afffe0d25702a844c9


Deployed Bytecode Sourcemap

8251:20621:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8251:20621:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;12684:2548:0;;;:::i;:::-;;8695:35;;;:::i;:::-;;;;;;;;;;;;;;;;8737:38;;;:::i;22983:2017::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;22983:2017:0;;;;;;;;:::i;9007:39::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9007:39:0;-1:-1:-1;;;;;9007:39:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9007:39:0;;;;;;;;;;;;;;8642:46;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8642:46:0;;;;:::i;25200:189::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25200:189:0;-1:-1:-1;;;;;25200:189:0;;:::i;26935:107::-;;;:::i;12131:541::-;;;:::i;26634:144::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;26634:144:0;;;;;;-1:-1:-1;;;;;26634:144:0;;:::i;10267:1852::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;10267:1852:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10267:1852:0;;:::i;8563:30::-;;;:::i;5266:79::-;;;:::i;:::-;;;;-1:-1:-1;;;;;5266:79:0;;;;;;;;;;;;;;5601:115;;;:::i;:::-;;;;;;;;;;;;;;;;;;27680:233;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;27680:233:0;;;;;;;;;;;;;;;;;:::i;26790:137::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;26790:137:0;;:::i;25854:208::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25854:208:0;;;;:::i;27925:944::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;27925:944:0;;;;;;;;;;;;;;:::i;19314:2202::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;19314:2202:0;;;;;;;;:::i;27054:614::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;27054:614:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8526:30::-;;;:::i;8600:35::-;;;:::i;26074:311::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;26074:311:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26397:229::-;;;:::i;5893:109::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5893:109:0;-1:-1:-1;;;;;5893:109:0;;:::i;12684:2548::-;12740:10;12733:18;;;;:6;:18;;;;;:25;;;12725:51;;;;;-1:-1:-1;;;12725:51:0;;;;;;;;;;;;-1:-1:-1;;;12725:51:0;;;;;;;;;;;;;;;12797:18;;:::i;:::-;-1:-1:-1;12825:10:0;12818:18;;;;:6;:18;;;;;;;;12797:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12797:39:0;;;;;;;12818:18;12878:62;;:25;:62::i;:::-;12857:83;;12965:10;12959:3;:16;:35;;;;12980:5;:14;;;12979:15;12959:35;12951:69;;;;;-1:-1:-1;;;12951:69:0;;;;;;;;;;;;-1:-1:-1;;;12951:69:0;;;;;;;;;;;;;;;13041:20;13072:17;13100:20;13145:5;:14;;;13141:903;;;13191:45;13225:10;13191:33;:45::i;:::-;13176:60;;13301:37;13318:5;:19;;;13301:12;:16;;:37;;;;:::i;:::-;13286:52;-1:-1:-1;13365:28:0;13389:3;13365:19;13286:52;13382:1;13365:19;:16;:19;:::i;:::-;:23;:28;:23;:28;:::i;:::-;13353:40;;13141:903;;;13462:10;13456:3;:16;13452:509;;;13508:48;13545:10;13508:36;:48::i;:::-;13493:63;;13452:509;;;13627:55;13666:10;13678:3;13627:38;:55::i;:::-;13612:70;;13803:13;13819:49;13832:5;:15;;;13849:5;:18;;;13819:12;:49::i;:::-;:58;;13876:1;13819:58;;;13871:2;13819:58;13803:74;-1:-1:-1;13911:34:0;13941:3;13911:25;:12;:25;;;;:16;:25;:::i;:34::-;13896:49;;13452:509;;13987:28;14011:3;13987:19;:12;14004:1;13987:19;:16;:19;:::i;:28::-;13975:40;;13141:903;14064:21;14088:27;:9;14102:12;14088:27;:13;:27;:::i;:::-;14064:51;;14126:23;14152:56;14194:13;14152:37;14169:5;:19;;;14152:12;:16;;:37;;;;:::i;:::-;:41;:56;:41;:56;:::i;:::-;14126:82;-1:-1:-1;14294:43:0;14315:21;:13;14333:2;14315:21;:17;:21;:::i;:::-;14294:16;;;:43;:20;:43;:::i;:::-;14275:16;:62;14378:19;14400:28;14425:2;14400:20;:13;14418:1;14400:20;:17;:20;:::i;:28::-;14457:5;;14472:12;;14378:50;;-1:-1:-1;;;;;;14457:5:0;;;;:14;;14472:12;14486:39;14378:50;14486:26;:39::i;:::-;14457:69;;;;;;;;;;;;;-1:-1:-1;;;;;14457:69:0;-1:-1:-1;;;;;14457:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14457:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14457:69:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14457:69:0;14449:106;;;;;-1:-1:-1;;;14449:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14571:36;;;;;;;;14583:10;;14571:36;;;;;;;;;;14634:11;;:18;;14650:1;14634:18;:15;:18;:::i;:::-;14620:11;:32;14693:19;;;;14677:11;;:36;;;:15;:36;:::i;:::-;14663:11;:50;14774:18;;;;14760:33;;;;;;:13;:33;;;;;;:40;;14798:1;14760:40;:37;:40;:::i;:::-;14738:18;;;;14724:33;;;;;;:13;:33;;;;;:76;14815:14;;;;14811:170;;;14865:16;;:23;;14886:1;14865:23;:20;:23;:::i;:::-;14846:16;:42;14811:170;;;14943:19;;:26;;14967:1;14943:26;:23;:26;:::i;:::-;14921:19;:48;14811:170;15005:10;14998:18;;;;:6;:18;;;;;14991:25;;-1:-1:-1;;14991:25:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14991:25:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;14991:25:0;;;15037:5;-1:-1:-1;;;;;15037:5:0;;:14;;15064:43;15091:15;15064:26;:43::i;:::-;15037:71;;;;;;;;;;;;;-1:-1:-1;;;;;15037:71:0;-1:-1:-1;;;;;15037:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15037:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15037:71:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15037:71:0;15029:112;;;;;-1:-1:-1;;;15029:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15167:57;;;;;;;;;;;;;;15181:10;;15167:57;;;;;;;;12684:2548;;;;;;;;:::o;8695:35::-;;;;:::o;8737:38::-;;;;:::o;22983:2017::-;23077:7;23097:18;;:::i;:::-;-1:-1:-1;;;;;;23118:16:0;;;;;;;:6;:16;;;;;;;;;23097:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23155:25;;:::i;:::-;23183:36;23203:5;:15;;;23183:19;:36::i;:::-;23155:64;;23230:23;;:::i;:::-;23256:25;23276:4;23256:19;:25::i;:::-;23230:51;;23374:5;:11;;;23357:28;;:7;:13;;;:28;;;23353:219;;;23402:13;23418:66;23452:5;23459;:9;;;23470:7;23479:4;23418:33;:66::i;:::-;23402:82;;23507:26;23517:5;:15;;;23507:5;:9;;:26;;;;:::i;:::-;23499:34;-1:-1:-1;23548:12:0;;-1:-1:-1;;;;23548:12:0;23353:219;23651:13;23667:52;23698:5;23705:7;23714:4;23667:30;:52::i;:::-;23651:68;;23740:23;23766:62;23792:5;:15;;;23809:5;:18;;;23766:25;:62::i;:::-;23740:88;;23839:26;;:::i;:::-;23868:36;23888:15;23868:19;:36::i;:::-;23839:65;-1:-1:-1;23937:1:0;23925:1068;23942:5;:18;;;23939:21;;:1;:21;;;23925:1068;;24002:13;;;;24055:12;;24002:17;;;;24101:2;24086:17;;;;24082:125;;;24139:1;24124:16;24189:2;24174:17;;;;24159:32;;24082:125;24223:11;24237:53;24244:12;24237:53;;24258:11;24237:53;;24271:5;:18;;;24237:6;:53::i;:::-;24223:67;;24372:8;:14;;;24356:30;;:12;:30;;;24352:471;;;24407:13;24423:32;24431:8;:12;;;24445:5;:9;;;24423:7;:32::i;:::-;24407:48;;24537:43;24554:5;24561:7;24537:43;;24570:3;24575:4;24537:16;:43::i;:::-;24530:50;;;;;;;;;;;;;;;24352:471;24635:5;:11;;;24619:27;;:12;:27;;;24615:208;;;24762:45;24779:5;24786;:9;;;24762:45;;24797:3;24802:4;24762:16;:45::i;:::-;24755:52;;;;;;;;;;;;;;24615:208;24913:68;24937:5;24944:3;24949:11;24962:12;24976:4;24913:23;:68::i;:::-;24905:76;-1:-1:-1;;23961:3:0;;;;;-1:-1:-1;23925:1068:0;;-1:-1:-1;23925:1068:0;;;22983:2017;;;;;;;;;;;:::o;9007:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9007:39:0;;:::o;8642:46::-;;;;;;;;;;;;;:::o;25200:189::-;-1:-1:-1;;;;;25325:15:0;;25272:7;25325:15;;;:6;:15;;;;;:25;;;;25352:28;;;;;25299:82;;25325:25;25352:28;;;;;25299:25;:82::i;:::-;25292:89;;25200:189;;;;:::o;26935:107::-;27016:18;;26935:107;:::o;12131:541::-;12184:10;12177:18;;;;:6;:18;;;;;:25;;;12169:51;;;;;-1:-1:-1;;;12169:51:0;;;;;;;;;;;;-1:-1:-1;;;12169:51:0;;;;;;;;;;;;;;;12247:10;12240:18;;;;:6;:18;;;;;:27;;;;;12239:28;12231:98;;;;-1:-1:-1;;;12231:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12371:10;12342:19;12364:18;;;:6;:18;;;;;;12409:55;;12460:3;12409:38;:55::i;:::-;12475:15;;;:24;;;;;;-1:-1:-1;12528:5:0;12393:71;;-1:-1:-1;;;;;;12528:5:0;:14;12543:10;12555:33;12393:71;12555:26;:33::i;:::-;12528:61;;;;;;;;;;;;;-1:-1:-1;;;;;12528:61:0;-1:-1:-1;;;;;12528:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12528:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12528:61:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12528:61:0;12520:91;;;;;-1:-1:-1;;;12520:91:0;;;;;;;;;;;;-1:-1:-1;;;12520:91:0;;;;;;;;;;;;;;;12629:35;;;;;;;;12646:10;;12629:35;;;;;;;;;;12131:541;;:::o;26634:144::-;5478:9;:7;:9::i;:::-;5470:18;;12:1:-1;9;2:12;5470:18:0;26738:5:::1;::::0;:31:::1;::::0;;-1:-1:-1;;;26738:31:0;;-1:-1:-1;;;;;26738:31:0;;::::1;;::::0;::::1;::::0;;;;;;;;;:5;;;::::1;::::0;:14:::1;::::0;:31;;;;;::::1;::::0;;;;;;;;:5:::1;::::0;:31;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;26738:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26738:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26738:31:0;26730:40:::1;;12:1:-1;9::::0;2:12:::1;26730:40:0;26634:144:::0;;:::o;10267:1852::-;10395:10;10388:18;;;;:6;:18;;;;;:25;;;10387:26;10379:63;;;;;-1:-1:-1;;;10379:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10461:35;10482:13;10461:20;:35::i;:::-;10453:69;;;;;-1:-1:-1;;;10453:69:0;;;;;;;;;;;;-1:-1:-1;;;10453:69:0;;;;;;;;;;;;;;;10552:23;:21;:23::i;:::-;10541:7;:34;;10533:62;;;;;-1:-1:-1;;;10533:62:0;;;;;;;;;;;;-1:-1:-1;;;10533:62:0;;;;;;;;;;;;;;;10631:5;;-1:-1:-1;;;;;10631:5:0;10624:26;10651:10;10671:4;10678:35;10705:7;10678:26;:35::i;:::-;10624:90;;;;;;;;;;;;;-1:-1:-1;;;;;10624:90:0;-1:-1:-1;;;;;10624:90:0;;;;;;-1:-1:-1;;;;;10624:90:0;-1:-1:-1;;;;;10624:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10624:90:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10624:90:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10624:90:0;10616:127;;;;;-1:-1:-1;;;10616:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10768:23:0;;;;;;:51;;-1:-1:-1;;;;;;10795:17:0;;;;;;:6;:17;;;;;:24;;;10768:51;10764:460;;;-1:-1:-1;;;;;10863:17:0;;10836:24;10863:17;;;:6;:17;;;;;:31;;;:47;;10906:3;;10863:38;;10899:1;10863:38;:35;:38;:::i;:47::-;-1:-1:-1;;;;;10930:87:0;;10967:17;;;;:6;:17;;;;;;;;;:31;;;10930:87;;;;;;;;;;;;;10836:74;;-1:-1:-1;10930:87:0;;;;;;;;;;;;-1:-1:-1;;;;;11032:17:0;;;;;;:6;:17;;;;;:31;;:51;;;;;;11112:11;;:33;;11067:16;11112:33;:15;:33;:::i;:::-;11098:11;:47;-1:-1:-1;10764:460:0;;;-1:-1:-1;11200:12:0;;-1:-1:-1;;;;;11200:12:0;10764:460;11236:18;;:::i;:::-;-1:-1:-1;11257:376:0;;;;;;;;11271:4;11257:376;;;11325:3;11257:376;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11257:376:0;;;;;;-1:-1:-1;;;;;11257:376:0;;;;;;;;;11689:10;11682:18;;:6;:18;;;;;;;:26;;;;-1:-1:-1;;11682:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11682:26:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11682:26:0;;;;;;;;;11733:11;;11257:376;;11733:18;;:11;:15;:18::i;:::-;11719:11;:32;11776:11;;:24;;11792:7;11776:24;:15;:24;:::i;:::-;11762:11;:38;11811:28;;;;;;;:13;:28;;;;;:33;;11843:1;11811:33;;;11855:165;;;;11904:16;;:23;;11925:1;11904:23;:20;:23;:::i;:::-;11885:16;:42;11855:165;;;11982:19;;:26;;12006:1;11982:26;:23;:26;:::i;:::-;11960:19;:48;11855:165;12045:66;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12045:66:0;;;;;;;;12054:10;;12045:66;;;;;;;;;;10267:1852;;;;;:::o;8563:30::-;;;;:::o;5266:79::-;5304:7;5331:6;-1:-1:-1;;;;;5331:6:0;5266:79;:::o;5601:115::-;5641:4;5679:6;;-1:-1:-1;;;;;5679:6:0;5665:10;:20;;:43;;-1:-1:-1;5702:6:0;;-1:-1:-1;;;;;5702:6:0;5689:9;:19;5665:43;5658:50;;5601:115;:::o;27680:233::-;5478:9;:7;:9::i;:::-;5470:18;;12:1:-1;9;2:12;5470:18:0;27792:12:::1;:20:::0;;;;27823:12:::1;:20:::0;;;;27854:12:::1;:20:::0;27885:12:::1;:20:::0;27680:233::o;26790:137::-;5478:9;:7;:9::i;:::-;5470:18;;12:1:-1;9;2:12;5470:18:0;26879::::1;:40:::0;26790:137::o;25854:208::-;25939:14;;25914:4;;25939:14;;:24;;;;;25957:1;:6;;25962:1;25957:6;25939:24;25938:56;;;-1:-1:-1;25969:14:0;;;;;;;:24;;;;;25987:1;:6;;25992:1;25987:6;25969:24;25938:86;;;-1:-1:-1;25999:14:0;;;;;;;:24;;;;;26017:1;:6;;26022:1;26017:6;25999:24;25938:116;;;-1:-1:-1;26029:14:0;;;;;;;:24;;;;-1:-1:-1;;26047:6:0;;26052:1;26047:6;;25854:208::o;27925:944::-;28011:7;28035:10;;;:4;:10;;;;;;;;:17;;;;;;;;:24;;;28031:461;;;28080:12;:17;;28096:1;28080:17;28076:405;;;-1:-1:-1;28125:10:0;;;;:4;:10;;;;;;;;:17;;;;;;;;:22;;;28118:29;;28076:405;28186:12;:17;;28202:1;28186:17;28182:299;;;-1:-1:-1;28231:10:0;;;;:4;:10;;;;;;;;:17;;;;;;;;:22;;;28224:29;;28182:299;28292:12;:17;;28308:1;28292:17;28288:193;;;-1:-1:-1;28337:10:0;;;;:4;:10;;;;;;;;:17;;;;;;;;:22;;;28330:29;;28288:193;28398:12;:17;;28414:1;28398:17;28394:87;;;-1:-1:-1;28443:10:0;;;;:4;:10;;;;;;;;:17;;;;;;;;:22;;;28436:29;;28394:87;28516:12;:17;;28532:1;28516:17;28512:321;;;-1:-1:-1;28557:12:0;;28550:19;;28512:321;28600:12;:17;;28616:1;28600:17;28596:237;;;-1:-1:-1;28641:12:0;;28634:19;;28596:237;28684:12;:17;;28700:1;28684:17;28680:153;;;-1:-1:-1;28725:12:0;;28718:19;;28680:153;28768:12;:17;;28784:1;28768:17;28764:69;;;-1:-1:-1;28809:12:0;;28802:19;;28764:69;-1:-1:-1;28860:1:0;27925:944;;;;;;:::o;19314:2202::-;19415:7;19435:18;;:::i;:::-;-1:-1:-1;;;;;;19456:16:0;;;;;;;:6;:16;;;;;;;;;19435:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19493:25;;:::i;:::-;19521:36;19541:5;:15;;;19521:19;:36::i;:::-;19493:64;;19568:23;;:::i;:::-;19594:25;19614:4;19594:19;:25::i;:::-;19568:51;;19712:5;:11;;;19695:28;;:7;:13;;;:28;;;19691:220;;;19740:13;19756:67;19790:5;19797;:9;;;19808:7;19817:5;19756:33;:67::i;19691:220::-;19990:13;20006:53;20037:5;20044:7;20053:5;20006:30;:53::i;:::-;19990:69;;20080:23;20106:62;20132:5;:15;;;20149:5;:18;;;20106:25;:62::i;:::-;20080:88;;20179:26;;:::i;:::-;20208:36;20228:15;20208:19;:36::i;:::-;20179:65;-1:-1:-1;20277:1:0;20265:1166;20282:5;:18;;;20279:21;;:1;:21;;;20265:1166;;20342:13;;;;20395:12;;20342:17;;;;20441:2;20426:17;;;;20422:125;;;20479:1;20464:16;20529:2;20514:17;;;;20499:32;;20422:125;20563:11;20577:53;20584:12;20577:53;;20598:11;20577:53;;20611:5;:18;;;20577:6;:53::i;:::-;20563:67;;20712:8;:14;;;20696:30;;:12;:30;;;20692:553;;;20747:13;20763:32;20771:8;:12;;;20785:5;:9;;;20763:7;:32::i;:::-;20747:48;;20879:58;20896:5;:19;;;20917:7;20879:58;;20926:3;20931:5;20879:16;:58::i;:::-;20870:67;;;;20956:5;;;;;;20692:553;21016:5;:11;;;21000:27;;:12;:27;;;20996:249;;;21145:60;21162:5;:19;;;21183:5;:9;;;21145:60;;21194:3;21199:5;21145:16;:60::i;:::-;21136:69;;;;21224:5;;;;;20996:249;21336:83;21360:5;:19;;;21381:3;21386:11;21399:12;21413:5;21336:23;:83::i;:::-;21327:92;;;;;-1:-1:-1;;;20301:3:0;;20265:1166;;;-1:-1:-1;21469:15:0;;;;21459:26;;:5;;:26;:9;:26;:::i;:::-;21451:34;19314:2202;-1:-1:-1;;;;;;;;;19314:2202:0:o;27054:614::-;5478:9;:7;:9::i;:::-;5470:18;;12:1:-1;9;2:12;5470:18:0;27190::::1;27211:4;:12;27224:3;27211:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;27211:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27211:17:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;27211:17:0;27261:18:::1;::::0;;-1:-1:-1;;;27261:18:0;;27275:3:::1;27261:18;::::0;::::1;::::0;;;27190:38:::1;::::0;;::::1;::::0;-1:-1:-1;27239:19:0::1;::::0;27261:4:::1;::::0;:13:::1;::::0;:18;;;;;27211:17:::1;::::0;27261:18;;;;;;;:4;:18;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;27261:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;27261:18:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;27261:18:0;27239:40:::1;;::::0;-1:-1:-1;27309:21:0;;::::1;::::0;::::1;::::0;:45:::1;;;27344:10;27335:5;:19;27309:45;27308:69;;;;27367:10;27359:5;:18;27308:69;27300:134;;;;-1:-1:-1::0;;;27300:134:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;27455:11:0::1;::::0;;;:4:::1;:11;::::0;;;;;;;:19;;;;;;;;;;:33;;-1:-1:-1;;27455:33:0::1;27484:4;27455:33:::0;;::::1;::::0;;27499:24;::::1;:32:::0;;;;27542:24:::1;::::0;::::1;:32:::0;27585:24:::1;::::0;::::1;:32:::0;;;;27628:24:::1;;:32:::0;27054:614::o;8526:30::-;;;;:::o;8600:35::-;;;;:::o;26074:311::-;5478:9;:7;:9::i;:::-;5470:18;;12:1:-1;9;2:12;5470:18:0;26216:14:::1;:32:::0;;-1:-1:-1;;26216:32:0::1;::::0;::::1;;::::0;;;::::1;-1:-1:-1::0;;26259:32:0::1;26216;26259::::0;::::1;;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;26302:32:0::1;::::0;;::::1;;::::0;;;::::1;;-1:-1:-1::0;;26345:32:0::1;::::0;;::::1;;::::0;;;::::1;;::::0;;26074:311::o;26397:229::-;5478:9;:7;:9::i;:::-;5470:18;;12:1:-1;9;2:12;5470:18:0;26468:16:::1;::::0;;26451:14:::1;26495:20:::0;;;-1:-1:-1;26534:5:0;-1:-1:-1;;;;;26534:5:0::1;:14;26549:10;26561:34;26468:16:::0;26561:26:::1;:34::i;:::-;26534:62;;;;;;;;;;;;;-1:-1:-1::0;;;;;26534:62:0::1;-1:-1:-1::0;;;;;26534:62:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26534:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26534:62:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;26534:62:0;26526:92:::1;;;::::0;;-1:-1:-1;;;26526:92:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26526:92:0;;;;;;;;;;;;;::::1;;5499:1;26397:229::o:0;5893:109::-;5478:9;:7;:9::i;:::-;5470:18;;12:1:-1;9;2:12;5470:18:0;5966:28:::1;5985:8;5966:18;:28::i;25401:441::-:0;25500:7;25520:11;25534:4;:12;25547:10;25534:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25534:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25534:24:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25534:24:0;25583:25;;;-1:-1:-1;;;25583:25:0;;;;;;;;;;25534:24;;-1:-1:-1;25569:11:0;;25583:4;;:13;;:25;;;;;25534:24;;25583:25;;;;;;;:4;:25;;;2:2:-1;;;;27:1;24;17:12;2:2;25583:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25583:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25583:25:0;25619:22;;;-1:-1:-1;25664:2:0;25656:10;;;;25652:85;;;25691:1;25683:9;;;;25723:2;25715:5;:10;;;;;;;;25707:18;;25652:85;25747:9;25759:4;:11;25771:10;25759:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25759:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25759:23:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25759:23:0;25800:34;;;-1:-1:-1;;;25800:34:0;;;;;;;;;;;;;;;;;;;;;;;;;25759:23;;-1:-1:-1;25800:4:0;;:16;;:34;;;;;25759:23;;25800:34;;;;;;;;:4;:34;;;2:2:-1;;;;27:1;24;17:12;2:2;25800:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25800:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25800:34:0;;25401:441;-1:-1:-1;;;;;;25401:441:0:o;21606:1310::-;21690:7;21710:18;;:::i;:::-;-1:-1:-1;;;;;;21731:16:0;;;;;;;:6;:16;;;;;;;;;21710:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21768:25;;:::i;:::-;21796:36;21816:5;:15;;;21796:19;:36::i;:::-;21768:64;;21853:13;21869:52;21900:5;21907:7;21916:4;21869:30;:52::i;:::-;21853:68;;21942:23;21968:62;21994:5;:15;;;22011:5;:18;;;21968:25;:62::i;:::-;21942:88;;22041:26;;:::i;:::-;22070:36;22090:15;22070:19;:36::i;:::-;22041:65;-1:-1:-1;22139:1:0;22127:782;22144:5;:18;;;22141:21;;:1;:21;;;22127:782;;22204:13;;;;22257:12;;22204:17;;;;22303:2;22288:17;;;;22284:125;;;22341:1;22326:16;22391:2;22376:17;;;;22361:32;;22284:125;22425:11;22439:53;22446:12;22439:53;;22460:11;22439:53;;22473:5;:18;;;22439:6;:53::i;:::-;22425:67;;22577:8;:14;;;22561:30;;:12;:30;;;22557:182;;;22675:48;22692:5;22699:8;:12;;;22675:48;;22713:3;22718:4;22675:16;:48::i;:::-;22668:55;;;;;;;;;;;;;22557:182;22829:68;22853:5;22860:3;22865:11;22878:12;22892:4;22829:23;:68::i;:::-;22821:76;-1:-1:-1;;22163:3:0;;;;;-1:-1:-1;22127:782:0;;-1:-1:-1;22127:782:0;;;21606:1310;;;;;;;;:::o;7403:136::-;7461:7;7488:43;7492:1;7495;7488:43;;;;;;;;;;;;;;;;;:3;:43::i;7188:203::-;7246:9;7272:6;7268:47;;-1:-1:-1;7302:1:0;7295:8;;7268:47;-1:-1:-1;7329:5:0;;;7333:1;7329;:5;:1;7353:5;;;;;:10;7345:19;;12:1:-1;9;2:12;7755:132:0;7813:7;7840:39;7844:1;7847;7840:39;;;;;;;;;;;;;;;;;:3;:39::i;17749:1449::-;17836:7;17856:18;;:::i;:::-;-1:-1:-1;;;;;;17877:16:0;;;;;;;:6;:16;;;;;;;;;17856:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17914:25;;:::i;:::-;17942:36;17962:5;:15;;;17942:19;:36::i;:::-;17914:64;;17999:13;18015:53;18046:5;18053:7;18062:5;18015:30;:53::i;:::-;17999:69;;18089:23;18115:62;18141:5;:15;;;18158:5;:18;;;18115:25;:62::i;:::-;18089:88;;18188:26;;:::i;:::-;18217:36;18237:15;18217:19;:36::i;:::-;18188:65;-1:-1:-1;18286:1:0;18274:839;18291:5;:18;;;18288:21;;:1;:21;;;18274:839;;18351:13;;;;18404:12;;18351:17;;;;18450:2;18435:17;;;;18431:125;;;18488:1;18473:16;18538:2;18523:17;;;;18508:32;;18431:125;18572:11;18586:53;18593:12;18586:53;;18607:11;18586:53;;18620:5;:18;;;18586:6;:53::i;:::-;18572:67;;18724:8;:14;;;18708:30;;:12;:30;;;18704:223;;;18824:63;18841:5;:19;;;18862:8;:12;;;18824:63;;18876:3;18881:5;18824:16;:63::i;:::-;18815:72;;;;18906:5;;;;;18704:223;19018:83;19042:5;:19;;;19063:3;19068:11;19081:12;19095:5;19018:23;:83::i;:::-;19009:92;;;;;-1:-1:-1;;;18310:3:0;;18274:839;;;-1:-1:-1;19151:15:0;;;;19141:26;;:5;;:26;:9;:26;:::i;:::-;19133:34;17749:1449;-1:-1:-1;;;;;;;17749:1449:0:o;15391:489::-;15477:4;15508:12;15562:1;15545:18;;;;15541:88;;;15614:3;15600:11;:3;15608:2;15600:11;:7;:11;:::i;:::-;15587:10;:24;:30;15580:37;;;;;15541:88;15643:13;:18;;15660:1;15643:18;15639:88;;;15712:3;15698:11;:3;15706:2;15698:11;:7;:11;:::i;15639:88::-;15741:13;:18;;15758:1;15741:18;15737:88;;;15810:3;15796:11;:3;15804:2;15796:11;:7;:11;:::i;15737:88::-;15869:3;15855:11;:3;15863:2;15855:11;:7;:11;:::i;:::-;15842:10;:24;:30;15835:37;;;15391:489;;;;:::o;7038:142::-;7122:5;;;7146:6;;;;7138:15;;12:1:-1;9;2:12;15244:135:0;15363:8;;15357:2;:14;15347:24;;15244:135::o;1324:1147::-;1387:15;;:::i;:::-;1415:24;;;1520:18;1528:9;1520:7;:18::i;:::-;1510:28;;;;1582;351:4;1582:15;:28::i;:::-;1571:7;;1555:24;;;;:15;:24::i;:::-;:55;1549:61;;1669:3;304:8;1646:26;1623:49;;;;1749:3;351:4;1725:2;:7;;;:21;:27;;;252:8;1706:47;1683:70;;;;1784:19;1823:1;1819:5;;1814:336;1831:2;1826:1;:7;;;1814:336;;1893:26;1908:1;1911:2;:7;;;1893:14;:26::i;:::-;1876:43;;208:5;1876:43;1859:60;;1981:9;1959:19;1942:14;:36;:48;1938:145;;;2019:12;;;:8;;;:12;2058:5;;1938:145;2101:37;;;;1835:3;;;;;1814:336;;;2187:1;2183:5;;2178:286;2195:33;2210:2;:8;;;2220:2;:7;;;2195:14;:33::i;:::-;2190:38;;:1;:38;;;2178:286;;2297:9;2275:19;208:5;2258:36;:48;2254:143;;;2335:10;;;:6;;;:10;2372:5;;2254:143;208:5;2415:37;;;;;2230:3;;;;;2178:286;;;1324:1147;;;;;;;:::o;15892:385::-;16041:7;16061:11;16075:57;16082:8;:14;;;16075:57;;16098:8;:13;;;16075:57;;16113:5;:18;;;16075:6;:57::i;:::-;16061:71;;16143:15;16173:8;:12;;;16161:9;:24;16143:42;;16203:66;16220:5;:19;;;16241:9;16203:66;;16252:3;16257:11;16203:16;:66::i;:::-;16196:73;;;;15892:385;;;;;;;:::o;16285:444::-;16472:14;;;;;16488:13;;16452:50;;;-1:-1:-1;;;16452:50:0;;;;;;;;;;;;;;;;;;;16414:7;;;;16452:4;;:19;;:50;;;;;16472:14;;16452:50;;;;;;:4;:50;;;2:2:-1;;;;27:1;24;17:12;2:2;16452:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16452:50:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16452:50:0;;16534:14;;;16550:13;;16565:18;;;;16452:50;;-1:-1:-1;16513:11:0;;16527:57;;;;;;;;:6;:57::i;:::-;16513:71;;16595:15;16625:8;:12;;;16613:9;:24;16595:42;;16655:66;16672:5;:19;;;16693:9;16655:66;;16704:3;16709:11;16655:16;:66::i;25012:176::-;25076:5;25105:4;25098:11;;:4;:11;;;25094:55;;;-1:-1:-1;25133:4:0;25126:11;;25094:55;-1:-1:-1;25176:4:0;25012:176;-1:-1:-1;25012:176:0:o;17053:604::-;17174:7;17198:11;17194:354;;;17246:11;17272:159;17290:2;17278:9;:14;17272:159;;;17328:53;17371:9;17328:38;17363:2;17345:14;:3;17353:5;17345:14;:7;:14;:::i;:::-;17328:12;;17345:20;;17328:38;:16;:38;:::i;:53::-;17313:68;;17413:2;17400:15;;;;17272:159;;;17467:69;17526:9;17517:5;:18;17467:45;17502:9;17484:14;17492:5;17484:3;:7;;:14;;;;:::i;17467:69::-;17452:84;;;17445:91;;;;;17194:354;17602:47;17643:5;17602:36;17634:3;17602:27;:12;17619:9;17602:27;:16;:27;:::i;:::-;:31;:36;:31;:36;:::i;:47::-;17595:54;17053:604;-1:-1:-1;;;;;17053:604:0:o;16741:300::-;16920:34;;;-1:-1:-1;;;16920:34:0;;;;;;;;;;;;;;;;;;16880:7;;;;16920:4;;:19;;:34;;;;;;;;;;;;;;:4;:34;;;2:2:-1;;;;27:1;24;17:12;2:2;16920:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16920:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16920:34:0;16900:54;;;-1:-1:-1;16972:61:0;16989:13;16900:54;17015:4;17021:11;16972:16;:61::i;6152:187::-;-1:-1:-1;;;;;6226:22:0;;6218:31;;12:1:-1;9;2:12;6218:31:0;6286:6;;;6265:38;;-1:-1:-1;;;;;6265:38:0;;;;6286:6;;;6265:38;;;6314:6;:17;;-1:-1:-1;;;;;;6314:17:0;-1:-1:-1;;;;;6314:17:0;;;;;;;;;;6152:187::o;7551:192::-;7637:7;7673:12;7665:6;;;;7657:29;;;;-1:-1:-1;;;7657:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7657:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7709:5:0;;;7551:192::o;7899:345::-;7985:7;8087:12;8080:5;8072:28;;;;-1:-1:-1;;;8072:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;8072:28:0;;8111:9;8127:1;8123;:5;;;;;;;7899:345;-1:-1:-1;;;;;7899:345:0:o;2479:845::-;2533:6;;351:4;252:8;2688:27;;2674:41;;;2533:6;;2766:28;;:15;:28::i;:::-;2742:21;2758:4;2742:21;;:15;:21::i;:::-;:52;2727:67;;2853:12;304:8;2830:35;2807:58;;;;2939:12;351:4;2918;:18;:33;;;252:8;2899:53;2876:76;;;;2965:330;2994:9;2972:19;:31;2965:330;;;3028:28;3053:1;3046:4;:8;3028:10;:28::i;:::-;3024:232;;;304:8;3085:43;;;;3024:232;;;252:8;3198:38;;;;3024:232;3282:1;3274:9;;;;2965:330;;;-1:-1:-1;3312:4:0;2479:845;-1:-1:-1;;;2479:845:0:o;681:143::-;-1:-1:-1;;755:9:0;738:4;813:3;755:9;806:10;800:3;793:4;:10;789:1;782:4;:8;:21;:34;;681:143;-1:-1:-1;;681:143:0:o;832:484::-;903:5;925;:10;;934:1;925:10;:24;;;;939:5;:10;;948:1;939:10;925:24;:38;;;;953:5;:10;;962:1;953:10;925:38;:52;;;;967:5;:10;;976:1;967:10;925:52;:66;;;;981:5;:10;;990:1;981:10;925:66;:81;;;;995:5;:11;;1004:2;995:11;925:81;:96;;;;1010:5;:11;;1019:2;1010:11;925:96;921:388;;;-1:-1:-1;1049:2:0;1042:9;;921:388;1082:5;:10;;1091:1;1082:10;:24;;;;1096:5;:10;;1105:1;1096:10;1082:24;:38;;;;1110:5;:10;;1119:1;1110:10;1082:38;:53;;;;1124:5;:11;;1133:2;1124:11;1082:53;1078:231;;;-1:-1:-1;1163:2:0;1156:9;;1078:231;1196:16;1207:4;1196:10;:16::i;:::-;1192:117;;;-1:-1:-1;1240:2:0;1233:9;;1192:117;-1:-1:-1;1295:2:0;1288:9;;364:309;418:4;439:8;;;:13;435:62;;-1:-1:-1;480:5:0;473:12;;435:62;518:3;511:10;;;;:15;;525:1;511:15;507:63;;-1:-1:-1;554:4:0;547:11;;507:63;591:3;584:10;;;;:15;;598:1;584:15;580:64;;-1:-1:-1;627:5:0;620:12;;580:64;-1:-1:-1;661:4:0;364:309;;;:::o;8251:20621::-;;;;;;;;;-1:-1:-1;8251:20621:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;8251:20621:0;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://76d4617847b5164b6653fe2f8a25c41e63396ca613a11b88597c8b74d3171ca4

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.