Contract 0x4Aa152e14b34f3618dFE9f6c21523400532D44F7

Contract Overview

Balance:
0 MATIC
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x5a8cf857db33a574a0df7afc157514a05be5b2de3cfa6744b21d412efb149d18New Mecenas Pool218393402021-11-23 21:58:187 days 5 hrs ago0x2b56089fd96537e5a59435384c83d847d4c68aae IN  0x4aa152e14b34f3618dfe9f6c21523400532d44f70 MATIC0.0132649615
0xe0f142119a7917a63613362f997fddb2704ac150ad11295f384a5fdb0b1e3d76New Mecenas Pool215054502021-11-15 17:39:1115 days 9 hrs ago0xff89895e587d9dd599c6567f8f1fab2e0f8dc81b IN  0x4aa152e14b34f3618dfe9f6c21523400532d44f70 MATIC0.011421267
0x50299f11b4f92d6f65a8c4cc05ed29d13c68fb7fa35d46ef5d700b123749bfa2New Mecenas Pool214169782021-11-13 14:32:2317 days 12 hrs ago0x2b56089fd96537e5a59435384c83d847d4c68aae IN  0x4aa152e14b34f3618dfe9f6c21523400532d44f70 MATIC0.011369967
0x03e91a3a58d22b2b08177fee67bcc0700fbb8f586cb77c720391b4e1a2a538e4New Mecenas Pool214131642021-11-13 12:21:1517 days 15 hrs ago0x2b56089fd96537e5a59435384c83d847d4c68aae IN  0x4aa152e14b34f3618dfe9f6c21523400532d44f70 MATIC0.015159956
0x96b18768634d948704b551e0c6e60a699b49a7922f801cd887dd9be68fbb256bNew Mecenas Pool214131412021-11-13 12:20:2917 days 15 hrs ago0x2b56089fd96537e5a59435384c83d847d4c68aae IN  0x4aa152e14b34f3618dfe9f6c21523400532d44f70 MATIC0.015365156
0xee5c0c574048d72f9e0374b7e84769057cc9fdd9a8c4d0be479c10a46ad464570x60806040214129092021-11-13 12:12:2917 days 15 hrs ago0x2b56089fd96537e5a59435384c83d847d4c68aae IN  Contract Creation0 MATIC0.019797388
[ Download CSV Export 
Latest 5 internal transactions
Parent Txn Hash Block From To Value
0x5a8cf857db33a574a0df7afc157514a05be5b2de3cfa6744b21d412efb149d18218393402021-11-23 21:58:187 days 5 hrs ago 0x4aa152e14b34f3618dfe9f6c21523400532d44f7  Contract Creation0 MATIC
0xe0f142119a7917a63613362f997fddb2704ac150ad11295f384a5fdb0b1e3d76215054502021-11-15 17:39:1115 days 9 hrs ago 0x4aa152e14b34f3618dfe9f6c21523400532d44f7  Contract Creation0 MATIC
0x50299f11b4f92d6f65a8c4cc05ed29d13c68fb7fa35d46ef5d700b123749bfa2214169782021-11-13 14:32:2317 days 12 hrs ago 0x4aa152e14b34f3618dfe9f6c21523400532d44f7  Contract Creation0 MATIC
0x03e91a3a58d22b2b08177fee67bcc0700fbb8f586cb77c720391b4e1a2a538e4214131642021-11-13 12:21:1517 days 15 hrs ago 0x4aa152e14b34f3618dfe9f6c21523400532d44f7  Contract Creation0 MATIC
0x96b18768634d948704b551e0c6e60a699b49a7922f801cd887dd9be68fbb256b214131412021-11-13 12:20:2917 days 15 hrs ago 0x4aa152e14b34f3618dfe9f6c21523400532d44f7  Contract Creation0 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MecenasFactoryV3

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 3: MecenasFactoryV3.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./MecenasV3.sol";


contract MecenasFactoryV3 {

    address public constant EMPTY_ADDRESS_FACTORY = address(0);

    struct Pool {
        MecenasV3 newpool;
        address newmarket;
        address newunderlying;
        string newnametoken;
    }
    
    mapping(address => Pool[]) public OwnerPools;
    mapping(MecenasV3 => uint) public MapPools;
    Pool[] public FactoryPools;

    uint public counterpools;

    address public factoryowner;
    address public factorydeveloper;
    address public factoryseeker;

    bool public lockfactory;

 
    event ChildCreated(address childAddress, address indexed yield, address indexed underlying, address indexed owner, uint _mindeposit, uint _agedeposit, uint _agelottery);
    event ChangeFactoryDeveloper(address indexed olddeveloper, address indexed newdeveloper);
    event ChangeFactorySeeker(address indexed oldseeker, address indexed newseeker);
    event ChangeFactoryOwner(address indexed oldowner, address indexed newowner);
    event ChangeFactoryLock(bool oldlock, bool newlock);


    constructor(address _developer, address _seeker) {
        factoryowner = msg.sender;
        factorydeveloper = _developer;
        factoryseeker = _seeker;
    }    

    
    // this function changes the factory developer address

    function changedeveloper(address _newdeveloper) public {
        require(_newdeveloper != EMPTY_ADDRESS_FACTORY && msg.sender == factoryowner);
        address olddeveloper = factorydeveloper;
        factorydeveloper = _newdeveloper;
    
        emit ChangeFactoryDeveloper(olddeveloper, factorydeveloper);
    }


    // this function changes the factory seeker address

    function changeseeker(address _newseeker) public {
        require(_newseeker != EMPTY_ADDRESS_FACTORY && msg.sender == factoryowner);
        address oldseeker = factoryseeker;
        factoryseeker = _newseeker;
    
        emit ChangeFactorySeeker(oldseeker, factoryseeker);
    }


    // this function changes the factory owner address

    function changeowner(address _newowner) public {
        require(_newowner != EMPTY_ADDRESS_FACTORY && msg.sender == factoryowner);
        address oldowner = factoryowner;
        factoryowner = _newowner;
    
        emit ChangeFactoryOwner(oldowner, factoryowner);
    }


    // this function locks and unlocks de factory 
    // false = unlock
    // true = lock
    

    function changelockfactory(bool _newlock) public {
        require(_newlock == true || _newlock == false);
        require(msg.sender == factoryowner);
        bool oldlock = lockfactory;
        lockfactory = _newlock;
    
        emit ChangeFactoryLock(oldlock, lockfactory);
    }


    // this function creates a nwe Mecenas pool

    function newMecenasPool(address _yield, uint mindeposit, uint agedeposit, uint agelottery) external {
        require(lockfactory == false);
        require(msg.sender != EMPTY_ADDRESS_FACTORY && _yield != EMPTY_ADDRESS_FACTORY);
        require(mindeposit > 0 && agedeposit > 0 && agelottery > 0 );
        
        counterpools++;
    
        MecenasV3 newpool = new MecenasV3(msg.sender, _yield, factorydeveloper, factoryseeker, mindeposit, agedeposit, agelottery);
    
        CreamYield marketfactory = CreamYield(_yield);
        ERC20 underlyingfactory = ERC20(marketfactory.underlying()); 
        string memory nametokenfactory = underlyingfactory.symbol();
        
        OwnerPools[msg.sender].push(Pool(MecenasV3(newpool), address(_yield), address(underlyingfactory), nametokenfactory));
        MapPools[newpool] = 1;
        FactoryPools.push(Pool(MecenasV3(newpool), address(_yield), address(underlyingfactory), nametokenfactory));
        
        emit ChildCreated(address(newpool), address(_yield), address(underlyingfactory), msg.sender, mindeposit, agedeposit, agelottery);
    }
    
    
    // this function returns an array of struct of pools created by owner
    
    function getOwnerPools(address _account) external view returns (Pool[] memory) {
      return OwnerPools[_account];
    } 


    // this function returns an array of struct of pools created
    
    function getTotalPools() external view returns (Pool[] memory) {
      return FactoryPools;
    }

}

File 2 of 3: MecenasV3.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ReentrancyGuard.sol";


interface ERC20 {

    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
}


interface CreamYield {
    
    function mint(uint mintAmount) external returns (uint);
    function redeemUnderlying(uint redeemAmount) external returns (uint);
    function balanceOfUnderlying(address owner) external returns (uint);
    function getCash() external view returns (uint);
    function underlying() external view returns (address);
}


contract MecenasV3 is ReentrancyGuard {

    address public constant EMPTY_ADDRESS = address(0);
    uint public immutable LOT_DEPOSIT;
    uint public immutable LOCK_PLAYERS;
    uint public immutable LOCK_LOTTERY;

    CreamYield public marketcream;
    ERC20 public underlying;
    
    uint public totalseekerinterest;
    uint public totaldevelopinterest;
    uint public reservevalue;
    uint public totalinterestpaid;
    uint public totalreservepaid;
    uint public supporters;
    uint public lockdeposits;
    uint public jackpotvalue;
    uint public interestvalue;
    uint private nonce;
    uint private blockNumber;
    
    bool public spinning;
    bool public picking;

    uint public jackpotsettled;
    uint public timejackpot;
    uint public supporterslottery;
    uint public jackpotspaid;
    uint public lastjackpotresult;
    address public lastjackpotwinner;
    uint public lastjackpotamount;
    uint public lastjackpotdate;
    uint public developsettled;
    uint public seekersettled;
    
    uint public lastjackpotcounter;
    
    uint public balancedonations;
    uint public totaldonations;
    uint public totaldonationspaid;
    mapping(address => uint) public balancedonators;
    mapping(address => uint) public balancepatrons;
    uint public balancepool;

    uint public decimalstoken;
    string public nametoken;

    address[] private players;
    
    mapping(address => uint) public timeplayers;
    
    mapping(address => uint) private indexplayers;
    
    address public owner;
    address public developer;
    address public seeker;

    uint public lotterycounter;
    
    struct Lottery {
        uint lotteryid;
        uint lotterydate;
        uint lotteryresult;
        address lotterywinner;
        uint lotteryamount;
    }    
    
    Lottery[] public LotteryResults;
    
    event Deposit(address indexed from, uint amount);
    event Withdraw(address indexed to, uint amount);
    event DepositDonation(address indexed from, uint amount);
    event WithdrawDonation(address indexed to, uint amount);
    event CollectInterest(address indexed to, uint amount);
    event CollectReserve(address indexed to, uint amount);
    event PayWinner(address indexed to, uint amount);
    event PayDeveloper(address indexed to, uint amount);
    event PaySeeker(address indexed to, uint amount);
    event ChangeOwner(address indexed oldowner, address indexed newowner);
    event ChangeDeveloper(address indexed olddeveloper, address indexed newdeveloper);
    event ChangeSeeker(address indexed oldseeker, address indexed newseeker);
    event ChangePoolLock(address indexed ownerchanger, uint oldlock, uint newlock);
    event LotteryAwarded(uint counter, uint date, address indexed thewinner, uint amount, uint result);
    
    
    constructor(address _owner, address _marketcream, address _developer, address _seeker, uint _mindeposit, uint _agedeposit, uint _agelottery) {
        
        marketcream = CreamYield(_marketcream);
        underlying = ERC20(marketcream.underlying());
        owner = _owner;
        developer = _developer;
        seeker = _seeker;
        LOT_DEPOSIT = _mindeposit;
        LOCK_PLAYERS = _agedeposit;
        LOCK_LOTTERY = _agelottery;
        decimalstoken = underlying.decimals();
        nametoken = underlying.symbol();
    }


    // this modifier checks if msg.sender is the owner
    
    modifier onlyowner() {
        require(msg.sender == owner);
        _;
    }

    
    // this function modifies the address of the owner
    
    function transferowner(address _newowner) external onlyowner {
        require(_newowner != EMPTY_ADDRESS);
        address oldowner = owner;
        owner = _newowner;
    
        emit ChangeOwner(oldowner, owner);
    }


    // this function modifies the address of the developer

    function transferdeveloper(address _newdeveloper) external {
        require(_newdeveloper != EMPTY_ADDRESS && msg.sender == developer);
        address olddeveloper = developer;
        developer = _newdeveloper;
    
        emit ChangeDeveloper(olddeveloper, developer);
    }


    // this function modifies the address of the seeker

    function transferseeker(address _newseeker) external {
        require(_newseeker != EMPTY_ADDRESS && msg.sender == seeker);
        address oldseeker = seeker;
        seeker = _newseeker;
    
        emit ChangeSeeker(oldseeker, seeker);
    }


    // this function is used to lock or unlock functions deposit() and depositdonation()
    // 0 = unlock 
    // 1 = lock
    
    function lockpool(uint _lockdeposits) external onlyowner {
        require(_lockdeposits == 1 || _lockdeposits == 0);
        uint oldlockdeposits = lockdeposits;
        lockdeposits = _lockdeposits;
    
        emit ChangePoolLock(owner, oldlockdeposits, lockdeposits);
    }
    
    
    // this function is used to deposit underlying and transfer it to yield source
    // evaluates if is a jackpot participant
    
    function deposit(uint _amount) external nonReentrant {
        require(spinning == false && lockdeposits == 0 && msg.sender != EMPTY_ADDRESS);
        require(_amount > 0 && underlying.balanceOf(msg.sender) >= _amount);
        require(underlying.allowance(msg.sender, address(this)) >= _amount);
        
        require(underlying.transferFrom(msg.sender, address(this), _amount) == true);
        
        uint balancesupporter = balancepatrons[msg.sender];
        
        if (balancesupporter == 0) {
            supporters += 1;
            if (_amount >= LOT_DEPOSIT) {
                supporterslottery += 1;
                players.push(msg.sender);
                indexplayers[msg.sender] = players.length - 1;
                timeplayers[msg.sender] = block.timestamp;
            } 
        }
        
        if (balancesupporter > 0) {
            if (balancesupporter < LOT_DEPOSIT && (balancesupporter + _amount) >= LOT_DEPOSIT) {
                supporterslottery += 1;
                players.push(msg.sender);
                indexplayers[msg.sender] = players.length - 1;
                timeplayers[msg.sender] = block.timestamp;
            }
        }
        
        if (supporterslottery > 0 && timejackpot == 0 && spinning == false) {
            timejackpot = block.timestamp;
        }
        
        require(underlying.approve(address(marketcream), _amount) == true);
        balancepatrons[msg.sender] += _amount;
        balancepool += _amount;
        
        require(marketcream.mint(_amount) == 0);   
        
        emit Deposit(msg.sender, _amount);
    }
    
    
    // this function is used to deposit underlying and transfer it to yield source
  
    function depositdonation(uint _amount) external nonReentrant {
        require(lockdeposits == 0 && msg.sender != EMPTY_ADDRESS);
        require(_amount > 0 && underlying.balanceOf(msg.sender) >= _amount);
        require(underlying.allowance(msg.sender, address(this)) >= _amount);
        
        require(underlying.transferFrom(msg.sender, address(this), _amount) == true);
        
        require(underlying.approve(address(marketcream), _amount) == true);
        
        balancedonations += _amount;
        require(marketcream.mint(_amount) == 0);   
        
        totaldonations += _amount;
        balancedonators[msg.sender] += _amount;
        
        emit DepositDonation(msg.sender, _amount);
    }
    
    
    // this function is used to redeem underlying from yield source and withdraw
    // evaluates if is a jackpot participant
    
    function withdraw(uint _amount) external nonReentrant {
        require(spinning == false && msg.sender != EMPTY_ADDRESS);
        require(_amount > 0 && balancepatrons[msg.sender] >= _amount);
        require(marketcream.getCash() >= _amount);
        
        require(marketcream.redeemUnderlying(_amount) == 0);
        
        balancepatrons[msg.sender] -= _amount; 
        balancepool -= _amount;
        
        uint balancesupporter = balancepatrons[msg.sender];
        
        if (balancesupporter == 0) {
            supporters -= 1;
        }
    
        if (balancesupporter >= 0) {
            if (balancesupporter < LOT_DEPOSIT && (balancesupporter + _amount) >= LOT_DEPOSIT) {
                supporterslottery -= 1;
                timeplayers[msg.sender] = 0;
                
                uint index = indexplayers[msg.sender];
                uint indexmove = players.length - 1;
                address addressmove = players[indexmove];
                
                if (index == indexmove || players.length == 1) {
                    delete indexplayers[msg.sender];
                    players.pop();
                
                    
                } else {
                    delete indexplayers[msg.sender];
                    players[index] = addressmove;
                    indexplayers[addressmove] = index;
                    players.pop();
                }
                    
            }
        } 
        
        if (supporterslottery == 0) {
            timejackpot = 0;
            spinning = false;
            picking = false;
            jackpotsettled = 0;
            developsettled = 0;
            seekersettled = 0;
        }    
        
        require(underlying.transfer(msg.sender, _amount) == true);
    
        emit Withdraw(msg.sender, _amount);
    }


    // this function accrues the yield and splits into interests, reserves and jackpot
    
    function splityield() internal {
        uint interest = interestaccrued();
        
        uint totransferinterest = interest * (50 * 10 ** decimalstoken / 100);
        totransferinterest = totransferinterest / 10 ** decimalstoken;
        
        interestvalue += totransferinterest;
        
        uint jackpotinterest = interest * (25 * 10 ** decimalstoken / 100);
        jackpotinterest = jackpotinterest / 10 ** decimalstoken;
        jackpotvalue += jackpotinterest;
        
        uint reserveinterest = interest - totransferinterest - jackpotinterest;
        reservevalue += reserveinterest;
        
        assert(interest == (totransferinterest + jackpotinterest + reserveinterest));
        assert(marketcream.balanceOfUnderlying(address(this)) >= (interestvalue + jackpotvalue + reservevalue + balancepool + balancedonations));
    }


    // this function is used to calculate interest accrued in yield source
    
    function interestaccrued() internal returns (uint) {
        uint interest = (marketcream.balanceOfUnderlying(address(this)) - balancepool - balancedonations - reservevalue - jackpotvalue - interestvalue); 
        return interest;
    }


    // this function is used to settle the prize and seeds with block number and nonce to be used to generate random number
    
    function settlejackpot() external nonReentrant {
        
        require(spinning == false && supporterslottery > 0 && timejackpot > 0 && block.number - blockNumber > 0);
        
        uint end = block.timestamp;
        uint totaltime = end - timejackpot;
        require(totaltime >= LOCK_LOTTERY);

        spinning = true;
        timejackpot = 0;
        blockNumber = block.number;

        splityield();
    
        require(jackpotvalue > 0);
        
        jackpotsettled = jackpotvalue;
        uint distjackpot = jackpotsettled;
        
        developsettled = distjackpot * (20 * 10 ** decimalstoken / 100);
        developsettled = developsettled / 10 ** decimalstoken;
        seekersettled = distjackpot * (5 * 10 ** decimalstoken / 100);
        seekersettled = seekersettled / 10 ** decimalstoken;
        
        jackpotsettled = jackpotsettled - developsettled - seekersettled;
        
        assert(distjackpot == (jackpotsettled + developsettled + seekersettled));
        
        nonce += 1;
        picking = true;
    }
    
    
    // this function generates a random number using future Blockhash
    
    function generaterandomnumber() internal view returns (uint) {
        uint randnum = uint(keccak256(abi.encode(blockhash(blockNumber), nonce))) % players.length;
        return randnum;  
    }


    // this function is used to pick a winner, redeem underlying from yield source and transfer to
    // the winner, to the developer and to the seeker
    
    function pickawinner() external nonReentrant {
        
        require(spinning == true && picking == true && block.number - blockNumber > 0 && supporterslottery > 0);
        
        picking = false;
        uint toredeem =  jackpotsettled + developsettled + seekersettled;
        require(marketcream.getCash() >= toredeem);  
        
        uint totransferbeneficiary = jackpotsettled;
        uint totransferdevelop = developsettled;
        uint totransferseeker = seekersettled;
        
        jackpotsettled = 0;
        developsettled = 0;
        seekersettled = 0;
        
        lotterycounter++;
        uint end = block.timestamp;
        
        if (block.number - blockNumber > 250) {
    
            lastjackpotresult = 2;
            
            LotteryResults.push(Lottery(lotterycounter, end, 2, EMPTY_ADDRESS, 0));

            emit LotteryAwarded(lotterycounter, end, EMPTY_ADDRESS, 0, 2);
        
        } else {
        
        uint w = 0;
        uint winner = 0;
        address beneficiary;
        
        uint randomnumber;
        
        while(w < players.length && winner < 1 ) {
        
            w++;
        
            randomnumber = generaterandomnumber();
        
            address candidate = players[randomnumber];
        
                if (timeplayers[candidate] > 0 && balancepatrons[candidate] >= LOT_DEPOSIT) { 
        
                    uint totaltime = end - timeplayers[candidate];
                        if (totaltime >= LOCK_PLAYERS) {
                            winner = 1;
                            beneficiary = candidate;
                        }
                }
            
            nonce++; 
        }        

        if (winner == 1) {
            
            jackpotspaid += totransferbeneficiary;
            totaldevelopinterest += totransferdevelop;
            totalseekerinterest += totransferseeker;
            
            require(marketcream.redeemUnderlying(toredeem) == 0);
            jackpotvalue -= toredeem;
            
            require(underlying.transfer(beneficiary, totransferbeneficiary) == true);
            require(underlying.transfer(developer, totransferdevelop) == true);
            require(underlying.transfer(seeker, totransferseeker) == true);
        
            lastjackpotresult = 1;
            lastjackpotwinner = beneficiary;
            lastjackpotamount = totransferbeneficiary;
            lastjackpotdate = end;
            lastjackpotcounter = lotterycounter;
        
            LotteryResults.push(Lottery(lotterycounter, end, 1, beneficiary, totransferbeneficiary));
        
            emit PayWinner(beneficiary, totransferbeneficiary);
            emit PayDeveloper(developer, totransferdevelop);
            emit PaySeeker(seeker, totransferseeker);
            
            emit LotteryAwarded(lotterycounter, end, beneficiary, totransferbeneficiary, 1);
            
        } else {
        
            lastjackpotresult = 2;
            
            LotteryResults.push(Lottery(lotterycounter, end, 2, EMPTY_ADDRESS, 0));
            
            emit LotteryAwarded(lotterycounter, end, EMPTY_ADDRESS, 0, 2);
        }    
          
        }
          
        timejackpot = block.timestamp;
        spinning = false;
    }
        
    
    // this function returns the timeleft to execute function settlejackpot()
    // 0 = no time left

    function calculatetimeleft() public view returns (uint) {
        uint end = block.timestamp;
        uint totaltime = end - timejackpot;
        
        if(totaltime < LOCK_LOTTERY) {
            uint timeleft = LOCK_LOTTERY - totaltime;
            return timeleft;
        } else {
            return 0;
        }
    }
    
    
    // this function returns if conditions are met to execute function settlejackpot()
    // 1 = met
    // 2 = not met 
    
    function calculatesettlejackpot() public view returns (uint) {
        
        uint end = block.timestamp;
        uint totaltime = end - timejackpot;

        if (spinning == false && supporterslottery > 0 && timejackpot > 0 && (block.number - blockNumber) > 0 && totaltime >= LOCK_LOTTERY) {
            return 1;
    
        } else {
            return 2;
        }    
    }        
            
    
    // this function returns if conditions are met to execute function pickawinner()
    // 1 = met
    // 2 = not met 
        
    function calculatepickawinner() public view returns (uint) {
        
        uint toredeem = jackpotsettled + developsettled + seekersettled;
        uint metwinner;
        
            
            if (spinning == true && block.number - blockNumber > 0 && supporterslottery > 0 && marketcream.getCash() >= toredeem) {
                metwinner = 1;
        
            } else {
                metwinner = 2;
            }
        
        
        return metwinner;
    }
    
    
    // this function returns if account is the owner
    // 1 = is owner
    // 2 = is not owner
    
    function verifyowner(address _account) public view returns (uint) {
        
        if (_account == owner) {
            return 1;
        } else {
            return 2;
        }
    }
    
  
    // this  function returns an array of struct of jackpots drawn results
  
    function getLotteryResults() external view returns (Lottery[] memory) {
    return LotteryResults;
    }
  
    
    // this function is used to redeem underlying from yield source and withdraw interests and reserves
    // flag 1 = interests
    // flag 2 = reserves

    function withdrawyield(uint _amount, uint _flag) external nonReentrant onlyowner {
        require(_amount > 0 && (_flag == 1 || _flag == 2));
        
        splityield();
        
        if (_flag == 1) {
        require(_amount <= interestvalue);
        }
        
        if (_flag == 2) {
        require(_amount <= reservevalue);
        }
        
        require(marketcream.getCash() >= _amount);  
        
        uint totransferinterestnet = _amount;
        
        if (_flag == 1) {
        totalinterestpaid += _amount;
        }
        
        if (_flag == 2) {
        totalreservepaid += _amount;
        }
        
        require(marketcream.redeemUnderlying(totransferinterestnet) == 0);
        
        if (_flag == 1) {
        interestvalue -= _amount;
        }
        
        if (_flag == 2) {
        reservevalue -= _amount;
        }
        
        require(underlying.transfer(owner, totransferinterestnet) == true);

        if (_flag == 1) {
        emit CollectInterest(owner, totransferinterestnet);
        }
        
        if (_flag == 2) {
        emit CollectReserve(owner, totransferinterestnet);
        }
    }

    
    
    // this function is used to redeem underlying from yield source and withdraw donations     
    
    function withdrawdonations(uint _amount) external nonReentrant onlyowner {
        require(_amount > 0);
        require(balancedonations >= _amount);
        require(marketcream.getCash() >= _amount);  
        
        require(marketcream.redeemUnderlying(_amount) == 0);
        balancedonations -= _amount;
        totaldonationspaid += _amount;
        
        require(underlying.transfer(owner, _amount) == true);

        emit WithdrawDonation(owner, _amount);
    }
    

    // this function returns yield generated
    // _amount = balance of underlying of yieldsource
    
    function calculateinterest(uint _amount) external view returns(uint, uint, uint) {
        
        uint yield = (_amount - balancepool - balancedonations - reservevalue - jackpotvalue - interestvalue);
        
        uint interest = yield * (50 * 10 ** decimalstoken / 100);
        interest = interest / 10 ** decimalstoken;
        
        uint reserve = yield * (25 * 10 ** decimalstoken / 100);
        reserve = reserve / 10 ** decimalstoken;
        
        uint jackpot = yield - interest - reserve;
        
        interest = interest + interestvalue;
        reserve = reserve + reservevalue;
        jackpot = jackpot + jackpotvalue - jackpotsettled - developsettled - seekersettled;
    
        jackpot = jackpot * (75 * 10 ** decimalstoken / 100);
        jackpot = jackpot / 10 ** decimalstoken;
        
        return (interest, reserve, jackpot);
    }
    

    // this function returns data to the front end

    function calculatedata() external view returns (uint [] memory) {
        
        uint[] memory datafront = new uint[](23);
        
        datafront[0] = balancepool + balancedonations; // deposits
        datafront[1] = marketcream.getCash(); // liquidity
        datafront[2] = calculatetimeleft(); // leftime lottery
        datafront[3] = calculatesettlejackpot(); // evaluates if conditions are met to settle the lottery
        datafront[4] = calculatepickawinner(); // evaluates if conditions are met to pick a lottery winner
        
        datafront[5] = totalinterestpaid;
        datafront[6] = totalreservepaid;
        datafront[7] = totaldonationspaid;
        datafront[8] = balancedonations;
        
        datafront[9] = totaldonations;
        datafront[10] = jackpotsettled;
        datafront[11] = jackpotspaid;
        
        datafront[12] = lastjackpotamount;
        datafront[13] = supporters;
        datafront[14] = supporterslottery;
        
        datafront[15] = lastjackpotresult;
        datafront[16] = lastjackpotdate;
        datafront[17] = lastjackpotcounter;
        
        datafront[18] = LOT_DEPOSIT;
        datafront[19] = LOCK_PLAYERS;
        datafront[20] = LOCK_LOTTERY;
        
        datafront[21] = decimalstoken;
        datafront[22] = balancepool;
        
        return (datafront);
    }

   
   // this function returns data to the front end
    
    function calculatedataaccount(address _account) external view returns (uint [] memory) {
        require(_account != EMPTY_ADDRESS);

        uint[] memory datafrontaccount = new uint[](6);
        
        datafrontaccount[0] = balancepatrons[_account]; // balance depositors
        datafrontaccount[1] = underlying.balanceOf(_account); // balance wallet underlying depositors
        datafrontaccount[2] = underlying.allowance(_account, address(this)); // allowance underlying depositors behalf pool
        datafrontaccount[3] = lockdeposits;
        datafrontaccount[4] = balancedonators[_account]; // balance donators
        datafrontaccount[5] = verifyowner(_account); // evaluates if caller is the owner of the pool

        return (datafrontaccount);
    }


    // this  function is used by the front end to check conditions of operations
    // flag 1 = deposits
    // flag 2 = donations
    // flag 3 = withdraw
    // flag 4 = withdraw donations
    // flag 5 = withdraw yield

    function checkoperations(uint _amount, uint _amount1, address _account, uint _flag) external view returns (uint) {
        require(_account != EMPTY_ADDRESS && _amount > 0 && _flag > 0);
        
        uint result = 0;
        
        if (lockdeposits == 1 && (_flag == 1 || _flag == 2)) {
            result = 1;
        } else {
            if (spinning == true && (_flag == 1 || _flag == 3)) {
                result = 2;
            } else {
                if (_amount > underlying.balanceOf(_account) && (_flag == 1 || _flag == 2)) {
                    result = 3;
                } else {
                    if (_amount > underlying.allowance(_account, address(this)) && (_flag == 1 || _flag == 2)) {
                        result = 4;
                    } else {
                        if (_amount > balancepatrons[_account] && _flag == 3) {
                            result = 5;            
                        } else {
                             if (verifyowner(_account) == 2 && (_flag == 4 || _flag == 5)) {
                                result = 6;
                            } else {
                                if (_amount > balancedonations && _flag == 4) {
                                    result = 7;
                                } else {
                                    if (_amount > _amount1 && _flag == 5) {
                                        result = 8;
                                    } else {
                                        if (_amount > marketcream.getCash() && (_flag == 3 || _flag == 4 || _flag == 5)) {
                                            result = 9;
                                        }
                                    }
                                }
                            }     
                        }
                    }                        
                }
            }
        }
        
        return result;
    }

}

File 3 of 3: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_developer","type":"address"},{"internalType":"address","name":"_seeker","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"olddeveloper","type":"address"},{"indexed":true,"internalType":"address","name":"newdeveloper","type":"address"}],"name":"ChangeFactoryDeveloper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"oldlock","type":"bool"},{"indexed":false,"internalType":"bool","name":"newlock","type":"bool"}],"name":"ChangeFactoryLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldowner","type":"address"},{"indexed":true,"internalType":"address","name":"newowner","type":"address"}],"name":"ChangeFactoryOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldseeker","type":"address"},{"indexed":true,"internalType":"address","name":"newseeker","type":"address"}],"name":"ChangeFactorySeeker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"childAddress","type":"address"},{"indexed":true,"internalType":"address","name":"yield","type":"address"},{"indexed":true,"internalType":"address","name":"underlying","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_mindeposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_agedeposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_agelottery","type":"uint256"}],"name":"ChildCreated","type":"event"},{"inputs":[],"name":"EMPTY_ADDRESS_FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"FactoryPools","outputs":[{"internalType":"contract MecenasV3","name":"newpool","type":"address"},{"internalType":"address","name":"newmarket","type":"address"},{"internalType":"address","name":"newunderlying","type":"address"},{"internalType":"string","name":"newnametoken","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract MecenasV3","name":"","type":"address"}],"name":"MapPools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"OwnerPools","outputs":[{"internalType":"contract MecenasV3","name":"newpool","type":"address"},{"internalType":"address","name":"newmarket","type":"address"},{"internalType":"address","name":"newunderlying","type":"address"},{"internalType":"string","name":"newnametoken","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newdeveloper","type":"address"}],"name":"changedeveloper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newlock","type":"bool"}],"name":"changelockfactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newowner","type":"address"}],"name":"changeowner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newseeker","type":"address"}],"name":"changeseeker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"counterpools","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factorydeveloper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factoryowner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factoryseeker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getOwnerPools","outputs":[{"components":[{"internalType":"contract MecenasV3","name":"newpool","type":"address"},{"internalType":"address","name":"newmarket","type":"address"},{"internalType":"address","name":"newunderlying","type":"address"},{"internalType":"string","name":"newnametoken","type":"string"}],"internalType":"struct MecenasFactoryV3.Pool[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalPools","outputs":[{"components":[{"internalType":"contract MecenasV3","name":"newpool","type":"address"},{"internalType":"address","name":"newmarket","type":"address"},{"internalType":"address","name":"newunderlying","type":"address"},{"internalType":"string","name":"newnametoken","type":"string"}],"internalType":"struct MecenasFactoryV3.Pool[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockfactory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_yield","type":"address"},{"internalType":"uint256","name":"mindeposit","type":"uint256"},{"internalType":"uint256","name":"agedeposit","type":"uint256"},{"internalType":"uint256","name":"agelottery","type":"uint256"}],"name":"newMecenasPool","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50604051620058453803806200584583398101604081905261003191610089565b600480546001600160a01b03199081163317909155600580546001600160a01b03948516908316179055600680549290931691161790556100bc565b80516001600160a01b038116811461008457600080fd5b919050565b6000806040838503121561009c57600080fd5b6100a58361006d565b91506100b36020840161006d565b90509250929050565b61577980620000cc6000396000f3fe60806040523480156200001157600080fd5b5060043610620001155760003560e01c8063b5809d1b11620000a3578063dac17de2116200006e578063dac17de2146200027c578063df9e4c221462000290578063e44d0e0514620002a7578063f6f0291414620002be57600080fd5b8063b5809d1b14620001f4578063cb4a9368146200021a578063d3ffe67a1462000240578063d4537f94146200024a57600080fd5b8063751c8b1a11620000e4578063751c8b1a1462000193578063789a7b0b14620001c057806387926c8d14620001c9578063a60e1c2b14620001dd57600080fd5b80635246fb8a146200011a578063662e4ee4146200013357806367416705146200014a57806370c38318146200017c575b600080fd5b620001316200012b36600462000daf565b620002c8565b005b620001316200014436600462000daf565b62000347565b620001616200015b36600462000dd6565b620003c6565b60405162000173949392919062000e66565b60405180910390f35b620001316200018d36600462000ea6565b620004b0565b600454620001a7906001600160a01b031681565b6040516001600160a01b03909116815260200162000173565b620001a7600081565b600654620001a7906001600160a01b031681565b62000131620001ee36600462000ee4565b620008fb565b6200020b6200020536600462000daf565b620009a0565b60405162000173919062000f08565b6006546200022f90600160a01b900460ff1681565b604051901515815260200162000173565b6200020b62000ae1565b6200026d6200025b36600462000daf565b60016020526000908152604090205481565b60405190815260200162000173565b600554620001a7906001600160a01b031681565b62000131620002a136600462000daf565b62000c0e565b62000161620002b836600462000fa5565b62000c8d565b6200026d60035481565b6001600160a01b03811615801590620002eb57506004546001600160a01b031633145b620002f557600080fd5b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fb6d779092e744a55bfbd14f79a5e14960cbe681b56050d437a0efbce933b829b90600090a35050565b6001600160a01b038116158015906200036a57506004546001600160a01b031633145b6200037457600080fd5b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f7eee5cbc033ec172b73198088b64e108dc7242d7d8722dbdd10945c3c05d4c3f90600090a35050565b60006020528160005260406000208181548110620003e357600080fd5b600091825260209091206004909102018054600182015460028301546003840180546001600160a01b03948516975092841695509216929190620004279062000fbf565b80601f0160208091040260200160405190810160405280929190818152602001828054620004559062000fbf565b8015620004a65780601f106200047a57610100808354040283529160200191620004a6565b820191906000526020600020905b8154815290600101906020018083116200048857829003601f168201915b5050505050905084565b600654600160a01b900460ff1615620004c857600080fd5b3315801590620004e057506001600160a01b03841615155b620004ea57600080fd5b600083118015620004fb5750600082115b8015620005085750600081115b6200051257600080fd5b60038054906000620005248362000ffc565b9091555050600554600654604051600092339288926001600160a01b0392831692909116908890889088906200055a9062000ce2565b6001600160a01b03978816815295871660208701529386166040860152949091166060840152608083015260a082019290925260c081019190915260e001604051809103906000f080158015620005b5573d6000803e3d6000fd5b50905060008590506000816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015620005f957600080fd5b505afa1580156200060e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000634919062001026565b90506000816001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156200067257600080fd5b505afa15801562000687573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620006b191908101906200105c565b3360009081526020818152604080832081516080810183526001600160a01b038a811682528e81168286019081528982169483019485526060830188815284546001808201875595895297879020845160049099020180546001600160a01b0319908116998516999099178155915194820180548916958416959095179094559351600285018054909716911617909455518051949550929390926200075f92600385019291019062000cf0565b5050506001600160a01b03808516600081815260016020818152604080842083905580516080810182529485528d861685830190815288871691860191825260608601888152600280549586018155909552855160049094027f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace810180549589166001600160a01b031996871617815591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf82018054918a1691871691909117905591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad08301805491909816941693909317909555915180519394919362000893937f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad190930192919091019062000cf0565b5050604080516001600160a01b038781168252602082018b905291810189905260608101889052339250848216918b16907f03563f5d73f944c303453d8d2c50d1873cf2ee3f5efc53596a4dc4e3487928d49060800160405180910390a45050505050505050565b600181151514806200090b575080155b6200091557600080fd5b6004546001600160a01b031633146200092d57600080fd5b60068054821515600160a01b90810260ff60a01b198316179283905560405160ff928290048316937fbe7d1cb79f3095a7130e4c3390d628e846d218e281792d2ccfbc7611f21d44cd93620009949386939204169091151582521515602082015260400190565b60405180910390a15050565b6001600160a01b038116600090815260208181526040808320805482518185028101850190935280835260609492939192909184015b8282101562000ad6576000848152602090819020604080516080810182526004860290920180546001600160a01b039081168452600182015481169484019490945260028101549093169082015260038201805491929160608401919062000a3e9062000fbf565b80601f016020809104026020016040519081016040528092919081815260200182805462000a6c9062000fbf565b801562000abd5780601f1062000a915761010080835404028352916020019162000abd565b820191906000526020600020905b81548152906001019060200180831162000a9f57829003601f168201915b50505050508152505081526020019060010190620009d6565b505050509050919050565b60606002805480602002602001604051908101604052809291908181526020016000905b8282101562000c05576000848152602090819020604080516080810182526004860290920180546001600160a01b039081168452600182015481169484019490945260028101549093169082015260038201805491929160608401919062000b6d9062000fbf565b80601f016020809104026020016040519081016040528092919081815260200182805462000b9b9062000fbf565b801562000bec5780601f1062000bc05761010080835404028352916020019162000bec565b820191906000526020600020905b81548152906001019060200180831162000bce57829003601f168201915b5050505050815250508152602001906001019062000b05565b50505050905090565b6001600160a01b0381161580159062000c3157506004546001600160a01b031633145b62000c3b57600080fd5b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f999d368309e1bd77323845a60ea9e56ac0436ad448c1f110a355b37508fc461a90600090a35050565b6002818154811062000c9e57600080fd5b600091825260209091206004909102018054600182015460028301546003840180546001600160a01b03948516965092841694939091169291620004279062000fbf565b61462e806200111683390190565b82805462000cfe9062000fbf565b90600052602060002090601f01602090048101928262000d22576000855562000d6d565b82601f1062000d3d57805160ff191683800117855562000d6d565b8280016001018555821562000d6d579182015b8281111562000d6d57825182559160200191906001019062000d50565b5062000d7b92915062000d7f565b5090565b5b8082111562000d7b576000815560010162000d80565b6001600160a01b038116811462000dac57600080fd5b50565b60006020828403121562000dc257600080fd5b813562000dcf8162000d96565b9392505050565b6000806040838503121562000dea57600080fd5b823562000df78162000d96565b946020939093013593505050565b60005b8381101562000e2257818101518382015260200162000e08565b8381111562000e32576000848401525b50505050565b6000815180845262000e5281602086016020860162000e05565b601f01601f19169290920160200192915050565b6001600160a01b03858116825284811660208301528316604082015260806060820181905260009062000e9c9083018462000e38565b9695505050505050565b6000806000806080858703121562000ebd57600080fd5b843562000eca8162000d96565b966020860135965060408601359560600135945092505050565b60006020828403121562000ef757600080fd5b8135801515811462000dcf57600080fd5b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101562000f9757888303603f19018552815180516001600160a01b0390811685528882015181168986015287820151168785015260609081015160809185018290529062000f828186018362000e38565b96890196945050509086019060010162000f2f565b509098975050505050505050565b60006020828403121562000fb857600080fd5b5035919050565b600181811c9082168062000fd457607f821691505b6020821081141562000ff657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200101f57634e487b7160e01b600052601160045260246000fd5b5060010190565b6000602082840312156200103957600080fd5b815162000dcf8162000d96565b634e487b7160e01b600052604160045260246000fd5b6000602082840312156200106f57600080fd5b815167ffffffffffffffff808211156200108857600080fd5b818401915084601f8301126200109d57600080fd5b815181811115620010b257620010b262001046565b604051601f8201601f19908116603f01168101908382118183101715620010dd57620010dd62001046565b81604052828152876020848701011115620010f757600080fd5b6200110a83602083016020880162000e05565b97965050505050505056fe60e06040523480156200001157600080fd5b506040516200462e3803806200462e833981016040819052620000349162000306565b6001600081905580546001600160a01b0319166001600160a01b03881690811790915560408051636f307dc360e01b81529051636f307dc391600480820192602092909190829003018186803b1580156200008e57600080fd5b505afa158015620000a3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c9919062000380565b600280546001600160a01b03199081166001600160a01b039384169081179092556025805482168b85161790556026805482168985161790556027805490911692871692909217909155608084905260a083905260c08290526040805163313ce56760e01b8152905163313ce56791600480820192602092909190829003018186803b1580156200015957600080fd5b505afa1580156200016e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001949190620003a5565b60ff16602055600254604080516395d89b4160e01b815290516001600160a01b03909216916395d89b4191600480820192600092909190829003018186803b158015620001e057600080fd5b505afa158015620001f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200021f9190810190620003e0565b8051620002359160219160209091019062000243565b5050505050505050620004f9565b8280546200025190620004bc565b90600052602060002090601f016020900481019282620002755760008555620002c0565b82601f106200029057805160ff1916838001178555620002c0565b82800160010185558215620002c0579182015b82811115620002c0578251825591602001919060010190620002a3565b50620002ce929150620002d2565b5090565b5b80821115620002ce5760008155600101620002d3565b80516001600160a01b03811681146200030157600080fd5b919050565b600080600080600080600060e0888a0312156200032257600080fd5b6200032d88620002e9565b96506200033d60208901620002e9565b95506200034d60408901620002e9565b94506200035d60608901620002e9565b93506080880151925060a0880151915060c0880151905092959891949750929550565b6000602082840312156200039357600080fd5b6200039e82620002e9565b9392505050565b600060208284031215620003b857600080fd5b815160ff811681146200039e57600080fd5b634e487b7160e01b600052604160045260246000fd5b60006020808385031215620003f457600080fd5b82516001600160401b03808211156200040c57600080fd5b818501915085601f8301126200042157600080fd5b815181811115620004365762000436620003ca565b604051601f8201601f19908116603f01168101908382118183101715620004615762000461620003ca565b8160405282815288868487010111156200047a57600080fd5b600093505b828410156200049e57848401860151818501870152928501926200047f565b82841115620004b05760008684830101525b98975050505050505050565b600181811c90821680620004d157607f821691505b60208210811415620004f357634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c0516140a36200058b600039600081816104df01528181611cd201528181612cda0152818161339a015281816138a801526138d60152600081816103c4015281816111970152611c9201526000818161041301528181610a8601528181610ab00152818161114901528181611c5201528181612fc90152818161307d01526130a701526140a36000f3fe608060405234801561001057600080fd5b50600436106103ba5760003560e01c80638da5cb5b116101f4578063b6b55f251161011a578063dabf0488116100ad578063f3ab7ea91161007c578063f3ab7ea9146107db578063f641a529146107ee578063fdc31f6f146107f6578063ff7f2867146107ff57600080fd5b8063dabf0488146107a1578063dcdf0982146107aa578063e3525577146107b3578063eb39c3af146107d357600080fd5b8063c6b9b541116100e9578063c6b9b54114610738578063ca4b208b14610741578063cd69875314610754578063cfb00f321461079857600080fd5b8063b6b55f2514610701578063bfa4f29614610714578063c30e14a81461071d578063c381cf301461072557600080fd5b8063a27cd02b11610192578063b076731c11610161578063b076731c146106bc578063b4e420ae146106cf578063b5fba737146106d8578063b64fbe5f146106e157600080fd5b8063a27cd02b14610685578063a696a8891461068e578063a8a87d49146106a1578063ae08abe4146106b457600080fd5b8063950d84c2116101ce578063950d84c214610636578063954e72971461065657806396866fda14610669578063a1507db71461067c57600080fd5b80638da5cb5b146106075780638e90ab671461061a5780639408f1ec1461062357600080fd5b806355ac3481116102e457806375cfbac91161027757806383db2c6a1161024657806383db2c6a146105cd57806386b833c9146105d657806387c45591146105eb578063882ffd2c146105f457600080fd5b806375cfbac91461057a5780637681fd561461058d5780637b040eba146105bb5780637e86b38e146105c457600080fd5b8063697fb6e5116102b3578063697fb6e5146105375780636be94a1a1461053f5780636f307dc31461055457806375388cc91461056757600080fd5b806355ac34811461051357806359780c331461051c5780635debc466146105255780635f5737fd1461052e57600080fd5b80633ae196421161035c578063488928531161032b57806348892853146104af57806349ae9143146104da5780634a17410a146105015780634bb4285f1461050a57600080fd5b80633ae196421461048c5780633de15e36146104955780633df153dc1461049d5780634111a810146104a657600080fd5b806321f72fd01161039857806321f72fd01461043557806325a16511146104525780632e1a7d4d146104645780633312cbf41461047957600080fd5b806305ebb47b146103bf5780630b8d1386146103f95780631e4aef701461040e575b600080fd5b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b610401610808565b6040516103f09190613c10565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b600e546104429060ff1681565b60405190151581526020016103f0565b600e5461044290610100900460ff1681565b610477610472366004613c65565b610896565b005b610477610487366004613c95565b610d43565b6103e660125481565b610477610dbf565b6103e660285481565b6103e660185481565b6001546104c2906001600160a01b031681565b6040516001600160a01b0390911681526020016103f0565b6103e67f000000000000000000000000000000000000000000000000000000000000000081565b6103e660195481565b6103e660175481565b6103e6600a5481565b6103e6601b5481565b6103e6601a5481565b6103e660095481565b6103e661183b565b610547611930565b6040516103f09190613cb7565b6002546104c2906001600160a01b031681565b610547610575366004613c95565b611d58565b610477610588366004613c95565b611f97565b6105a061059b366004613c65565b612014565b604080519384526020840192909252908201526060016103f0565b6103e660045481565b6103e660035481565b6103e6600b5481565b6105de6121c6565b6040516103f09190613cfb565b6103e660165481565b610477610602366004613d72565b61225a565b6025546104c2906001600160a01b031681565b6103e660075481565b6103e6610631366004613c95565b6125c0565b6103e6610644366004613c95565b601e6020526000908152604090205481565b610477610664366004613c65565b6125ee565b610477610677366004613c65565b612869565b6103e6601f5481565b6103e660155481565b61047761069c366004613c95565b612c01565b6014546104c2906001600160a01b031681565b6103e6612c7e565b6104776106ca366004613c65565b612d14565b6103e660205481565b6103e660055481565b6103e66106ef366004613c95565b60236020526000908152604090205481565b61047761070f366004613c65565b612d95565b6103e660115481565b610477613317565b6103e6610733366004613d94565b613519565b6103e660135481565b6026546104c2906001600160a01b031681565b610767610762366004613c65565b613843565b604080519586526020860194909452928401919091526001600160a01b03166060830152608082015260a0016103f0565b6103e6601c5481565b6103e6600f5481565b6103e660105481565b6103e66107c1366004613c95565b601d6020526000908152604090205481565b6104c2600081565b6027546104c2906001600160a01b031681565b6103e6613890565b6103e660085481565b6103e660065481565b6021805461081590613dd1565b80601f016020809104026020016040519081016040528092919081815260200182805461084190613dd1565b801561088e5780601f106108635761010080835404028352916020019161088e565b820191906000526020600020905b81548152906001019060200180831161087157829003601f168201915b505050505081565b600260005414156108c25760405162461bcd60e51b81526004016108b990613e0c565b60405180910390fd5b6002600055600e5460ff161580156108d957503315155b6108e257600080fd5b6000811180156109015750336000908152601e60205260409020548111155b61090a57600080fd5b60015460408051631d8e90d160e11b8152905183926001600160a01b031691633b1d21a2916004808301926020929190829003018186803b15801561094e57600080fd5b505afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109869190613e43565b101561099157600080fd5b60015460405163852a12e360e01b8152600481018390526001600160a01b039091169063852a12e390602401602060405180830381600087803b1580156109d757600080fd5b505af11580156109eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0f9190613e43565b15610a1957600080fd5b336000908152601e602052604081208054839290610a38908490613e72565b9250508190555080601f6000828254610a519190613e72565b9091555050336000908152601e602052604090205480610a8457600160086000828254610a7e9190613e72565b90915550505b7f000000000000000000000000000000000000000000000000000000000000000081108015610adc57507f0000000000000000000000000000000000000000000000000000000000000000610ad98383613e89565b10155b15610c4b57600160116000828254610af49190613e72565b90915550503360009081526023602090815260408083208390556024909152812054602254909190610b2890600190613e72565b9050600060228281548110610b3f57610b3f613ea1565b6000918252602090912001546001600160a01b0316905082821480610b6657506022546001145b15610bb357336000908152602460205260408120556022805480610b8c57610b8c613eb7565b600082815260209020810160001990810180546001600160a01b0319169055019055610c47565b336000908152602460205260408120556022805482919085908110610bda57610bda613ea1565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905591831681526024909152604090208390556022805480610c2457610c24613eb7565b600082815260209020810160001990810180546001600160a01b03191690550190555b5050505b601154610c725760006010819055600e805461ffff19169055600f81905560178190556018555b60025460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b158015610cbe57600080fd5b505af1158015610cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf69190613ecd565b1515600114610d0457600080fd5b60405182815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a250506001600055565b6025546001600160a01b03163314610d5a57600080fd5b6001600160a01b038116610d6d57600080fd5b602580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f9aecf86140d81442289f667eb72e1202a8fbb3478a686659952e145e8531965690600090a35050565b60026000541415610de25760405162461bcd60e51b81526004016108b990613e0c565b6002600055600e5460ff1615156001148015610e0b5750600e5460ff6101009091041615156001145b8015610e2457506000600d5443610e229190613e72565b115b8015610e3257506000601154115b610e3b57600080fd5b600e805461ff0019169055601854601754600f5460009291610e5c91613e89565b610e669190613e89565b905080600160009054906101000a90046001600160a01b03166001600160a01b0316633b1d21a26040518163ffffffff1660e01b815260040160206040518083038186803b158015610eb757600080fd5b505afa158015610ecb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eef9190613e43565b1015610efa57600080fd5b600f8054601780546018805460009586905592859055849055602880549394919391610f2583613eef565b9091555050600d54429060fa90610f3c9043613e72565b11156110b457600260138190556040805160a08101825260288054825260208083018681528385018681526000606080870182815260808089018481526029805460018101825590865299517fcb7c14ce178f56e2e8d86ab33ebc0ae081ba8556a00cd122038841867181caac6005909b029a8b015595517fcb7c14ce178f56e2e8d86ab33ebc0ae081ba8556a00cd122038841867181caad8a015593517fcb7c14ce178f56e2e8d86ab33ebc0ae081ba8556a00cd122038841867181caae890155517fcb7c14ce178f56e2e8d86ab33ebc0ae081ba8556a00cd122038841867181caaf880180546001600160a01b0319166001600160a01b0390921691909117905592517fcb7c14ce178f56e2e8d86ab33ebc0ae081ba8556a00cd122038841867181cab0909601959095559254855190815291820187905293810183905292830193909352917f0ea40012165a20f800adbe7d44e3d2d460cf9048a7a2b7b6cf86980fc6513b22910160405180910390a2611821565b6000806000805b602254841080156110cc5750600183105b156111e157836110db81613eef565b9450506110e661390b565b90506000602282815481106110fd576110fd613ea1565b60009182526020808320909101546001600160a01b031680835260239091526040909120549091501580159061116b57506001600160a01b0381166000908152601e60205260409020547f000000000000000000000000000000000000000000000000000000000000000011155b156111c6576001600160a01b0381166000908152602360205260408120546111939088613e72565b90507f000000000000000000000000000000000000000000000000000000000000000081106111c457600194508193505b505b600c80549060006111d683613eef565b9190505550506110bb565b82600114156116ae5787601260008282546111fc9190613e89565b9250508190555086600460008282546112159190613e89565b92505081905550856003600082825461122e9190613e89565b909155505060015460405163852a12e360e01b8152600481018b90526001600160a01b039091169063852a12e390602401602060405180830381600087803b15801561127957600080fd5b505af115801561128d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b19190613e43565b156112bb57600080fd5b88600a60008282546112cd9190613e72565b909155505060025460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018b90529091169063a9059cbb90604401602060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113589190613ecd565b151560011461136657600080fd5b60025460265460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018a905291169063a9059cbb90604401602060405180830381600087803b1580156113b657600080fd5b505af11580156113ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ee9190613ecd565b15156001146113fc57600080fd5b60025460275460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810189905291169063a9059cbb90604401602060405180830381600087803b15801561144c57600080fd5b505af1158015611460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114849190613ecd565b151560011461149257600080fd5b600160138190555081601460006101000a8154816001600160a01b0302191690836001600160a01b03160217905550876015819055508460168190555060285460198190555060296040518060a00160405280602854815260200187815260200160018152602001846001600160a01b031681526020018a815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550608082015181600401555050816001600160a01b03167faffd7eb38f11b70f6657a98f30dc78203c499888d35801fbce07a6d5c944f94c896040516115c891815260200190565b60405180910390a26026546040518881526001600160a01b03909116907f2dbf449051f38d992cd6ff2d5750cbbaf97180c5c9fcd9556cec6adeb6e9c2319060200160405180910390a26027546040518781526001600160a01b03909116907f2a6a96d7419fd0b4ce7f9aa79483240989a0bd228af7d45e9bc8ec4ddf1dc7199060200160405180910390a260285460408051918252602082018790528101899052600160608201526001600160a01b038316907f0ea40012165a20f800adbe7d44e3d2d460cf9048a7a2b7b6cf86980fc6513b229060800160405180910390a261181c565b600260138190556040805160a08101825260288054825260208083018a81528385018681526000606080870182815260808089018481526029805460018101825590865299517fcb7c14ce178f56e2e8d86ab33ebc0ae081ba8556a00cd122038841867181caac6005909b029a8b015595517fcb7c14ce178f56e2e8d86ab33ebc0ae081ba8556a00cd122038841867181caad8a015593517fcb7c14ce178f56e2e8d86ab33ebc0ae081ba8556a00cd122038841867181caae890155517fcb7c14ce178f56e2e8d86ab33ebc0ae081ba8556a00cd122038841867181caaf880180546001600160a01b0319166001600160a01b0390921691909117905592517fcb7c14ce178f56e2e8d86ab33ebc0ae081ba8556a00cd122038841867181cab090960195909555925485519081529182018b905293810183905292830193909352917f0ea40012165a20f800adbe7d44e3d2d460cf9048a7a2b7b6cf86980fc6513b22910160405180910390a25b505050505b5050426010555050600e805460ff19169055506001600055565b600080601854601754600f546118519190613e89565b61185b9190613e89565b600e5490915060009060ff161515600114801561188557506000600d54436118839190613e72565b115b801561189357506000601154115b8015611919575060015460408051631d8e90d160e11b8152905184926001600160a01b031691633b1d21a2916004808301926020929190829003018186803b1580156118de57600080fd5b505afa1580156118f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119169190613e43565b10155b156119265750600161192a565b5060025b92915050565b604080516017808252610300820190925260609160009190602082016102e080368337019050509050601a54601f546119699190613e89565b8160008151811061197c5761197c613ea1565b60209081029190910181019190915260015460408051631d8e90d160e11b815290516001600160a01b0390921692633b1d21a292600480840193829003018186803b1580156119ca57600080fd5b505afa1580156119de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a029190613e43565b81600181518110611a1557611a15613ea1565b602002602001018181525050611a29613890565b81600281518110611a3c57611a3c613ea1565b602002602001018181525050611a50612c7e565b81600381518110611a6357611a63613ea1565b602002602001018181525050611a7761183b565b81600481518110611a8a57611a8a613ea1565b60200260200101818152505060065481600581518110611aac57611aac613ea1565b60200260200101818152505060075481600681518110611ace57611ace613ea1565b602002602001018181525050601c5481600781518110611af057611af0613ea1565b602002602001018181525050601a5481600881518110611b1257611b12613ea1565b602002602001018181525050601b5481600981518110611b3457611b34613ea1565b602002602001018181525050600f5481600a81518110611b5657611b56613ea1565b60200260200101818152505060125481600b81518110611b7857611b78613ea1565b60200260200101818152505060155481600c81518110611b9a57611b9a613ea1565b60200260200101818152505060085481600d81518110611bbc57611bbc613ea1565b60200260200101818152505060115481600e81518110611bde57611bde613ea1565b60200260200101818152505060135481600f81518110611c0057611c00613ea1565b60200260200101818152505060165481601081518110611c2257611c22613ea1565b60200260200101818152505060195481601181518110611c4457611c44613ea1565b6020026020010181815250507f000000000000000000000000000000000000000000000000000000000000000081601281518110611c8457611c84613ea1565b6020026020010181815250507f000000000000000000000000000000000000000000000000000000000000000081601381518110611cc457611cc4613ea1565b6020026020010181815250507f000000000000000000000000000000000000000000000000000000000000000081601481518110611d0457611d04613ea1565b60200260200101818152505060205481601581518110611d2657611d26613ea1565b602002602001018181525050601f5481601681518110611d4857611d48613ea1565b6020908102919091010152919050565b60606001600160a01b038216611d6d57600080fd5b60408051600680825260e082019092526000916020820160c0803683375050506001600160a01b0384166000908152601e6020526040812054825192935091839190611dbb57611dbb613ea1565b60209081029190910101526002546040516370a0823160e01b81526001600160a01b038581166004830152909116906370a082319060240160206040518083038186803b158015611e0b57600080fd5b505afa158015611e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e439190613e43565b81600181518110611e5657611e56613ea1565b6020908102919091010152600254604051636eb1769f60e11b81526001600160a01b0385811660048301523060248301529091169063dd62ed3e9060440160206040518083038186803b158015611eac57600080fd5b505afa158015611ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee49190613e43565b81600281518110611ef757611ef7613ea1565b60200260200101818152505060095481600381518110611f1957611f19613ea1565b602002602001018181525050601d6000846001600160a01b03166001600160a01b031681526020019081526020016000205481600481518110611f5e57611f5e613ea1565b602002602001018181525050611f73836125c0565b81600581518110611f8657611f86613ea1565b602090810291909101015292915050565b6001600160a01b03811615801590611fb957506026546001600160a01b031633145b611fc257600080fd5b602680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f869504a2007ee0aecc33d77ea774c0e0aee67a4fe83cc90155a5fab7c6a87dbc90600090a35050565b600080600080600b54600a54600554601a54601f54896120349190613e72565b61203e9190613e72565b6120489190613e72565b6120529190613e72565b61205c9190613e72565b905060006064602054600a6120719190613fee565b61207c906032613ffa565b612086919061402f565b6120909083613ffa565b9050602054600a6120a19190613fee565b6120ab908261402f565b905060006064602054600a6120c09190613fee565b6120cb906019613ffa565b6120d5919061402f565b6120df9084613ffa565b9050602054600a6120f09190613fee565b6120fa908261402f565b90506000816121098486613e72565b6121139190613e72565b9050600b54836121239190613e89565b9250600554826121339190613e89565b9150601854601754600f54600a548461214c9190613e89565b6121569190613e72565b6121609190613e72565b61216a9190613e72565b90506064602054600a61217d9190613fee565b61218890604b613ffa565b612192919061402f565b61219c9082613ffa565b9050602054600a6121ad9190613fee565b6121b7908261402f565b92989197509195509350505050565b60606029805480602002602001604051908101604052809291908181526020016000905b828210156122515760008481526020908190206040805160a08101825260058602909201805483526001808201548486015260028201549284019290925260038101546001600160a01b0316606084015260040154608083015290835290920191016121ea565b50505050905090565b6002600054141561227d5760405162461bcd60e51b81526004016108b990613e0c565b60026000556025546001600160a01b0316331461229957600080fd5b6000821180156122b3575080600114806122b35750806002145b6122bc57600080fd5b6122c461394d565b80600114156122dc57600b548211156122dc57600080fd5b80600214156122f4576005548211156122f457600080fd5b60015460408051631d8e90d160e11b8152905184926001600160a01b031691633b1d21a2916004808301926020929190829003018186803b15801561233857600080fd5b505afa15801561234c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123709190613e43565b101561237b57600080fd5b81600182141561239d5782600660008282546123979190613e89565b90915550505b81600214156123be5782600760008282546123b89190613e89565b90915550505b60015460405163852a12e360e01b8152600481018390526001600160a01b039091169063852a12e390602401602060405180830381600087803b15801561240457600080fd5b505af1158015612418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061243c9190613e43565b1561244657600080fd5b81600114156124675782600b60008282546124619190613e72565b90915550505b81600214156124885782600560008282546124829190613e72565b90915550505b60025460255460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb90604401602060405180830381600087803b1580156124d857600080fd5b505af11580156124ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125109190613ecd565b151560011461251e57600080fd5b816001141561256a576025546040518281526001600160a01b03909116907f0ea642e516217541a1e2dc773348c8478ff8a42b293518739a126c10215b36a69060200160405180910390a25b81600214156125b6576025546040518281526001600160a01b03909116907fe8ba20a8ed6b554b0883b861bead01a8cc072b1e5eef3cf125536dad835481f19060200160405180910390a25b5050600160005550565b6025546000906001600160a01b03838116911614156125e157506001919050565b506002919050565b919050565b600260005414156126115760405162461bcd60e51b81526004016108b990613e0c565b60026000556025546001600160a01b0316331461262d57600080fd5b6000811161263a57600080fd5b80601a54101561264957600080fd5b60015460408051631d8e90d160e11b8152905183926001600160a01b031691633b1d21a2916004808301926020929190829003018186803b15801561268d57600080fd5b505afa1580156126a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c59190613e43565b10156126d057600080fd5b60015460405163852a12e360e01b8152600481018390526001600160a01b039091169063852a12e390602401602060405180830381600087803b15801561271657600080fd5b505af115801561272a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274e9190613e43565b1561275857600080fd5b80601a600082825461276a9190613e72565b9250508190555080601c60008282546127839190613e89565b909155505060025460255460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb90604401602060405180830381600087803b1580156127d857600080fd5b505af11580156127ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128109190613ecd565b151560011461281e57600080fd5b6025546040518281526001600160a01b03909116907f916d90440c92dba9d7754ff7631fe1ad9cced57d553043148a9f755803888449906020015b60405180910390a2506001600055565b6002600054141561288c5760405162461bcd60e51b81526004016108b990613e0c565b60026000556009541580156128a057503315155b6128a957600080fd5b60008111801561293257506002546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b1580156128f757600080fd5b505afa15801561290b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292f9190613e43565b10155b61293b57600080fd5b600254604051636eb1769f60e11b815233600482015230602482015282916001600160a01b03169063dd62ed3e9060440160206040518083038186803b15801561298457600080fd5b505afa158015612998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bc9190613e43565b10156129c757600080fd5b6002546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015612a1957600080fd5b505af1158015612a2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a519190613ecd565b1515600114612a5f57600080fd5b60025460015460405163095ea7b360e01b81526001600160a01b0391821660048201526024810184905291169063095ea7b390604401602060405180830381600087803b158015612aaf57600080fd5b505af1158015612ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ae79190613ecd565b1515600114612af557600080fd5b80601a6000828254612b079190613e89565b909155505060015460405163140e25ad60e31b8152600481018390526001600160a01b039091169063a0712d6890602401602060405180830381600087803b158015612b5257600080fd5b505af1158015612b66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8a9190613e43565b15612b9457600080fd5b80601b6000828254612ba69190613e89565b9091555050336000908152601d602052604081208054839290612bca908490613e89565b909155505060405181815233907fcb5e406a2abc0d032ba33712dd7369bd632cbc91ff68b8e896acf029b44e2a9490602001612859565b6001600160a01b03811615801590612c2357506027546001600160a01b031633145b612c2c57600080fd5b602780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907ff59aa6ab5fb95b0390dedb0bd38890d17da90c749dad873393463a52b51765c090600090a35050565b60105460009042908290612c929083613e72565b600e5490915060ff16158015612caa57506000601154115b8015612cb857506000601054115b8015612cd157506000600d5443612ccf9190613e72565b115b8015612cfd57507f00000000000000000000000000000000000000000000000000000000000000008110155b15612d0b5760019250505090565b60029250505090565b6025546001600160a01b03163314612d2b57600080fd5b8060011480612d38575080155b612d4157600080fd5b600980549082905560255460408051838152602081018590526001600160a01b03909216917f44046e7be7d848149abebac2b643d261ef302311c3928a58ace78cba0a0c3fd7910160405180910390a25050565b60026000541415612db85760405162461bcd60e51b81526004016108b990613e0c565b6002600055600e5460ff16158015612dd05750600954155b8015612ddb57503315155b612de457600080fd5b600081118015612e6d57506002546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b158015612e3257600080fd5b505afa158015612e46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6a9190613e43565b10155b612e7657600080fd5b600254604051636eb1769f60e11b815233600482015230602482015282916001600160a01b03169063dd62ed3e9060440160206040518083038186803b158015612ebf57600080fd5b505afa158015612ed3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef79190613e43565b1015612f0257600080fd5b6002546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015612f5457600080fd5b505af1158015612f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8c9190613ecd565b1515600114612f9a57600080fd5b336000908152601e60205260409020548061307557600160086000828254612fc29190613e89565b90915550507f00000000000000000000000000000000000000000000000000000000000000008210613075576001601160008282546130019190613e89565b9091555050602280546001818101835560008390527f61035b26e3e9eee00e0d72fd1ee8ddca6894550dca6916ea2ac6baa90d11e51090910180546001600160a01b0319163317905590546130569190613e72565b3360009081526024602090815260408083209390935560239052204290555b801561315f577f0000000000000000000000000000000000000000000000000000000000000000811080156130d357507f00000000000000000000000000000000000000000000000000000000000000006130d08383613e89565b10155b1561315f576001601160008282546130eb9190613e89565b9091555050602280546001818101835560008390527f61035b26e3e9eee00e0d72fd1ee8ddca6894550dca6916ea2ac6baa90d11e51090910180546001600160a01b0319163317905590546131409190613e72565b3360009081526024602090815260408083209390935560239052204290555b60006011541180156131715750601054155b80156131805750600e5460ff16155b1561318a57426010555b60025460015460405163095ea7b360e01b81526001600160a01b0391821660048201526024810185905291169063095ea7b390604401602060405180830381600087803b1580156131da57600080fd5b505af11580156131ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132129190613ecd565b151560011461322057600080fd5b336000908152601e60205260408120805484929061323f908490613e89565b9250508190555081601f60008282546132589190613e89565b909155505060015460405163140e25ad60e31b8152600481018490526001600160a01b039091169063a0712d6890602401602060405180830381600087803b1580156132a357600080fd5b505af11580156132b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132db9190613e43565b156132e557600080fd5b60405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610d32565b6002600054141561333a5760405162461bcd60e51b81526004016108b990613e0c565b6002600055600e5460ff1615801561335457506000601154115b801561336257506000601054115b801561337b57506000600d54436133799190613e72565b115b61338457600080fd5b60105442906000906133969083613e72565b90507f00000000000000000000000000000000000000000000000000000000000000008110156133c557600080fd5b600e805460ff19166001179055600060105543600d556133e361394d565b6000600a54116133f257600080fd5b600a8054600f819055602054909160649161340c91613fee565b613417906014613ffa565b613421919061402f565b61342b9082613ffa565b60175560205461343c90600a613fee565b601754613449919061402f565b60175560205460649061345d90600a613fee565b613468906005613ffa565b613472919061402f565b61347c9082613ffa565b60185560205461348d90600a613fee565b60185461349a919061402f565b6018819055601754600f546134af9190613e72565b6134b99190613e72565b600f81905560185460175490916134d09190613e89565b6134da9190613e89565b81146134e8576134e8614043565b6001600c60008282546134fb9190613e89565b9091555050600e805461ff0019166101001790555050600160005550565b60006001600160a01b038316158015906135335750600085115b801561353f5750600082115b61354857600080fd5b60006009546001148015613566575082600114806135665750826002145b156135735750600161383a565b600e5460ff1615156001148015613594575082600114806135945750826003145b156135a15750600261383a565b6002546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a082319060240160206040518083038186803b1580156135e657600080fd5b505afa1580156135fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361e9190613e43565b86118015613636575082600114806136365750826002145b156136435750600361383a565b600254604051636eb1769f60e11b81526001600160a01b0386811660048301523060248301529091169063dd62ed3e9060440160206040518083038186803b15801561368e57600080fd5b505afa1580156136a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c69190613e43565b861180156136de575082600114806136de5750826002145b156136eb5750600461383a565b6001600160a01b0384166000908152601e6020526040902054861180156137125750826003145b1561371f5750600561383a565b613728846125c0565b6002148015613741575082600414806137415750826005145b1561374e5750600661383a565b601a548611801561375f5750826004145b1561376c5750600761383a565b848611801561377b5750826005145b156137885750600861383a565b600160009054906101000a90046001600160a01b03166001600160a01b0316633b1d21a26040518163ffffffff1660e01b815260040160206040518083038186803b1580156137d657600080fd5b505afa1580156137ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061380e9190613e43565b86118015613831575082600314806138265750826004145b806138315750826005145b1561383a575060095b95945050505050565b6029818154811061385357600080fd5b600091825260209091206005909102018054600182015460028301546003840154600490940154929450909290916001600160a01b039091169085565b601054600090429082906138a49083613e72565b90507f00000000000000000000000000000000000000000000000000000000000000008110156139025760006138fa827f0000000000000000000000000000000000000000000000000000000000000000613e72565b949350505050565b60009250505090565b602254600d54600c54604080519240602084015282015260009182916060016040516020818303038152906040528051906020012060001c61192a9190614059565b6000613957613b43565b905060006064602054600a61396c9190613fee565b613977906032613ffa565b613981919061402f565b61398b9083613ffa565b9050602054600a61399c9190613fee565b6139a6908261402f565b905080600b60008282546139ba9190613e89565b90915550506020546000906064906139d390600a613fee565b6139de906019613ffa565b6139e8919061402f565b6139f29084613ffa565b9050602054600a613a039190613fee565b613a0d908261402f565b905080600a6000828254613a219190613e89565b909155506000905081613a348486613e72565b613a3e9190613e72565b90508060056000828254613a529190613e89565b90915550819050613a638385613e89565b613a6d9190613e89565b8414613a7b57613a7b614043565b601a54601f54600554600a54600b54613a949190613e89565b613a9e9190613e89565b613aa89190613e89565b613ab29190613e89565b600154604051633af9e66960e01b81523060048201526001600160a01b0390911690633af9e66990602401602060405180830381600087803b158015613af757600080fd5b505af1158015613b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b2f9190613e43565b1015613b3d57613b3d614043565b50505050565b600b54600a54600554601a54601f54600154604051633af9e66960e01b81523060048201526000968796909590949093909290916001600160a01b0390911690633af9e66990602401602060405180830381600087803b158015613ba657600080fd5b505af1158015613bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bde9190613e43565b613be89190613e72565b613bf29190613e72565b613bfc9190613e72565b613c069190613e72565b61192a9190613e72565b600060208083528351808285015260005b81811015613c3d57858101830151858201604001528201613c21565b81811115613c4f576000604083870101525b50601f01601f1916929092016040019392505050565b600060208284031215613c7757600080fd5b5035919050565b80356001600160a01b03811681146125e957600080fd5b600060208284031215613ca757600080fd5b613cb082613c7e565b9392505050565b6020808252825182820181905260009190848201906040850190845b81811015613cef57835183529284019291840191600101613cd3565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015613d6557815180518552868101518786015285810151868601526060808201516001600160a01b0316908601526080908101519085015260a09093019290850190600101613d18565b5091979650505050505050565b60008060408385031215613d8557600080fd5b50508035926020909101359150565b60008060008060808587031215613daa57600080fd5b8435935060208501359250613dc160408601613c7e565b9396929550929360600135925050565b600181811c90821680613de557607f821691505b60208210811415613e0657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600060208284031215613e5557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082821015613e8457613e84613e5c565b500390565b60008219821115613e9c57613e9c613e5c565b500190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060208284031215613edf57600080fd5b81518015158114613cb057600080fd5b6000600019821415613f0357613f03613e5c565b5060010190565b600181815b80851115613f45578160001904821115613f2b57613f2b613e5c565b80851615613f3857918102915b93841c9390800290613f0f565b509250929050565b600082613f5c5750600161192a565b81613f695750600061192a565b8160018114613f7f5760028114613f8957613fa5565b600191505061192a565b60ff841115613f9a57613f9a613e5c565b50506001821b61192a565b5060208310610133831016604e8410600b8410161715613fc8575081810a61192a565b613fd28383613f0a565b8060001904821115613fe657613fe6613e5c565b029392505050565b6000613cb08383613f4d565b600081600019048311821515161561401457614014613e5c565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261403e5761403e614019565b500490565b634e487b7160e01b600052600160045260246000fd5b60008261406857614068614019565b50069056fea2646970667358221220d33c1a2bf4b6911d78c97c909be76192e8b3f59173772154ec98ebf326c31d7264736f6c63430008090033a2646970667358221220f817168dda93ad0516c2270a93d794d69d19e38e0dff6c4efecafba67127958564736f6c6343000809003300000000000000000000000034eed477bf8287e79659711799a1e3057ec1a03f00000000000000000000000034eed477bf8287e79659711799a1e3057ec1a03f

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

00000000000000000000000034eed477bf8287e79659711799a1e3057ec1a03f00000000000000000000000034eed477bf8287e79659711799a1e3057ec1a03f

-----Decoded View---------------
Arg [0] : _developer (address): 0x34eed477bf8287e79659711799a1e3057ec1a03f
Arg [1] : _seeker (address): 0x34eed477bf8287e79659711799a1e3057ec1a03f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000034eed477bf8287e79659711799a1e3057ec1a03f
Arg [1] : 00000000000000000000000034eed477bf8287e79659711799a1e3057ec1a03f


Deployed ByteCode Sourcemap

93:4334:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1794:290;;;;;;:::i;:::-;;:::i;:::-;;2152:280;;;;;;:::i;:::-;;:::i;345:44::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;2897:1121;;;;;;:::i;:::-;;:::i;513:27::-;;;;;-1:-1:-1;;;;;513:27:0;;;;;;-1:-1:-1;;;;;2392:32:3;;;2374:51;;2362:2;2347:18;513:27:0;2228:203:3;128:58:0;;184:1;128:58;;585:28;;;;;-1:-1:-1;;;;;585:28:0;;;2545:291;;;;;;:::i;:::-;;:::i;4117:123::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;622:23::-;;;;;-1:-1:-1;;;622:23:0;;;;;;;;;4136:14:3;;4129:22;4111:41;;4099:2;4084:18;622:23:0;3971:187:3;4323:99:0;;;:::i;396:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;4579:25:3;;;4567:2;4552:18;396:42:0;4433:177:3;547:31:0;;;;;-1:-1:-1;;;;;547:31:0;;;1405:320;;;;;;:::i;:::-;;:::i;445:26::-;;;;;;:::i;:::-;;:::i;480:24::-;;;;;;1794:290;-1:-1:-1;;;;;1862:35:0;;;;;;:65;;-1:-1:-1;1915:12:0;;-1:-1:-1;;;;;1915:12:0;1901:10;:26;1862:65;1854:74;;;;;;1959:13;;;-1:-1:-1;;;;;1983:26:0;;;-1:-1:-1;;;;;;1983:26:0;;;;;;;2031:45;;1959:13;;;1983:26;1959:13;;2031:45;;1939:17;;2031:45;1843:241;1794:290;:::o;2152:280::-;-1:-1:-1;;;;;2218:34:0;;;;;;:64;;-1:-1:-1;2270:12:0;;-1:-1:-1;;;;;2270:12:0;2256:10;:26;2218:64;2210:73;;;;;;2313:12;;;-1:-1:-1;;;;;2336:24:0;;;-1:-1:-1;;;;;;2336:24:0;;;;;;;2382:42;;2313:12;;;2336:24;2313:12;;2382:42;;2294:16;;2382:42;2199:233;2152:280;:::o;345:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;345:44:0;;;;-1:-1:-1;345:44:0;;;;-1:-1:-1;345:44:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2897:1121::-;3016:11;;-1:-1:-1;;;3016:11:0;;;;:20;3008:29;;;;;;3056:10;:35;;;;:70;;-1:-1:-1;;;;;;3095:31:0;;;;3056:70;3048:79;;;;;;3159:1;3146:10;:14;:32;;;;;3177:1;3164:10;:14;3146:32;:50;;;;;3195:1;3182:10;:14;3146:50;3138:60;;;;;;3219:12;:14;;;:12;:14;;;:::i;:::-;;;;-1:-1:-1;;3304:16:0;;3322:13;;3270:102;;3250:17;;3284:10;;3296:6;;-1:-1:-1;;;;;3304:16:0;;;;3322:13;;;;3337:10;;3349;;3361;;3270:102;;;:::i;:::-;-1:-1:-1;;;;;5793:15:3;;;5775:34;;5845:15;;;5840:2;5825:18;;5818:43;5897:15;;;5892:2;5877:18;;5870:43;5949:15;;;;5944:2;5929:18;;5922:43;5996:3;5981:19;;5974:35;5755:3;6025:19;;6018:35;;;;6084:3;6069:19;;6062:35;;;;5724:3;5709:19;3270:102:0;;;;;;;;;;;;;;;;;;;;;;;3250:122;;3389:24;3427:6;3389:45;;3445:23;3477:13;-1:-1:-1;;;;;3477:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3445:59;;3516:30;3549:17;-1:-1:-1;;;;;3549:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3549:26:0;;;;;;;;;;;;:::i;:::-;3607:10;3596;:22;;;;;;;;;;;3624:87;;;;;;;-1:-1:-1;;;;;3624:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3596:116;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3596:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3624:87;;-1:-1:-1;3624:87:0;;3596:116;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;3723:17:0;;;;;;;3743:1;3723:17;;;;;;;;:21;;;3773:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3755:12;:106;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;3755:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3773:87;;3755:106;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;3887:123:0;;;-1:-1:-1;;;;;7634:32:3;;;7616:51;;7698:2;7683:18;;7676:34;;;7726:18;;;7719:34;;;7784:2;7769:18;;7762:34;;;3963:10:0;;-1:-1:-1;3887:123:0;;;;;;;;;7603:3:3;7588:19;3887:123:0;;;;;;;2997:1021;;;;2897:1121;;;;:::o;2545:291::-;2625:4;2613:16;;;;;:37;;-1:-1:-1;2633:17:0;;2613:37;2605:46;;;;;;2684:12;;-1:-1:-1;;;;;2684:12:0;2670:10;:26;2662:35;;;;;;2723:11;;;2745:22;;;-1:-1:-1;;;2745:22:0;;;-1:-1:-1;;;;2745:22:0;;;;;;;2789:39;;2723:11;;;;;;;;2789:39;;;;2723:11;;2816;;;;7994:14:3;;7987:22;7969:41;;8053:14;8046:22;8041:2;8026:18;;8019:50;7957:2;7942:18;;7807:268;2789:39:0;;;;;;;;2594:242;2545:291;:::o;4117:123::-;-1:-1:-1;;;;;4212:20:0;;:10;:20;;;;;;;;;;;4205:27;;;;;;;;;;;;;;;;;4181:13;;4205:27;;4212:20;;4205:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4205:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4117:123;;;:::o;4323:99::-;4371:13;4402:12;4395:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4395:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4323:99;:::o;1405:320::-;-1:-1:-1;;;;;1479:38:0;;;;;;:68;;-1:-1:-1;1535:12:0;;-1:-1:-1;;;;;1535:12:0;1521:10;:26;1479:68;1471:77;;;;;;1582:16;;;-1:-1:-1;;;;;1609:32:0;;;-1:-1:-1;;;;;;1609:32:0;;;;;;;1663:54;;1582:16;;;1609:32;1582:16;;1663:54;;1559:20;;1663:54;1460:265;1405:320;:::o;445:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;445:26:0;;;;-1:-1:-1;445:26:0;;;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:3;-1:-1:-1;;;;;89:31:3;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:247::-;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;:::-;386:5;150:247;-1:-1:-1;;;150:247:3:o;402:315::-;470:6;478;531:2;519:9;510:7;506:23;502:32;499:52;;;547:1;544;537:12;499:52;586:9;573:23;605:31;630:5;605:31;:::i;:::-;655:5;707:2;692:18;;;;679:32;;-1:-1:-1;;;402:315:3:o;722:258::-;794:1;804:113;818:6;815:1;812:13;804:113;;;894:11;;;888:18;875:11;;;868:39;840:2;833:10;804:113;;;935:6;932:1;929:13;926:48;;;970:1;961:6;956:3;952:16;945:27;926:48;;722:258;;;:::o;985:::-;1027:3;1065:5;1059:12;1092:6;1087:3;1080:19;1108:63;1164:6;1157:4;1152:3;1148:14;1141:4;1134:5;1130:16;1108:63;:::i;:::-;1225:2;1204:15;-1:-1:-1;;1200:29:3;1191:39;;;;1232:4;1187:50;;985:258;-1:-1:-1;;985:258:3:o;1248:518::-;-1:-1:-1;;;;;1537:15:3;;;1519:34;;1589:15;;;1584:2;1569:18;;1562:43;1641:15;;1636:2;1621:18;;1614:43;1693:3;1688:2;1673:18;;1666:31;;;1462:4;;1714:46;;1740:19;;1732:6;1714:46;:::i;:::-;1706:54;1248:518;-1:-1:-1;;;;;;1248:518:3:o;1771:452::-;1857:6;1865;1873;1881;1934:3;1922:9;1913:7;1909:23;1905:33;1902:53;;;1951:1;1948;1941:12;1902:53;1990:9;1977:23;2009:31;2034:5;2009:31;:::i;:::-;2059:5;2111:2;2096:18;;2083:32;;-1:-1:-1;2162:2:3;2147:18;;2134:32;;2213:2;2198:18;2185:32;;-1:-1:-1;1771:452:3;-1:-1:-1;;;1771:452:3:o;2436:273::-;2492:6;2545:2;2533:9;2524:7;2520:23;2516:32;2513:52;;;2561:1;2558;2551:12;2513:52;2600:9;2587:23;2653:5;2646:13;2639:21;2632:5;2629:32;2619:60;;2675:1;2672;2665:12;2714:1252;2896:4;2925:2;2965;2954:9;2950:18;2995:2;2984:9;2977:21;3018:6;3053;3047:13;3084:6;3076;3069:22;3110:2;3100:12;;3143:2;3132:9;3128:18;3121:25;;3205:2;3195:6;3192:1;3188:14;3177:9;3173:30;3169:39;3243:2;3235:6;3231:15;3264:1;3274:663;3288:6;3285:1;3282:13;3274:663;;;3353:22;;;-1:-1:-1;;3349:36:3;3337:49;;3409:13;;3523:9;;-1:-1:-1;;;;;3519:18:3;;;3504:34;;3585:11;;;3579:18;3575:27;;3558:15;;;3551:52;3650:11;;;3644:18;3640:27;3623:15;;;3616:52;3691:4;3734:11;;;3728:18;3445:4;3766:15;;;3759:27;;;3728:18;3809:48;3841:15;;;3728:18;3809:48;:::i;:::-;3915:12;;;;3799:58;-1:-1:-1;;;3880:15:3;;;;3310:1;3303:9;3274:663;;;-1:-1:-1;3954:6:3;;2714:1252;-1:-1:-1;;;;;;;;2714:1252:3:o;4615:180::-;4674:6;4727:2;4715:9;4706:7;4702:23;4698:32;4695:52;;;4743:1;4740;4733:12;4695:52;-1:-1:-1;4766:23:3;;4615:180;-1:-1:-1;4615:180:3:o;4800:380::-;4879:1;4875:12;;;;4922;;;4943:61;;4997:4;4989:6;4985:17;4975:27;;4943:61;5050:2;5042:6;5039:14;5019:18;5016:38;5013:161;;;5096:10;5091:3;5087:20;5084:1;5077:31;5131:4;5128:1;5121:15;5159:4;5156:1;5149:15;5013:161;;4800:380;;;:::o;5185:232::-;5224:3;-1:-1:-1;;5245:17:3;;5242:140;;;5304:10;5299:3;5295:20;5292:1;5285:31;5339:4;5336:1;5329:15;5367:4;5364:1;5357:15;5242:140;-1:-1:-1;5409:1:3;5398:13;;5185:232::o;6108:251::-;6178:6;6231:2;6219:9;6210:7;6206:23;6202:32;6199:52;;;6247:1;6244;6237:12;6199:52;6279:9;6273:16;6298:31;6323:5;6298:31;:::i;6364:127::-;6425:10;6420:3;6416:20;6413:1;6406:31;6456:4;6453:1;6446:15;6480:4;6477:1;6470:15;6496:884;6576:6;6629:2;6617:9;6608:7;6604:23;6600:32;6597:52;;;6645:1;6642;6635:12;6597:52;6678:9;6672:16;6707:18;6748:2;6740:6;6737:14;6734:34;;;6764:1;6761;6754:12;6734:34;6802:6;6791:9;6787:22;6777:32;;6847:7;6840:4;6836:2;6832:13;6828:27;6818:55;;6869:1;6866;6859:12;6818:55;6898:2;6892:9;6920:2;6916;6913:10;6910:36;;;6926:18;;:::i;:::-;7001:2;6995:9;6969:2;7055:13;;-1:-1:-1;;7051:22:3;;;7075:2;7047:31;7043:40;7031:53;;;7099:18;;;7119:22;;;7096:46;7093:72;;;7145:18;;:::i;:::-;7185:10;7181:2;7174:22;7220:2;7212:6;7205:18;7260:7;7255:2;7250;7246;7242:11;7238:20;7235:33;7232:53;;;7281:1;7278;7271:12;7232:53;7294:55;7346:2;7341;7333:6;7329:15;7324:2;7320;7316:11;7294:55;:::i;:::-;7368:6;6496:884;-1:-1:-1;;;;;;;6496:884:3:o

Swarm Source

ipfs://f817168dda93ad0516c2270a93d794d69d19e38e0dff6c4efecafba671279585
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading