ETH Price: $1,857.85 (-5.85%)
 

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve181700192023-09-19 12:40:59887 days ago1695127259IN
0xc16E0AFC...B9e4E5798
0 ETH0.000274311.34390058
Transfer173795082023-05-31 14:40:23998 days ago1685544023IN
0xc16E0AFC...B9e4E5798
0 ETH0.0019833652.38552488
Transfer171696992023-05-02 1:00:591028 days ago1682989259IN
0xc16E0AFC...B9e4E5798
0 ETH0.0047519886.47997525
Exit Pool169719922023-04-04 0:20:231056 days ago1680567623IN
0xc16E0AFC...B9e4E5798
0 ETH0.0023848122.09001728
Exit Pool168693302023-03-20 13:57:591070 days ago1679320679IN
0xc16E0AFC...B9e4E5798
0 ETH0.002764325.60517747
Approve168292102023-03-14 22:39:231076 days ago1678833563IN
0xc16E0AFC...B9e4E5798
0 ETH0.0011556325.05868252
Enter Pool167396152023-03-02 8:12:231088 days ago1677744743IN
0xc16E0AFC...B9e4E5798
0 ETH0.0080899620.43644028
Exit Pool164460132023-01-20 5:46:111129 days ago1674193571IN
0xc16E0AFC...B9e4E5798
0 ETH0.0016122514.41365934
Exit Pool164460042023-01-20 5:44:231129 days ago1674193463IN
0xc16E0AFC...B9e4E5798
0 ETH0.0015272714.57920485
Enter Pool162807892022-12-28 4:13:471153 days ago1672200827IN
0xc16E0AFC...B9e4E5798
0 ETH0.0044822313.52525981
Enter Pool162024662022-12-17 5:56:111163 days ago1671256571IN
0xc16E0AFC...B9e4E5798
0 ETH0.0037716313.13882485
Enter Pool161870622022-12-15 2:18:111166 days ago1671070691IN
0xc16E0AFC...B9e4E5798
0 ETH0.00523313.06096761
Exit Pool152059632022-07-24 14:55:291309 days ago1658674529IN
0xc16E0AFC...B9e4E5798
0 ETH0.0012369611.4577154
Exit Pool152059592022-07-24 14:54:271309 days ago1658674467IN
0xc16E0AFC...B9e4E5798
0 ETH0.0011983211.09977458
Enter Pool150212852022-06-25 1:44:361339 days ago1656121476IN
0xc16E0AFC...B9e4E5798
0 ETH0.0062166818.86932754
Enter Pool150212852022-06-25 1:44:361339 days ago1656121476IN
0xc16E0AFC...B9e4E5798
0 ETH0.0066099116.49757288
Exit Pool148653052022-05-29 7:53:251365 days ago1653810805IN
0xc16E0AFC...B9e4E5798
0 ETH0.0011205510.37944506
Enter Pool148652272022-05-29 7:35:291365 days ago1653809729IN
0xc16E0AFC...B9e4E5798
0 ETH0.0046711811.80008157
Enter Pool138355382021-12-19 12:17:011526 days ago1639916221IN
0xc16E0AFC...B9e4E5798
0 ETH0.0137602434.76039149
Exit Pool131968762021-09-10 8:14:561626 days ago1631261696IN
0xc16E0AFC...B9e4E5798
0 ETH0.0085324771.4678844
Exit Pool130713772021-08-21 22:36:471646 days ago1629585407IN
0xc16E0AFC...B9e4E5798
0 ETH0.0032657426.84780687
Exit Pool129667022021-08-05 18:58:441662 days ago1628189924IN
0xc16E0AFC...B9e4E5798
0 ETH0.0072690753.72204552
Exit Pool126955592021-06-24 7:32:231704 days ago1624519943IN
0xc16E0AFC...B9e4E5798
0 ETH0.0008076611
Exit Pool126937342021-06-24 0:42:471705 days ago1624495367IN
0xc16E0AFC...B9e4E5798
0 ETH0.000660819
Exit Pool126936742021-06-24 0:26:221705 days ago1624494382IN
0xc16E0AFC...B9e4E5798
0 ETH0.0007342410
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
HEXPOOL

Compiler Version
v0.5.13+commit.5b0b510c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv2 license

Contract Source Code (Solidity Multiple files format)

File 1 of 4: HEXPOOL.sol
//HEXPOOL.sol
//
//

pragma solidity ^0.5.13;

import "./SafeMath.sol";
import "./IERC20.sol";
import "./HEX.sol";

////////////////////////////////////////////////
////////////////////EVENTS/////////////////////
//////////////////////////////////////////////
contract PoolEvents {

//when a user enters a pool
    event PoolEntry(
        address indexed user,//msg.sender
        uint indexed heartValue,
        uint indexed entryId,
        uint poolId
    );
    
//when a user exits a pool
    event PoolExit(
        address indexed user,//msg.sender
        uint indexed heartValue,
        uint indexed entryId,
        uint poolId
    );

//when a pool starts staking
    event PoolStartStake(
        uint heartValue,//always 150m
        uint indexed dayLength,
        uint indexed poolId,
        uint hexStakeId
    );

//when a pool ends stake
    event PoolEndStake(
        uint heartValue,//always 150m
        uint indexed stakeProfit,
        uint indexed dayLength,
        uint indexed poolId,
        uint hexStakeId
    );

//when an ended stakes rewards are withdrawn
    event Withdrawal(
        address indexed user,
        uint indexed heartValue
    );
}

contract TokenEvents {

//when a user freezes tokens
    event TokenFreeze(
        address indexed user,
        uint indexed value
    );

//when a user unfreezes tokens
    event TokenUnfreeze(
        address indexed user,
        uint indexed value
    );
}

//////////////////////////////////////
//////////POOL TOKEN CONTRACT////////
////////////////////////////////////
contract POOL is IERC20, TokenEvents{

    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    bool internal mintBlock;//stops any more tokens ever being minted once _totalSupply reaches _maxSupply - allows for burn rate to take full effect
    uint256 internal _maxSupply = 10000000000000000000;// max supply @ 100B
    uint256 internal _totalSupply;
    string public constant name = "HEXPOOL";
    string public constant symbol = "POOL";
    uint public constant decimals = 8;

    //BUDDY SYSTEM
    uint public buddyDiv;
    //FREEZING
    uint public totalFrozen;
    mapping (address => uint) public tokenFrozenBalances;//balance of POOL frozen mapped by user

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        //1% burn rate
        uint burnt = amount.div(100);
        uint newAmt = amount.sub(burnt);
        _balances[sender] = _balances[sender].sub(newAmt, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(newAmt);
        _burn(sender, burnt);
        emit Transfer(sender, recipient, newAmt);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        uint256 amt = amount;
        require(account != address(0), "ERC20: mint to the zero address");
        if(!mintBlock){
            if(_totalSupply < _maxSupply){
                if(_totalSupply.add(amt) > _maxSupply){
                    amt = _maxSupply.sub(_totalSupply);
                    _totalSupply = _maxSupply;
                    mintBlock = true;
                }
                else{
                    _totalSupply = _totalSupply.add(amt);
                }
                _balances[account] = _balances[account].add(amt);
                emit Transfer(address(0), account, amt);
            }
        }
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount, "ERC20: burn amount exceeds allowance"));
    }

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);//from address(0) for minting

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    //mint POOL to msg.sender
    function mintPool(uint hearts)
        internal
        returns(bool)
    {
        uint amt = hearts.div(100);
        address minter = msg.sender;
        _mint(minter, amt);//mint POOL - 1% of total heart value before fees @ 10 POOL for 1000 HEX
        return true;
    }

    ////////////////////////////////////////////////////////
    /////////////////PUBLIC FACING - POOL CONTROL//////////
    //////////////////////////////////////////////////////

    //freeze POOL to contract
    function FreezeTokens(uint amt)
        public
    {
        require(amt > 0, "zero input");
        require(tokenBalance() >= amt, "Error: insufficient balance");//ensure user has enough funds
        //update balances (allow for 1% burn)
        tokenFrozenBalances[msg.sender] = tokenFrozenBalances[msg.sender].add(amt.sub(amt.div(100)));
        totalFrozen = totalFrozen.add(amt.sub(amt.div(100)));
        _transfer(msg.sender, address(this), amt);//make transfer and burn
        emit TokenFreeze(msg.sender, amt);
    }

    //unfreeze POOL from contract
    function UnfreezeTokens(uint amt)
        public
    {
        require(amt > 0, "zero input");
        require(tokenFrozenBalances[msg.sender] >= amt,"Error: unsufficient frozen balance");//ensure user has enough frozen funds
        tokenFrozenBalances[msg.sender] = tokenFrozenBalances[msg.sender].sub(amt);//update balances
        totalFrozen = totalFrozen.sub(amt);
        _transfer(address(this), msg.sender, amt);//make transfer and burn
        emit TokenUnfreeze(msg.sender, amt);
    }

    ///////////////////////////////
    ////////VIEW ONLY//////////////
    ///////////////////////////////

    //total POOL frozen in contract
    function totalFrozenTokenBalance()
        public
        view
        returns (uint256)
    {
        return totalFrozen;
    }

    //pool balance of caller
    function tokenBalance()
        public
        view
        returns (uint256)
    {
        return balanceOf(msg.sender);
    }
}

contract HEXPOOL is POOL, PoolEvents {

    ///////////////////////////////////////////////////////////////////////
    ////////////////////////////////CONTRACT SETUP///////////////////////
    ////////////////////////////////////////////////////////////////////
    using SafeMath for uint256;

    HEX hexInterface;

    //HEXPOOL
    address payable constant hexAddress = 0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39;

    address payable devAddress;//set in constructor
    address payable constant devAddress2 = 0xD30BC4859A79852157211E6db19dE159673a67E2;

    uint constant fee = 100; //1%;
    uint constant devFee = 2; // 50% of 1% @ 0.5%;
    uint constant devFee2 = 4; // 25% of 1% @ 0.25%;
    uint constant refFee = 4; // 25% of 1% @ 0.25%; - 100% goes to buddyDiv if no ref, 50% if ref;

    uint public last_pool_entry_id;// pool entry id
    uint public last_pool_id;// pool id
    uint public last_stake_id;// stake id

    uint public minEntryHearts;//minimum entry value

    mapping (address => UserInfo) public users;
    mapping (uint => EntryInfo) public entries;
    mapping (uint => PoolInfo) public pools;

    mapping (uint => uint) internal poolUserCount;
    mapping (uint => uint[]) internal poolEntryIds;
    mapping (address => uint[]) internal userEntryIds;

    bool locked;
    bool ready;

    struct UserInfo {
        uint     totalHeartsEntered;
        address  userAddress;
    }

    struct EntryInfo {
        uint     heartValue;
        uint     poolId;
        uint     entryId;
        address payable userAddress;
        address payable refferer;
    }

    struct PoolInfo {
        uint     poolStakeThreshold;//hearts
        uint     poolStakeDayLength;
        uint     poolValue;//hearts
        uint     poolId;
        uint     poolType;
        mapping  (address => bool) poolParticipant;
        mapping  (address => uint) userHeartValue;
        uint     stakeId;
        uint40   hexStakeId;
        bool     isStaking;
        bool     isActive;
        uint256  poolStakeStartTimestamp;
        uint     stakeValue;
        uint     stakeProfit;
        bool     stakeEnded;
    }

    modifier onlyOwner {
        require(msg.sender == devAddress, "notOwner");
        _;
    }

    modifier canEnter(uint id, uint hearts) {
        require(isPoolActive(id), "cannot enter, poolId not active");
        require(id <= last_pool_id, "Error: poolId out of range");
        require(hearts > minEntryHearts, "Error: value must be greater than minEntryHearts");
        _;
    }

    modifier isReady {
        require(ready, "cannot enter, pools not initialized");
        _;
    }

    modifier synchronized {
        require(!locked, "Sync lock");
        locked = true;
        _;
        locked = false;
    }

    constructor() public {
        devAddress = msg.sender;
        hexInterface = HEX(hexAddress);
        initializePools();
    }

    function() external payable {
        require(false); //refunds any eth accidently sent to contract;
    }

    function initializePools()
        internal
        onlyOwner
    {
        require(!ready, "cannot reinitialize");
        //create one of each pool on deployment
        for(uint i = 0; i < 3; i++){
            newPool(i, 0, address(0));
        }
        setMinEntry(100000000000);//1000 HEX @ contract launch, may change dependant on price.
        ready = true;
    }

    ///////////////////////////////////////////////////////////////////////
    ////////////////////////////////HEXPOOL CORE//////////////////////////
    ////////////////////////////////////////////////////////////////////

    //creates a new pool - called on initializePools and when a poolValue reachs its poolStakeThreshold
    function newPool(uint poolType, uint remainderHearts, address payable ref)
       internal
       returns (bool)
    {
        uint threshold;
        uint dayLength;

        if(poolType == 0){
            threshold = 15000000000000000;//150M BPB @ 10% - 36 DAYS
            dayLength = 36;//~1 month
        }
        else if(poolType == 1){
            threshold = 15000000000000000;//150M BPB @ 10% - 365 DAYS
            dayLength = 365;//1 year
        }
        else if(poolType == 2){
            threshold = 15000000000000000;//150M BPB @ 10% - 3650 DAYS
            dayLength = 3650;//10 years (max rewards)
        }
        else{
            revert("invalid poolType");
        }
        uint id = _next_pool_id();
        PoolInfo storage pool = pools[id];
        pool.poolStakeThreshold = threshold;//hearts
        pool.poolStakeDayLength = dayLength;
        pool.poolValue = remainderHearts;//hearts
        pool.poolId = id;
        pool.poolType = poolType;
        pool.isActive = true;
        if(remainderHearts > 0){//update pool, user and entry data as the new pool now has 1 participant
            poolUserCount[id]++;
            pool.poolParticipant[msg.sender] = true;
            pool.userHeartValue[msg.sender] = pool.userHeartValue[msg.sender].add(remainderHearts);
            //user info
            updateUserData(remainderHearts);
            //entry info
            updateEntryData(remainderHearts, id, ref);
        }
        pools[id] = pool;
        return true;
    }

    //enters pool - transfers HEX from user to contract - approval needed
    function enterPool(uint hearts, uint poolId, address payable ref)
        internal
        returns(bool)
    {
        PoolInfo storage pool = pools[poolId];
        require(hearts <= pool.poolStakeThreshold, "amount over threshold - only 1 new pool to be created per tx");
        require(!pool.isStaking, "pool is staking");
        //calc amounts
        uint _fee = hearts.div(fee);
        uint _devFee = _fee.div(devFee);
        uint _devFee2 = _fee.div(devFee2);
        uint _refFee = _fee.div(refFee);
        uint _hearts = hearts.sub(_fee);
        pool.poolValue = pool.poolValue.add(_hearts);//increment pool value with heart value after fees
        if(!pool.poolParticipant[msg.sender]){
            pool.poolParticipant[msg.sender] = true;
            poolUserCount[poolId]++;
        }
         //TOTAL amount of hearts this user has input in THIS pool after fees (EntryInfo for individual pool entries)
        pool.userHeartValue[msg.sender] = pool.userHeartValue[msg.sender].add(_hearts);
        //buddy divs
        if(buddyDiv > 0){
            require(hexInterface.transfer(msg.sender, buddyDiv), "Transfer failed");//send hex as buddy div to user
        }
        if(ref == address(0)){//no ref
            //hex refFee to buddyDivs
            buddyDiv = _refFee;
        }
        else{//ref
            //hex refFee to ref
            buddyDiv = _refFee.div(2);
            require(hexInterface.transferFrom(msg.sender, ref, _refFee.div(2)), "Ref transfer failed");//send hex to refferer
        }
        //send
        require(hexInterface.transferFrom(msg.sender, address(this), _hearts.add(buddyDiv)), "Transfer failed");//send hex from user to contract + buddyDivs to remain in contract
        require(hexInterface.transferFrom(msg.sender, devAddress, _devFee), "Dev1 transfer failed");//send hex to dev
        require(hexInterface.transferFrom(msg.sender, devAddress2, _devFee2), "Dev2 transfer failed");//send hex to dev2
        //check for pool overflow
        if(pool.poolValue > pool.poolStakeThreshold){
            uint remainderHearts = pool.poolValue.sub(pool.poolStakeThreshold);//get remainder
            //user info
            updateUserData(_hearts.sub(remainderHearts));//remainder to be rolled to next pool
            //entry info
            updateEntryData(_hearts.sub(remainderHearts), pool.poolId, ref);//remainder to be rolled to next pool
            pool.poolValue = pool.poolStakeThreshold;//set as max
             //Back out the remainder value that is spilling into the next pool
            pool.userHeartValue[msg.sender] = pool.userHeartValue[msg.sender].sub(remainderHearts);
            require(startStake(poolId, pool), "Error: could not start stake");
            require(newPool(pool.poolType, remainderHearts, ref), "Error: could not create new pool");//create new pool with remainder
        }
        else if(pool.poolValue == pool.poolStakeThreshold){
            //user info
            updateUserData(_hearts);
            //entry info
            updateEntryData(_hearts, pool.poolId, ref);
            require(startStake(poolId, pool), "Error: could not start stake");
            require(newPool(pool.poolType, 0, ref), "Error: could not create new pool");//new pool no remainder
        }
        else{
            //user info
            updateUserData(_hearts);
            //entry info
            updateEntryData(_hearts, pool.poolId, ref);
        }
        //mint bonus POOL tokens relative to HEX amount before fees
        require(mintPool(hearts), "Error: could not mint tokens");
        return true;
    }

    //starts staking poolStakeThreshold to the HEX contract
    function startStake(uint poolId, PoolInfo storage pool)
        internal
        returns (bool)
    {
        require(pool.poolValue == pool.poolStakeThreshold, "Stake amount incorrect");
        uint newStakedHearts = pool.poolStakeThreshold;
        uint newStakedDays = pool.poolStakeDayLength;
        hexInterface.stakeStart(newStakedHearts, newStakedDays);
        uint hexStakeIndex = hexInterface.stakeCount(address(this)).sub(1);//get the most recent stakeIndex
        SStore memory stake = getStakeByIndex(address(this), hexStakeIndex); //get stake from address and stakeindex
        //set pool stake id info
        pool.hexStakeId = stake.stakeId;
        pool.stakeId = last_stake_id;
        pool.poolStakeStartTimestamp = now;
        pool.isActive = false;
        pool.isStaking = true;
        _next_stake_id();
        emit PoolStartStake(
            newStakedHearts,
            newStakedDays,
            poolId,
            stake.stakeId
        );
        return true;
    }

    //end a pool stake - cannot emergency unstake - needs testing
    function endStake(uint poolId)
        internal
        returns (bool)
    {
        require(poolId <= last_pool_id, "Error: poolId out of range");
        PoolInfo storage pool = pools[poolId];
        require(pool.isStaking, "Error: pool is not yet staked, or has already ended staking");
        require(isPoolStakeFinished(poolId), "Error: cannot early unstake");

        uint256 oldBalance = getContractBalance();
        //find the stake index then
        //end stake
        hexInterface.stakeEnd(getStakeIndexById(address(this), pool.hexStakeId), pool.hexStakeId);
        pool.isStaking = false;
        pool.stakeEnded = true;
        //calc stakeValue and stakeProfit
        uint256 stakeValue = getContractBalance().sub(oldBalance);
        pool.stakeValue = stakeValue;
        pool.stakeProfit = stakeValue.sub(pool.poolStakeThreshold);
        emit PoolEndStake(
            pool.stakeProfit,
            pool.poolValue,
            pool.poolStakeDayLength,
            pool.poolId,
            pool.hexStakeId
        );
        return true;
    }

    //withdraws any staking rewards - or ends a stake if finished but not yet unstaked
    function withdrawPoolRewards(uint poolId)
        internal
        returns(bool)
    {
        PoolInfo storage pool = pools[poolId];
        require(pool.poolValue > 0, "pool rewards have been drained");
        require(pools[poolId].userHeartValue[msg.sender] > 0, "you have no share in this pool");
        if(!pool.stakeEnded){
            endStake(poolId);
        }
        uint rewards = getWithdrawableRewards(poolId);//calculate pool share
        pool.poolValue = pool.poolValue.sub(pool.userHeartValue[msg.sender]);//reduce pool value
        pool.userHeartValue[msg.sender] = 0;//user has withdrawn rewards from pool
        if(pool.poolValue == 0){
            delete pools[poolId];//delete pool if empty
        }
        require(hexInterface.transfer(msg.sender, rewards), "Transfer failed");//transfer users share
        emit Withdrawal(msg.sender, rewards);
        return true;
    }

    //get any withdrawable staking rewards of caller
    function getWithdrawableRewards(uint poolId)
        public
        view
        returns (uint)
    {
        PoolInfo storage pool = pools[poolId];
        require(pool.stakeEnded, "pool stake has not yet finished");
        if(pool.userHeartValue[msg.sender] == 0){
            return 0;
        }
        uint stakeWithdrawable = pool.stakeValue.mul(pool.userHeartValue[msg.sender]).div(pool.poolStakeThreshold);//withdrawable rewards
        return stakeWithdrawable;
    }

    //exits pool of entry by entryId
    function exitPool(uint entryId)
        internal
        returns (bool)
    {
        EntryInfo memory entry = entries[entryId];
        require(msg.sender == entry.userAddress, "not entry owner, or already exited");
        PoolInfo storage pool = pools[entry.poolId];
        require(pool.poolParticipant[msg.sender], "you are not a pool participant");
        require(!pool.isStaking, "pool is staking, cannot exit");
        users[msg.sender].totalHeartsEntered = users[msg.sender].totalHeartsEntered.sub(entry.heartValue);
        pool.poolValue = pool.poolValue.sub(entry.heartValue); //reduce pool value
        pool.userHeartValue[msg.sender] = pool.userHeartValue[msg.sender].sub(entry.heartValue);//reduce users pool share
        //remove user from pool data if 0 pool share
        if(pool.userHeartValue[msg.sender] == 0){
            pool.poolParticipant[msg.sender] = false;
            poolUserCount[entry.poolId]--;
        }
        delete entries[entryId];
        //calc fee amount
        uint _fee = entry.heartValue.div(fee);
        uint _devFee = _fee.div(devFee);
        uint _devFee2 = _fee.div(devFee2);
        uint _refFee = _fee.div(refFee);
        uint _hearts = entry.heartValue.sub(_fee);
        
        if(buddyDiv > 0){
            require(hexInterface.transfer(devAddress, buddyDiv.div(2)), "Transfer failed");//send hex as buddy div to dev1 as penalty for user exiting pool
            require(hexInterface.transfer(devAddress2, buddyDiv.div(2)), "Transfer failed");//send hex as buddy div to dev2 as penalty for user exiting pool
        }
        if(entry.refferer == address(0)){//no ref
            //set new buddyDivs as hex refFee
            buddyDiv = _refFee;
        }
        else{//ref
            //set new buddyDivs as hex refFee / 2
            buddyDiv = _refFee.div(2);
            require(hexInterface.transfer(entry.refferer, _refFee.div(2)), "Ref transfer failed");//send hex to refferer
        }
        //send
        require(hexInterface.transfer(msg.sender, _hearts), "Transfer failed");//send hex from contract to user
        require(hexInterface.transfer(devAddress, _devFee), "Dev1 transfer failed");//send hex to dev
        require(hexInterface.transfer(devAddress2, _devFee2), "Dev2 transfer failed");//send hex to dev2
        //events
        emit PoolExit(
            entry.userAddress,
            entry.heartValue,
            entry.entryId,
            pool.poolId
        );
        return true;
    }

    //updates user data
    function updateUserData(uint hearts)
        internal
    {
        UserInfo storage user = users[msg.sender];
        user.totalHeartsEntered = user.totalHeartsEntered.add(hearts);//total amount of hearts deposited by this user after fees
        user.userAddress = msg.sender;
    }

    //updates entry data
    function updateEntryData(uint hearts, uint poolId, address payable ref)
        internal
    {
        uint _entryID = _next_pool_entry_id();
        userEntryIds[msg.sender].push(_entryID);//update userEntryIds
        poolEntryIds[poolId].push(_entryID);//update poolEntryIds
        EntryInfo memory entry;
        entry.heartValue = hearts;//amount of hearts deposited in this entry after fees
        entry.poolId = poolId;//poolId this entry has deposited to
        entry.entryId = _entryID;
        entry.userAddress = msg.sender;
        entry.refferer = ref;
        entries[_entryID] = entry;//update entry data
        emit PoolEntry(
            entry.userAddress,
            entry.heartValue,
            entry.entryId,
            poolId
        );
    }

    //get next entry id
    function _next_pool_entry_id()
        internal
        returns (uint)
    {
        last_pool_entry_id++;
        return last_pool_entry_id;
    }

    //get next pool id
    function _next_pool_id()
        internal
        returns (uint)
    {
        last_pool_id++;
        return last_pool_id;
    }

    //get next stake id
    function _next_stake_id()
        internal
        returns (uint)
    {
        last_stake_id++;
        return last_stake_id;
    }

    //////////////////////////////////////////////////////////////////
    ////////////////////////PUBLIC FACING HEXPOOL////////////////////
    ////////////////////////////////////////////////////////////////

    //enter any pool that isActive
    function EnterPool(uint _hearts, uint _poolId, address payable _ref)
        public
        canEnter(_poolId, _hearts)
        synchronized
    {
        require(enterPool(_hearts, _poolId, _ref), "Error: could not enter pool");
    }

    //withdraw funds from pool by entryId - pool cannot be already staking
    function ExitPool(uint _entryId)
        public
        synchronized
    {
        require(exitPool(_entryId), "Error: could not exit pool");
    }

    //ends a staked pool
    function EndPoolStake(uint _poolId)
        public
        synchronized
    {
        require(endStake(_poolId), "Error: could not end stake");
    }

    //withdraws HEX staking rewards
    function WithdrawHEX(uint _poolId)
        public
        synchronized
    {
        require(withdrawPoolRewards(_poolId), "Error: could not withdraw rewards");
    }

    //////////////////////////////////////////
    ////////////VIEW ONLY/////////////////////
    //////////////////////////////////////////

    //only an active pool can be entered or exited
    function isPoolActive(uint poolId)
        public
        view
        isReady
        returns(bool)
    {
        return pools[poolId].isActive;
    }

    //
    function isPoolStaking(uint poolId)
        public
        view
        returns(bool)
    {
        return pools[poolId].isStaking;
    }

    //
    function isPoolStakeFinished(uint poolId)
        public
        view
        returns(bool)
    {
        //add 1 to stakeDayLength to account for stake pending time
        return pools[poolId].poolStakeStartTimestamp.add((pools[poolId].poolStakeDayLength.add(1)).mul(86400)) <= now;
    }

    //
    function isPoolStakeEnded(uint poolId)
        public
        view
        returns(bool)
    {
        return pools[poolId].stakeEnded;
    }

    //general user info
    function getUserInfo(address addr)
        public
        view
        returns(
        uint    totalHeartsEntered,
        uint[] memory _entryIds,
        address userAddress
        )
    {
        return(users[addr].totalHeartsEntered, userEntryIds[addr], users[addr].userAddress);
    }

    //general entry info
    function getEntryInfo(uint entryId)
        public
        view
        returns(
        uint     heartValue,
        uint     poolId,
        address payable userAddress,
        address payable refferer
        )
    {
        return(entries[entryId].heartValue, entries[entryId].poolId, entries[entryId].userAddress, entries[entryId].refferer);
    }

    //general pool info
    function getPoolInfo(uint poolId)
        public
        view
        returns(
        uint     poolStakeThreshold,//hearts
        uint     poolStakeDayLength,
        uint     poolValue,//hearts
        uint     poolType,
        bool     isStaking,
        uint256  poolStakeStartTimestamp,
        bool     stakeEnded
        )
    {
        return(
            pools[poolId].poolStakeThreshold,
            pools[poolId].poolStakeDayLength,
            pools[poolId].poolValue,
            pools[poolId].poolType,
            pools[poolId].isStaking,
            pools[poolId].poolStakeStartTimestamp,
            pools[poolId].stakeEnded
            );
    }

    //returns all entryIds of a pool
    function getPoolEntryIds(uint poolId)
        public
        view
        returns(uint[] memory)
    {
        return poolEntryIds[poolId];
    }

    //return vital stake params
    function getPoolStakeInfo(uint poolId)
        public
        view
        returns(uint stakeId, uint hexStakeIndex, uint40 hexStakeId)
    {
        return(pools[poolId].stakeId, getStakeIndexById(address(this), pools[poolId].hexStakeId), pools[poolId].hexStakeId);
    }

    //returns amount of users by address in a pool
    function getPoolUserCount(uint poolId)
        public
        view
        returns(uint)
    {
        return poolUserCount[poolId];
    }

    //is address a user of pool
    function isPoolParticipant(uint id, address addr)
        public
        view
        returns(bool)
    {
       return pools[id].poolParticipant[addr];
    }

    //returns total hearts a user owns in pool
    function getUserHeartValue(uint id, address addr)
        public
        view
        returns(uint)
    {
       return pools[id].userHeartValue[addr];
    }

    //returns contract HEX balance
    function getContractBalance()
        public
        view
        returns(uint)
    {
        return hexInterface.balanceOf(address(this));
    }

    ///////////////////////////////////////////////
    //////////////////MUTABLE//////////////////////
    //////////////////////////////////////////////

    function setMinEntry(uint hearts)
        public
        onlyOwner
    {
        minEntryHearts = hearts;
    }

    ///////////////////////////////////////////////
    ///////////////////HEX UTILS///////////////////
    ///////////////////////////////////////////////
    //credits to kyle bahr @ https://gist.github.com/kbahr/80e61ab761053849f7fdc6226b85a354

    struct SStore {
        uint40 stakeId;
        uint72 stakedHearts;
        uint72 stakeShares;
        uint16 lockedDay;
        uint16 stakedDays;
        uint16 unlockedDay;
        bool isAutoStake;
    }

    struct DailyDataCache {
        uint256 dayPayoutTotal;
        uint256 dayStakeSharesTotal;
        uint256 dayUnclaimedSatoshisTotal;
    }
    uint256 private constant HEARTS_UINT_SHIFT = 72;
    uint256 private constant HEARTS_MASK = (1 << HEARTS_UINT_SHIFT) - 1;
    uint256 private constant SATS_UINT_SHIFT = 56;
    uint256 private constant SATS_MASK = (1 << SATS_UINT_SHIFT) - 1;

    function decodeDailyData(uint256 encDay)
    private
    pure
    returns (DailyDataCache memory)
    {
        uint256 v = encDay;
        uint256 payout = v & HEARTS_MASK;
        v = v >> HEARTS_UINT_SHIFT;
        uint256 shares = v & HEARTS_MASK;
        v = v >> HEARTS_UINT_SHIFT;
        uint256 sats = v & SATS_MASK;
        return DailyDataCache(payout, shares, sats);
    }

    function interestForRange(DailyDataCache[] memory dailyData, uint256 myShares)
    private
    pure
    returns (uint256)
    {
        uint256 len = dailyData.length;
        uint256 total = 0;
        for(uint256 i = 0; i < len; i++){
            total += interestForDay(dailyData[i], myShares);
        }
        return total;
    }

    function interestForDay(DailyDataCache memory dayObj, uint256 myShares)
    private
    pure
    returns (uint256)
    {
        return myShares * dayObj.dayPayoutTotal / dayObj.dayStakeSharesTotal;
    }

    function getDataRange(uint256 b, uint256 e)
    private
    view
    returns (DailyDataCache[] memory)
    {
        uint256[] memory dataRange = hexInterface.dailyDataRange(b, e);
        uint256 len = dataRange.length;
        DailyDataCache[] memory data = new DailyDataCache[](len);
        for(uint256 i = 0; i < len; i++){
            data[i] = decodeDailyData(dataRange[i]);
        }
        return data;
    }

    function getLastDataDay()
    private
    view
    returns(uint256)
    {
        uint256[13] memory globalInfo = hexInterface.globalInfo();
        uint256 lastDay = globalInfo[4];
        return lastDay;
    }

    function getInterestByStake(SStore memory s)
    private
    view
    returns (uint256)
    {
        uint256 b = s.lockedDay;
        uint256 e = getLastDataDay(); // ostensibly "today"

        if (b >= e) {
            //not started - error
            return 0;
        } else {
            DailyDataCache[] memory data = getDataRange(b, e);
            return interestForRange(data, s.stakeShares);
        }
    }

    function getInterestByStakeId(address addr, uint40 stakeId)
    public
    view
    returns (uint256)
    {
        SStore memory s = getStakeByStakeId(addr, stakeId);

        return getInterestByStake(s);
    }

    function getTotalValueByStakeId(address addr, uint40 stakeId)
    public
    view
    returns (uint256)
    {
        SStore memory stake = getStakeByStakeId(addr, stakeId);

        uint256 interest = getInterestByStake(stake);
        return stake.stakedHearts + interest;
    }

    function getStakeByIndex(address addr, uint256 idx)
    private
    view
    returns (SStore memory)
    {
        uint40 stakeId;
        uint72 stakedHearts;
        uint72 stakeShares;
        uint16 lockedDay;
        uint16 stakedDays;
        uint16 unlockedDay;
        bool isAutoStake;

        (stakeId,
            stakedHearts,
            stakeShares,
            lockedDay,
            stakedDays,
            unlockedDay,
            isAutoStake) = hexInterface.stakeLists(addr, idx);

        return SStore(stakeId,
                        stakedHearts,
                        stakeShares,
                        lockedDay,
                        stakedDays,
                        unlockedDay,
                        isAutoStake);
    }

    function getStakeByStakeId(address addr, uint40 sid)
    private
    view
    returns (SStore memory)
    {

        uint40 stakeId;
        uint72 stakedHearts;
        uint72 stakeShares;
        uint16 lockedDay;
        uint16 stakedDays;
        uint16 unlockedDay;
        bool isAutoStake;

        uint256 stakeCount = hexInterface.stakeCount(addr);
        for(uint256 i = 0; i < stakeCount; i++){
            (stakeId,
            stakedHearts,
            stakeShares,
            lockedDay,
            stakedDays,
            unlockedDay,
            isAutoStake) = hexInterface.stakeLists(addr, i);

            if(stakeId == sid){
                return SStore(stakeId,
                                stakedHearts,
                                stakeShares,
                                lockedDay,
                                stakedDays,
                                unlockedDay,
                                isAutoStake);
            }
        }
    }

    function getStakeIndexById(address addr, uint40 sid)
        private
        view
        returns (uint)
    {
        uint40 stakeId;
        uint72 stakedHearts;
        uint72 stakeShares;
        uint16 lockedDay;
        uint16 stakedDays;
        uint16 unlockedDay;
        bool isAutoStake;

        uint256 stakeCount = hexInterface.stakeCount(addr);
        for(uint256 i = 0; i < stakeCount; i++){
            (stakeId,
            stakedHearts,
            stakeShares,
            lockedDay,
            stakedDays,
            unlockedDay,
            isAutoStake) = hexInterface.stakeLists(addr, i);

            if(stakeId == sid){
                return i;
            }
        }
    }
}

File 2 of 4: HEX.sol
pragma solidity 0.5.13;

interface HEX {
   /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);//from address(0) for minting

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
    
   function stakeStart(uint256 newStakedHearts, uint256 newStakedDays) external;
   function stakeEnd(uint256 stakeIndex, uint40 stakeIdParam) external;
   function stakeCount(address stakerAddr) external view returns (uint256);
   function stakeLists(address owner, uint256 stakeIndex) external view returns (uint40, uint72, uint72, uint16, uint16, uint16, bool);
   function currentDay() external view returns (uint256);
   function dailyDataRange(uint256 beginDay, uint256 endDay) external view returns (uint256[] memory);
   function globalInfo() external view returns (uint256[13] memory);

}

File 3 of 4: IERC20.sol
pragma solidity ^0.5.13;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
 
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);//from address(0) for minting

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 4 of 4: SafeMath.sol
pragma solidity ^0.5.13;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"heartValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeProfit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"dayLength","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hexStakeId","type":"uint256"}],"name":"PoolEndStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"heartValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"entryId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"PoolEntry","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"heartValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"entryId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"PoolExit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"heartValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"dayLength","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"poolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"hexStakeId","type":"uint256"}],"name":"PoolStartStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenFreeze","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenUnfreeze","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"heartValue","type":"uint256"}],"name":"Withdrawal","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"EndPoolStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_hearts","type":"uint256"},{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"address payable","name":"_ref","type":"address"}],"name":"EnterPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_entryId","type":"uint256"}],"name":"ExitPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"FreezeTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"UnfreezeTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"}],"name":"WithdrawHEX","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"buddyDiv","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"entries","outputs":[{"internalType":"uint256","name":"heartValue","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"entryId","type":"uint256"},{"internalType":"address payable","name":"userAddress","type":"address"},{"internalType":"address payable","name":"refferer","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"entryId","type":"uint256"}],"name":"getEntryInfo","outputs":[{"internalType":"uint256","name":"heartValue","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address payable","name":"userAddress","type":"address"},{"internalType":"address payable","name":"refferer","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint40","name":"stakeId","type":"uint40"}],"name":"getInterestByStakeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getPoolEntryIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getPoolInfo","outputs":[{"internalType":"uint256","name":"poolStakeThreshold","type":"uint256"},{"internalType":"uint256","name":"poolStakeDayLength","type":"uint256"},{"internalType":"uint256","name":"poolValue","type":"uint256"},{"internalType":"uint256","name":"poolType","type":"uint256"},{"internalType":"bool","name":"isStaking","type":"bool"},{"internalType":"uint256","name":"poolStakeStartTimestamp","type":"uint256"},{"internalType":"bool","name":"stakeEnded","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getPoolStakeInfo","outputs":[{"internalType":"uint256","name":"stakeId","type":"uint256"},{"internalType":"uint256","name":"hexStakeIndex","type":"uint256"},{"internalType":"uint40","name":"hexStakeId","type":"uint40"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getPoolUserCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint40","name":"stakeId","type":"uint40"}],"name":"getTotalValueByStakeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"getUserHeartValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"totalHeartsEntered","type":"uint256"},{"internalType":"uint256[]","name":"_entryIds","type":"uint256[]"},{"internalType":"address","name":"userAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getWithdrawableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"isPoolActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"isPoolParticipant","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"isPoolStakeEnded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"isPoolStakeFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"isPoolStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"last_pool_entry_id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"last_pool_id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"last_stake_id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minEntryHearts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"uint256","name":"poolStakeThreshold","type":"uint256"},{"internalType":"uint256","name":"poolStakeDayLength","type":"uint256"},{"internalType":"uint256","name":"poolValue","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"uint256","name":"poolType","type":"uint256"},{"internalType":"uint256","name":"stakeId","type":"uint256"},{"internalType":"uint40","name":"hexStakeId","type":"uint40"},{"internalType":"bool","name":"isStaking","type":"bool"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"uint256","name":"poolStakeStartTimestamp","type":"uint256"},{"internalType":"uint256","name":"stakeValue","type":"uint256"},{"internalType":"uint256","name":"stakeProfit","type":"uint256"},{"internalType":"bool","name":"stakeEnded","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"hearts","type":"uint256"}],"name":"setMinEntry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenFrozenBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalFrozen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalFrozenTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"totalHeartsEntered","type":"uint256"},{"internalType":"address","name":"userAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]

6080604052678ac7230489e800006003553480156200001d57600080fd5b50600980546001600160a01b0319908116331790915560088054909116732b591e99afe9f32eaa6214f7b7629768c40eeb39179055620000656001600160e01b036200006b16565b62000716565b6009546001600160a01b03163314620000e557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6e6f744f776e6572000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b601454610100900460ff16156200015d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f63616e6e6f74207265696e697469616c697a6500000000000000000000000000604482015290519081900360640190fd5b60005b60038110156200018b5762000181816000806001600160e01b03620001b616565b5060010162000160565b50620001a564174876e8006001600160e01b036200046016565b6014805461ff001916610100179055565b6000808085620001d3575066354a6ba7a180009050602462000276565b8560011415620001f1575066354a6ba7a18000905061016d62000276565b85600214156200020f575066354a6ba7a180009050610e4262000276565b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f696e76616c696420706f6f6c5479706500000000000000000000000000000000604482015290519081900360640190fd5b60006200028b6001600160e01b03620004df16565b60008181526010602052604090208481556001810184905560028101889055600381018290556004810189905560088101805460ff60301b1916660100000000000017905590915086156200036857600082815260116020908152604080832080546001908101909155338452600585018352818420805460ff19169091179055600684018252909120546200032c9189906200232b620004ed821b17901c565b33600090815260068301602052604090205562000352876001600160e01b036200056916565b620003688783886001600160e01b03620005ae16565b60009182526010602052604090912081548155600180830154818301556002808401549083015560038084015490830155600480840154908301556007808401549083015560088084018054918401805464ffffffffff90931664ffffffffff1990931692909217808355815460ff60281b19909116650100000000009182900460ff908116151590920217808455915460ff60301b19909216660100000000000092839004821615159092029190911790915560098085015490840155600a8085015490840155600b8085015490840155600c9384015493909201805460ff19169390921615159290921790559695505050505050565b6009546001600160a01b03163314620004da57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6e6f744f776e6572000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600d55565b600b80546001019081905590565b6000828201838110156200056257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b336000908152600e602090815260409091208054909162000596919084906200232b620004ed821b17901c565b815560010180546001600160a01b0319163317905550565b6000620005c36001600160e01b03620006c716565b336000908152601360209081526040808320805460018181018355918552838520018590558784526012835290832080549182018155835291200181905590506200060d620006d5565b8481526020808201858152604080840185815233606086019081526001600160a01b03888116608088019081526000898152600f885285902088518082559651600182015593516002850181905592516003850180549184166001600160a01b0319928316811790915591516004909501805495909316941693909317905582518981529251909491927fb8ab617400c81f66404f4b37405e10991268e0a05e4d7f3b06b7d28076c2c69592908290030190a45050505050565b600a80546001019081905590565b6040518060a0016040528060008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b614a0780620007266000396000f3fe60806040526004361061027d5760003560e01c8063916808bb1161014f578063ac4afa38116100c1578063c7d0b70e1161007a578063c7d0b70e14610b49578063cc2e5b2814610b73578063d34b0a3e14610bac578063dd62ed3e14610bc1578063ea62167b14610bfc578063f248b86a14610c265761027d565b8063ac4afa3814610955578063ad663e67146109f0578063b0a5df9a14610a3f578063b30906d414610a7f578063bb7a1c3514610ae0578063bbbaf8c814610b1f5761027d565b80639e1a4d19116101135780639e1a4d191461083b578063a391210714610850578063a457c2d714610865578063a87430ba1461089e578063a8dcd03a146108f2578063a9059cbb1461091c5761027d565b8063916808bb1461075b578063922e92a3146107705780639355aea7146107a357806394244039146107fc57806395d89b41146108265761027d565b8063313ce567116101f35780636f9fb98a116101ac5780636f9fb98a1461066a57806370a082311461067f5780637be79cf6146106b25780637e8e3749146106dc5780638094f90d1461071c57806384e56ca2146107465761027d565b8063313ce567146104e857806333590596146104fd578063365a94e8146105365780633950935114610560578063404f1fec146105995780636386c1c7146105c35761027d565b806318160ddd1161024557806318160ddd146103d6578063181f599f146103eb5780631e7f87bc1461040057806323b872dd14610415578063245590da146104585780632f380b35146104825761027d565b80630410808e1461028457806306fdde03146102ab578063095ea7b3146103355780630cdc25d3146103825780630cfd442a146103ac575b600080fd5b005b34801561029057600080fd5b50610299610ca0565b60408051918252519081900360200190f35b3480156102b757600080fd5b506102c0610ca6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102fa5781810151838201526020016102e2565b50505050905090810190601f1680156103275780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561034157600080fd5b5061036e6004803603604081101561035857600080fd5b506001600160a01b038135169060200135610cc9565b604080519115158252519081900360200190f35b34801561038e57600080fd5b50610282600480360360208110156103a557600080fd5b5035610ce0565b3480156103b857600080fd5b50610282600480360360208110156103cf57600080fd5b5035610d98565b3480156103e257600080fd5b50610299610e2d565b3480156103f757600080fd5b50610299610e33565b34801561040c57600080fd5b50610299610e39565b34801561042157600080fd5b5061036e6004803603606081101561043857600080fd5b506001600160a01b03813581169160208101359091169060400135610e3f565b34801561046457600080fd5b506102826004803603602081101561047b57600080fd5b5035610eae565b34801561048e57600080fd5b506104ac600480360360208110156104a557600080fd5b5035610fbf565b6040805197885260208801969096528686019490945260608601929092521515608085015260a0840152151560c0830152519081900360e00190f35b3480156104f457600080fd5b50610299611009565b34801561050957600080fd5b5061036e6004803603604081101561052057600080fd5b50803590602001356001600160a01b031661100e565b34801561054257600080fd5b5061036e6004803603602081101561055957600080fd5b503561103d565b34801561056c57600080fd5b5061036e6004803603604081101561058357600080fd5b506001600160a01b0381351690602001356110a3565b3480156105a557600080fd5b50610299600480360360208110156105bc57600080fd5b50356110df565b3480156105cf57600080fd5b506105f6600480360360208110156105e657600080fd5b50356001600160a01b03166110f1565b6040518084815260200180602001836001600160a01b03166001600160a01b03168152602001828103825284818151815260200191508051906020019060200280838360005b8381101561065457818101518382015260200161063c565b5050505090500194505050505060405180910390f35b34801561067657600080fd5b50610299611186565b34801561068b57600080fd5b50610299600480360360208110156106a257600080fd5b50356001600160a01b0316611202565b3480156106be57600080fd5b50610282600480360360208110156106d557600080fd5b503561121d565b3480156106e857600080fd5b50610299600480360360408110156106ff57600080fd5b5080356001600160a01b0316906020013564ffffffffff1661126c565b34801561072857600080fd5b506102996004803603602081101561073f57600080fd5b5035611293565b34801561075257600080fd5b50610299611357565b34801561076757600080fd5b5061029961135d565b34801561077c57600080fd5b506102996004803603602081101561079357600080fd5b50356001600160a01b0316611363565b3480156107af57600080fd5b506107cd600480360360208110156107c657600080fd5b5035611375565b6040805194855260208501939093526001600160a01b0391821684840152166060830152519081900360800190f35b34801561080857600080fd5b5061036e6004803603602081101561081f57600080fd5b50356113a9565b34801561083257600080fd5b506102c06113c1565b34801561084757600080fd5b506102996113e1565b34801561085c57600080fd5b506102996113f1565b34801561087157600080fd5b5061036e6004803603604081101561088857600080fd5b506001600160a01b0381351690602001356113f7565b3480156108aa57600080fd5b506108d1600480360360208110156108c157600080fd5b50356001600160a01b031661144c565b604080519283526001600160a01b0390911660208301528051918290030190f35b3480156108fe57600080fd5b506102826004803603602081101561091557600080fd5b503561146e565b34801561092857600080fd5b5061036e6004803603604081101561093f57600080fd5b506001600160a01b038135169060200135611519565b34801561096157600080fd5b5061097f6004803603602081101561097857600080fd5b5035611526565b604080519d8e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945264ffffffffff90921660c0890152151560e08801521515610100870152610120860152610140850152610160840152151561018083015251908190036101a00190f35b3480156109fc57600080fd5b50610a1a60048036036020811015610a1357600080fd5b503561159a565b60408051938452602084019290925264ffffffffff1682820152519081900360600190f35b348015610a4b57600080fd5b5061029960048036036040811015610a6257600080fd5b5080356001600160a01b0316906020013564ffffffffff166115ee565b348015610a8b57600080fd5b50610aa960048036036020811015610aa257600080fd5b503561162c565b604080519586526020860194909452848401929092526001600160a01b039081166060850152166080830152519081900360a00190f35b348015610aec57600080fd5b5061028260048036036060811015610b0357600080fd5b50803590602081013590604001356001600160a01b0316611667565b348015610b2b57600080fd5b5061036e60048036036020811015610b4257600080fd5b5035611818565b348015610b5557600080fd5b5061028260048036036020811015610b6c57600080fd5b5035611881565b348015610b7f57600080fd5b5061029960048036036040811015610b9657600080fd5b50803590602001356001600160a01b03166119d3565b348015610bb857600080fd5b506102996119ff565b348015610bcd57600080fd5b5061029960048036036040811015610be457600080fd5b506001600160a01b0381358116916020013516611a05565b348015610c0857600080fd5b5061036e60048036036020811015610c1f57600080fd5b5035611a30565b348015610c3257600080fd5b50610c5060048036036020811015610c4957600080fd5b5035611a4f565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610c8c578181015183820152602001610c74565b505050509050019250505060405180910390f35b60065490565b604051806040016040528060078152602001661211561413d3d360ca1b81525081565b6000610cd6338484611ab1565b5060015b92915050565b60145460ff1615610d24576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff19166001179055610d3a81611b9d565b610d8b576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20636f756c64206e6f7420656e64207374616b65000000000000604482015290519081900360640190fd5b506014805460ff19169055565b60145460ff1615610ddc576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff19166001179055610df281611e0d565b610d8b5760405162461bcd60e51b81526004018080602001828103825260218152602001806148056021913960400191505060405180910390fd5b60045490565b600c5481565b60065481565b6000610e4c8484846120ab565b610ea48433610e9f8560405180606001604052806028815260200161491c602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919063ffffffff61224b16565b611ab1565b5060019392505050565b60008111610ef0576040805162461bcd60e51b815260206004820152600a6024820152691e995c9bc81a5b9c1d5d60b21b604482015290519081900360640190fd5b33600090815260076020526040902054811115610f3e5760405162461bcd60e51b815260040180806020018281038252602281526020018061484c6022913960400191505060405180910390fd5b33600090815260076020526040902054610f5e908263ffffffff6122e216565b33600090815260076020526040902055600654610f81908263ffffffff6122e216565b600655610f8f3033836120ab565b604051819033907fb925ba840e2f36bcb317f8179bd8b5ed01aba4a22abf5f169162c0894dea87ab90600090a350565b6000908152601060205260409020805460018201546002830154600484015460088501546009860154600c909601549496939592949193600160281b90910460ff90811693921690565b600881565b60008281526010602090815260408083206001600160a01b038516845260050190915290205460ff1692915050565b600081815260106020526040812060019081015442916110999161107b91620151809161106f9163ffffffff61232b16565b9063ffffffff61238516565b6000858152601060205260409020600901549063ffffffff61232b16565b111590505b919050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610cd6918590610e9f908663ffffffff61232b16565b60009081526011602052604090205490565b6001600160a01b038082166000908152600e6020818152604080842080546013845282862094845260019091015484548351818602810186019094528084529596606096889693959394929091169284919083018282801561117257602002820191906000526020600020905b81548152602001906001019080831161115e575b505050505091509250925092509193909250565b600854604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156111d157600080fd5b505afa1580156111e5573d6000803e3d6000fd5b505050506040513d60208110156111fb57600080fd5b5051905090565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b03163314611267576040805162461bcd60e51b81526020600482015260086024820152673737ba27bbb732b960c11b604482015290519081900360640190fd5b600d55565b6000611276614681565b61128084846123de565b905061128b816125cb565b949350505050565b6000818152601060205260408120600c81015460ff166112fa576040805162461bcd60e51b815260206004820152601f60248201527f706f6f6c207374616b6520686173206e6f74207965742066696e697368656400604482015290519081900360640190fd5b33600090815260068201602052604090205461131a57600091505061109e565b8054336000908152600683016020526040812054600a840154919261128b92909161134b919063ffffffff61238516565b9063ffffffff61262516565b60055481565b600a5481565b60076020526000908152604090205481565b6000908152600f60205260409020805460018201546003830154600490930154919390926001600160a01b03908116921690565b6000908152601060205260409020600c015460ff1690565b604051806040016040528060048152602001631413d3d360e21b81525081565b60006113ec33611202565b905090565b600b5481565b6000610cd63384610e9f856040518060600160405280602581526020016149ae602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919063ffffffff61224b16565b600e60205260009081526040902080546001909101546001600160a01b031682565b60145460ff16156114b2576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff191660011790556114c881612667565b610d8b576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20636f756c64206e6f74206578697420706f6f6c000000000000604482015290519081900360640190fd5b6000610cd63384846120ab565b601060205260009081526040902080546001820154600283015460038401546004850154600786015460088701546009880154600a890154600b8a0154600c909a015498999798969795969495939464ffffffffff84169460ff600160281b8604811695600160301b90048116949392168d565b60008181526010602052604081206007810154600890910154829182916115c990309064ffffffffff16612f21565b60009586526010602052604090952060080154909564ffffffffff9091169350915050565b60006115f8614681565b61160284846123de565b9050600061160f826125cb565b60209092015168ffffffffffffffffff1690910191505092915050565b600f60205260009081526040902080546001820154600283015460038401546004909401549293919290916001600160a01b03908116911685565b818361167282611818565b6116c3576040805162461bcd60e51b815260206004820152601f60248201527f63616e6e6f7420656e7465722c20706f6f6c4964206e6f742061637469766500604482015290519081900360640190fd5b600b5482111561171a576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20706f6f6c4964206f7574206f662072616e6765000000000000604482015290519081900360640190fd5b600d54811161175a5760405162461bcd60e51b81526004018080602001828103825260308152602001806148cb6030913960400191505060405180910390fd5b60145460ff161561179e576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff191660011790556117b68585856130af565b611807576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a20636f756c64206e6f7420656e74657220706f6f6c0000000000604482015290519081900360640190fd5b50506014805460ff19169055505050565b601454600090610100900460ff166118615760405162461bcd60e51b815260040180806020018281038252602381526020018061473f6023913960400191505060405180910390fd5b50600090815260106020526040902060080154600160301b900460ff1690565b600081116118c3576040805162461bcd60e51b815260206004820152600a6024820152691e995c9bc81a5b9c1d5d60b21b604482015290519081900360640190fd5b806118cc6113e1565b101561191f576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a20696e73756666696369656e742062616c616e63650000000000604482015290519081900360640190fd5b61195f61194361193683606463ffffffff61262516565b839063ffffffff6122e216565b336000908152600760205260409020549063ffffffff61232b16565b3360009081526007602052604090205561199561198661193683606463ffffffff61262516565b6006549063ffffffff61232b16565b6006556119a33330836120ab565b604051819033907f7def9f73ac6a7ac8fe4dc55f5257d48aed7e3f9d5247b0020598b87a5c369d8290600090a350565b60008281526010602090815260408083206001600160a01b038516845260060190915290205492915050565b600d5481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600090815260106020526040902060080154600160281b900460ff1690565b600081815260126020908152604091829020805483518184028101840190945280845260609392830182828015611aa557602002820191906000526020600020905b815481526020019060010190808311611a91575b50505050509050919050565b6001600160a01b038316611af65760405162461bcd60e51b815260040180806020018281038252602481526020018061498a6024913960400191505060405180910390fd5b6001600160a01b038216611b3b5760405162461bcd60e51b81526004018080602001828103825260228152602001806147e36022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000600b54821115611bf6576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20706f6f6c4964206f7574206f662072616e6765000000000000604482015290519081900360640190fd5b60008281526010602052604090206008810154600160281b900460ff16611c4e5760405162461bcd60e51b815260040180806020018281038252603b81526020018061486e603b913960400191505060405180910390fd5b611c578361103d565b611ca8576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a2063616e6e6f74206561726c7920756e7374616b650000000000604482015290519081900360640190fd5b6000611cb2611186565b60088054908401549192506001600160a01b03169063343009a290611cdf90309064ffffffffff16612f21565b6008850154604080516001600160e01b031960e086901b168152600481019390935264ffffffffff909116602483015251604480830192600092919082900301818387803b158015611d3057600080fd5b505af1158015611d44573d6000803e3d6000fd5b50505060088301805465ff00000000001916905550600c8201805460ff191660011790556000611d8282611d76611186565b9063ffffffff6122e216565b600a84018190558354909150611d9f90829063ffffffff6122e216565b600b840181905560038401546001850154600286015460088701546040805195865264ffffffffff909116602086015280519394929391927f4264c1c4dce9a5bdaf76353b212e051ed6a441a4c184dece2572f8510b007c8f929081900390910190a4506001949350505050565b60008181526010602052604081206002810154611e71576040805162461bcd60e51b815260206004820152601e60248201527f706f6f6c20726577617264732068617665206265656e20647261696e65640000604482015290519081900360640190fd5b6000838152601060209081526040808320338452600601909152902054611edf576040805162461bcd60e51b815260206004820152601e60248201527f796f752068617665206e6f20736861726520696e207468697320706f6f6c0000604482015290519081900360640190fd5b600c81015460ff16611ef657611ef483611b9d565b505b6000611f0184611293565b3360009081526006840160205260409020546002840154919250611f2b919063ffffffff6122e216565b6002830190815533600090815260068401602052604081205554611fb1576000848152601060205260408120818155600181018290556002810182905560038101829055600481018290556007810182905560088101805466ffffffffffffff1916905560098101829055600a8101829055600b810191909155600c01805460ff191690555b6008546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561200557600080fd5b505af1158015612019573d6000803e3d6000fd5b505050506040513d602081101561202f57600080fd5b5051612074576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b604051819033907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6590600090a35060019392505050565b6001600160a01b0383166120f05760405162461bcd60e51b81526004018080602001828103825260258152602001806149656025913960400191505060405180910390fd5b6001600160a01b0382166121355760405162461bcd60e51b81526004018080602001828103825260238152602001806147626023913960400191505060405180910390fd5b600061214882606463ffffffff61262516565b9050600061215c838363ffffffff6122e216565b90506121a181604051806060016040528060268152602001614826602691396001600160a01b038816600090815260208190526040902054919063ffffffff61224b16565b6001600160a01b0380871660009081526020819052604080822093909355908616815220546121d6908263ffffffff61232b16565b6001600160a01b0385166000908152602081905260409020556121f985836139ca565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050505050565b600081848411156122da5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561229f578181015183820152602001612287565b50505050905090810190601f1680156122cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600061232483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061224b565b9392505050565b600082820183811015612324576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261239457506000610cda565b828202828482816123a157fe5b04146123245760405162461bcd60e51b81526004018080602001828103825260218152602001806148fb6021913960400191505060405180910390fd5b6123e6614681565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b03166333060d908c6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561245d57600080fd5b505afa158015612471573d6000803e3d6000fd5b505050506040513d602081101561248757600080fd5b5051905060005b818110156125bc5760085460408051632607443b60e01b81526001600160a01b038f811660048301526024820185905291519190921691632607443b9160448083019260e0929190829003018186803b1580156124ea57600080fd5b505afa1580156124fe573d6000803e3d6000fd5b505050506040513d60e081101561251457600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a5098509650909450925064ffffffffff808a16908c1614156125b45750506040805160e08101825264ffffffffff909816885268ffffffffffffffffff9687166020890152949095169386019390935261ffff9182166060860152811660808501521660a0830152151560c08201529050610cda565b60010161248e565b50505050505050505092915050565b606081015160009061ffff16816125e0613ac6565b90508082106125f45760009250505061109e565b60606126008383613b64565b905061261b81866040015168ffffffffffffffffff16613d1c565b935050505061109e565b600061232483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d5e565b60006126716146bd565b506000828152600f6020908152604091829020825160a0810184528154815260018201549281019290925260028101549282019290925260038201546001600160a01b03908116606083018190526004909301541660808201529033146127095760405162461bcd60e51b81526004018080602001828103825260228152602001806148a96022913960400191505060405180910390fd5b60208082015160009081526010825260408082203383526005810190935290205460ff1661277e576040805162461bcd60e51b815260206004820152601e60248201527f796f7520617265206e6f74206120706f6f6c207061727469636970616e740000604482015290519081900360640190fd5b6008810154600160281b900460ff16156127df576040805162461bcd60e51b815260206004820152601c60248201527f706f6f6c206973207374616b696e672c2063616e6e6f74206578697400000000604482015290519081900360640190fd5b8151336000908152600e60205260409020546128009163ffffffff6122e216565b336000908152600e6020526040902055815160028201546128269163ffffffff6122e216565b6002820155815133600090815260068301602052604090205461284e9163ffffffff6122e216565b3360009081526006830160205260409020819055612898573360009081526005820160209081526040808320805460ff191690558482015183526011909152902080546000190190555b6000848152600f6020526040812081815560018101829055600281018290556003810180546001600160a01b031990811690915560049091018054909116905582516128eb90606463ffffffff61262516565b9050600061290082600263ffffffff61262516565b9050600061291583600463ffffffff61262516565b9050600061292a84600463ffffffff61262516565b8651909150600090612942908663ffffffff6122e216565b60055490915015612b36576008546009546005546001600160a01b039283169263a9059cbb92169061297b90600263ffffffff61262516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156129ca57600080fd5b505af11580156129de573d6000803e3d6000fd5b505050506040513d60208110156129f457600080fd5b5051612a39576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6008546005546001600160a01b039091169063a9059cbb9073d30bc4859a79852157211e6db19de159673a67e290612a7890600263ffffffff61262516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ac757600080fd5b505af1158015612adb573d6000803e3d6000fd5b505050506040513d6020811015612af157600080fd5b5051612b36576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60808701516001600160a01b0316612b52576005829055612c53565b612b6382600263ffffffff61262516565b60055560085460808801516001600160a01b039091169063a9059cbb90612b9185600263ffffffff61262516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612be057600080fd5b505af1158015612bf4573d6000803e3d6000fd5b505050506040513d6020811015612c0a57600080fd5b5051612c53576040805162461bcd60e51b8152602060048201526013602482015272149959881d1c985b9cd9995c8819985a5b1959606a1b604482015290519081900360640190fd5b6008546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015612ca757600080fd5b505af1158015612cbb573d6000803e3d6000fd5b505050506040513d6020811015612cd157600080fd5b5051612d16576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6008546009546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018890529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015612d6f57600080fd5b505af1158015612d83573d6000803e3d6000fd5b505050506040513d6020811015612d9957600080fd5b5051612de3576040805162461bcd60e51b815260206004820152601460248201527311195d8c481d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b6008546040805163a9059cbb60e01b815273d30bc4859a79852157211e6db19de159673a67e260048201526024810186905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015612e4b57600080fd5b505af1158015612e5f573d6000803e3d6000fd5b505050506040513d6020811015612e7557600080fd5b5051612ebf576040805162461bcd60e51b815260206004820152601460248201527311195d8c881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b8660400151876000015188606001516001600160a01b03167f998379a72dc64811ce41782d18dd7759dd22de4dd43049986376fada953be82989600301546040518082815260200191505060405180910390a450600198975050505050505050565b6000806000806000806000806000600860009054906101000a90046001600160a01b03166001600160a01b03166333060d908c6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612f9a57600080fd5b505afa158015612fae573d6000803e3d6000fd5b505050506040513d6020811015612fc457600080fd5b5051905060005b818110156125bc5760085460408051632607443b60e01b81526001600160a01b038f811660048301526024820185905291519190921691632607443b9160448083019260e0929190829003018186803b15801561302757600080fd5b505afa15801561303b573d6000803e3d6000fd5b505050506040513d60e081101561305157600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a5098509650909450925064ffffffffff808a16908c1614156130a7579850610cda975050505050505050565b600101612fcb565b600082815260106020526040812080548511156130fd5760405162461bcd60e51b815260040180806020018281038252603c815260200180614785603c913960400191505060405180910390fd5b6008810154600160281b900460ff1615613150576040805162461bcd60e51b815260206004820152600f60248201526e706f6f6c206973207374616b696e6760881b604482015290519081900360640190fd5b600061316386606463ffffffff61262516565b9050600061317882600263ffffffff61262516565b9050600061318d83600463ffffffff61262516565b905060006131a284600463ffffffff61262516565b905060006131b68a8663ffffffff6122e216565b60028701549091506131ce908263ffffffff61232b16565b600287015533600090815260058701602052604090205460ff16613221573360009081526005870160209081526040808320805460ff191660019081179091558c84526011909252909120805490910190555b336000908152600687016020526040902054613243908263ffffffff61232b16565b33600090815260068801602052604090205560055415613323576008546005546040805163a9059cbb60e01b81523360048201526024810192909252516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b1580156132b457600080fd5b505af11580156132c8573d6000803e3d6000fd5b505050506040513d60208110156132de57600080fd5b5051613323576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b03881661333b57600582905561344e565b61334c82600263ffffffff61262516565b6005556008546001600160a01b03166323b872dd338a61337386600263ffffffff61262516565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156133db57600080fd5b505af11580156133ef573d6000803e3d6000fd5b505050506040513d602081101561340557600080fd5b505161344e576040805162461bcd60e51b8152602060048201526013602482015272149959881d1c985b9cd9995c8819985a5b1959606a1b604482015290519081900360640190fd5b6008546005546001600160a01b03909116906323b872dd903390309061347b90869063ffffffff61232b16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156134e357600080fd5b505af11580156134f7573d6000803e3d6000fd5b505050506040513d602081101561350d57600080fd5b5051613552576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b600854600954604080516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101889052905191909216916323b872dd9160648083019260209291908290030181600087803b1580156135b157600080fd5b505af11580156135c5573d6000803e3d6000fd5b505050506040513d60208110156135db57600080fd5b5051613625576040805162461bcd60e51b815260206004820152601460248201527311195d8c481d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b600854604080516323b872dd60e01b815233600482015273d30bc4859a79852157211e6db19de159673a67e260248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561369357600080fd5b505af11580156136a7573d6000803e3d6000fd5b505050506040513d60208110156136bd57600080fd5b5051613707576040805162461bcd60e51b815260206004820152601460248201527311195d8c881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b855460028701541115613862578554600287015460009161372e919063ffffffff6122e216565b9050613748613743838363ffffffff6122e216565b613dc3565b61376661375b838363ffffffff6122e216565b88600301548b613dfc565b8654600288015533600090815260068801602052604090205461378f908263ffffffff6122e216565b3360009081526006890160205260409020556137ab8a88613f08565b6137fc576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20636f756c64206e6f74207374617274207374616b6500000000604482015290519081900360640190fd5b61380b8760040154828b61410e565b61385c576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a20636f756c64206e6f7420637265617465206e657720706f6f6c604482015290519081900360640190fd5b50613960565b8554600287015414156139485761387881613dc3565b6138878187600301548a613dfc565b6138918987613f08565b6138e2576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20636f756c64206e6f74207374617274207374616b6500000000604482015290519081900360640190fd5b6138f2866004015460008a61410e565b613943576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a20636f756c64206e6f7420637265617465206e657720706f6f6c604482015290519081900360640190fd5b613960565b61395181613dc3565b6139608187600301548a613dfc565b6139698a614363565b6139ba576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20636f756c64206e6f74206d696e7420746f6b656e7300000000604482015290519081900360640190fd5b5060019998505050505050505050565b6001600160a01b038216613a0f5760405162461bcd60e51b81526004018080602001828103825260218152602001806149446021913960400191505060405180910390fd5b613a52816040518060600160405280602281526020016147c1602291396001600160a01b038516600090815260208190526040902054919063ffffffff61224b16565b6001600160a01b038316600090815260208190526040902055600454613a7e908263ffffffff6122e216565b6004556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000613ad06146fe565b600860009054906101000a90046001600160a01b03166001600160a01b031663f04b5fa06040518163ffffffff1660e01b81526004016101a06040518083038186803b158015613b1f57600080fd5b505afa158015613b33573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506101a0811015613b5957600080fd5b506080015192915050565b60085460408051633510850760e11b81526004810185905260248101849052905160609283926001600160a01b0390911691636a210a0e91604480820192600092909190829003018186803b158015613bbc57600080fd5b505afa158015613bd0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613bf957600080fd5b8101908080516040519392919084640100000000821115613c1957600080fd5b908301906020820185811115613c2e57600080fd5b8251866020820283011164010000000082111715613c4b57600080fd5b82525081516020918201928201910280838360005b83811015613c78578181015183820152602001613c60565b505050509050016040525050509050600081519050606081604051908082528060200260200182016040528015613cc957816020015b613cb661471d565b815260200190600190039081613cae5790505b50905060005b82811015613d1257613cf3848281518110613ce657fe5b6020026020010151614384565b828281518110613cff57fe5b6020908102919091010152600101613ccf565b5095945050505050565b815160009081805b82811015613d5557613d49868281518110613d3b57fe5b6020026020010151866143c7565b90910190600101613d24565b50949350505050565b60008183613dad5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561229f578181015183820152602001612287565b506000838581613db957fe5b0495945050505050565b336000908152600e602052604090208054613de4908363ffffffff61232b16565b815560010180546001600160a01b0319163317905550565b6000613e066143e4565b33600090815260136020908152604080832080546001818101835591855283852001859055878452601283529083208054918201815583529120018190559050613e4e6146bd565b8481526020808201858152604080840185815233606086019081526001600160a01b03888116608088019081526000898152600f885285902088518082559651600182015593516002850181905592516003850180549184166001600160a01b0319928316811790915591516004909501805495909316941693909317905582518981529251909491927fb8ab617400c81f66404f4b37405e10991268e0a05e4d7f3b06b7d28076c2c69592908290030190a45050505050565b8054600282015460009114613f5d576040805162461bcd60e51b815260206004820152601660248201527514dd185ad948185b5bdd5b9d081a5b98dbdc9c9958dd60521b604482015290519081900360640190fd5b8154600183015460085460408051630a54871760e31b8152600481018590526024810184905290516001600160a01b03909216916352a438b89160448082019260009290919082900301818387803b158015613fb857600080fd5b505af1158015613fcc573d6000803e3d6000fd5b50506008546040805163033060d960e41b815230600482015290516000945061405a93506001926001600160a01b0316916333060d90916024808301926020929190829003018186803b15801561402257600080fd5b505afa158015614036573d6000803e3d6000fd5b505050506040513d602081101561404c57600080fd5b50519063ffffffff6122e216565b9050614064614681565b61406e30836143f2565b805160088801805464ffffffffff90921664ffffffffff1990921691909117808255600c5460078a01554260098a015566ffff00000000001916600160281b17905590506140ba614510565b5080516040805186815264ffffffffff90921660208301528051899286927fe6e27f56b3cdde69e5d0a9bcdef1ef34500823c80d47d320e171687080f8fbb292918290030190a35060019695505050505050565b6000808085614129575066354a6ba7a18000905060246141a1565b8560011415614145575066354a6ba7a18000905061016d6141a1565b8560021415614161575066354a6ba7a180009050610e426141a1565b6040805162461bcd60e51b815260206004820152601060248201526f696e76616c696420706f6f6c5479706560801b604482015290519081900360640190fd5b60006141ab61451e565b60008181526010602052604090208481556001810184905560028101889055600381018290556004810189905560088101805466ff0000000000001916600160301b179055909150861561426b57600082815260116020908152604080832080546001908101909155338452600585018352818420805460ff1916909117905560068401909152902054614245908863ffffffff61232b16565b33600090815260068301602052604090205561426087613dc3565b61426b878388613dfc565b60009182526010602052604090912081548155600180830154818301556002808401549083015560038084015490830155600480840154908301556007808401549083015560088084018054918401805464ffffffffff90931664ffffffffff1990931692909217808355815465ff000000000019909116600160281b9182900460ff908116151590920217808455915466ff00000000000019909216600160301b92839004821615159092029190911790915560098085015490840155600a8085015490840155600b8085015490840155600c9384015493909201805460ff19169390921615159290921790559695505050505050565b60008061437783606463ffffffff61262516565b905033610ea4818361452c565b61438c61471d565b506040805160608101825268ffffffffffffffffff8381168252604884901c16602082015260909290921c66ffffffffffffff169082015290565b6000826020015183600001518302816143dc57fe5b049392505050565b600a80546001019081905590565b6143fa614681565b60085460408051632607443b60e01b81526001600160a01b038681166004830152602482018690529151600093849384938493849384938493911691632607443b9160448082019260e092909190829003018186803b15801561445c57600080fd5b505afa158015614470573d6000803e3d6000fd5b505050506040513d60e081101561448657600080fd5b50805160208083015160408085015160608087015160808089015160a0808b015160c09b8c0151885160e081018a5264ffffffffff909c168c5268ffffffffffffffffff998a169a8c019a909a52979095169589019590955261ffff91821692880192909252928316908601529116908301521515918101919091529a9950505050505050505050565b600c80546001019081905590565b600b80546001019081905590565b806001600160a01b038316614588576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60025460ff1661467c57600354600454101561467c576003546004546145b4908363ffffffff61232b16565b11156145e9576004546003546145cf9163ffffffff6122e216565b6003546004556002805460ff191660011790559050614600565b6004546145fc908263ffffffff61232b16565b6004555b6001600160a01b038316600090815260208190526040902054614629908263ffffffff61232b16565b6001600160a01b0384166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35b505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6040518060a0016040528060008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b604051806101a00160405280600d906020820280388339509192915050565b6040518060600160405280600081526020016000815260200160008152509056fe63616e6e6f7420656e7465722c20706f6f6c73206e6f7420696e697469616c697a656445524332303a207472616e7366657220746f20746865207a65726f2061646472657373616d6f756e74206f766572207468726573686f6c64202d206f6e6c792031206e657720706f6f6c20746f20626520637265617465642070657220747845524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f20616464726573734572726f723a20636f756c64206e6f74207769746864726177207265776172647345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654572726f723a20756e73756666696369656e742066726f7a656e2062616c616e63654572726f723a20706f6f6c206973206e6f7420796574207374616b65642c206f722068617320616c726561647920656e646564207374616b696e676e6f7420656e747279206f776e65722c206f7220616c7265616479206578697465644572726f723a2076616c7565206d7573742062652067726561746572207468616e206d696e456e747279486561727473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820ca62bd23ffec7202a2b3a5f9ecfb53da305133c5723869fed8a369af68340e9364736f6c634300050d0032

Deployed Bytecode

0x60806040526004361061027d5760003560e01c8063916808bb1161014f578063ac4afa38116100c1578063c7d0b70e1161007a578063c7d0b70e14610b49578063cc2e5b2814610b73578063d34b0a3e14610bac578063dd62ed3e14610bc1578063ea62167b14610bfc578063f248b86a14610c265761027d565b8063ac4afa3814610955578063ad663e67146109f0578063b0a5df9a14610a3f578063b30906d414610a7f578063bb7a1c3514610ae0578063bbbaf8c814610b1f5761027d565b80639e1a4d19116101135780639e1a4d191461083b578063a391210714610850578063a457c2d714610865578063a87430ba1461089e578063a8dcd03a146108f2578063a9059cbb1461091c5761027d565b8063916808bb1461075b578063922e92a3146107705780639355aea7146107a357806394244039146107fc57806395d89b41146108265761027d565b8063313ce567116101f35780636f9fb98a116101ac5780636f9fb98a1461066a57806370a082311461067f5780637be79cf6146106b25780637e8e3749146106dc5780638094f90d1461071c57806384e56ca2146107465761027d565b8063313ce567146104e857806333590596146104fd578063365a94e8146105365780633950935114610560578063404f1fec146105995780636386c1c7146105c35761027d565b806318160ddd1161024557806318160ddd146103d6578063181f599f146103eb5780631e7f87bc1461040057806323b872dd14610415578063245590da146104585780632f380b35146104825761027d565b80630410808e1461028457806306fdde03146102ab578063095ea7b3146103355780630cdc25d3146103825780630cfd442a146103ac575b600080fd5b005b34801561029057600080fd5b50610299610ca0565b60408051918252519081900360200190f35b3480156102b757600080fd5b506102c0610ca6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102fa5781810151838201526020016102e2565b50505050905090810190601f1680156103275780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561034157600080fd5b5061036e6004803603604081101561035857600080fd5b506001600160a01b038135169060200135610cc9565b604080519115158252519081900360200190f35b34801561038e57600080fd5b50610282600480360360208110156103a557600080fd5b5035610ce0565b3480156103b857600080fd5b50610282600480360360208110156103cf57600080fd5b5035610d98565b3480156103e257600080fd5b50610299610e2d565b3480156103f757600080fd5b50610299610e33565b34801561040c57600080fd5b50610299610e39565b34801561042157600080fd5b5061036e6004803603606081101561043857600080fd5b506001600160a01b03813581169160208101359091169060400135610e3f565b34801561046457600080fd5b506102826004803603602081101561047b57600080fd5b5035610eae565b34801561048e57600080fd5b506104ac600480360360208110156104a557600080fd5b5035610fbf565b6040805197885260208801969096528686019490945260608601929092521515608085015260a0840152151560c0830152519081900360e00190f35b3480156104f457600080fd5b50610299611009565b34801561050957600080fd5b5061036e6004803603604081101561052057600080fd5b50803590602001356001600160a01b031661100e565b34801561054257600080fd5b5061036e6004803603602081101561055957600080fd5b503561103d565b34801561056c57600080fd5b5061036e6004803603604081101561058357600080fd5b506001600160a01b0381351690602001356110a3565b3480156105a557600080fd5b50610299600480360360208110156105bc57600080fd5b50356110df565b3480156105cf57600080fd5b506105f6600480360360208110156105e657600080fd5b50356001600160a01b03166110f1565b6040518084815260200180602001836001600160a01b03166001600160a01b03168152602001828103825284818151815260200191508051906020019060200280838360005b8381101561065457818101518382015260200161063c565b5050505090500194505050505060405180910390f35b34801561067657600080fd5b50610299611186565b34801561068b57600080fd5b50610299600480360360208110156106a257600080fd5b50356001600160a01b0316611202565b3480156106be57600080fd5b50610282600480360360208110156106d557600080fd5b503561121d565b3480156106e857600080fd5b50610299600480360360408110156106ff57600080fd5b5080356001600160a01b0316906020013564ffffffffff1661126c565b34801561072857600080fd5b506102996004803603602081101561073f57600080fd5b5035611293565b34801561075257600080fd5b50610299611357565b34801561076757600080fd5b5061029961135d565b34801561077c57600080fd5b506102996004803603602081101561079357600080fd5b50356001600160a01b0316611363565b3480156107af57600080fd5b506107cd600480360360208110156107c657600080fd5b5035611375565b6040805194855260208501939093526001600160a01b0391821684840152166060830152519081900360800190f35b34801561080857600080fd5b5061036e6004803603602081101561081f57600080fd5b50356113a9565b34801561083257600080fd5b506102c06113c1565b34801561084757600080fd5b506102996113e1565b34801561085c57600080fd5b506102996113f1565b34801561087157600080fd5b5061036e6004803603604081101561088857600080fd5b506001600160a01b0381351690602001356113f7565b3480156108aa57600080fd5b506108d1600480360360208110156108c157600080fd5b50356001600160a01b031661144c565b604080519283526001600160a01b0390911660208301528051918290030190f35b3480156108fe57600080fd5b506102826004803603602081101561091557600080fd5b503561146e565b34801561092857600080fd5b5061036e6004803603604081101561093f57600080fd5b506001600160a01b038135169060200135611519565b34801561096157600080fd5b5061097f6004803603602081101561097857600080fd5b5035611526565b604080519d8e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945264ffffffffff90921660c0890152151560e08801521515610100870152610120860152610140850152610160840152151561018083015251908190036101a00190f35b3480156109fc57600080fd5b50610a1a60048036036020811015610a1357600080fd5b503561159a565b60408051938452602084019290925264ffffffffff1682820152519081900360600190f35b348015610a4b57600080fd5b5061029960048036036040811015610a6257600080fd5b5080356001600160a01b0316906020013564ffffffffff166115ee565b348015610a8b57600080fd5b50610aa960048036036020811015610aa257600080fd5b503561162c565b604080519586526020860194909452848401929092526001600160a01b039081166060850152166080830152519081900360a00190f35b348015610aec57600080fd5b5061028260048036036060811015610b0357600080fd5b50803590602081013590604001356001600160a01b0316611667565b348015610b2b57600080fd5b5061036e60048036036020811015610b4257600080fd5b5035611818565b348015610b5557600080fd5b5061028260048036036020811015610b6c57600080fd5b5035611881565b348015610b7f57600080fd5b5061029960048036036040811015610b9657600080fd5b50803590602001356001600160a01b03166119d3565b348015610bb857600080fd5b506102996119ff565b348015610bcd57600080fd5b5061029960048036036040811015610be457600080fd5b506001600160a01b0381358116916020013516611a05565b348015610c0857600080fd5b5061036e60048036036020811015610c1f57600080fd5b5035611a30565b348015610c3257600080fd5b50610c5060048036036020811015610c4957600080fd5b5035611a4f565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610c8c578181015183820152602001610c74565b505050509050019250505060405180910390f35b60065490565b604051806040016040528060078152602001661211561413d3d360ca1b81525081565b6000610cd6338484611ab1565b5060015b92915050565b60145460ff1615610d24576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff19166001179055610d3a81611b9d565b610d8b576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20636f756c64206e6f7420656e64207374616b65000000000000604482015290519081900360640190fd5b506014805460ff19169055565b60145460ff1615610ddc576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff19166001179055610df281611e0d565b610d8b5760405162461bcd60e51b81526004018080602001828103825260218152602001806148056021913960400191505060405180910390fd5b60045490565b600c5481565b60065481565b6000610e4c8484846120ab565b610ea48433610e9f8560405180606001604052806028815260200161491c602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919063ffffffff61224b16565b611ab1565b5060019392505050565b60008111610ef0576040805162461bcd60e51b815260206004820152600a6024820152691e995c9bc81a5b9c1d5d60b21b604482015290519081900360640190fd5b33600090815260076020526040902054811115610f3e5760405162461bcd60e51b815260040180806020018281038252602281526020018061484c6022913960400191505060405180910390fd5b33600090815260076020526040902054610f5e908263ffffffff6122e216565b33600090815260076020526040902055600654610f81908263ffffffff6122e216565b600655610f8f3033836120ab565b604051819033907fb925ba840e2f36bcb317f8179bd8b5ed01aba4a22abf5f169162c0894dea87ab90600090a350565b6000908152601060205260409020805460018201546002830154600484015460088501546009860154600c909601549496939592949193600160281b90910460ff90811693921690565b600881565b60008281526010602090815260408083206001600160a01b038516845260050190915290205460ff1692915050565b600081815260106020526040812060019081015442916110999161107b91620151809161106f9163ffffffff61232b16565b9063ffffffff61238516565b6000858152601060205260409020600901549063ffffffff61232b16565b111590505b919050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610cd6918590610e9f908663ffffffff61232b16565b60009081526011602052604090205490565b6001600160a01b038082166000908152600e6020818152604080842080546013845282862094845260019091015484548351818602810186019094528084529596606096889693959394929091169284919083018282801561117257602002820191906000526020600020905b81548152602001906001019080831161115e575b505050505091509250925092509193909250565b600854604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156111d157600080fd5b505afa1580156111e5573d6000803e3d6000fd5b505050506040513d60208110156111fb57600080fd5b5051905090565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b03163314611267576040805162461bcd60e51b81526020600482015260086024820152673737ba27bbb732b960c11b604482015290519081900360640190fd5b600d55565b6000611276614681565b61128084846123de565b905061128b816125cb565b949350505050565b6000818152601060205260408120600c81015460ff166112fa576040805162461bcd60e51b815260206004820152601f60248201527f706f6f6c207374616b6520686173206e6f74207965742066696e697368656400604482015290519081900360640190fd5b33600090815260068201602052604090205461131a57600091505061109e565b8054336000908152600683016020526040812054600a840154919261128b92909161134b919063ffffffff61238516565b9063ffffffff61262516565b60055481565b600a5481565b60076020526000908152604090205481565b6000908152600f60205260409020805460018201546003830154600490930154919390926001600160a01b03908116921690565b6000908152601060205260409020600c015460ff1690565b604051806040016040528060048152602001631413d3d360e21b81525081565b60006113ec33611202565b905090565b600b5481565b6000610cd63384610e9f856040518060600160405280602581526020016149ae602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919063ffffffff61224b16565b600e60205260009081526040902080546001909101546001600160a01b031682565b60145460ff16156114b2576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff191660011790556114c881612667565b610d8b576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20636f756c64206e6f74206578697420706f6f6c000000000000604482015290519081900360640190fd5b6000610cd63384846120ab565b601060205260009081526040902080546001820154600283015460038401546004850154600786015460088701546009880154600a890154600b8a0154600c909a015498999798969795969495939464ffffffffff84169460ff600160281b8604811695600160301b90048116949392168d565b60008181526010602052604081206007810154600890910154829182916115c990309064ffffffffff16612f21565b60009586526010602052604090952060080154909564ffffffffff9091169350915050565b60006115f8614681565b61160284846123de565b9050600061160f826125cb565b60209092015168ffffffffffffffffff1690910191505092915050565b600f60205260009081526040902080546001820154600283015460038401546004909401549293919290916001600160a01b03908116911685565b818361167282611818565b6116c3576040805162461bcd60e51b815260206004820152601f60248201527f63616e6e6f7420656e7465722c20706f6f6c4964206e6f742061637469766500604482015290519081900360640190fd5b600b5482111561171a576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20706f6f6c4964206f7574206f662072616e6765000000000000604482015290519081900360640190fd5b600d54811161175a5760405162461bcd60e51b81526004018080602001828103825260308152602001806148cb6030913960400191505060405180910390fd5b60145460ff161561179e576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6014805460ff191660011790556117b68585856130af565b611807576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a20636f756c64206e6f7420656e74657220706f6f6c0000000000604482015290519081900360640190fd5b50506014805460ff19169055505050565b601454600090610100900460ff166118615760405162461bcd60e51b815260040180806020018281038252602381526020018061473f6023913960400191505060405180910390fd5b50600090815260106020526040902060080154600160301b900460ff1690565b600081116118c3576040805162461bcd60e51b815260206004820152600a6024820152691e995c9bc81a5b9c1d5d60b21b604482015290519081900360640190fd5b806118cc6113e1565b101561191f576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a20696e73756666696369656e742062616c616e63650000000000604482015290519081900360640190fd5b61195f61194361193683606463ffffffff61262516565b839063ffffffff6122e216565b336000908152600760205260409020549063ffffffff61232b16565b3360009081526007602052604090205561199561198661193683606463ffffffff61262516565b6006549063ffffffff61232b16565b6006556119a33330836120ab565b604051819033907f7def9f73ac6a7ac8fe4dc55f5257d48aed7e3f9d5247b0020598b87a5c369d8290600090a350565b60008281526010602090815260408083206001600160a01b038516845260060190915290205492915050565b600d5481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600090815260106020526040902060080154600160281b900460ff1690565b600081815260126020908152604091829020805483518184028101840190945280845260609392830182828015611aa557602002820191906000526020600020905b815481526020019060010190808311611a91575b50505050509050919050565b6001600160a01b038316611af65760405162461bcd60e51b815260040180806020018281038252602481526020018061498a6024913960400191505060405180910390fd5b6001600160a01b038216611b3b5760405162461bcd60e51b81526004018080602001828103825260228152602001806147e36022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000600b54821115611bf6576040805162461bcd60e51b815260206004820152601a60248201527f4572726f723a20706f6f6c4964206f7574206f662072616e6765000000000000604482015290519081900360640190fd5b60008281526010602052604090206008810154600160281b900460ff16611c4e5760405162461bcd60e51b815260040180806020018281038252603b81526020018061486e603b913960400191505060405180910390fd5b611c578361103d565b611ca8576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a2063616e6e6f74206561726c7920756e7374616b650000000000604482015290519081900360640190fd5b6000611cb2611186565b60088054908401549192506001600160a01b03169063343009a290611cdf90309064ffffffffff16612f21565b6008850154604080516001600160e01b031960e086901b168152600481019390935264ffffffffff909116602483015251604480830192600092919082900301818387803b158015611d3057600080fd5b505af1158015611d44573d6000803e3d6000fd5b50505060088301805465ff00000000001916905550600c8201805460ff191660011790556000611d8282611d76611186565b9063ffffffff6122e216565b600a84018190558354909150611d9f90829063ffffffff6122e216565b600b840181905560038401546001850154600286015460088701546040805195865264ffffffffff909116602086015280519394929391927f4264c1c4dce9a5bdaf76353b212e051ed6a441a4c184dece2572f8510b007c8f929081900390910190a4506001949350505050565b60008181526010602052604081206002810154611e71576040805162461bcd60e51b815260206004820152601e60248201527f706f6f6c20726577617264732068617665206265656e20647261696e65640000604482015290519081900360640190fd5b6000838152601060209081526040808320338452600601909152902054611edf576040805162461bcd60e51b815260206004820152601e60248201527f796f752068617665206e6f20736861726520696e207468697320706f6f6c0000604482015290519081900360640190fd5b600c81015460ff16611ef657611ef483611b9d565b505b6000611f0184611293565b3360009081526006840160205260409020546002840154919250611f2b919063ffffffff6122e216565b6002830190815533600090815260068401602052604081205554611fb1576000848152601060205260408120818155600181018290556002810182905560038101829055600481018290556007810182905560088101805466ffffffffffffff1916905560098101829055600a8101829055600b810191909155600c01805460ff191690555b6008546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b15801561200557600080fd5b505af1158015612019573d6000803e3d6000fd5b505050506040513d602081101561202f57600080fd5b5051612074576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b604051819033907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6590600090a35060019392505050565b6001600160a01b0383166120f05760405162461bcd60e51b81526004018080602001828103825260258152602001806149656025913960400191505060405180910390fd5b6001600160a01b0382166121355760405162461bcd60e51b81526004018080602001828103825260238152602001806147626023913960400191505060405180910390fd5b600061214882606463ffffffff61262516565b9050600061215c838363ffffffff6122e216565b90506121a181604051806060016040528060268152602001614826602691396001600160a01b038816600090815260208190526040902054919063ffffffff61224b16565b6001600160a01b0380871660009081526020819052604080822093909355908616815220546121d6908263ffffffff61232b16565b6001600160a01b0385166000908152602081905260409020556121f985836139ca565b836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050505050565b600081848411156122da5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561229f578181015183820152602001612287565b50505050905090810190601f1680156122cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600061232483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061224b565b9392505050565b600082820183811015612324576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261239457506000610cda565b828202828482816123a157fe5b04146123245760405162461bcd60e51b81526004018080602001828103825260218152602001806148fb6021913960400191505060405180910390fd5b6123e6614681565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b03166333060d908c6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561245d57600080fd5b505afa158015612471573d6000803e3d6000fd5b505050506040513d602081101561248757600080fd5b5051905060005b818110156125bc5760085460408051632607443b60e01b81526001600160a01b038f811660048301526024820185905291519190921691632607443b9160448083019260e0929190829003018186803b1580156124ea57600080fd5b505afa1580156124fe573d6000803e3d6000fd5b505050506040513d60e081101561251457600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a5098509650909450925064ffffffffff808a16908c1614156125b45750506040805160e08101825264ffffffffff909816885268ffffffffffffffffff9687166020890152949095169386019390935261ffff9182166060860152811660808501521660a0830152151560c08201529050610cda565b60010161248e565b50505050505050505092915050565b606081015160009061ffff16816125e0613ac6565b90508082106125f45760009250505061109e565b60606126008383613b64565b905061261b81866040015168ffffffffffffffffff16613d1c565b935050505061109e565b600061232483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613d5e565b60006126716146bd565b506000828152600f6020908152604091829020825160a0810184528154815260018201549281019290925260028101549282019290925260038201546001600160a01b03908116606083018190526004909301541660808201529033146127095760405162461bcd60e51b81526004018080602001828103825260228152602001806148a96022913960400191505060405180910390fd5b60208082015160009081526010825260408082203383526005810190935290205460ff1661277e576040805162461bcd60e51b815260206004820152601e60248201527f796f7520617265206e6f74206120706f6f6c207061727469636970616e740000604482015290519081900360640190fd5b6008810154600160281b900460ff16156127df576040805162461bcd60e51b815260206004820152601c60248201527f706f6f6c206973207374616b696e672c2063616e6e6f74206578697400000000604482015290519081900360640190fd5b8151336000908152600e60205260409020546128009163ffffffff6122e216565b336000908152600e6020526040902055815160028201546128269163ffffffff6122e216565b6002820155815133600090815260068301602052604090205461284e9163ffffffff6122e216565b3360009081526006830160205260409020819055612898573360009081526005820160209081526040808320805460ff191690558482015183526011909152902080546000190190555b6000848152600f6020526040812081815560018101829055600281018290556003810180546001600160a01b031990811690915560049091018054909116905582516128eb90606463ffffffff61262516565b9050600061290082600263ffffffff61262516565b9050600061291583600463ffffffff61262516565b9050600061292a84600463ffffffff61262516565b8651909150600090612942908663ffffffff6122e216565b60055490915015612b36576008546009546005546001600160a01b039283169263a9059cbb92169061297b90600263ffffffff61262516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156129ca57600080fd5b505af11580156129de573d6000803e3d6000fd5b505050506040513d60208110156129f457600080fd5b5051612a39576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6008546005546001600160a01b039091169063a9059cbb9073d30bc4859a79852157211e6db19de159673a67e290612a7890600263ffffffff61262516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612ac757600080fd5b505af1158015612adb573d6000803e3d6000fd5b505050506040513d6020811015612af157600080fd5b5051612b36576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b60808701516001600160a01b0316612b52576005829055612c53565b612b6382600263ffffffff61262516565b60055560085460808801516001600160a01b039091169063a9059cbb90612b9185600263ffffffff61262516565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612be057600080fd5b505af1158015612bf4573d6000803e3d6000fd5b505050506040513d6020811015612c0a57600080fd5b5051612c53576040805162461bcd60e51b8152602060048201526013602482015272149959881d1c985b9cd9995c8819985a5b1959606a1b604482015290519081900360640190fd5b6008546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015612ca757600080fd5b505af1158015612cbb573d6000803e3d6000fd5b505050506040513d6020811015612cd157600080fd5b5051612d16576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6008546009546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018890529051919092169163a9059cbb9160448083019260209291908290030181600087803b158015612d6f57600080fd5b505af1158015612d83573d6000803e3d6000fd5b505050506040513d6020811015612d9957600080fd5b5051612de3576040805162461bcd60e51b815260206004820152601460248201527311195d8c481d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b6008546040805163a9059cbb60e01b815273d30bc4859a79852157211e6db19de159673a67e260048201526024810186905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015612e4b57600080fd5b505af1158015612e5f573d6000803e3d6000fd5b505050506040513d6020811015612e7557600080fd5b5051612ebf576040805162461bcd60e51b815260206004820152601460248201527311195d8c881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b8660400151876000015188606001516001600160a01b03167f998379a72dc64811ce41782d18dd7759dd22de4dd43049986376fada953be82989600301546040518082815260200191505060405180910390a450600198975050505050505050565b6000806000806000806000806000600860009054906101000a90046001600160a01b03166001600160a01b03166333060d908c6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612f9a57600080fd5b505afa158015612fae573d6000803e3d6000fd5b505050506040513d6020811015612fc457600080fd5b5051905060005b818110156125bc5760085460408051632607443b60e01b81526001600160a01b038f811660048301526024820185905291519190921691632607443b9160448083019260e0929190829003018186803b15801561302757600080fd5b505afa15801561303b573d6000803e3d6000fd5b505050506040513d60e081101561305157600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a5098509650909450925064ffffffffff808a16908c1614156130a7579850610cda975050505050505050565b600101612fcb565b600082815260106020526040812080548511156130fd5760405162461bcd60e51b815260040180806020018281038252603c815260200180614785603c913960400191505060405180910390fd5b6008810154600160281b900460ff1615613150576040805162461bcd60e51b815260206004820152600f60248201526e706f6f6c206973207374616b696e6760881b604482015290519081900360640190fd5b600061316386606463ffffffff61262516565b9050600061317882600263ffffffff61262516565b9050600061318d83600463ffffffff61262516565b905060006131a284600463ffffffff61262516565b905060006131b68a8663ffffffff6122e216565b60028701549091506131ce908263ffffffff61232b16565b600287015533600090815260058701602052604090205460ff16613221573360009081526005870160209081526040808320805460ff191660019081179091558c84526011909252909120805490910190555b336000908152600687016020526040902054613243908263ffffffff61232b16565b33600090815260068801602052604090205560055415613323576008546005546040805163a9059cbb60e01b81523360048201526024810192909252516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b1580156132b457600080fd5b505af11580156132c8573d6000803e3d6000fd5b505050506040513d60208110156132de57600080fd5b5051613323576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6001600160a01b03881661333b57600582905561344e565b61334c82600263ffffffff61262516565b6005556008546001600160a01b03166323b872dd338a61337386600263ffffffff61262516565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156133db57600080fd5b505af11580156133ef573d6000803e3d6000fd5b505050506040513d602081101561340557600080fd5b505161344e576040805162461bcd60e51b8152602060048201526013602482015272149959881d1c985b9cd9995c8819985a5b1959606a1b604482015290519081900360640190fd5b6008546005546001600160a01b03909116906323b872dd903390309061347b90869063ffffffff61232b16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156134e357600080fd5b505af11580156134f7573d6000803e3d6000fd5b505050506040513d602081101561350d57600080fd5b5051613552576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b600854600954604080516323b872dd60e01b81523360048201526001600160a01b03928316602482015260448101889052905191909216916323b872dd9160648083019260209291908290030181600087803b1580156135b157600080fd5b505af11580156135c5573d6000803e3d6000fd5b505050506040513d60208110156135db57600080fd5b5051613625576040805162461bcd60e51b815260206004820152601460248201527311195d8c481d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b600854604080516323b872dd60e01b815233600482015273d30bc4859a79852157211e6db19de159673a67e260248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561369357600080fd5b505af11580156136a7573d6000803e3d6000fd5b505050506040513d60208110156136bd57600080fd5b5051613707576040805162461bcd60e51b815260206004820152601460248201527311195d8c881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b855460028701541115613862578554600287015460009161372e919063ffffffff6122e216565b9050613748613743838363ffffffff6122e216565b613dc3565b61376661375b838363ffffffff6122e216565b88600301548b613dfc565b8654600288015533600090815260068801602052604090205461378f908263ffffffff6122e216565b3360009081526006890160205260409020556137ab8a88613f08565b6137fc576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20636f756c64206e6f74207374617274207374616b6500000000604482015290519081900360640190fd5b61380b8760040154828b61410e565b61385c576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a20636f756c64206e6f7420637265617465206e657720706f6f6c604482015290519081900360640190fd5b50613960565b8554600287015414156139485761387881613dc3565b6138878187600301548a613dfc565b6138918987613f08565b6138e2576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20636f756c64206e6f74207374617274207374616b6500000000604482015290519081900360640190fd5b6138f2866004015460008a61410e565b613943576040805162461bcd60e51b815260206004820181905260248201527f4572726f723a20636f756c64206e6f7420637265617465206e657720706f6f6c604482015290519081900360640190fd5b613960565b61395181613dc3565b6139608187600301548a613dfc565b6139698a614363565b6139ba576040805162461bcd60e51b815260206004820152601c60248201527f4572726f723a20636f756c64206e6f74206d696e7420746f6b656e7300000000604482015290519081900360640190fd5b5060019998505050505050505050565b6001600160a01b038216613a0f5760405162461bcd60e51b81526004018080602001828103825260218152602001806149446021913960400191505060405180910390fd5b613a52816040518060600160405280602281526020016147c1602291396001600160a01b038516600090815260208190526040902054919063ffffffff61224b16565b6001600160a01b038316600090815260208190526040902055600454613a7e908263ffffffff6122e216565b6004556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000613ad06146fe565b600860009054906101000a90046001600160a01b03166001600160a01b031663f04b5fa06040518163ffffffff1660e01b81526004016101a06040518083038186803b158015613b1f57600080fd5b505afa158015613b33573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506101a0811015613b5957600080fd5b506080015192915050565b60085460408051633510850760e11b81526004810185905260248101849052905160609283926001600160a01b0390911691636a210a0e91604480820192600092909190829003018186803b158015613bbc57600080fd5b505afa158015613bd0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613bf957600080fd5b8101908080516040519392919084640100000000821115613c1957600080fd5b908301906020820185811115613c2e57600080fd5b8251866020820283011164010000000082111715613c4b57600080fd5b82525081516020918201928201910280838360005b83811015613c78578181015183820152602001613c60565b505050509050016040525050509050600081519050606081604051908082528060200260200182016040528015613cc957816020015b613cb661471d565b815260200190600190039081613cae5790505b50905060005b82811015613d1257613cf3848281518110613ce657fe5b6020026020010151614384565b828281518110613cff57fe5b6020908102919091010152600101613ccf565b5095945050505050565b815160009081805b82811015613d5557613d49868281518110613d3b57fe5b6020026020010151866143c7565b90910190600101613d24565b50949350505050565b60008183613dad5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561229f578181015183820152602001612287565b506000838581613db957fe5b0495945050505050565b336000908152600e602052604090208054613de4908363ffffffff61232b16565b815560010180546001600160a01b0319163317905550565b6000613e066143e4565b33600090815260136020908152604080832080546001818101835591855283852001859055878452601283529083208054918201815583529120018190559050613e4e6146bd565b8481526020808201858152604080840185815233606086019081526001600160a01b03888116608088019081526000898152600f885285902088518082559651600182015593516002850181905592516003850180549184166001600160a01b0319928316811790915591516004909501805495909316941693909317905582518981529251909491927fb8ab617400c81f66404f4b37405e10991268e0a05e4d7f3b06b7d28076c2c69592908290030190a45050505050565b8054600282015460009114613f5d576040805162461bcd60e51b815260206004820152601660248201527514dd185ad948185b5bdd5b9d081a5b98dbdc9c9958dd60521b604482015290519081900360640190fd5b8154600183015460085460408051630a54871760e31b8152600481018590526024810184905290516001600160a01b03909216916352a438b89160448082019260009290919082900301818387803b158015613fb857600080fd5b505af1158015613fcc573d6000803e3d6000fd5b50506008546040805163033060d960e41b815230600482015290516000945061405a93506001926001600160a01b0316916333060d90916024808301926020929190829003018186803b15801561402257600080fd5b505afa158015614036573d6000803e3d6000fd5b505050506040513d602081101561404c57600080fd5b50519063ffffffff6122e216565b9050614064614681565b61406e30836143f2565b805160088801805464ffffffffff90921664ffffffffff1990921691909117808255600c5460078a01554260098a015566ffff00000000001916600160281b17905590506140ba614510565b5080516040805186815264ffffffffff90921660208301528051899286927fe6e27f56b3cdde69e5d0a9bcdef1ef34500823c80d47d320e171687080f8fbb292918290030190a35060019695505050505050565b6000808085614129575066354a6ba7a18000905060246141a1565b8560011415614145575066354a6ba7a18000905061016d6141a1565b8560021415614161575066354a6ba7a180009050610e426141a1565b6040805162461bcd60e51b815260206004820152601060248201526f696e76616c696420706f6f6c5479706560801b604482015290519081900360640190fd5b60006141ab61451e565b60008181526010602052604090208481556001810184905560028101889055600381018290556004810189905560088101805466ff0000000000001916600160301b179055909150861561426b57600082815260116020908152604080832080546001908101909155338452600585018352818420805460ff1916909117905560068401909152902054614245908863ffffffff61232b16565b33600090815260068301602052604090205561426087613dc3565b61426b878388613dfc565b60009182526010602052604090912081548155600180830154818301556002808401549083015560038084015490830155600480840154908301556007808401549083015560088084018054918401805464ffffffffff90931664ffffffffff1990931692909217808355815465ff000000000019909116600160281b9182900460ff908116151590920217808455915466ff00000000000019909216600160301b92839004821615159092029190911790915560098085015490840155600a8085015490840155600b8085015490840155600c9384015493909201805460ff19169390921615159290921790559695505050505050565b60008061437783606463ffffffff61262516565b905033610ea4818361452c565b61438c61471d565b506040805160608101825268ffffffffffffffffff8381168252604884901c16602082015260909290921c66ffffffffffffff169082015290565b6000826020015183600001518302816143dc57fe5b049392505050565b600a80546001019081905590565b6143fa614681565b60085460408051632607443b60e01b81526001600160a01b038681166004830152602482018690529151600093849384938493849384938493911691632607443b9160448082019260e092909190829003018186803b15801561445c57600080fd5b505afa158015614470573d6000803e3d6000fd5b505050506040513d60e081101561448657600080fd5b50805160208083015160408085015160608087015160808089015160a0808b015160c09b8c0151885160e081018a5264ffffffffff909c168c5268ffffffffffffffffff998a169a8c019a909a52979095169589019590955261ffff91821692880192909252928316908601529116908301521515918101919091529a9950505050505050505050565b600c80546001019081905590565b600b80546001019081905590565b806001600160a01b038316614588576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b60025460ff1661467c57600354600454101561467c576003546004546145b4908363ffffffff61232b16565b11156145e9576004546003546145cf9163ffffffff6122e216565b6003546004556002805460ff191660011790559050614600565b6004546145fc908263ffffffff61232b16565b6004555b6001600160a01b038316600090815260208190526040902054614629908263ffffffff61232b16565b6001600160a01b0384166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35b505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6040518060a0016040528060008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b604051806101a00160405280600d906020820280388339509192915050565b6040518060600160405280600081526020016000815260200160008152509056fe63616e6e6f7420656e7465722c20706f6f6c73206e6f7420696e697469616c697a656445524332303a207472616e7366657220746f20746865207a65726f2061646472657373616d6f756e74206f766572207468726573686f6c64202d206f6e6c792031206e657720706f6f6c20746f20626520637265617465642070657220747845524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f20616464726573734572726f723a20636f756c64206e6f74207769746864726177207265776172647345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654572726f723a20756e73756666696369656e742066726f7a656e2062616c616e63654572726f723a20706f6f6c206973206e6f7420796574207374616b65642c206f722068617320616c726561647920656e646564207374616b696e676e6f7420656e747279206f776e65722c206f7220616c7265616479206578697465644572726f723a2076616c7565206d7573742062652067726561746572207468616e206d696e456e747279486561727473536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820ca62bd23ffec7202a2b3a5f9ecfb53da305133c5723869fed8a369af68340e9364736f6c634300050d0032

Deployed Bytecode Sourcemap

12356:28491:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15402:14;;;;12356:28491;12044:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12044:134:1;;;:::i;:::-;;;;;;;;;;;;;;;;2116:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2116:39:1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2116:39:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3476:150;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3476:150:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3476:150:1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;30354:154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30354:154:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30354:154:1;;:::i;30553:171::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30553:171:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30553:171:1;;:::i;2499:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2499:91:1;;;:::i;13273:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13273:25:1;;;:::i;2312:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2312:23:1;;;:::i;4098:300::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4098:300:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4098:300:1;;;;;;;;;;;;;;;;;:::i;11381:505::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11381:505:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11381:505:1;;:::i;32488:686::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32488:686:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32488:686:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2207:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2207:33:1;;;:::i;33935:164::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33935:164:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33935:164:1;;;;;;-1:-1:-1;;;;;33935:164:1;;:::i;31263:297::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31263:297:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31263:297:1;;:::i;4807:206::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4807:206:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4807:206:1;;;;;;;;:::i;33750:144::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33750:144:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33750:144:1;;:::i;31756:301::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31756:301:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31756:301:1;-1:-1:-1;;;;;31756:301:1;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;31756:301:1;-1:-1:-1;;;;;31756:301:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31756:301:1;;;;;;;;;;;;;;;;;;;34362:151;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34362:151:1;;;:::i;2653:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2653:110:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2653:110:1;-1:-1:-1;;;;;2653:110:1;;:::i;34681:116::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34681:116:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34681:116:1;;:::i;37770:220::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37770:220:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37770:220:1;;-1:-1:-1;;;;;37770:220:1;;;;;;;;:::i;24847:489::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24847:489:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24847:489:1;;:::i;2269:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2269:20:1;;;:::i;13179:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13179:30:1;;;:::i;2342:52::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2342:52:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2342:52:1;-1:-1:-1;;;;;2342:52:1;;:::i;32091:364::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32091:364:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32091:364:1;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;32091:364:1;;;;;;;;;;;;;;;;;;;;;31576:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31576:147:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31576:147:1;;:::i;2162:38::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2162:38:1;;;:::i;12216:133::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12216:133:1;;;:::i;13232:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13232:24:1;;;:::i;5516:257::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5516:257:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5516:257:1;;;;;;;;:::i;13374:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13374:42:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13374:42:1;-1:-1:-1;;;;;13374:42:1;;:::i;:::-;;;;;;;-1:-1:-1;;;;;13374:42:1;;;;;;;;;;;;;;;;30168:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30168:152:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30168:152:1;;:::i;2976:156::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2976:156:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2976:156:1;;;;;;;;:::i;13472:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13472:39:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13472:39:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33412:278;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33412:278:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33412:278:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37998:289;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37998:289:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37998:289:1;;-1:-1:-1;;;;;37998:289:1;;;;;;;;:::i;13423:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13423:42:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13423:42:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13423:42:1;;;;;;;;;;;;;;;;;;;;;29844:240;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29844:240:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29844:240:1;;;;;;;;;;;-1:-1:-1;;;;;29844:240:1;;:::i;30930:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30930:158:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30930:158:1;;:::i;10801:537::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10801:537:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10801:537:1;;:::i;34155:163::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34155:163:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34155:163:1;;;;;;-1:-1:-1;;;;;34155:163:1;;:::i;13318:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13318:26:1;;;:::i;3195:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3195:134:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3195:134:1;;;;;;;;;;:::i;31104:143::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31104:143:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31104:143:1;;:::i;33220:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33220:151:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33220:151:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;33220:151:1;;;;;;;;;;;;;;;;;12044:134;12159:11;;12044:134;:::o;2116:39::-;;;;;;;;;;;;;;-1:-1:-1;;;2116:39:1;;;;:::o;3476:150::-;3542:4;3559:37;3568:10;3580:7;3589:6;3559:8;:37::i;:::-;-1:-1:-1;3614:4:1;3476:150;;;;;:::o;30354:154::-;15126:6;;;;15125:7;15117:29;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;;;;15157:6;:13;;-1:-1:-1;;15157:13:1;15166:4;15157:13;;;30452:17;30461:7;30452:8;:17::i;:::-;30444:56;;;;;-1:-1:-1;;;30444:56:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15193:6:1;:14;;-1:-1:-1;;15193:14:1;;;30354:154::o;30553:171::-;15126:6;;;;15125:7;15117:29;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;;;;15157:6;:13;;-1:-1:-1;;15157:13:1;15166:4;15157:13;;;30650:28;30670:7;30650:19;:28::i;:::-;30642:74;;;;-1:-1:-1;;;30642:74:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2499:91;2570:12;;2499:91;:::o;13273:25::-;;;;:::o;2312:23::-;;;;:::o;4098:300::-;4187:4;4204:36;4214:6;4222:9;4233:6;4204:9;:36::i;:::-;4251:117;4260:6;4268:10;4280:87;4316:6;4280:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4280:19:1;;;;;;:11;:19;;;;;;;;4300:10;4280:31;;;;;;;;;:87;;:35;:87;:::i;:::-;4251:8;:117::i;:::-;-1:-1:-1;4386:4:1;4098:300;;;;;:::o;11381:505::-;11461:1;11455:3;:7;11447:30;;;;;-1:-1:-1;;;11447:30:1;;;;;;;;;;;;-1:-1:-1;;;11447:30:1;;;;;;;;;;;;;;;11516:10;11496:31;;;;:19;:31;;;;;;:38;-1:-1:-1;11496:38:1;11488:84;;;;-1:-1:-1;;;11488:84:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11674:10;11654:31;;;;:19;:31;;;;;;:40;;11690:3;11654:40;:35;:40;:::i;:::-;11640:10;11620:31;;;;:19;:31;;;;;:74;11736:11;;:20;;11752:3;11736:20;:15;:20;:::i;:::-;11722:11;:34;11767:41;11785:4;11792:10;11804:3;11767:9;:41::i;:::-;11848:30;;11874:3;;11862:10;;11848:30;;;;;11381:505;:::o;32488:686::-;32579:27;32868:13;;;:5;:13;;;;;:32;;32915;;;;32962:23;;;;33000:22;;;;33037:23;;;;33075:37;;;;33127:24;;;;;32868:32;;32915;;32962:23;;33000:22;;-1:-1:-1;;;33037:23:1;;;;;;;;33075:37;33127:24;;32488:686::o;2207:33::-;2239:1;2207:33;:::o;33935:164::-;34032:4;34060:9;;;:5;:9;;;;;;;;-1:-1:-1;;;;;34060:31:1;;;;:25;;:31;;;;;;;;33935:164;;;;:::o;31263:297::-;31352:4;31493:13;;;:5;:13;;;;;31530:1;31493:32;;;;31549:3;;31450:95;;31492:52;;31538:5;;31493:39;;;:36;:39;:::i;:::-;31492:45;:52;:45;:52;:::i;:::-;31450:13;;;;:5;:13;;;;;:37;;;;:95;:41;:95;:::i;:::-;:102;;31443:109;;31263:297;;;;:::o;4807:206::-;4913:10;4887:4;4934:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;4934:32:1;;;;;;;;;;4887:4;;4904:79;;4925:7;;4934:48;;4971:10;4934:48;:36;:48;:::i;33750:144::-;33836:4;33865:21;;;:13;:21;;;;;;;33750:144::o;31756:301::-;-1:-1:-1;;;;;31973:11:1;;;31848:26;31973:11;;;:5;:11;;;;;;;;:30;;32005:12;:18;;;;;32025:11;;;:23;;;;;31966:83;;;;;;;;;;;;;;;;;31848:26;;31885:23;;31848:26;;31973:30;;32005:18;;32025:23;;;;;32005:18;;31966:83;;;32005:18;31966:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31756:301;;;;;:::o;34362:151::-;34468:12;;:37;;;-1:-1:-1;;;34468:37:1;;34499:4;34468:37;;;;;;34439:4;;-1:-1:-1;;;;;34468:12:1;;:22;;:37;;;;;;;;;;;;;;:12;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;34468:37:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34468:37:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34468:37:1;;-1:-1:-1;34362:151:1;:::o;2653:110::-;-1:-1:-1;;;;;2737:18:1;2710:7;2737:18;;;;;;;;;;;;2653:110::o;34681:116::-;14622:10;;-1:-1:-1;;;;;14622:10:1;14608;:24;14600:45;;;;;-1:-1:-1;;;14600:45:1;;;;;;;;;;;;-1:-1:-1;;;14600:45:1;;;;;;;;;;;;;;;34766:14;:23;34681:116::o;37770:220::-;37866:7;37891:15;;:::i;:::-;37909:32;37927:4;37933:7;37909:17;:32::i;:::-;37891:50;;37961:21;37980:1;37961:18;:21::i;:::-;37954:28;37770:220;-1:-1:-1;;;;37770:220:1:o;24847:489::-;24940:4;24986:13;;;:5;:13;;;;;25018:15;;;;;;25010:59;;;;;-1:-1:-1;;;25010:59:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;25103:10;25083:31;;;;:19;;;:31;;;;;;25080:75;;25142:1;25135:8;;;;;25080:75;25247:23;;25230:10;25165:22;25210:31;;;:19;;;:31;;;;;;25190:15;;;;25165:22;;25190:81;;25247:23;;25190:52;;:15;:52;:19;:52;:::i;:::-;:56;:81;:56;:81;:::i;2269:20::-;;;;:::o;13179:30::-;;;;:::o;2342:52::-;;;;;;;;;;;;;:::o;32091:364::-;32184:19;32337:16;;;:7;:16;;;;;:27;;32366:23;;;;32391:28;;;;32421:25;;;;;32337:27;;32366:23;;-1:-1:-1;;;;;32391:28:1;;;;32421:25;;32091:364::o;31576:147::-;31662:4;31691:13;;;:5;:13;;;;;:24;;;;;;31576:147::o;2162:38::-;;;;;;;;;;;;;;-1:-1:-1;;;2162:38:1;;;;:::o;12216:133::-;12288:7;12320:21;12330:10;12320:9;:21::i;:::-;12313:28;;12216:133;:::o;13232:24::-;;;;:::o;5516:257::-;5601:4;5618:125;5627:10;5639:7;5648:94;5685:15;5648:94;;;;;;;;;;;;;;;;;5660:10;5648:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;5648:32:1;;;;;;;;;;;:94;;:36;:94;:::i;13374:42::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13374:42:1;;:::o;30168:152::-;15126:6;;;;15125:7;15117:29;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;;;;15157:6;:13;;-1:-1:-1;;15157:13:1;15166:4;15157:13;;;30263:18;30272:8;30263;:18::i;:::-;30255:57;;;;;-1:-1:-1;;;30255:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;2976:156;3045:4;3062:40;3072:10;3084:9;3095:6;3062:9;:40::i;13472:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13472:39:1;;;;;-1:-1:-1;;;13472:39:1;;;;;;;;;:::o;33412:278::-;33498:12;33574:13;;;:5;:13;;;;;:21;;;;33630:24;;;;;33498:12;;;;33597:58;;33623:4;;33630:24;;33597:17;:58::i;:::-;33657:13;;;;:5;:13;;;;;;:24;;;33567:115;;33657:24;;;;;-1:-1:-1;33412:278:1;-1:-1:-1;;33412:278:1:o;37998:289::-;38096:7;38121:19;;:::i;:::-;38143:32;38161:4;38167:7;38143:17;:32::i;:::-;38121:54;;38188:16;38207:25;38226:5;38207:18;:25::i;:::-;38250:18;;;;;:29;;;;;;-1:-1:-1;;37998:289:1;;;;:::o;13423:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13423:42:1;;;;;;:::o;29844:240::-;29947:7;29956;14732:16;14745:2;14732:12;:16::i;:::-;14724:60;;;;;-1:-1:-1;;;14724:60:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;14809:12;;14803:2;:18;;14795:57;;;;;-1:-1:-1;;;14795:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;14880:14;;14871:6;:23;14863:84;;;;-1:-1:-1;;;14863:84:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15126:6;;;;15125:7;15117:29;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;-1:-1:-1;;;15117:29:1;;;;;;;;;;;;;;;15157:6;:13;;-1:-1:-1;;15157:13:1;15166:4;15157:13;;;30011:33;30021:7;30030;30039:4;30011:9;:33::i;:::-;30003:73;;;;;-1:-1:-1;;;30003:73:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15193:6:1;:14;;-1:-1:-1;;15193:14:1;;;-1:-1:-1;;;29844:240:1:o;30930:158::-;15011:5;;31029:4;;15011:5;;;;;15003:53;;;;-1:-1:-1;;;15003:53:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31058:13:1;;;;:5;:13;;;;;:22;;;-1:-1:-1;;;31058:22:1;;;;;30930:158::o;10801:537::-;10879:1;10873:3;:7;10865:30;;;;;-1:-1:-1;;;10865:30:1;;;;;;;;;;;;-1:-1:-1;;;10865:30:1;;;;;;;;;;;;;;;10932:3;10914:14;:12;:14::i;:::-;:21;;10906:61;;;;;-1:-1:-1;;;10906:61:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;11089:58;11125:21;11133:12;:3;11141;11133:12;:7;:12;:::i;:::-;11125:3;;:21;:7;:21;:::i;:::-;11109:10;11089:31;;;;:19;:31;;;;;;;:58;:35;:58;:::i;:::-;11075:10;11055:31;;;;:19;:31;;;;;:92;11172:38;11188:21;11196:12;:3;11204;11196:12;:7;:12;:::i;11188:21::-;11172:11;;;:38;:15;:38;:::i;:::-;11158:11;:52;11221:41;11231:10;11251:4;11258:3;11221:9;:41::i;:::-;11302:28;;11326:3;;11314:10;;11302:28;;;;;10801:537;:::o;34155:163::-;34252:4;34280:9;;;:5;:9;;;;;;;;-1:-1:-1;;;;;34280:30:1;;;;:24;;:30;;;;;;34155:163;;;;:::o;13318:26::-;;;;:::o;3195:134::-;-1:-1:-1;;;;;3294:18:1;;;3267:7;3294:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3195:134::o;31104:143::-;31187:4;31216:13;;;:5;:13;;;;;:23;;;-1:-1:-1;;;31216:23:1;;;;;31104:143::o;33220:151::-;33343:20;;;;:12;:20;;;;;;;;;33336:27;;;;;;;;;;;;;;;;;33305:13;;33336:27;;;33343:20;33336:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33220:151;;;:::o;8982:338::-;-1:-1:-1;;;;;9076:19:1;;9068:68;;;;-1:-1:-1;;;9068:68:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9155:21:1;;9147:68;;;;-1:-1:-1;;;9147:68:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9228:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9280:32;;;;;;;;;;;;;;;;;8982:338;;;:::o;22675:1093::-;22742:4;22782:12;;22772:6;:22;;22764:61;;;;;-1:-1:-1;;;22764:61:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;22836:21;22860:13;;;:5;:13;;;;;22892:14;;;;-1:-1:-1;;;22892:14:1;;;;22884:86;;;;-1:-1:-1;;;22884:86:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22989:27;23009:6;22989:19;:27::i;:::-;22981:67;;;;;-1:-1:-1;;;22981:67:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;23061:18;23082:20;:18;:20::i;:::-;23171:12;;;23226:15;;;;23061:41;;-1:-1:-1;;;;;;23171:12:1;;:21;;23193:49;;23219:4;;23226:15;;23193:17;:49::i;:::-;23244:15;;;;23171:89;;;-1:-1:-1;;;;;;23171:89:1;;;;;;;;;;;;;;23244:15;;;;23171:89;;;;;;;;;;23244:15;;23171:89;;;;;;;23244:15;23171:89;;;;5:2:-1;;;;30:1;27;20:12;5:2;23171:89:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;23271:14:1;;;:22;;-1:-1:-1;;23271:22:1;;;-1:-1:-1;23304:15:1;;;:22;;-1:-1:-1;;23304:22:1;23271;23304;;;23288:5;23401:36;23426:10;23401:20;:18;:20::i;:::-;:24;:36;:24;:36;:::i;:::-;23448:15;;;:28;;;23521:23;;23380:57;;-1:-1:-1;23506:39:1;;23380:57;;23506:39;:14;:39;:::i;:::-;23487:16;;;:58;;;23686:11;;;;23648:23;;;;23619:14;;;;23712:15;;;;23561:177;;;;;;23712:15;;;;23561:177;;;;;;23686:11;;23648:23;;23619:14;;23561:177;;;;;;;;;;;-1:-1:-1;23756:4:1;;22675:1093;-1:-1:-1;;;;22675:1093:1:o;23864:921::-;23941:4;23987:13;;;:5;:13;;;;;24019:14;;;;24011:61;;;;;-1:-1:-1;;;24011:61:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;24134:1;24091:13;;;:5;:13;;;;;;;;24120:10;24091:40;;:28;;:40;;;;;;24083:87;;;;;-1:-1:-1;;;24083:87:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;24185:15;;;;;;24181:63;;24216:16;24225:6;24216:8;:16::i;:::-;;24181:63;24254:12;24269:30;24292:6;24269:22;:30::i;:::-;24388:10;24368:31;;;;:19;;;:31;;;;;;24349:14;;;;24254:45;;-1:-1:-1;24349:51:1;;:14;:51;:18;:51;:::i;:::-;24332:14;;;:68;;;24450:10;24464:1;24430:31;;;:19;;;:31;;;;;:35;24517:14;24514:92;;24559:13;;;;:5;:13;;;;;24552:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24552:20:1;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24552:20:1;;;24514:92;24624:12;;:42;;;-1:-1:-1;;;24624:42:1;;24646:10;24624:42;;;;;;;;;;;;-1:-1:-1;;;;;24624:12:1;;;;:21;;:42;;;;;;;;;;;;;;;:12;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;24624:42:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24624:42:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24624:42:1;24616:70;;;;;-1:-1:-1;;;24616:70:1;;;;;;;;;;;;-1:-1:-1;;;24616:70:1;;;;;;;;;;;;;;;24724:31;;24747:7;;24735:10;;24724:31;;;;;-1:-1:-1;24773:4:1;;23864:921;-1:-1:-1;;;23864:921:1:o;6263:605::-;-1:-1:-1;;;;;6361:20:1;;6353:70;;;;-1:-1:-1;;;6353:70:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6442:23:1;;6434:71;;;;-1:-1:-1;;;6434:71:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6540:10;6553:15;:6;6564:3;6553:15;:10;:15;:::i;:::-;6540:28;-1:-1:-1;6579:11:1;6593:17;:6;6540:28;6593:17;:10;:17;:::i;:::-;6579:31;;6641:71;6663:6;6641:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6641:17:1;;:9;:17;;;;;;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;6621:17:1;;;:9;:17;;;;;;;;;;;:91;;;;6746:20;;;;;;;:32;;6771:6;6746:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;6723:20:1;;:9;:20;;;;;;;;;;:55;6789:20;6795:6;6803:5;6789;:20::i;:::-;6842:9;-1:-1:-1;;;;;6825:35:1;6834:6;-1:-1:-1;;;;;6825:35:1;;6853:6;6825:35;;;;;;;;;;;;;;;;;;6263:605;;;;;:::o;1789:192:3:-;1875:7;1911:12;1903:6;;;;1895:29;;;;-1:-1:-1;;;1895:29:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1895:29:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1947:5:3;;;1789:192::o;1316:136::-;1374:7;1401:43;1405:1;1408;1401:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1394:50;1316:136;-1:-1:-1;;;1316:136:3:o;860:181::-;918:7;950:5;;;974:6;;;;966:46;;;;;-1:-1:-1;;;966:46:3;;;;;;;;;;;;;;;;;;;;;;;;;;;2232:471;2290:7;2535:6;2531:47;;-1:-1:-1;2565:1:3;2558:8;;2531:47;2602:5;;;2606:1;2602;:5;:1;2626:5;;;;;:10;2618:56;;;;-1:-1:-1;;;2618:56:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39089:1017:1;39179:13;;:::i;:::-;39212:14;39237:19;39267:18;39296:16;39323:17;39351:18;39380:16;39409:18;39430:12;;;;;;;;;-1:-1:-1;;;;;39430:12:1;-1:-1:-1;;;;;39430:23:1;;39454:4;39430:29;;;;;;;;;;;;;-1:-1:-1;;;;;39430:29:1;-1:-1:-1;;;;;39430:29:1;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39430:29:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39430:29:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39430:29:1;;-1:-1:-1;39474:9:1;39470:629;39493:10;39489:1;:14;39470:629;;;39690:12;;:32;;;-1:-1:-1;;;39690:32:1;;-1:-1:-1;;;;;39690:32:1;;;;;;;;;;;;;;;:12;;;;;:23;;:32;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;39690:32:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39690:32:1;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;39690:32:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39690:32:1;;-1:-1:-1;39690:32:1;;-1:-1:-1;39690:32:1;-1:-1:-1;39690:32:1;-1:-1:-1;39690:32:1;;-1:-1:-1;39690:32:1;-1:-1:-1;39742:14:1;;;;;;;;39739:349;;;-1:-1:-1;;39783:289:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39776:296:1;;39739:349;39505:3;;39470:629;;;;39089:1017;;;;;;;;;;;;:::o;37328:434::-;37447:11;;;;37410:7;;37435:23;;37410:7;37481:16;:14;:16::i;:::-;37469:28;;37541:1;37536;:6;37532:223;;37601:1;37594:8;;;;;;37532:223;37635:28;37666:18;37679:1;37682;37666:12;:18::i;:::-;37635:49;;37706:37;37723:4;37729:1;:13;;;37706:37;;:16;:37::i;:::-;37699:44;;;;;;;3171:132:3;3229:7;3256:39;3260:1;3263;3256:39;;;;;;;;;;;;;;;;;:3;:39::i;25382:2533:1:-;25450:4;25472:22;;:::i;:::-;-1:-1:-1;25497:16:1;;;;:7;:16;;;;;;;;;25472:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25472:41:1;;;;;;;;;;;;;;;;;;;;25532:10;:31;25524:78;;;;-1:-1:-1;;;25524:78:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25643:12;;;;;25613:21;25637:19;;;:5;:19;;;;;;25696:10;25675:32;;:20;;;:32;;;;;;;;25667:75;;;;;-1:-1:-1;;;25667:75:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;25762:14;;;;-1:-1:-1;;;25762:14:1;;;;25761:15;25753:56;;;;;-1:-1:-1;;;25753:56:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;25900:16;;25865:10;25900:16;25859:17;;;:5;:17;;;;;:36;:58;;;:40;:58;:::i;:::-;25826:10;25820:17;;;;:5;:17;;;;;:97;25964:16;;25945:14;;;;:36;;;:18;:36;:::i;:::-;25928:14;;;:53;26082:16;;26066:10;26082:16;26046:31;;;:19;;;:31;;;;;;:53;;;:35;:53;:::i;:::-;26032:10;26012:31;;;;:19;;;:31;;;;;:87;;;26189:151;;26265:10;26279:5;26244:32;;;:20;;;:32;;;;;;;;:40;;-1:-1:-1;;26244:40:1;;;26313:12;;;;26299:27;;:13;:27;;;;;:29;;-1:-1:-1;;26299:29:1;;;26189:151;26357:16;;;;:7;:16;;;;;26350:23;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26350:23:1;;;;;;;;;;;;;;;;;26423:16;;:25;;12955:3;26423:25;:20;:25;:::i;:::-;26411:37;-1:-1:-1;26459:12:1;26474:16;26411:37;12994:1;26474:16;:8;:16;:::i;:::-;26459:31;-1:-1:-1;26501:13:1;26517:17;:4;13047:1;26517:17;:8;:17;:::i;:::-;26501:33;-1:-1:-1;26545:12:1;26560:16;:4;13100:1;26560:16;:8;:16;:::i;:::-;26602;;26545:31;;-1:-1:-1;26587:12:1;;26602:26;;26623:4;26602:26;:20;:26;:::i;:::-;26652:8;;26587:41;;-1:-1:-1;26652:12:1;26649:343;;26688:12;;26710:10;;26722:8;;-1:-1:-1;;;;;26688:12:1;;;;:21;;26710:10;;26722:15;;26735:1;26722:15;:12;:15;:::i;:::-;26688:50;;;;;;;;;;;;;-1:-1:-1;;;;;26688:50:1;-1:-1:-1;;;;;26688:50:1;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26688:50:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26688:50:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26688:50:1;26680:78;;;;;-1:-1:-1;;;26680:78:1;;;;;;;;;;;;-1:-1:-1;;;26680:78:1;;;;;;;;;;;;;;;26845:12;;26880:8;;-1:-1:-1;;;;;26845:12:1;;;;:21;;12884:42;;26880:15;;26893:1;26880:15;:12;:15;:::i;:::-;26845:51;;;;;;;;;;;;;-1:-1:-1;;;;;26845:51:1;-1:-1:-1;;;;;26845:51:1;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26845:51:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26845:51:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26845:51:1;26837:79;;;;;-1:-1:-1;;;26837:79:1;;;;;;;;;;;;-1:-1:-1;;;26837:79:1;;;;;;;;;;;;;;;27005:14;;;;-1:-1:-1;;;;;27005:28:1;27002:376;;27104:8;:18;;;27002:376;;;27230:14;:7;27242:1;27230:14;:11;:14;:::i;:::-;27219:8;:25;27267:12;;27289:14;;;;-1:-1:-1;;;;;27267:12:1;;;;:21;;27305:14;:7;27317:1;27305:14;:11;:14;:::i;:::-;27267:53;;;;;;;;;;;;;-1:-1:-1;;;;;27267:53:1;-1:-1:-1;;;;;27267:53:1;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27267:53:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27267:53:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27267:53:1;27259:85;;;;;-1:-1:-1;;;27259:85:1;;;;;;;;;;;;-1:-1:-1;;;27259:85:1;;;;;;;;;;;;;;;27412:12;;:42;;;-1:-1:-1;;;27412:42:1;;27434:10;27412:42;;;;;;;;;;;;-1:-1:-1;;;;;27412:12:1;;;;:21;;:42;;;;;;;;;;;;;;;:12;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;27412:42:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27412:42:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27412:42:1;27404:70;;;;;-1:-1:-1;;;27404:70:1;;;;;;;;;;;;-1:-1:-1;;;27404:70:1;;;;;;;;;;;;;;;27525:12;;27547:10;;27525:42;;;-1:-1:-1;;;27525:42:1;;-1:-1:-1;;;;;27547:10:1;;;27525:42;;;;;;;;;;;;:12;;;;;:21;;:42;;;;;;;;;;;;;;:12;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;27525:42:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27525:42:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27525:42:1;27517:75;;;;;-1:-1:-1;;;27517:75:1;;;;;;;;;;;;-1:-1:-1;;;27517:75:1;;;;;;;;;;;;;;;27628:12;;:44;;;-1:-1:-1;;;27628:44:1;;12884:42;27628:44;;;;;;;;;;;;-1:-1:-1;;;;;27628:12:1;;;;:21;;:44;;;;;;;;;;;;;;;:12;;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;27628:44:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27628:44:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27628:44:1;27620:77;;;;;-1:-1:-1;;;27620:77:1;;;;;;;;;;;;-1:-1:-1;;;27620:77:1;;;;;;;;;;;;;;;27835:5;:13;;;27804:5;:16;;;27772:5;:17;;;-1:-1:-1;;;;;27749:136:1;;27863:4;:11;;;27749:136;;;;;;;;;;;;;;;;;;-1:-1:-1;27903:4:1;;25382:2533;-1:-1:-1;;;;;;;;25382:2533:1:o;40114:730::-;40216:4;40238:14;40263:19;40293:18;40322:16;40349:17;40377:18;40406:16;40435:18;40456:12;;;;;;;;;-1:-1:-1;;;;;40456:12:1;-1:-1:-1;;;;;40456:23:1;;40480:4;40456:29;;;;;;;;;;;;;-1:-1:-1;;;;;40456:29:1;-1:-1:-1;;;;;40456:29:1;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40456:29:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40456:29:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40456:29:1;;-1:-1:-1;40500:9:1;40496:341;40519:10;40515:1;:14;40496:341;;;40716:12;;:32;;;-1:-1:-1;;;40716:32:1;;-1:-1:-1;;;;;40716:32:1;;;;;;;;;;;;;;;:12;;;;;:23;;:32;;;;;;;;;;;;;;:12;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;40716:32:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40716:32:1;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;40716:32:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40716:32:1;;-1:-1:-1;40716:32:1;;-1:-1:-1;40716:32:1;-1:-1:-1;40716:32:1;-1:-1:-1;40716:32:1;;-1:-1:-1;40716:32:1;-1:-1:-1;40768:14:1;;;;;;;;40765:61;;;40809:1;-1:-1:-1;40802:8:1;;-1:-1:-1;;;;;;;;40802:8:1;40765:61;40531:3;;40496:341;;17838:3669;17939:4;17985:13;;;:5;:13;;;;;18027:23;;18017:33;;;18009:106;;;;-1:-1:-1;;;18009:106:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18135:14;;;;-1:-1:-1;;;18135:14:1;;;;18134:15;18126:43;;;;;-1:-1:-1;;;18126:43:1;;;;;;;;;;;;-1:-1:-1;;;18126:43:1;;;;;;;;;;;;;;;18204:9;18216:15;:6;12955:3;18216:15;:10;:15;:::i;:::-;18204:27;-1:-1:-1;18242:12:1;18257:16;18204:27;12994:1;18257:16;:8;:16;:::i;:::-;18242:31;-1:-1:-1;18284:13:1;18300:17;:4;13047:1;18300:17;:8;:17;:::i;:::-;18284:33;-1:-1:-1;18328:12:1;18343:16;:4;13100:1;18343:16;:8;:16;:::i;:::-;18328:31;-1:-1:-1;18370:12:1;18385:16;:6;18396:4;18385:16;:10;:16;:::i;:::-;18429:14;;;;18370:31;;-1:-1:-1;18429:27:1;;18370:31;18429:27;:18;:27;:::i;:::-;18412:14;;;:44;18542:10;18521:32;;;;:20;;;:32;;;;;;;;18517:141;;18590:10;18569:32;;;;:20;;;:32;;;;;;;;:39;;-1:-1:-1;;18569:39:1;18604:4;18569:39;;;;;;18623:21;;;:13;:21;;;;;;:23;;;;;;;18517:141;18841:10;18821:31;;;;:19;;;:31;;;;;;:44;;18857:7;18821:44;:35;:44;:::i;:::-;18807:10;18787:31;;;;:19;;;:31;;;;;:78;18901:8;;:12;18898:145;;18937:12;;18971:8;;18937:43;;;-1:-1:-1;;;18937:43:1;;18959:10;18937:43;;;;;;;;;;;;-1:-1:-1;;;;;18937:12:1;;;;:21;;:43;;;;;;;;;;;;;;;:12;;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;18937:43:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18937:43:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18937:43:1;18929:71;;;;;-1:-1:-1;;;18929:71:1;;;;;;;;;;;;-1:-1:-1;;;18929:71:1;;;;;;;;;;;;;;;-1:-1:-1;;;;;19056:17:1;;19053:344;;19136:8;:18;;;19053:344;;;19244:14;:7;19256:1;19244:14;:11;:14;:::i;:::-;19233:8;:25;19281:12;;-1:-1:-1;;;;;19281:12:1;:25;19307:10;19319:3;19324:14;:7;19336:1;19324:14;:11;:14;:::i;:::-;19281:58;;;;;;;;;;;;;-1:-1:-1;;;;;19281:58:1;-1:-1:-1;;;;;19281:58:1;;;;;;-1:-1:-1;;;;;19281:58:1;-1:-1:-1;;;;;19281:58:1;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19281:58:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19281:58:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19281:58:1;19273:90;;;;;-1:-1:-1;;;19273:90:1;;;;;;;;;;;;-1:-1:-1;;;19273:90:1;;;;;;;;;;;;;;;19431:12;;19496:8;;-1:-1:-1;;;;;19431:12:1;;;;:25;;19457:10;;19477:4;;19484:21;;:7;;:21;:11;:21;:::i;:::-;19431:75;;;;;;;;;;;;;-1:-1:-1;;;;;19431:75:1;-1:-1:-1;;;;;19431:75:1;;;;;;-1:-1:-1;;;;;19431:75:1;-1:-1:-1;;;;;19431:75:1;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19431:75:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19431:75:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19431:75:1;19423:103;;;;;-1:-1:-1;;;19423:103:1;;;;;;;;;;;;-1:-1:-1;;;19423:103:1;;;;;;;;;;;;;;;19611:12;;19649:10;;19611:58;;;-1:-1:-1;;;19611:58:1;;19637:10;19611:58;;;;-1:-1:-1;;;;;19649:10:1;;;19611:58;;;;;;;;;;;;:12;;;;;:25;;:58;;;;;;;;;;;;;;:12;;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;19611:58:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19611:58:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19611:58:1;19603:91;;;;;-1:-1:-1;;;19603:91:1;;;;;;;;;;;;-1:-1:-1;;;19603:91:1;;;;;;;;;;;;;;;19730:12;;:60;;;-1:-1:-1;;;19730:60:1;;19756:10;19730:60;;;;12884:42;19730:60;;;;;;;;;;;;-1:-1:-1;;;;;19730:12:1;;;;:25;;:60;;;;;;;;;;;;;;;:12;;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;19730:60:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19730:60:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19730:60:1;19722:93;;;;;-1:-1:-1;;;19722:93:1;;;;;;;;;;;;-1:-1:-1;;;19722:93:1;;;;;;;;;;;;;;;19899:23;;19882:14;;;;:40;19879:1462;;;19980:23;;19961:14;;;;19938:20;;19961:43;;:14;:43;:18;:43;:::i;:::-;19938:66;-1:-1:-1;20059:44:1;20074:28;:7;19938:66;20074:28;:11;:28;:::i;:::-;20059:14;:44::i;:::-;20181:63;20197:28;:7;20209:15;20197:28;:11;:28;:::i;:::-;20227:4;:11;;;20240:3;20181:15;:63::i;:::-;20313:23;;20296:14;;;:40;20498:10;20313:23;20478:31;;;:19;;;:31;;;;;;:52;;20514:15;20478:52;:35;:52;:::i;:::-;20464:10;20444:31;;;;:19;;;:31;;;;;:86;20553:24;20564:6;20444:4;20553:10;:24::i;:::-;20545:65;;;;;-1:-1:-1;;;20545:65:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;20633:44;20641:4;:13;;;20656:15;20673:3;20633:7;:44::i;:::-;20625:89;;;;;-1:-1:-1;;;20625:89:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19879:1462;;;;20794:23;;20776:14;;;;:41;20773:568;;;20858:23;20873:7;20858:14;:23::i;:::-;20922:42;20938:7;20947:4;:11;;;20960:3;20922:15;:42::i;:::-;20987:24;20998:6;21006:4;20987:10;:24::i;:::-;20979:65;;;;;-1:-1:-1;;;20979:65:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;21067:30;21075:4;:13;;;21090:1;21093:3;21067:7;:30::i;:::-;21059:75;;;;;-1:-1:-1;;;21059:75:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20773:568;;;21223:23;21238:7;21223:14;:23::i;:::-;21287:42;21303:7;21312:4;:11;;;21325:3;21287:15;:42::i;:::-;21428:16;21437:6;21428:8;:16::i;:::-;21420:57;;;;;-1:-1:-1;;;21420:57:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21495:4:1;;17838:3669;-1:-1:-1;;;;;;;;;17838:3669:1:o;8194:348::-;-1:-1:-1;;;;;8270:21:1;;8262:67;;;;-1:-1:-1;;;8262:67:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8363:68;8386:6;8363:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8363:18:1;;:9;:18;;;;;;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;8342:18:1;;:9;:18;;;;;;;;;;:89;8457:12;;:24;;8474:6;8457:24;:16;:24;:::i;:::-;8442:12;:39;8497:37;;;;;;;;8523:1;;-1:-1:-1;;;;;8497:37:1;;;;;;;;;;;;8194:348;;:::o;37101:219::-;37163:7;37188:29;;:::i;:::-;37220:12;;;;;;;;;-1:-1:-1;;;;;37220:12:1;-1:-1:-1;;;;;37220:23:1;;:25;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37220:25:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37220:25:1;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:3;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;37274:13:1;;;;37101:219;-1:-1:-1;;37101:219:1:o;36663:430::-;36814:12;;:33;;;-1:-1:-1;;;36814:33:1;;;;;;;;;;;;;;;;36744:23;;;;-1:-1:-1;;;;;36814:12:1;;;;:27;;:33;;;;;:12;;:33;;;;;;;;:12;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;36814:33:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36814:33:1;;;;;;39:16:-1;36:1;17:17;2:54;101:4;36814:33:1;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;36814:33:1;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;36814:33:1;;421:4:-1;412:14;;;;36814:33:1;;;;;412:14:-1;36814:33:1;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36814:33:1;;;;;;;;;;;36785:62;;36858:11;36872:9;:16;36858:30;;36899:28;36951:3;36930:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;36899:56:1;-1:-1:-1;36970:9:1;36966:98;36989:3;36985:1;:7;36966:98;;;37023:29;37039:9;37049:1;37039:12;;;;;;;;;;;;;;37023:15;:29::i;:::-;37013:4;37018:1;37013:7;;;;;;;;;;;;;;;;;:39;36994:3;;36966:98;;;-1:-1:-1;37081:4:1;36663:430;-1:-1:-1;;;;;36663:430:1:o;36091:346::-;36246:16;;36207:7;;;;36301:106;36324:3;36320:1;:7;36301:106;;;36357:38;36372:9;36382:1;36372:12;;;;;;;;;;;;;;36386:8;36357:14;:38::i;:::-;36348:47;;;;36329:3;;36301:106;;;-1:-1:-1;36424:5:1;36091:346;-1:-1:-1;;;;36091:346:1:o;3833:345:3:-;3919:7;4021:12;4014:5;4006:28;;;;-1:-1:-1;;;4006:28:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4006:28:3;;4045:9;4061:1;4057;:5;;;;;;;3833:345;-1:-1:-1;;;;;3833:345:3:o;27948:290:1:-;28049:10;28019:21;28043:17;;;:5;:17;;;;;28097:23;;:35;;28125:6;28097:35;:27;:35;:::i;:::-;28071:61;;28201:16;;:29;;-1:-1:-1;;;;;;28201:29:1;28220:10;28201:29;;;-1:-1:-1;27948:290:1:o;28272:789::-;28378:13;28394:21;:19;:21::i;:::-;28439:10;28426:24;;;;:12;:24;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;28426:39:1;;;;;;;;;;28497:20;;;:12;:20;;;;;27:10:-1;;23:18;;;45:23;;28497:35:1;;;;;;;;28378:37;-1:-1:-1;28564:22:1;;:::i;:::-;28597:25;;;28686:12;;;;:21;;;28754:13;;;;:24;;;28809:10;28789:17;;;:30;;;-1:-1:-1;;;;;28830:20:1;;;:14;;;:20;;;28597:16;28861:17;;;:7;:17;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28861:25:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;28921:132;;;;;;;28861:25;;;;28921:132;;;;;;;;;28272:789;;;;;:::o;21576:1024::-;21716:23;;21698:14;;;;21668:4;;21698:41;21690:76;;;;;-1:-1:-1;;;21690:76:1;;;;;;;;;;;;-1:-1:-1;;;21690:76:1;;;;;;;;;;;;;;;21800:23;;21855;;;;21889:12;;:55;;;-1:-1:-1;;;21889:55:1;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21889:12:1;;;;:23;;:55;;;;;21777:20;;21889:55;;;;;;;;21777:20;21889:12;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;21889:55:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;21976:12:1;;:38;;;-1:-1:-1;;;21976:38:1;;22008:4;21976:38;;;;;;21955:18;;-1:-1:-1;21976:45:1;;-1:-1:-1;22019:1:1;;-1:-1:-1;;;;;21976:12:1;;:23;;:38;;;;;;;;;;;;;;:12;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;21976:38:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21976:38:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21976:38:1;;:45;:42;:45;:::i;:::-;21955:66;;22064:19;;:::i;:::-;22086:45;22110:4;22117:13;22086:15;:45::i;:::-;22234:13;;22216:15;;;:31;;;;;;-1:-1:-1;;22216:31:1;;;;;;;;;;22273:13;;22258:12;;;:28;22328:3;22297:28;;;:34;-1:-1:-1;;22374:21:1;-1:-1:-1;;;22374:21:1;;;22064:67;-1:-1:-1;22406:16:1;:14;:16::i;:::-;-1:-1:-1;22546:13:1;;22438:132;;;;;;;;;;;;;;;;22525:6;;22497:13;;22438:132;;;;;;;;;-1:-1:-1;22588:4:1;;21576:1024;-1:-1:-1;;;;;;21576:1024:1:o;16204:1551::-;16313:4;;;16390:13;16387:529;;-1:-1:-1;16431:17:1;;-1:-1:-1;16501:2:1;16387:529;;;16543:8;16555:1;16543:13;16540:376;;;-1:-1:-1;16584:17:1;;-1:-1:-1;16655:3:1;16540:376;;;16696:8;16708:1;16696:13;16693:223;;;-1:-1:-1;16737:17:1;;-1:-1:-1;16809:4:1;16693:223;;;16878:26;;;-1:-1:-1;;;16878:26:1;;;;;;;;;;;;-1:-1:-1;;;16878:26:1;;;;;;;;;;;;;;16693:223;16926:7;16936:15;:13;:15::i;:::-;16962:21;16986:9;;;:5;:9;;;;;17006:35;;;17060:23;;;:35;;;17106:14;;;:32;;;17157:11;;;:16;;;17184:13;;;:24;;;17219:13;;;:20;;-1:-1:-1;;17219:20:1;-1:-1:-1;;;17219:20:1;;;16926:25;;-1:-1:-1;17253:19:1;;17250:449;;17360:17;;;;:13;:17;;;;;;;;:19;;;;;;;;;17415:10;17394:32;;:20;;;:32;;;;;:39;;-1:-1:-1;;17394:39:1;;;;;;17482:19;;;:31;;;;;;:52;;17518:15;17482:52;:35;:52;:::i;:::-;17468:10;17448:31;;;;:19;;;:31;;;;;:86;17574:31;17589:15;17574:14;:31::i;:::-;17646:41;17662:15;17679:2;17683:3;17646:15;:41::i;:::-;17709:9;;;;:5;:9;;;;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17709:16:1;;;;;;;;;;;;-1:-1:-1;;17709:16:1;;;-1:-1:-1;;;17709:16:1;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17709:16:1;;;-1:-1:-1;;;17709:16:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17709:16:1;;;;;;;;;;;;;;16204:1551;-1:-1:-1;;;;;;16204:1551:1:o;10294:283::-;10360:4;;10393:15;:6;10404:3;10393:15;:10;:15;:::i;:::-;10382:26;-1:-1:-1;10436:10:1;10457:18;10436:10;10382:26;10457:5;:18::i;35687:396::-;35765:21;;:::i;:::-;-1:-1:-1;36039:36:1;;;;;;;;35528:28;35850:15;;;36039:36;;35480:2;35880:22;;;35930:15;36039:36;;;;35960:22;;;;;35652:26;36008:13;36039:36;;;;;35687:396::o;36445:210::-;36554:7;36621:6;:26;;;36597:6;:21;;;36586:8;:32;:61;;;;;;;36445:210;-1:-1:-1;;;36445:210:1:o;29094:153::-;29183:18;:20;;;;;;;;29094:153;:::o;38295:786::-;38384:13;;:::i;:::-;38778:12;;:34;;;-1:-1:-1;;;38778:34:1;;-1:-1:-1;;;;;38778:34:1;;;;;;;;;;;;;;;38415:14;;;;;;;;;;;;;;38778:12;;;:23;;:34;;;;;;;;;;;;;;;:12;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;38778:34:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38778:34:1;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;38778:34:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38832:241;;38778:34;38832:241;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38295:786;-1:-1:-1;;;;;;;;;;38295:786:1:o;29447:138::-;29531:13;:15;;;;;;;;29447:138;:::o;29279:135::-;29362:12;:14;;;;;;;;29279:135;:::o;7149:713::-;7231:6;-1:-1:-1;;;;;7256:21:1;;7248:65;;;;;-1:-1:-1;;;7248:65:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;7328:9;;;;7324:531;;7371:10;;7356:12;;:25;7353:491;;;7428:10;;7404:12;;:21;;7421:3;7404:21;:16;:21;:::i;:::-;:34;7401:303;;;7483:12;;7468:10;;:28;;;:14;:28;:::i;:::-;7534:10;;7519:12;:25;7567:9;:16;;-1:-1:-1;;7567:16:1;7579:4;7567:16;;;7462:34;-1:-1:-1;7401:303:1;;;7663:12;;:21;;7680:3;7663:21;:16;:21;:::i;:::-;7648:12;:36;7401:303;-1:-1:-1;;;;;7743:18:1;;:9;:18;;;;;;;;;;;:27;;7766:3;7743:27;:22;:27;:::i;:::-;-1:-1:-1;;;;;7722:18:1;;:9;:18;;;;;;;;;;;:48;;;;7794:34;;;;;;;7722:18;;:9;;7794:34;;;;;;;;;;7353:491;7149:713;;;:::o;12356:28491::-;;;;;;;;;-1:-1:-1;12356:28491:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12356:28491:1;;;;;;-1:-1:-1;;;;;12356:28491:1;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;12356:28491:1;;;-1:-1:-1;;12356:28491:1:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://ca62bd23ffec7202a2b3a5f9ecfb53da305133c5723869fed8a369af68340e93

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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