ETH Price: $3,171.61 (-3.64%)

Token

SquidGrow (SquidGrow)
 

Overview

Max Total Supply

1,000,000,000,000,000 SquidGrow

Holders

2,880 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
115,076,046,169.115013829 SquidGrow

Value
$0.00
0x2c99c76ab5ae3c252997cdf12727188ba25d258f
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SquidGrow

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license, Audited

Contract Source Code (Solidity)Audit Report

/**
 *Submitted for verification at Etherscan.io on 2023-04-30
*/

/**

https://t.me/SquidGrowOfficial

*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.14;

library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

interface IERC20 {
 
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

library Address {

    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

interface IERC20Permit {
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function nonces(address owner) external view returns (uint256);
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}
abstract contract Auth {
    address public owner;
    mapping (address => bool) internal authorizations;
    
    constructor(address _owner) {
        owner = _owner;
        authorizations[_owner] = true; 
    }
    
    modifier onlyOwner() {
        require(isOwner(msg.sender), "!OWNER");
        _;
    }

    modifier authorized() {
        require(isAuthorized(msg.sender), "!AUTHORIZED");
        _;
    }
    
    function authorize(address adr) public authorized {
        authorizations[adr] = true;
    }

    function unauthorize(address adr) public authorized {
        authorizations[adr] = false;
    }

    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    function isAuthorized(address adr) public view returns (bool) {
        return authorizations[adr];
    }
    
    function transferOwnership(address payable adr) public authorized {
        require(adr != address(0), "Zero Address");
        owner = adr;
        authorizations[adr] = true;
        emit OwnershipTransferred(adr);}
    
    function renounceOwnership() external authorized {
        emit OwnershipTransferred(address(0));
        owner = address(0);}
    
    event OwnershipTransferred(address owner);
}


interface IFactory{
        function createPair(address tokenA, address tokenB) external returns (address pair);
        function getPair(address tokenA, address tokenB) external view returns (address pair);
}

interface IRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline) external;
}

interface IPair {
    function sync() external;
}

interface IWeth {
    function deposit() external payable;
}

contract SquidGrow  is IERC20, Auth {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    string private constant _name = 'SquidGrow';
    string private constant _symbol = 'SquidGrow';
    uint8 private constant _decimals = 9;
    uint256 private constant _totalSupply = 10 * 10**14 * (10 ** _decimals);

    address constant DEAD = 0x000000000000000000000000000000000000dEaD;
    uint256 public _maxTxAmount = ( _totalSupply * 30 ) / 10000;
    uint256 public _maxWalletAmount = ( _totalSupply * 500 ) / 10000;

    mapping (address => uint256) _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) _isBot;
    mapping (address => bool) isWhitelisted;
    mapping (address => bool) isBlacklisted;

    IRouter public immutable router;
    address public immutable pair;
    bool tradingEnabled = false;
    uint256 startedTime;

    uint256 constant feeDenominator = 10000;

    struct Fee {
        uint256 stakingFee;
        uint256 burnFee;
        uint256 liquidFee; // marketingFee + autoLPFee + teamFee
        uint256 totalFee;
    }

    enum TransactionType {BUY, SELL, TRANSFER}

    mapping (TransactionType => Fee) public fees;

    bool swapAndLiquifyEnabled = false;
    uint256 swapTimes; 
    uint256 minTransactionsBeforeSwap = 7;
    bool swapping; 
    bool antiBotEnabled = true;

    uint256 swapThreshold = ( _totalSupply * 300 ) / 100000;
    uint256 _minTokenAmount = ( _totalSupply * 15 ) / 100000;

    uint256 marketing_divisor = 0;
    uint256 liquidity_divisor = 100;
    uint256 team_divisor = 0;
    uint256 total_divisor = 100;

    address liquidity_receiver; 
    address staking_receiver;
    address marketing_receiver;

    address team1_receiver;
    address team2_receiver;
    address team3_receiver;
    address team4_receiver;

    address public multisig = address(0x4B1AbbdEaC18EaA719C608BcCF9005711f296E87); // it will be updated to mutlisig address before deployemnt.

    event WhitelistUpdated(address indexed account, bool indexed whitelisted);
    event BotUpdated(address indexed account, bool indexed isBot);
    event BlacklistedUpdated(address indexed account, bool indexed blacklisted);
    event AntiBotStateUpdated(bool indexed enabled);
    event TradingEnabled();
    event TradingDisabled();
    event SwapBackSettingsUpdated(bool indexed enabled, uint256 threshold, uint256 minLimit, uint256 _minTransactions);
    event MaxLimitsUpdated(uint256 maxTxAmount, uint256 maxWalletAmount);
    event UnsupportedTokensRecoverd(address indexed token, address receiver, uint256 amount);
    event DivisorsUpdated(uint256 team, uint256 liquidity, uint256 marketing);
    event TeamFundsDistributed(address team1, address team2, address team3, address team4, uint256 amount);
    event FeesUpdated(TransactionType indexed transactionType, uint256 burnFee, uint256 stakingFee, uint256 swapAndLiquifyFee);
    event FeesAddressesUpdated(address marketing, address liquidity, address staking);
    event TeamAddressesUpdated(address team1, address team2, address team3, address team4);
    event ForceAdjustedLP(bool indexed squid, uint256 amount, bool indexed add);
    event TokensAirdroped(address indexed sender, uint256 length, uint256 airdropedAmount);
    event MultisigUpdated(address indexed multisig);

    modifier lockTheSwap {
        swapping = true; 
        _;
        swapping = false;
    }

    modifier onlyMultisig {
        require(msg.sender == multisig, "Not multisig");
        _;
    }

    constructor() Auth(msg.sender) {
        IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // eth - 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        address _pair = IFactory(_router.factory()).createPair(address(this), _router.WETH());
        router = _router;
        pair = _pair;

        // initilasing Fees
        fees[TransactionType.SELL] = Fee (0, 0, 1200, 1200);
        fees[TransactionType.BUY] = Fee (0, 0, 400, 400);
        fees[TransactionType.TRANSFER] = Fee (0, 0, 0, 0);
        
        isBlacklisted[address(0)] = true;
       
        isWhitelisted[msg.sender] = true;
        isWhitelisted[address(this)] = true;

        liquidity_receiver = address(this);
        team1_receiver = msg.sender;
        team2_receiver = msg.sender;
        team3_receiver = msg.sender;
        team4_receiver = msg.sender;
        staking_receiver = msg.sender;
        marketing_receiver = msg.sender;

        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    receive() external payable {}

    function name() public pure returns (string memory) {return _name;}
    function symbol() public pure returns (string memory) {return _symbol;}
    function decimals() public pure returns (uint8) {return _decimals;}
    function totalSupply() public pure override returns (uint256) {return _totalSupply;}
    function balanceOf(address account) public view override returns (uint256) {return _balances[account];}
    function transfer(address recipient, uint256 amount) public override returns (bool) {_transfer(msg.sender, recipient, amount);return true;}
    function allowance(address owner, address spender) public view override returns (uint256) {return _allowances[owner][spender];}

    function isBot(address _address) public view returns (bool) {
        return _isBot[_address];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    
    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD));
    }

    function whitelistAddress(address _address, bool _whitelist) external authorized { 
        require(isWhitelisted[_address] != _whitelist, "Already set");
        isWhitelisted[_address] = _whitelist;

        emit WhitelistUpdated(_address, _whitelist);
    }

    function blacklistAddress(address _address, bool _blacklist) external authorized { 
        require(isBlacklisted[_address] != _blacklist, "Already set");
        isBlacklisted[_address] = _blacklist;

        emit BlacklistedUpdated(_address, _blacklist);
    }

    function updateBot(address _address, bool isBot_) external authorized {
        require(_isBot[_address] != isBot_, "Already set");
        _isBot[_address] = isBot_;

        emit BotUpdated(_address, isBot_);
    }

    function enableAntiBot(bool _enable) external authorized {
        require(antiBotEnabled != _enable, "Already set");
        antiBotEnabled = _enable;

        emit AntiBotStateUpdated(_enable);
    }

    function enableTrading(uint256 _input) external authorized {
        require(!tradingEnabled, "Already Enabled!");
        tradingEnabled = true;
        if(startedTime == 0) // initialise only once
            startedTime = block.timestamp.add(_input);
        
        emit TradingEnabled();
    }

    function disableTrading() external onlyMultisig {
        require(tradingEnabled, "Already disabled!");
        tradingEnabled = false;

        emit TradingDisabled();
    }

    function updateSwapBackSettings(bool _enabled, uint256 _threshold, uint256 _minLimit, uint256 _minTransactionsBeforeSwap) external authorized {
        swapAndLiquifyEnabled = _enabled; 
        swapThreshold = _threshold;
        _minTokenAmount = _minLimit;
        minTransactionsBeforeSwap = _minTransactionsBeforeSwap;

        emit SwapBackSettingsUpdated( _enabled, _threshold, _minLimit, _minTransactionsBeforeSwap);
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public override returns (bool) {
        _spendAllowance(from, msg.sender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, allowance(msg.sender, spender) + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = allowance(msg.sender, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(msg.sender, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    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);
    }

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        preTxCheck(sender, recipient, amount);

        bool takeFee = true;
        if (isWhitelisted[sender] || isWhitelisted[recipient]) {
            takeFee = false;

        } else {
            require(tradingEnabled, "Trading is Paused");
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
            if (recipient != pair) {
                require(_balances[recipient] + amount <= _maxWalletAmount, "Wallet amount exceeds limit");
            }

        }

        TransactionType transactionType;

        if(sender == pair) {
            transactionType = TransactionType.BUY;
            if(recipient != address(router) && block.timestamp <= startedTime) {
                _isBot[recipient] = true;
            }
        } else if (recipient == pair) {
            transactionType = TransactionType.SELL;
        } else {
            transactionType = TransactionType.TRANSFER;
        }

        swapTimes = swapTimes.add(1);
        if(shouldSwapBack(sender, amount)){
            swapAndLiquify(swapThreshold);
            swapTimes = 0;
        }

        _balances[sender] = _balances[sender].sub(amount);
        uint256 amountReceived = takeFee ? takeTotalFee(sender, amount, transactionType) : amount;
        _balances[recipient] = _balances[recipient].add(amountReceived);
        emit Transfer(sender, recipient, amountReceived);
    }

    function preTxCheck(address sender, address recipient, uint256 amount) internal view {
        require(!isBlacklisted[sender], "Blackisted");
        require(!isBlacklisted[recipient], "Blackisted");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(amount <= balanceOf(sender),"You are trying to transfer more than your balance");
    }

    function takeTotalFee(address sender, uint256 amount, TransactionType transactionType) internal returns (uint256) {
        Fee memory fee = fees[transactionType];
        uint256 totalFees = _isBot[sender] && antiBotEnabled? (feeDenominator - 100) : fee.totalFee; // 99% fees if bot
        if (totalFees == 0) {
            return amount;
        }
        uint256 feeAmount = (amount.mul(totalFees)).div(feeDenominator);
        uint256 burnAmount = (feeAmount.mul(fee.burnFee)).div(totalFees);
        uint256 stakingAmount = (feeAmount.mul(fee.stakingFee)).div(totalFees);

        uint256 liquidAmount = feeAmount.sub(burnAmount).sub(stakingAmount);

        if(burnAmount > 0) {
            _balances[address(DEAD)] = _balances[address(DEAD)].add(burnAmount);
            emit Transfer(sender, address(DEAD), burnAmount);
        }
        if(stakingAmount > 0) {
            _balances[address(staking_receiver)] = _balances[address(staking_receiver)].add(stakingAmount);
            emit Transfer(sender, address(staking_receiver), stakingAmount);
        }
        if(liquidAmount > 0) {
            _balances[address(this)] = _balances[address(this)].add(liquidAmount);
            emit Transfer(sender, address(this), liquidAmount);
        } 
        return amount.sub(feeAmount);

    }

    function updateMaxLimits(uint256 _transaction, uint256 _wallet) external authorized {
        require(_transaction >= 1, "Max txn limit cannot be less than 0.00001%");
        require(_wallet >= 500000, "Max Wallet limit cannot be less than 5%");
        uint256 newTxLimit = ( _totalSupply * _transaction ) / 10000000;
        uint256 newWalletLimit = ( _totalSupply * _wallet ) / 10000000;
        _maxTxAmount = newTxLimit;
        _maxWalletAmount = newWalletLimit;

        emit MaxLimitsUpdated(_maxTxAmount, _maxWalletAmount);
    }

    function recoverUnsupportedTokens(address _token, address _receiver, uint256 _percentage) external authorized {
        uint256 amount = IERC20(_token).balanceOf(address(this));
        uint256 amountToWithdraw = amount.mul(_percentage).div(10000);
        IERC20(_token).safeTransfer(_receiver, amountToWithdraw);

        emit UnsupportedTokensRecoverd(_token, _receiver, amountToWithdraw);
    }

    function updateDivisors(uint256 _team, uint256 _liquidity, uint256 _marketing) external authorized {
        team_divisor = _team;
        liquidity_divisor = _liquidity;
        marketing_divisor = _marketing;
        total_divisor = _team.add(_liquidity).add(_marketing);

        emit DivisorsUpdated(_team, _liquidity, _marketing);
    }

    function distributeTeamFunds(uint256 _numerator, uint256 _denominator) external authorized {
        uint256 ethAmount = address(this).balance;
        uint256 distributeAmount = ethAmount.mul(_numerator).div(_denominator);
        uint256 amountToSend = distributeAmount.div(4);
        transferETH(team1_receiver, amountToSend);
        transferETH(team2_receiver, amountToSend);
        transferETH(team3_receiver, amountToSend);
        transferETH(team4_receiver, amountToSend);

        emit TeamFundsDistributed(team1_receiver, team2_receiver, team3_receiver, team4_receiver, distributeAmount);
    }

    function updateFee(TransactionType transactionType, uint256 _burnFee, uint256 _stakingFee, uint256 _swapAndLiquifyFee) external onlyMultisig {
        require(_burnFee.add(_stakingFee).add(_swapAndLiquifyFee) <= feeDenominator.mul(3).div(20), "Tax cannot be more than 15%");
        Fee storage fee = fees[transactionType];
        fee.burnFee = _burnFee;
        fee.stakingFee = _stakingFee;
        fee.liquidFee = _swapAndLiquifyFee;
        fee.totalFee = _burnFee.add(_stakingFee).add(_swapAndLiquifyFee);    

        emit FeesUpdated(transactionType, _burnFee, _stakingFee, _swapAndLiquifyFee);
    }

    function updateFeesAddresses(address _marketing, address _liquidity, address _staking) external authorized {
        require(_marketing != address(0), "Zero Address");
        require(_liquidity != address(0), "Zero Address");
        require(_staking != address(0), "Zero Address");
        marketing_receiver = _marketing;
        liquidity_receiver = _liquidity;
        staking_receiver = _staking;

        emit FeesAddressesUpdated( _marketing, _liquidity, _staking);
    }

    function updateTeamAddresses(address _team1, address _team2, address _team3, address _team4) external authorized {
        require(_team1 != address(0), "Zero Address");
        require(_team2 != address(0), "Zero Address");
        require(_team3 != address(0), "Zero Address");
        require(_team4 != address(0), "Zero Address");
        team1_receiver = _team1;
        team2_receiver = _team2;
        team3_receiver = _team3;
        team4_receiver = _team4;

        emit TeamAddressesUpdated( _team1, _team2, _team3, _team4);
    }

    function shouldSwapBack(address sender, uint256 amount) internal view returns (bool) {
        bool aboveMin = amount >= _minTokenAmount;
        bool aboveThreshold = balanceOf(address(this)) >= swapThreshold;
        return !swapping && swapAndLiquifyEnabled && aboveMin && 
             swapTimes >= minTransactionsBeforeSwap && aboveThreshold && sender != pair;
    }

    function swapAndLiquify(uint256 tokens) private lockTheSwap {
        uint256 amountToLiquify = tokens.mul(liquidity_divisor).div(total_divisor).div(2);
        uint256 amountToSwap = tokens.sub(amountToLiquify);

        uint256 initialBalance = address(this).balance;
        swapTokensForETH(amountToSwap);

        uint256 deltaBalance = address(this).balance.sub(initialBalance);
        uint256 totalETHFee = total_divisor.sub(liquidity_divisor.div(2));

        if(amountToLiquify > 0){
            addLiquidity(amountToLiquify, deltaBalance.mul(liquidity_divisor).div(totalETHFee).div(2)); 
        }
        // transfer ETH to marketing, teamFunds stay in contract for future distribution.
        transferETH(marketing_receiver, deltaBalance.mul(marketing_divisor).div(totalETHFee));
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(router), tokenAmount);
        router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            liquidity_receiver,
            block.timestamp);
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        _approve(address(this), address(router), tokenAmount);
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp);
    }

    function transferETH(address recipient, uint256 amount) private {
        if(amount == 0) return;
        (bool success, ) = payable(recipient).call{value: amount}("");
        require(success, "Unable to send ETH");
    }

    function airdropTokens(address[] calldata accounts, uint256[] calldata amounts) external authorized {
        uint256 length = accounts.length;
        require (length == amounts.length, "array length mismatched");
        uint256 airdropAmount = 0;
        
        for (uint256 i = 0; i < length; i++) {
            // updating balance directly instead of calling transfer to save gas
            _balances[accounts[i]] += amounts[i];
            airdropAmount += amounts[i];
            emit Transfer(msg.sender, accounts[i], amounts[i]);
        }
        _balances[msg.sender] -= airdropAmount;

        emit TokensAirdroped(msg.sender, length, airdropAmount);
    }

    function forceAdjustLP(bool squid, uint256 amount, bool add) external payable onlyMultisig{
        if(!squid) {
            require(add, "Cant withdraw bnb from pool");
            amount = msg.value;
            IWeth(router.WETH()).deposit{value: amount}();
            IERC20(router.WETH()).safeTransfer(pair, amount);
        }else {
            if(add) {
                _balances[msg.sender] -= amount;
                _balances[pair] += amount;
                emit Transfer(msg.sender, pair, amount);

            } else {
                _balances[pair] -= amount;
                _balances[msg.sender] += amount;
                emit Transfer(pair, msg.sender, amount);
            }
        }
        IPair(pair).sync();
        emit ForceAdjustedLP(squid, amount, add);
    }

    function setMultisig(address _newMultisig) external onlyMultisig {
        require(_newMultisig != address(0), "Zero Address");
        multisig = _newMultisig;
        emit MultisigUpdated(_newMultisig);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"enabled","type":"bool"}],"name":"AntiBotStateUpdated","type":"event"},{"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":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"BlacklistedUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"isBot","type":"bool"}],"name":"BotUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"team","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketing","type":"uint256"}],"name":"DivisorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketing","type":"address"},{"indexed":false,"internalType":"address","name":"liquidity","type":"address"},{"indexed":false,"internalType":"address","name":"staking","type":"address"}],"name":"FeesAddressesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum SquidGrow.TransactionType","name":"transactionType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"burnFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakingFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapAndLiquifyFee","type":"uint256"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"squid","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"add","type":"bool"}],"name":"ForceAdjustedLP","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxWalletAmount","type":"uint256"}],"name":"MaxLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"multisig","type":"address"}],"name":"MultisigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_minTransactions","type":"uint256"}],"name":"SwapBackSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"team1","type":"address"},{"indexed":false,"internalType":"address","name":"team2","type":"address"},{"indexed":false,"internalType":"address","name":"team3","type":"address"},{"indexed":false,"internalType":"address","name":"team4","type":"address"}],"name":"TeamAddressesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"team1","type":"address"},{"indexed":false,"internalType":"address","name":"team2","type":"address"},{"indexed":false,"internalType":"address","name":"team3","type":"address"},{"indexed":false,"internalType":"address","name":"team4","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamFundsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"length","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"airdropedAmount","type":"uint256"}],"name":"TokensAirdroped","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","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":"token","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnsupportedTokensRecoverd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"whitelisted","type":"bool"}],"name":"WhitelistUpdated","type":"event"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airdropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_blacklist","type":"bool"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numerator","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"distributeTeamFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum SquidGrow.TransactionType","name":"","type":"uint8"}],"name":"fees","outputs":[{"internalType":"uint256","name":"stakingFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"uint256","name":"liquidFee","type":"uint256"},{"internalType":"uint256","name":"totalFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"squid","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"add","type":"bool"}],"name":"forceAdjustLP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"recoverUnsupportedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newMultisig","type":"address"}],"name":"setMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"adr","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"isBot_","type":"bool"}],"name":"updateBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_team","type":"uint256"},{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_marketing","type":"uint256"}],"name":"updateDivisors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum SquidGrow.TransactionType","name":"transactionType","type":"uint8"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_stakingFee","type":"uint256"},{"internalType":"uint256","name":"_swapAndLiquifyFee","type":"uint256"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketing","type":"address"},{"internalType":"address","name":"_liquidity","type":"address"},{"internalType":"address","name":"_staking","type":"address"}],"name":"updateFeesAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transaction","type":"uint256"},{"internalType":"uint256","name":"_wallet","type":"uint256"}],"name":"updateMaxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"uint256","name":"_minLimit","type":"uint256"},{"internalType":"uint256","name":"_minTransactionsBeforeSwap","type":"uint256"}],"name":"updateSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_team1","type":"address"},{"internalType":"address","name":"_team2","type":"address"},{"internalType":"address","name":"_team3","type":"address"},{"internalType":"address","name":"_team4","type":"address"}],"name":"updateTeamAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_whitelist","type":"bool"}],"name":"whitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052612710620000156009600a62000792565b620000289066038d7ea4c68000620007aa565b6200003590601e620007aa565b620000419190620007cc565b600255612710620000556009600a62000792565b620000689066038d7ea4c68000620007aa565b62000076906101f4620007aa565b620000829190620007cc565b6003556009805460ff199081168255600c805490911690556007600e55600f805461ff001916610100179055620186a090620000c090600a62000792565b620000d39066038d7ea4c68000620007aa565b620000e19061012c620007aa565b620000ed9190620007cc565b601055620186a0620001026009600a62000792565b620001159066038d7ea4c68000620007aa565b6200012290600f620007aa565b6200012e9190620007cc565b6011556000601281905560646013819055601491909155601555601d80546001600160a01b031916734b1abbdeac18eaa719c608bccf9005711f296e871790553480156200017b57600080fd5b50600080546001600160a01b0319163390811782558152600160208181526040808420805460ff1916909317909255815163c45a015560e01b81529151737a250d5630b4cf539739df2c5dacb4c659f2488d9392849263c45a0155926004808401938290030181865afa158015620001f7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021d9190620007ef565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200026b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002919190620007ef565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003059190620007ef565b6001600160a01b03838116608090815290821660a052604080518083018252600080825260208083018281526104b084860181815260608087019283526001808752600b80875297517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5cf5593517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5d05590517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5d15590517f72c6bfb7988af3a1efa6568f02a999bc52252641c659d85961ca3d372b57d5d2558551808801875284815280840185815261019082890181815283850191825287805288875292517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f765590517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f775590517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7855517fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f7955855196870186528387528683018481528787018581529188018581526002865295845296517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916345595517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916355594517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba916365591517fa50eece07c7db1631545c0069bd8f5f54d5935e215d59097edf258a44ba91637557f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7805460ff199081168617909155338083526007909352838220805482168617905530808352939091208054909116909317909255601680546001600160a01b0319908116909217905560198054821683179055601a8054821683179055601b8054821683179055601c8054821683179055601780548216831790556018805490911690911790559050620005fb6009600a62000792565b6200060e9066038d7ea4c68000620007aa565b33600081815260046020526040812092909255907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620006516009600a62000792565b620006649066038d7ea4c68000620007aa565b60405190815260200160405180910390a350506200081a565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620006d4578160001904821115620006b857620006b86200067d565b80851615620006c657918102915b93841c939080029062000698565b509250929050565b600082620006ed575060016200078c565b81620006fc575060006200078c565b8160018114620007155760028114620007205762000740565b60019150506200078c565b60ff8411156200073457620007346200067d565b50506001821b6200078c565b5060208310610133831016604e8410600b841016171562000765575081810a6200078c565b62000771838362000693565b80600019048211156200078857620007886200067d565b0290505b92915050565b6000620007a360ff841683620006dc565b9392505050565b6000816000190483118215151615620007c757620007c76200067d565b500290565b600082620007ea57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200080257600080fd5b81516001600160a01b0381168114620007a357600080fd5b60805160a05161387d620008be600039600081816106a6015281816111440152818161122f0152818161127a015281816112cf015281816113480152818161138701528181612229015281816122d90152818161238801526127bf0152600081816107da0152818161106c015281816111660152818161231601528181612ccd01528181612d8601528181612dc201528181612e3c0152612ea4015261387d6000f3fe6080604052600436106102605760003560e01c8063706f693711610144578063b6a5d7de116100b6578063f319ae771161007a578063f319ae7714610788578063f3283fba146107a8578063f887ea40146107c8578063fac1b9bc146107fc578063fc5ea5e61461081c578063fe9fbb801461083c57600080fd5b8063b6a5d7de146106e8578063b9a45aac14610708578063dd62ed3e14610728578063f0b37c0414610748578063f2fde38b1461076857600080fd5b80638da5cb5b116101085780638da5cb5b146106345780638e5c3ad31461065457806395d89b411461026c578063a457c2d714610674578063a8aa1b3114610694578063a9059cbb146106c857600080fd5b8063706f69371461059357806370a08231146105b3578063715018a6146105e95780637d1db4a5146105fe57806382aa7c681461061457600080fd5b8063357c1354116101dd578063455a4396116101a1578063455a4396146104d25780634783c35b146104f25780634a5a863a1461052a578063569c9b331461054a5780636b7f8b901461055d5780636c0a24eb1461057d57600080fd5b8063357c1354146103d757806339264b661461043957806339509351146104595780633bbac5791461047957806340005fbe146104b257600080fd5b806323b872dd1161022457806323b872dd146103375780632b112e49146103575780632f54bf6e1461036c578063313ce5671461039b5780633385f9aa146103b757600080fd5b806306fdde031461026c578063095ea7b3146102ad5780630eefe44b146102dd57806317700f01146102ff57806318160ddd1461031457600080fd5b3661026757005b600080fd5b34801561027857600080fd5b506040805180820182526009815268537175696447726f7760b81b602082015290516102a491906130d8565b60405180910390f35b3480156102b957600080fd5b506102cd6102c8366004613123565b61085c565b60405190151581526020016102a4565b3480156102e957600080fd5b506102fd6102f8366004613163565b610873565b005b34801561030b57600080fd5b506102fd6109da565b34801561032057600080fd5b50610329610a7f565b6040519081526020016102a4565b34801561034357600080fd5b506102cd61035236600461319c565b610aa3565b34801561036357600080fd5b50610329610ac6565b34801561037857600080fd5b506102cd6103873660046131dd565b6000546001600160a01b0391821691161490565b3480156103a757600080fd5b50604051600981526020016102a4565b3480156103c357600080fd5b506102fd6103d23660046131fa565b610b1c565b3480156103e357600080fd5b506104196103f2366004613256565b600b6020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102a4565b34801561044557600080fd5b506102fd61045436600461319c565b610c75565b34801561046557600080fd5b506102cd610474366004613123565b610d72565b34801561048557600080fd5b506102cd6104943660046131dd565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156104be57600080fd5b506102fd6104cd366004613271565b610d93565b3480156104de57600080fd5b506102fd6104ed3660046132ca565b610eaf565b3480156104fe57600080fd5b50601d54610512906001600160a01b031681565b6040516001600160a01b0390911681526020016102a4565b34801561053657600080fd5b506102fd610545366004613303565b610f68565b6102fd61055836600461332f565b610feb565b34801561056957600080fd5b506102fd610578366004613366565b61143c565b34801561058957600080fd5b5061032960035481565b34801561059f57600080fd5b506102fd6105ae3660046133cf565b6114d8565b3480156105bf57600080fd5b506103296105ce3660046131dd565b6001600160a01b031660009081526004602052604090205490565b3480156105f557600080fd5b506102fd6116e2565b34801561060a57600080fd5b5061032960025481565b34801561062057600080fd5b506102fd61062f36600461343b565b61174d565b34801561064057600080fd5b50600054610512906001600160a01b031681565b34801561066057600080fd5b506102fd61066f366004613454565b611809565b34801561068057600080fd5b506102cd61068f366004613123565b611895565b3480156106a057600080fd5b506105127f000000000000000000000000000000000000000000000000000000000000000081565b3480156106d457600080fd5b506102cd6106e3366004613123565b61190f565b3480156106f457600080fd5b506102fd6107033660046131dd565b61191c565b34801561071457600080fd5b506102fd6107233660046132ca565b611968565b34801561073457600080fd5b50610329610743366004613475565b611a21565b34801561075457600080fd5b506102fd6107633660046131dd565b611a4c565b34801561077457600080fd5b506102fd6107833660046131dd565b611a92565b34801561079457600080fd5b506102fd6107a33660046134a3565b611b49565b3480156107b457600080fd5b506102fd6107c33660046131dd565b611cea565b3480156107d457600080fd5b506105127f000000000000000000000000000000000000000000000000000000000000000081565b34801561080857600080fd5b506102fd6108173660046132ca565b611d84565b34801561082857600080fd5b506102fd6108373660046134a3565b611e3d565b34801561084857600080fd5b506102cd6108573660046131dd565b611f4c565b6000610869338484611f6a565b5060015b92915050565b601d546001600160a01b031633146108a65760405162461bcd60e51b815260040161089d906134c5565b60405180910390fd5b6108be60146108b86127106003612086565b90612092565b6108d2826108cc868661209e565b9061209e565b11156109205760405162461bcd60e51b815260206004820152601b60248201527f5461782063616e6e6f74206265206d6f7265207468616e203135250000000000604482015260640161089d565b6000600b6000866002811115610938576109386134eb565b6002811115610949576109496134eb565b815260208101919091526040016000206001810185905583815560028101839055905061097a826108cc868661209e565b6003820155846002811115610991576109916134eb565b60408051868152602081018690529081018490527fb1a90344459b408c97dc6c9427767fbcdb7fdf83182ce17a8d019839e88e8b05906060015b60405180910390a25050505050565b601d546001600160a01b03163314610a045760405162461bcd60e51b815260040161089d906134c5565b60095460ff16610a4a5760405162461bcd60e51b8152602060048201526011602482015270416c72656164792064697361626c65642160781b604482015260640161089d565b6009805460ff191690556040517fbcb8b8fbdea8aa6dc4ae41213e4da81e605a3d1a56ed851b9355182321c0919090600090a1565b6000610a8d6009600a6135fb565b610a9e9066038d7ea4c6800061360a565b905090565b6000610ab08433846120aa565b610abb848484612124565b5060015b9392505050565b61dead600090815260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd54610a9e90610b056009600a6135fb565b610b169066038d7ea4c6800061360a565b906124c9565b610b2533611f4c565b610b415760405162461bcd60e51b815260040161089d90613629565b6001600160a01b038416610b675760405162461bcd60e51b815260040161089d9061364e565b6001600160a01b038316610b8d5760405162461bcd60e51b815260040161089d9061364e565b6001600160a01b038216610bb35760405162461bcd60e51b815260040161089d9061364e565b6001600160a01b038116610bd95760405162461bcd60e51b815260040161089d9061364e565b601980546001600160a01b038681166001600160a01b03199283168117909355601a80548783169084168117909155601b80548784169085168117909155601c805493871693909416831790935560408051948552602085019190915283019190915260608201527f5e236cea420126c8c121f351414cc8f3a268d3e366008a30deb36003636cb5f6906080015b60405180910390a150505050565b610c7e33611f4c565b610c9a5760405162461bcd60e51b815260040161089d90613629565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610ce1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d059190613674565b90506000610d196127106108b88486612086565b9050610d2f6001600160a01b03861685836124d5565b604080516001600160a01b038681168252602082018490528716917fc3770890217b5014eb50f7ffe9521ca4e970a55a8795d24ba3933f962440e1b891016109cb565b6000610869338484610d843388611a21565b610d8e919061368d565b611f6a565b610d9c33611f4c565b610db85760405162461bcd60e51b815260040161089d90613629565b6001600160a01b038316610dde5760405162461bcd60e51b815260040161089d9061364e565b6001600160a01b038216610e045760405162461bcd60e51b815260040161089d9061364e565b6001600160a01b038116610e2a5760405162461bcd60e51b815260040161089d9061364e565b601880546001600160a01b038581166001600160a01b0319928316811790935560168054868316908416811790915560178054928616929093168217909255604080519384526020840192909252908201527ff4653be65455600571e0a73c497c13dd50347f1cd9ba7b16a1710b6184bb644c906060015b60405180910390a1505050565b610eb833611f4c565b610ed45760405162461bcd60e51b815260040161089d90613629565b6001600160a01b03821660009081526008602052604090205481151560ff909116151503610f145760405162461bcd60e51b815260040161089d906136a5565b6001600160a01b038216600081815260086020526040808220805460ff191685151590811790915590519092917f4728de7c6a4e2755a2f42b3034ce94f4a011aaff9d1af55ed984db300dea942091a35050565b610f7133611f4c565b610f8d5760405162461bcd60e51b815260040161089d90613629565b601483905560138290556012819055610faa816108cc858561209e565b60155560408051848152602081018490529081018290527fdb99cc69484cb3ee77f3036657c45f45b65191334cd61d9276977d3c9595ae3990606001610ea2565b601d546001600160a01b031633146110155760405162461bcd60e51b815260040161089d906134c5565b826111fb57806110675760405162461bcd60e51b815260206004820152601b60248201527f43616e7420776974686472617720626e622066726f6d20706f6f6c0000000000604482015260640161089d565b3491507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ec91906136ca565b6001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561112657600080fd5b505af115801561113a573d6000803e3d6000fd5b50505050506111f67f0000000000000000000000000000000000000000000000000000000000000000837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e691906136ca565b6001600160a01b031691906124d5565b611385565b80156112c55733600090815260046020526040812080548492906112209084906136e7565b90915550506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600460205260408120805484929061126d90849061368d565b90915550506040518281527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169033906000805160206138288339815191529060200160405180910390a3611385565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600460205260408120805484929061130d9084906136e7565b9091555050336000908152600460205260408120805484929061133190849061368d565b909155505060405182815233906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906000805160206138288339815191529060200160405180910390a35b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156113e057600080fd5b505af11580156113f4573d6000803e3d6000fd5b505050508015158315157fec46d2f046373c0e186ac781e1c6b18401e1b4dc15463c351938e04dd1027e7d8460405161142f91815260200190565b60405180910390a3505050565b61144533611f4c565b6114615760405162461bcd60e51b815260040161089d90613629565b801515600f60019054906101000a900460ff161515036114935760405162461bcd60e51b815260040161089d906136a5565b600f805461ff001916610100831515908102919091179091556040517f2f0beb716d08015c80504ade37e31a64305599dd9a32d0172637a4bf9726dbd090600090a250565b6114e133611f4c565b6114fd5760405162461bcd60e51b815260040161089d90613629565b8281811461154d5760405162461bcd60e51b815260206004820152601760248201527f6172726179206c656e677468206d69736d617463686564000000000000000000604482015260640161089d565b6000805b8281101561167a5784848281811061156b5761156b6136fe565b9050602002013560046000898985818110611588576115886136fe565b905060200201602081019061159d91906131dd565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546115cc919061368d565b9091555085905084828181106115e4576115e46136fe565b90506020020135826115f6919061368d565b915086868281811061160a5761160a6136fe565b905060200201602081019061161f91906131dd565b6001600160a01b03163360008051602061382883398151915287878581811061164a5761164a6136fe565b9050602002013560405161166091815260200190565b60405180910390a38061167281613714565b915050611551565b50336000908152600460205260408120805483929061169a9084906136e7565b9091555050604080518381526020810183905233917f2b644e2cd640daf5b246ed5491ab2dfb5e8d9b4c6fd5398b985b5fbf1a0e25a4910160405180910390a2505050505050565b6116eb33611f4c565b6117075760405162461bcd60e51b815260040161089d90613629565b604051600081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1600080546001600160a01b0319169055565b61175633611f4c565b6117725760405162461bcd60e51b815260040161089d90613629565b60095460ff16156117b85760405162461bcd60e51b815260206004820152601060248201526f416c726561647920456e61626c65642160801b604482015260640161089d565b6009805460ff19166001179055600a546000036117dd576117d9428261209e565b600a555b6040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b61181233611f4c565b61182e5760405162461bcd60e51b815260040161089d90613629565b600c805460ff191685151590811790915560108490556011839055600e82905560408051858152602081018590529081018390527feec54a1ebff8aabde12af12da4f2afccb0265aaf1d568498f7329cbae546850f9060600160405180910390a250505050565b6000806118a23385611a21565b9050828110156119025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161089d565b610abb3385858403611f6a565b6000610869338484612124565b61192533611f4c565b6119415760405162461bcd60e51b815260040161089d90613629565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b61197133611f4c565b61198d5760405162461bcd60e51b815260040161089d90613629565b6001600160a01b03821660009081526007602052604090205481151560ff9091161515036119cd5760405162461bcd60e51b815260040161089d906136a5565b6001600160a01b038216600081815260076020526040808220805460ff191685151590811790915590519092917ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91a35050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b611a5533611f4c565b611a715760405162461bcd60e51b815260040161089d90613629565b6001600160a01b03166000908152600160205260409020805460ff19169055565b611a9b33611f4c565b611ab75760405162461bcd60e51b815260040161089d90613629565b6001600160a01b038116611add5760405162461bcd60e51b815260040161089d9061364e565b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b611b5233611f4c565b611b6e5760405162461bcd60e51b815260040161089d90613629565b6001821015611bd25760405162461bcd60e51b815260206004820152602a60248201527f4d61782074786e206c696d69742063616e6e6f74206265206c657373207468616044820152696e20302e30303030312560b01b606482015260840161089d565b6207a120811015611c355760405162461bcd60e51b815260206004820152602760248201527f4d61782057616c6c6574206c696d69742063616e6e6f74206265206c657373206044820152667468616e20352560c81b606482015260840161089d565b60006298968083611c486009600a6135fb565b611c599066038d7ea4c6800061360a565b611c63919061360a565b611c6d919061372d565b905060006298968083611c826009600a6135fb565b611c939066038d7ea4c6800061360a565b611c9d919061360a565b611ca7919061372d565b6002839055600381905560408051848152602081018390529192507fb6cf947475d47632612a3265c7bc83f5cfed7429546220bfb088c3634f91c2299101610c67565b601d546001600160a01b03163314611d145760405162461bcd60e51b815260040161089d906134c5565b6001600160a01b038116611d3a5760405162461bcd60e51b815260040161089d9061364e565b601d80546001600160a01b0319166001600160a01b0383169081179091556040517f6d74d31357c421bb05a45b4becf09f03737979c1150bb0054704d1b4f31bb82a90600090a250565b611d8d33611f4c565b611da95760405162461bcd60e51b815260040161089d90613629565b6001600160a01b03821660009081526006602052604090205481151560ff909116151503611de95760405162461bcd60e51b815260040161089d906136a5565b6001600160a01b038216600081815260066020526040808220805460ff191685151590811790915590519092917f1c6168ae13717a8cda4e1c9276a36c39333240268ba173a5a844201a8f4baa9991a35050565b611e4633611f4c565b611e625760405162461bcd60e51b815260040161089d90613629565b476000611e73836108b88487612086565b90506000611e82826004612092565b601954909150611e9b906001600160a01b03168261252c565b601a54611eb1906001600160a01b03168261252c565b601b54611ec7906001600160a01b03168261252c565b601c54611edd906001600160a01b03168261252c565b601954601a54601b54601c54604080516001600160a01b0395861681529385166020850152918416838301529290921660608201526080810184905290517fa08f91be8aba9066a7bc396851b6d781cef0ae989dbcab9c649d4c6bceb3bee99181900360a00190a15050505050565b6001600160a01b031660009081526001602052604090205460ff1690565b6001600160a01b038316611fcc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161089d565b6001600160a01b03821661202d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161089d565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910161142f565b6000610abf828461360a565b6000610abf828461372d565b6000610abf828461368d565b60006120b68484611a21565b9050600019811461211e57818110156121115760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161089d565b61211e8484848403611f6a565b50505050565b61212f8383836125d0565b6001600160a01b03831660009081526007602052604090205460019060ff168061217157506001600160a01b03831660009081526007602052604090205460ff165b1561217e575060006122d5565b60095460ff166121c45760405162461bcd60e51b8152602060048201526011602482015270151c98591a5b99c81a5cc814185d5cd959607a1b604482015260640161089d565b6002548211156122275760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b606482015260840161089d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316146122d5576003546001600160a01b03841660009081526004602052604090205461228790849061368d565b11156122d55760405162461bcd60e51b815260206004820152601b60248201527f57616c6c657420616d6f756e742065786365656473206c696d69740000000000604482015260640161089d565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b03160361238657600090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316141580156123585750600a544211155b15612381576001600160a01b0384166000908152600660205260409020805460ff191660011790555b6123cb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316036123c7575060016123cb565b5060025b600d546123d990600161209e565b600d556123e68584612760565b156123fc576123f66010546127fd565b6000600d555b6001600160a01b03851660009081526004602052604090205461241f90846124c9565b6001600160a01b038616600090815260046020526040812091909155826124465783612451565b6124518685846128de565b6001600160a01b038616600090815260046020526040902054909150612477908261209e565b6001600160a01b038087166000818152600460205260409081902093909355915190881690600080516020613828833981519152906124b99085815260200190565b60405180910390a3505050505050565b6000610abf82846136e7565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612527908490612ba4565b505050565b80600003612538575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612585576040519150601f19603f3d011682016040523d82523d6000602084013e61258a565b606091505b50509050806125275760405162461bcd60e51b81526020600482015260126024820152710aadcc2c4d8ca40e8de40e6cadcc8408aa8960731b604482015260640161089d565b6001600160a01b03831660009081526008602052604090205460ff16156126265760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b604482015260640161089d565b6001600160a01b03821660009081526008602052604090205460ff161561267c5760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b604482015260640161089d565b600081116126de5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161089d565b6001600160a01b0383166000908152600460205260409020548111156125275760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b606482015260840161089d565b60115460105430600090815260046020526040812054600f5491938510159211159060ff161580156127945750600c5460ff165b801561279d5750815b80156127ad5750600e54600d5410155b80156127b65750805b80156127f457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b95945050505050565b600f805460ff19166001179055601554601354600091612827916002916108b89182908790612086565b9050600061283583836124c9565b90504761284182612c76565b600061284d47836124c9565b9050600061287361286a600260135461209290919063ffffffff16565b601554906124c9565b905084156128a2576128a28561289d60026108b8856108b86013548961208690919063ffffffff16565b612e36565b6018546012546128cc916001600160a01b0316906128c79084906108b8908790612086565b61252c565b5050600f805460ff1916905550505050565b600080600b60008460028111156128f7576128f76134eb565b6002811115612908576129086134eb565b81526020808201929092526040908101600090812082516080810184528154815260018201548186015260028201548185015260039091015460608201526001600160a01b03891682526006909352908120549192509060ff1680156129755750600f54610100900460ff165b612983578160600151612990565b61299060646127106136e7565b9050806000036129a4578492505050610abf565b60006129b66127106108b88885612086565b905060006129d5836108b886602001518561208690919063ffffffff16565b905060006129f4846108b887600001518661208690919063ffffffff16565b90506000612a0682610b1686866124c9565b90508215612aab5761dead60005260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd54612a45908461209e565b61dead600081905260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd919091556040516001600160a01b038c169060008051602061382883398151915290612aa29087815260200190565b60405180910390a35b8115612b24576017546001600160a01b0316600090815260046020526040902054612ad6908361209e565b601780546001600160a01b03908116600090815260046020908152604091829020949094559154915185815291811692908d1691600080516020613828833981519152910160405180910390a35b8015612b8c5730600090815260046020526040902054612b44908261209e565b30600081815260046020526040908190209290925590516001600160a01b038c169060008051602061382883398151915290612b839085815260200190565b60405180910390a35b612b9689856124c9565b9a9950505050505050505050565b6000612bf9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612f1c9092919063ffffffff16565b8051909150156125275780806020019051810190612c17919061374f565b6125275760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161089d565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612cab57612cab6136fe565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4d91906136ca565b81600181518110612d6057612d606136fe565b60200260200101906001600160a01b031690816001600160a01b031681525050612dab307f000000000000000000000000000000000000000000000000000000000000000084611f6a565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790612e0090859060009086903090429060040161376c565b600060405180830381600087803b158015612e1a57600080fd5b505af1158015612e2e573d6000803e3d6000fd5b505050505050565b612e61307f000000000000000000000000000000000000000000000000000000000000000084611f6a565b60165460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af1158015612ef0573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612f1591906137dd565b5050505050565b6060612f2b8484600085612f33565b949350505050565b606082471015612f945760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161089d565b600080866001600160a01b03168587604051612fb0919061380b565b60006040518083038185875af1925050503d8060008114612fed576040519150601f19603f3d011682016040523d82523d6000602084013e612ff2565b606091505b50915091506130038783838761300e565b979650505050505050565b6060831561307d578251600003613076576001600160a01b0385163b6130765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161089d565b5081612f2b565b612f2b83838151156130925781518083602001fd5b8060405162461bcd60e51b815260040161089d91906130d8565b60005b838110156130c75781810151838201526020016130af565b8381111561211e5750506000910152565b60208152600082518060208401526130f78160408501602087016130ac565b601f01601f19169190910160400192915050565b6001600160a01b038116811461312057600080fd5b50565b6000806040838503121561313657600080fd5b82356131418161310b565b946020939093013593505050565b80356003811061315e57600080fd5b919050565b6000806000806080858703121561317957600080fd5b6131828561314f565b966020860135965060408601359560600135945092505050565b6000806000606084860312156131b157600080fd5b83356131bc8161310b565b925060208401356131cc8161310b565b929592945050506040919091013590565b6000602082840312156131ef57600080fd5b8135610abf8161310b565b6000806000806080858703121561321057600080fd5b843561321b8161310b565b9350602085013561322b8161310b565b9250604085013561323b8161310b565b9150606085013561324b8161310b565b939692955090935050565b60006020828403121561326857600080fd5b610abf8261314f565b60008060006060848603121561328657600080fd5b83356132918161310b565b925060208401356132a18161310b565b915060408401356132b18161310b565b809150509250925092565b801515811461312057600080fd5b600080604083850312156132dd57600080fd5b82356132e88161310b565b915060208301356132f8816132bc565b809150509250929050565b60008060006060848603121561331857600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561334457600080fd5b833561334f816132bc565b92506020840135915060408401356132b1816132bc565b60006020828403121561337857600080fd5b8135610abf816132bc565b60008083601f84011261339557600080fd5b50813567ffffffffffffffff8111156133ad57600080fd5b6020830191508360208260051b85010111156133c857600080fd5b9250929050565b600080600080604085870312156133e557600080fd5b843567ffffffffffffffff808211156133fd57600080fd5b61340988838901613383565b9096509450602087013591508082111561342257600080fd5b5061342f87828801613383565b95989497509550505050565b60006020828403121561344d57600080fd5b5035919050565b6000806000806080858703121561346a57600080fd5b8435613182816132bc565b6000806040838503121561348857600080fd5b82356134938161310b565b915060208301356132f88161310b565b600080604083850312156134b657600080fd5b50508035926020909101359150565b6020808252600c908201526b4e6f74206d756c746973696760a01b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561355257816000190482111561353857613538613501565b8085161561354557918102915b93841c939080029061351c565b509250929050565b6000826135695750600161086d565b816135765750600061086d565b816001811461358c5760028114613596576135b2565b600191505061086d565b60ff8411156135a7576135a7613501565b50506001821b61086d565b5060208310610133831016604e8410600b84101617156135d5575081810a61086d565b6135df8383613517565b80600019048211156135f3576135f3613501565b029392505050565b6000610abf60ff84168361355a565b600081600019048311821515161561362457613624613501565b500290565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b60006020828403121561368657600080fd5b5051919050565b600082198211156136a0576136a0613501565b500190565b6020808252600b908201526a105b1c9958591e481cd95d60aa1b604082015260600190565b6000602082840312156136dc57600080fd5b8151610abf8161310b565b6000828210156136f9576136f9613501565b500390565b634e487b7160e01b600052603260045260246000fd5b60006001820161372657613726613501565b5060010190565b60008261374a57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561376157600080fd5b8151610abf816132bc565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156137bc5784516001600160a01b031683529383019391830191600101613797565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156137f257600080fd5b8351925060208401519150604084015190509250925092565b6000825161381d8184602087016130ac565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220792dd7bcb4cf8e10e6d3112f3b3858d5a7b0ac95b1756a3f8f9c9681b8215aad64736f6c634300080e0033

Deployed Bytecode

0x6080604052600436106102605760003560e01c8063706f693711610144578063b6a5d7de116100b6578063f319ae771161007a578063f319ae7714610788578063f3283fba146107a8578063f887ea40146107c8578063fac1b9bc146107fc578063fc5ea5e61461081c578063fe9fbb801461083c57600080fd5b8063b6a5d7de146106e8578063b9a45aac14610708578063dd62ed3e14610728578063f0b37c0414610748578063f2fde38b1461076857600080fd5b80638da5cb5b116101085780638da5cb5b146106345780638e5c3ad31461065457806395d89b411461026c578063a457c2d714610674578063a8aa1b3114610694578063a9059cbb146106c857600080fd5b8063706f69371461059357806370a08231146105b3578063715018a6146105e95780637d1db4a5146105fe57806382aa7c681461061457600080fd5b8063357c1354116101dd578063455a4396116101a1578063455a4396146104d25780634783c35b146104f25780634a5a863a1461052a578063569c9b331461054a5780636b7f8b901461055d5780636c0a24eb1461057d57600080fd5b8063357c1354146103d757806339264b661461043957806339509351146104595780633bbac5791461047957806340005fbe146104b257600080fd5b806323b872dd1161022457806323b872dd146103375780632b112e49146103575780632f54bf6e1461036c578063313ce5671461039b5780633385f9aa146103b757600080fd5b806306fdde031461026c578063095ea7b3146102ad5780630eefe44b146102dd57806317700f01146102ff57806318160ddd1461031457600080fd5b3661026757005b600080fd5b34801561027857600080fd5b506040805180820182526009815268537175696447726f7760b81b602082015290516102a491906130d8565b60405180910390f35b3480156102b957600080fd5b506102cd6102c8366004613123565b61085c565b60405190151581526020016102a4565b3480156102e957600080fd5b506102fd6102f8366004613163565b610873565b005b34801561030b57600080fd5b506102fd6109da565b34801561032057600080fd5b50610329610a7f565b6040519081526020016102a4565b34801561034357600080fd5b506102cd61035236600461319c565b610aa3565b34801561036357600080fd5b50610329610ac6565b34801561037857600080fd5b506102cd6103873660046131dd565b6000546001600160a01b0391821691161490565b3480156103a757600080fd5b50604051600981526020016102a4565b3480156103c357600080fd5b506102fd6103d23660046131fa565b610b1c565b3480156103e357600080fd5b506104196103f2366004613256565b600b6020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102a4565b34801561044557600080fd5b506102fd61045436600461319c565b610c75565b34801561046557600080fd5b506102cd610474366004613123565b610d72565b34801561048557600080fd5b506102cd6104943660046131dd565b6001600160a01b031660009081526006602052604090205460ff1690565b3480156104be57600080fd5b506102fd6104cd366004613271565b610d93565b3480156104de57600080fd5b506102fd6104ed3660046132ca565b610eaf565b3480156104fe57600080fd5b50601d54610512906001600160a01b031681565b6040516001600160a01b0390911681526020016102a4565b34801561053657600080fd5b506102fd610545366004613303565b610f68565b6102fd61055836600461332f565b610feb565b34801561056957600080fd5b506102fd610578366004613366565b61143c565b34801561058957600080fd5b5061032960035481565b34801561059f57600080fd5b506102fd6105ae3660046133cf565b6114d8565b3480156105bf57600080fd5b506103296105ce3660046131dd565b6001600160a01b031660009081526004602052604090205490565b3480156105f557600080fd5b506102fd6116e2565b34801561060a57600080fd5b5061032960025481565b34801561062057600080fd5b506102fd61062f36600461343b565b61174d565b34801561064057600080fd5b50600054610512906001600160a01b031681565b34801561066057600080fd5b506102fd61066f366004613454565b611809565b34801561068057600080fd5b506102cd61068f366004613123565b611895565b3480156106a057600080fd5b506105127f0000000000000000000000004fbf0043758e1e79238da9df6835bb4df8ac5b5781565b3480156106d457600080fd5b506102cd6106e3366004613123565b61190f565b3480156106f457600080fd5b506102fd6107033660046131dd565b61191c565b34801561071457600080fd5b506102fd6107233660046132ca565b611968565b34801561073457600080fd5b50610329610743366004613475565b611a21565b34801561075457600080fd5b506102fd6107633660046131dd565b611a4c565b34801561077457600080fd5b506102fd6107833660046131dd565b611a92565b34801561079457600080fd5b506102fd6107a33660046134a3565b611b49565b3480156107b457600080fd5b506102fd6107c33660046131dd565b611cea565b3480156107d457600080fd5b506105127f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561080857600080fd5b506102fd6108173660046132ca565b611d84565b34801561082857600080fd5b506102fd6108373660046134a3565b611e3d565b34801561084857600080fd5b506102cd6108573660046131dd565b611f4c565b6000610869338484611f6a565b5060015b92915050565b601d546001600160a01b031633146108a65760405162461bcd60e51b815260040161089d906134c5565b60405180910390fd5b6108be60146108b86127106003612086565b90612092565b6108d2826108cc868661209e565b9061209e565b11156109205760405162461bcd60e51b815260206004820152601b60248201527f5461782063616e6e6f74206265206d6f7265207468616e203135250000000000604482015260640161089d565b6000600b6000866002811115610938576109386134eb565b6002811115610949576109496134eb565b815260208101919091526040016000206001810185905583815560028101839055905061097a826108cc868661209e565b6003820155846002811115610991576109916134eb565b60408051868152602081018690529081018490527fb1a90344459b408c97dc6c9427767fbcdb7fdf83182ce17a8d019839e88e8b05906060015b60405180910390a25050505050565b601d546001600160a01b03163314610a045760405162461bcd60e51b815260040161089d906134c5565b60095460ff16610a4a5760405162461bcd60e51b8152602060048201526011602482015270416c72656164792064697361626c65642160781b604482015260640161089d565b6009805460ff191690556040517fbcb8b8fbdea8aa6dc4ae41213e4da81e605a3d1a56ed851b9355182321c0919090600090a1565b6000610a8d6009600a6135fb565b610a9e9066038d7ea4c6800061360a565b905090565b6000610ab08433846120aa565b610abb848484612124565b5060015b9392505050565b61dead600090815260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd54610a9e90610b056009600a6135fb565b610b169066038d7ea4c6800061360a565b906124c9565b610b2533611f4c565b610b415760405162461bcd60e51b815260040161089d90613629565b6001600160a01b038416610b675760405162461bcd60e51b815260040161089d9061364e565b6001600160a01b038316610b8d5760405162461bcd60e51b815260040161089d9061364e565b6001600160a01b038216610bb35760405162461bcd60e51b815260040161089d9061364e565b6001600160a01b038116610bd95760405162461bcd60e51b815260040161089d9061364e565b601980546001600160a01b038681166001600160a01b03199283168117909355601a80548783169084168117909155601b80548784169085168117909155601c805493871693909416831790935560408051948552602085019190915283019190915260608201527f5e236cea420126c8c121f351414cc8f3a268d3e366008a30deb36003636cb5f6906080015b60405180910390a150505050565b610c7e33611f4c565b610c9a5760405162461bcd60e51b815260040161089d90613629565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610ce1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d059190613674565b90506000610d196127106108b88486612086565b9050610d2f6001600160a01b03861685836124d5565b604080516001600160a01b038681168252602082018490528716917fc3770890217b5014eb50f7ffe9521ca4e970a55a8795d24ba3933f962440e1b891016109cb565b6000610869338484610d843388611a21565b610d8e919061368d565b611f6a565b610d9c33611f4c565b610db85760405162461bcd60e51b815260040161089d90613629565b6001600160a01b038316610dde5760405162461bcd60e51b815260040161089d9061364e565b6001600160a01b038216610e045760405162461bcd60e51b815260040161089d9061364e565b6001600160a01b038116610e2a5760405162461bcd60e51b815260040161089d9061364e565b601880546001600160a01b038581166001600160a01b0319928316811790935560168054868316908416811790915560178054928616929093168217909255604080519384526020840192909252908201527ff4653be65455600571e0a73c497c13dd50347f1cd9ba7b16a1710b6184bb644c906060015b60405180910390a1505050565b610eb833611f4c565b610ed45760405162461bcd60e51b815260040161089d90613629565b6001600160a01b03821660009081526008602052604090205481151560ff909116151503610f145760405162461bcd60e51b815260040161089d906136a5565b6001600160a01b038216600081815260086020526040808220805460ff191685151590811790915590519092917f4728de7c6a4e2755a2f42b3034ce94f4a011aaff9d1af55ed984db300dea942091a35050565b610f7133611f4c565b610f8d5760405162461bcd60e51b815260040161089d90613629565b601483905560138290556012819055610faa816108cc858561209e565b60155560408051848152602081018490529081018290527fdb99cc69484cb3ee77f3036657c45f45b65191334cd61d9276977d3c9595ae3990606001610ea2565b601d546001600160a01b031633146110155760405162461bcd60e51b815260040161089d906134c5565b826111fb57806110675760405162461bcd60e51b815260206004820152601b60248201527f43616e7420776974686472617720626e622066726f6d20706f6f6c0000000000604482015260640161089d565b3491507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ec91906136ca565b6001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b15801561112657600080fd5b505af115801561113a573d6000803e3d6000fd5b50505050506111f67f0000000000000000000000004fbf0043758e1e79238da9df6835bb4df8ac5b57837f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e691906136ca565b6001600160a01b031691906124d5565b611385565b80156112c55733600090815260046020526040812080548492906112209084906136e7565b90915550506001600160a01b037f0000000000000000000000004fbf0043758e1e79238da9df6835bb4df8ac5b57166000908152600460205260408120805484929061126d90849061368d565b90915550506040518281527f0000000000000000000000004fbf0043758e1e79238da9df6835bb4df8ac5b576001600160a01b03169033906000805160206138288339815191529060200160405180910390a3611385565b6001600160a01b037f0000000000000000000000004fbf0043758e1e79238da9df6835bb4df8ac5b57166000908152600460205260408120805484929061130d9084906136e7565b9091555050336000908152600460205260408120805484929061133190849061368d565b909155505060405182815233906001600160a01b037f0000000000000000000000004fbf0043758e1e79238da9df6835bb4df8ac5b5716906000805160206138288339815191529060200160405180910390a35b7f0000000000000000000000004fbf0043758e1e79238da9df6835bb4df8ac5b576001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156113e057600080fd5b505af11580156113f4573d6000803e3d6000fd5b505050508015158315157fec46d2f046373c0e186ac781e1c6b18401e1b4dc15463c351938e04dd1027e7d8460405161142f91815260200190565b60405180910390a3505050565b61144533611f4c565b6114615760405162461bcd60e51b815260040161089d90613629565b801515600f60019054906101000a900460ff161515036114935760405162461bcd60e51b815260040161089d906136a5565b600f805461ff001916610100831515908102919091179091556040517f2f0beb716d08015c80504ade37e31a64305599dd9a32d0172637a4bf9726dbd090600090a250565b6114e133611f4c565b6114fd5760405162461bcd60e51b815260040161089d90613629565b8281811461154d5760405162461bcd60e51b815260206004820152601760248201527f6172726179206c656e677468206d69736d617463686564000000000000000000604482015260640161089d565b6000805b8281101561167a5784848281811061156b5761156b6136fe565b9050602002013560046000898985818110611588576115886136fe565b905060200201602081019061159d91906131dd565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546115cc919061368d565b9091555085905084828181106115e4576115e46136fe565b90506020020135826115f6919061368d565b915086868281811061160a5761160a6136fe565b905060200201602081019061161f91906131dd565b6001600160a01b03163360008051602061382883398151915287878581811061164a5761164a6136fe565b9050602002013560405161166091815260200190565b60405180910390a38061167281613714565b915050611551565b50336000908152600460205260408120805483929061169a9084906136e7565b9091555050604080518381526020810183905233917f2b644e2cd640daf5b246ed5491ab2dfb5e8d9b4c6fd5398b985b5fbf1a0e25a4910160405180910390a2505050505050565b6116eb33611f4c565b6117075760405162461bcd60e51b815260040161089d90613629565b604051600081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1600080546001600160a01b0319169055565b61175633611f4c565b6117725760405162461bcd60e51b815260040161089d90613629565b60095460ff16156117b85760405162461bcd60e51b815260206004820152601060248201526f416c726561647920456e61626c65642160801b604482015260640161089d565b6009805460ff19166001179055600a546000036117dd576117d9428261209e565b600a555b6040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b61181233611f4c565b61182e5760405162461bcd60e51b815260040161089d90613629565b600c805460ff191685151590811790915560108490556011839055600e82905560408051858152602081018590529081018390527feec54a1ebff8aabde12af12da4f2afccb0265aaf1d568498f7329cbae546850f9060600160405180910390a250505050565b6000806118a23385611a21565b9050828110156119025760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161089d565b610abb3385858403611f6a565b6000610869338484612124565b61192533611f4c565b6119415760405162461bcd60e51b815260040161089d90613629565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b61197133611f4c565b61198d5760405162461bcd60e51b815260040161089d90613629565b6001600160a01b03821660009081526007602052604090205481151560ff9091161515036119cd5760405162461bcd60e51b815260040161089d906136a5565b6001600160a01b038216600081815260076020526040808220805460ff191685151590811790915590519092917ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91a35050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b611a5533611f4c565b611a715760405162461bcd60e51b815260040161089d90613629565b6001600160a01b03166000908152600160205260409020805460ff19169055565b611a9b33611f4c565b611ab75760405162461bcd60e51b815260040161089d90613629565b6001600160a01b038116611add5760405162461bcd60e51b815260040161089d9061364e565b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b611b5233611f4c565b611b6e5760405162461bcd60e51b815260040161089d90613629565b6001821015611bd25760405162461bcd60e51b815260206004820152602a60248201527f4d61782074786e206c696d69742063616e6e6f74206265206c657373207468616044820152696e20302e30303030312560b01b606482015260840161089d565b6207a120811015611c355760405162461bcd60e51b815260206004820152602760248201527f4d61782057616c6c6574206c696d69742063616e6e6f74206265206c657373206044820152667468616e20352560c81b606482015260840161089d565b60006298968083611c486009600a6135fb565b611c599066038d7ea4c6800061360a565b611c63919061360a565b611c6d919061372d565b905060006298968083611c826009600a6135fb565b611c939066038d7ea4c6800061360a565b611c9d919061360a565b611ca7919061372d565b6002839055600381905560408051848152602081018390529192507fb6cf947475d47632612a3265c7bc83f5cfed7429546220bfb088c3634f91c2299101610c67565b601d546001600160a01b03163314611d145760405162461bcd60e51b815260040161089d906134c5565b6001600160a01b038116611d3a5760405162461bcd60e51b815260040161089d9061364e565b601d80546001600160a01b0319166001600160a01b0383169081179091556040517f6d74d31357c421bb05a45b4becf09f03737979c1150bb0054704d1b4f31bb82a90600090a250565b611d8d33611f4c565b611da95760405162461bcd60e51b815260040161089d90613629565b6001600160a01b03821660009081526006602052604090205481151560ff909116151503611de95760405162461bcd60e51b815260040161089d906136a5565b6001600160a01b038216600081815260066020526040808220805460ff191685151590811790915590519092917f1c6168ae13717a8cda4e1c9276a36c39333240268ba173a5a844201a8f4baa9991a35050565b611e4633611f4c565b611e625760405162461bcd60e51b815260040161089d90613629565b476000611e73836108b88487612086565b90506000611e82826004612092565b601954909150611e9b906001600160a01b03168261252c565b601a54611eb1906001600160a01b03168261252c565b601b54611ec7906001600160a01b03168261252c565b601c54611edd906001600160a01b03168261252c565b601954601a54601b54601c54604080516001600160a01b0395861681529385166020850152918416838301529290921660608201526080810184905290517fa08f91be8aba9066a7bc396851b6d781cef0ae989dbcab9c649d4c6bceb3bee99181900360a00190a15050505050565b6001600160a01b031660009081526001602052604090205460ff1690565b6001600160a01b038316611fcc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161089d565b6001600160a01b03821661202d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161089d565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910161142f565b6000610abf828461360a565b6000610abf828461372d565b6000610abf828461368d565b60006120b68484611a21565b9050600019811461211e57818110156121115760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161089d565b61211e8484848403611f6a565b50505050565b61212f8383836125d0565b6001600160a01b03831660009081526007602052604090205460019060ff168061217157506001600160a01b03831660009081526007602052604090205460ff165b1561217e575060006122d5565b60095460ff166121c45760405162461bcd60e51b8152602060048201526011602482015270151c98591a5b99c81a5cc814185d5cd959607a1b604482015260640161089d565b6002548211156122275760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b606482015260840161089d565b7f0000000000000000000000004fbf0043758e1e79238da9df6835bb4df8ac5b576001600160a01b0316836001600160a01b0316146122d5576003546001600160a01b03841660009081526004602052604090205461228790849061368d565b11156122d55760405162461bcd60e51b815260206004820152601b60248201527f57616c6c657420616d6f756e742065786365656473206c696d69740000000000604482015260640161089d565b60007f0000000000000000000000004fbf0043758e1e79238da9df6835bb4df8ac5b576001600160a01b0316856001600160a01b03160361238657600090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316846001600160a01b0316141580156123585750600a544211155b15612381576001600160a01b0384166000908152600660205260409020805460ff191660011790555b6123cb565b7f0000000000000000000000004fbf0043758e1e79238da9df6835bb4df8ac5b576001600160a01b0316846001600160a01b0316036123c7575060016123cb565b5060025b600d546123d990600161209e565b600d556123e68584612760565b156123fc576123f66010546127fd565b6000600d555b6001600160a01b03851660009081526004602052604090205461241f90846124c9565b6001600160a01b038616600090815260046020526040812091909155826124465783612451565b6124518685846128de565b6001600160a01b038616600090815260046020526040902054909150612477908261209e565b6001600160a01b038087166000818152600460205260409081902093909355915190881690600080516020613828833981519152906124b99085815260200190565b60405180910390a3505050505050565b6000610abf82846136e7565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612527908490612ba4565b505050565b80600003612538575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612585576040519150601f19603f3d011682016040523d82523d6000602084013e61258a565b606091505b50509050806125275760405162461bcd60e51b81526020600482015260126024820152710aadcc2c4d8ca40e8de40e6cadcc8408aa8960731b604482015260640161089d565b6001600160a01b03831660009081526008602052604090205460ff16156126265760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b604482015260640161089d565b6001600160a01b03821660009081526008602052604090205460ff161561267c5760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b604482015260640161089d565b600081116126de5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161089d565b6001600160a01b0383166000908152600460205260409020548111156125275760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b606482015260840161089d565b60115460105430600090815260046020526040812054600f5491938510159211159060ff161580156127945750600c5460ff165b801561279d5750815b80156127ad5750600e54600d5410155b80156127b65750805b80156127f457507f0000000000000000000000004fbf0043758e1e79238da9df6835bb4df8ac5b576001600160a01b0316856001600160a01b031614155b95945050505050565b600f805460ff19166001179055601554601354600091612827916002916108b89182908790612086565b9050600061283583836124c9565b90504761284182612c76565b600061284d47836124c9565b9050600061287361286a600260135461209290919063ffffffff16565b601554906124c9565b905084156128a2576128a28561289d60026108b8856108b86013548961208690919063ffffffff16565b612e36565b6018546012546128cc916001600160a01b0316906128c79084906108b8908790612086565b61252c565b5050600f805460ff1916905550505050565b600080600b60008460028111156128f7576128f76134eb565b6002811115612908576129086134eb565b81526020808201929092526040908101600090812082516080810184528154815260018201548186015260028201548185015260039091015460608201526001600160a01b03891682526006909352908120549192509060ff1680156129755750600f54610100900460ff165b612983578160600151612990565b61299060646127106136e7565b9050806000036129a4578492505050610abf565b60006129b66127106108b88885612086565b905060006129d5836108b886602001518561208690919063ffffffff16565b905060006129f4846108b887600001518661208690919063ffffffff16565b90506000612a0682610b1686866124c9565b90508215612aab5761dead60005260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd54612a45908461209e565b61dead600081905260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd919091556040516001600160a01b038c169060008051602061382883398151915290612aa29087815260200190565b60405180910390a35b8115612b24576017546001600160a01b0316600090815260046020526040902054612ad6908361209e565b601780546001600160a01b03908116600090815260046020908152604091829020949094559154915185815291811692908d1691600080516020613828833981519152910160405180910390a35b8015612b8c5730600090815260046020526040902054612b44908261209e565b30600081815260046020526040908190209290925590516001600160a01b038c169060008051602061382883398151915290612b839085815260200190565b60405180910390a35b612b9689856124c9565b9a9950505050505050505050565b6000612bf9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612f1c9092919063ffffffff16565b8051909150156125275780806020019051810190612c17919061374f565b6125275760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161089d565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612cab57612cab6136fe565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4d91906136ca565b81600181518110612d6057612d606136fe565b60200260200101906001600160a01b031690816001600160a01b031681525050612dab307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611f6a565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790612e0090859060009086903090429060040161376c565b600060405180830381600087803b158015612e1a57600080fd5b505af1158015612e2e573d6000803e3d6000fd5b505050505050565b612e61307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611f6a565b60165460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af1158015612ef0573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612f1591906137dd565b5050505050565b6060612f2b8484600085612f33565b949350505050565b606082471015612f945760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161089d565b600080866001600160a01b03168587604051612fb0919061380b565b60006040518083038185875af1925050503d8060008114612fed576040519150601f19603f3d011682016040523d82523d6000602084013e612ff2565b606091505b50915091506130038783838761300e565b979650505050505050565b6060831561307d578251600003613076576001600160a01b0385163b6130765760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161089d565b5081612f2b565b612f2b83838151156130925781518083602001fd5b8060405162461bcd60e51b815260040161089d91906130d8565b60005b838110156130c75781810151838201526020016130af565b8381111561211e5750506000910152565b60208152600082518060208401526130f78160408501602087016130ac565b601f01601f19169190910160400192915050565b6001600160a01b038116811461312057600080fd5b50565b6000806040838503121561313657600080fd5b82356131418161310b565b946020939093013593505050565b80356003811061315e57600080fd5b919050565b6000806000806080858703121561317957600080fd5b6131828561314f565b966020860135965060408601359560600135945092505050565b6000806000606084860312156131b157600080fd5b83356131bc8161310b565b925060208401356131cc8161310b565b929592945050506040919091013590565b6000602082840312156131ef57600080fd5b8135610abf8161310b565b6000806000806080858703121561321057600080fd5b843561321b8161310b565b9350602085013561322b8161310b565b9250604085013561323b8161310b565b9150606085013561324b8161310b565b939692955090935050565b60006020828403121561326857600080fd5b610abf8261314f565b60008060006060848603121561328657600080fd5b83356132918161310b565b925060208401356132a18161310b565b915060408401356132b18161310b565b809150509250925092565b801515811461312057600080fd5b600080604083850312156132dd57600080fd5b82356132e88161310b565b915060208301356132f8816132bc565b809150509250929050565b60008060006060848603121561331857600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561334457600080fd5b833561334f816132bc565b92506020840135915060408401356132b1816132bc565b60006020828403121561337857600080fd5b8135610abf816132bc565b60008083601f84011261339557600080fd5b50813567ffffffffffffffff8111156133ad57600080fd5b6020830191508360208260051b85010111156133c857600080fd5b9250929050565b600080600080604085870312156133e557600080fd5b843567ffffffffffffffff808211156133fd57600080fd5b61340988838901613383565b9096509450602087013591508082111561342257600080fd5b5061342f87828801613383565b95989497509550505050565b60006020828403121561344d57600080fd5b5035919050565b6000806000806080858703121561346a57600080fd5b8435613182816132bc565b6000806040838503121561348857600080fd5b82356134938161310b565b915060208301356132f88161310b565b600080604083850312156134b657600080fd5b50508035926020909101359150565b6020808252600c908201526b4e6f74206d756c746973696760a01b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561355257816000190482111561353857613538613501565b8085161561354557918102915b93841c939080029061351c565b509250929050565b6000826135695750600161086d565b816135765750600061086d565b816001811461358c5760028114613596576135b2565b600191505061086d565b60ff8411156135a7576135a7613501565b50506001821b61086d565b5060208310610133831016604e8410600b84101617156135d5575081810a61086d565b6135df8383613517565b80600019048211156135f3576135f3613501565b029392505050565b6000610abf60ff84168361355a565b600081600019048311821515161561362457613624613501565b500290565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b60006020828403121561368657600080fd5b5051919050565b600082198211156136a0576136a0613501565b500190565b6020808252600b908201526a105b1c9958591e481cd95d60aa1b604082015260600190565b6000602082840312156136dc57600080fd5b8151610abf8161310b565b6000828210156136f9576136f9613501565b500390565b634e487b7160e01b600052603260045260246000fd5b60006001820161372657613726613501565b5060010190565b60008261374a57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561376157600080fd5b8151610abf816132bc565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156137bc5784516001600160a01b031683529383019391830191600101613797565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156137f257600080fd5b8351925060208401519150604084015190509250925092565b6000825161381d8184602087016130ac565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220792dd7bcb4cf8e10e6d3112f3b3858d5a7b0ac95b1756a3f8f9c9681b8215aad64736f6c634300080e0033

Deployed Bytecode Sourcemap

13796:20371:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18551:67;;;;;;;;;;-1:-1:-1;18611:5:0;;;;;;;;;;;-1:-1:-1;;;18611:5:0;;;;18551:67;;;;18611:5;18551:67;:::i;:::-;;;;;;;;19363:159;;;;;;;;;;-1:-1:-1;19363:159:0;;;;;:::i;:::-;;:::i;:::-;;;1286:14:1;;1279:22;1261:41;;1249:2;1234:18;19363:159:0;1121:187:1;28527:617:0;;;;;;;;;;-1:-1:-1;28527:617:0;;;;;:::i;:::-;;:::i;:::-;;20968:179;;;;;;;;;;;;;:::i;18774:84::-;;;;;;;;;;;;;:::i;:::-;;;2049:25:1;;;2037:2;2022:18;18774:84:0;1903:177:1;21600:249:0;;;;;;;;;;-1:-1:-1;21600:249:0;;;;;:::i;:::-;;:::i;19534:121::-;;;;;;;;;;;;;:::i;11985:103::-;;;;;;;;;;-1:-1:-1;11985:103:0;;;;;:::i;:::-;12040:4;12075:5;-1:-1:-1;;;;;12064:16:0;;;12075:5;;12064:16;;11985:103;18701:67;;;;;;;;;;-1:-1:-1;18701:67:0;;14044:1;2940:36:1;;2928:2;2913:18;18701:67:0;2798:184:1;29648:552:0;;;;;;;;;;-1:-1:-1;29648:552:0;;;;;:::i;:::-;;:::i;15007:44::-;;;;;;;;;;-1:-1:-1;15007:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4118:25:1;;;4174:2;4159:18;;4152:34;;;;4202:18;;;4195:34;4260:2;4245:18;;4238:34;4105:3;4090:19;15007:44:0;3887:391:1;27134:404:0;;;;;;;;;;-1:-1:-1;27134:404:0;;;;;:::i;:::-;;:::i;21857:209::-;;;;;;;;;;-1:-1:-1;21857:209:0;;;;;:::i;:::-;;:::i;19253:102::-;;;;;;;;;;-1:-1:-1;19253:102:0;;;;;:::i;:::-;-1:-1:-1;;;;;19331:16:0;19307:4;19331:16;;;:6;:16;;;;;;;;;19253:102;29152:488;;;;;;;;;;-1:-1:-1;29152:488:0;;;;;:::i;:::-;;:::i;19936:267::-;;;;;;;;;;-1:-1:-1;19936:267:0;;;;;:::i;:::-;;:::i;15712:77::-;;;;;;;;;;-1:-1:-1;15712:77:0;;;;-1:-1:-1;;;;;15712:77:0;;;;;;-1:-1:-1;;;;;5491:32:1;;;5473:51;;5461:2;5446:18;15712:77:0;5327:203:1;27546:348:0;;;;;;;;;;-1:-1:-1;27546:348:0;;;;;:::i;:::-;;:::i;33134:808::-;;;;;;:::i;:::-;;:::i;20440:206::-;;;;;;;;;;-1:-1:-1;20440:206:0;;;;;:::i;:::-;;:::i;14271:64::-;;;;;;;;;;;;;;;;32441:685;;;;;;;;;;-1:-1:-1;32441:685:0;;;;;:::i;:::-;;:::i;18864:103::-;;;;;;;;;;-1:-1:-1;18864:103:0;;;;;:::i;:::-;-1:-1:-1;;;;;18947:18:0;18930:7;18947:18;;;:9;:18;;;;;;;18864:103;12448:128;;;;;;;;;;;;;:::i;14205:59::-;;;;;;;;;;;;;;;;20654:306;;;;;;;;;;-1:-1:-1;20654:306:0;;;;;:::i;:::-;;:::i;11362:20::-;;;;;;;;;;-1:-1:-1;11362:20:0;;;;-1:-1:-1;;;;;11362:20:0;;;21155:437;;;;;;;;;;-1:-1:-1;21155:437:0;;;;;:::i;:::-;;:::i;22074:407::-;;;;;;;;;;-1:-1:-1;22074:407:0;;;;;:::i;:::-;;:::i;14636:29::-;;;;;;;;;;;;;;;18973:139;;;;;;;;;;-1:-1:-1;18973:139:0;;;;;:::i;:::-;;:::i;11776:95::-;;;;;;;;;;-1:-1:-1;11776:95:0;;;;;:::i;:::-;;:::i;19663:265::-;;;;;;;;;;-1:-1:-1;19663:265:0;;;;;:::i;:::-;;:::i;19118:127::-;;;;;;;;;;-1:-1:-1;19118:127:0;;;;;:::i;:::-;;:::i;11879:98::-;;;;;;;;;;-1:-1:-1;11879:98:0;;;;;:::i;:::-;;:::i;12215:221::-;;;;;;;;;;-1:-1:-1;12215:221:0;;;;;:::i;:::-;;:::i;26578:548::-;;;;;;;;;;-1:-1:-1;26578:548:0;;;;;:::i;:::-;;:::i;33950:214::-;;;;;;;;;;-1:-1:-1;33950:214:0;;;;;:::i;:::-;;:::i;14598:31::-;;;;;;;;;;;;;;;20211:221;;;;;;;;;;-1:-1:-1;20211:221:0;;;;;:::i;:::-;;:::i;27902:617::-;;;;;;;;;;-1:-1:-1;27902:617:0;;;;;:::i;:::-;;:::i;12096:107::-;;;;;;;;;;-1:-1:-1;12096:107:0;;;;;:::i;:::-;;:::i;19363:159::-;19438:4;19455:37;19464:10;19476:7;19485:6;19455:8;:37::i;:::-;-1:-1:-1;19510:4:0;19363:159;;;;;:::o;28527:617::-;17381:8;;-1:-1:-1;;;;;17381:8:0;17367:10;:22;17359:47;;;;-1:-1:-1;;;17359:47:0;;;;;;;:::i;:::-;;;;;;;;;28740:29:::1;28766:2;28740:21;14768:5;28759:1;28740:18;:21::i;:::-;:25:::0;::::1;:29::i;:::-;28687:49;28717:18:::0;28687:25:::1;:8:::0;28700:11;28687:12:::1;:25::i;:::-;:29:::0;::::1;:49::i;:::-;:82;;28679:122;;;::::0;-1:-1:-1;;;28679:122:0;;10010:2:1;28679:122:0::1;::::0;::::1;9992:21:1::0;10049:2;10029:18;;;10022:30;10088:29;10068:18;;;10061:57;10135:18;;28679:122:0::1;9808:351:1::0;28679:122:0::1;28812:15;28830:4;:21;28835:15;28830:21;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;28830:21:0;28862:11:::1;::::0;::::1;:22:::0;;;28895:28;;;28934:13:::1;::::0;::::1;:34:::0;;;28830:21;-1:-1:-1;28994:49:0::1;28950:18:::0;28994:25:::1;28876:8:::0;28912:11;28994:12:::1;:25::i;:49::-;28979:12;::::0;::::1;:64:::0;29077:15;29065:71:::1;::::0;::::1;;;;;;:::i;:::-;;::::0;;10498:25:1;;;10554:2;10539:18;;10532:34;;;10582:18;;;10575:34;;;29065:71:0::1;::::0;10486:2:1;10471:18;29065:71:0::1;;;;;;;;28668:476;28527:617:::0;;;;:::o;20968:179::-;17381:8;;-1:-1:-1;;;;;17381:8:0;17367:10;:22;17359:47;;;;-1:-1:-1;;;17359:47:0;;;;;;;:::i;:::-;21035:14:::1;::::0;::::1;;21027:44;;;::::0;-1:-1:-1;;;21027:44:0;;10822:2:1;21027:44:0::1;::::0;::::1;10804:21:1::0;10861:2;10841:18;;;10834:30;-1:-1:-1;;;10880:18:1;;;10873:47;10937:18;;21027:44:0::1;10620:341:1::0;21027:44:0::1;21082:14;:22:::0;;-1:-1:-1;;21082:22:0::1;::::0;;21122:17:::1;::::0;::::1;::::0;21099:5:::1;::::0;21122:17:::1;20968:179::o:0;18774:84::-;18827:7;14107:15;14044:1;14107:2;:15;:::i;:::-;14092:31;;:11;:31;:::i;:::-;18837:19;;18774:84;:::o;21600:249::-;21723:4;21740:41;21756:4;21762:10;21774:6;21740:15;:41::i;:::-;21792:27;21802:4;21808:2;21812:6;21792:9;:27::i;:::-;-1:-1:-1;21837:4:0;21600:249;;;;;;:::o;19534:121::-;14156:42;19587:7;18947:18;;;:9;:18;;;;19614:33;;14107:15;14044:1;14107:2;:15;:::i;:::-;14092:31;;:11;:31;:::i;:::-;19614:16;;:33::i;29648:552::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29780:20:0;::::1;29772:45;;;;-1:-1:-1::0;;;29772:45:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29836:20:0;::::1;29828:45;;;;-1:-1:-1::0;;;29828:45:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29892:20:0;::::1;29884:45;;;;-1:-1:-1::0;;;29884:45:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29948:20:0;::::1;29940:45;;;;-1:-1:-1::0;;;29940:45:0::1;;;;;;;:::i;:::-;29996:14;:23:::0;;-1:-1:-1;;;;;29996:23:0;;::::1;-1:-1:-1::0;;;;;;29996:23:0;;::::1;::::0;::::1;::::0;;;30030:14:::1;:23:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;30064:14:::1;:23:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;30098:14:::1;:23:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;30139:53:::1;::::0;;13604:34:1;;;13669:2;13654:18;;13647:43;;;;13706:18;;13699:43;;;;13773:2;13758:18;;13751:43;30139:53:0::1;::::0;13553:3:1;13538:19;30139:53:0::1;;;;;;;;29648:552:::0;;;;:::o;27134:404::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;27272:39:::1;::::0;-1:-1:-1;;;27272:39:0;;27305:4:::1;27272:39;::::0;::::1;5473:51:1::0;27255:14:0::1;::::0;-1:-1:-1;;;;;27272:24:0;::::1;::::0;::::1;::::0;5446:18:1;;27272:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27255:56:::0;-1:-1:-1;27322:24:0::1;27349:34;27377:5;27349:23;27255:56:::0;27360:11;27349:10:::1;:23::i;:34::-;27322:61:::0;-1:-1:-1;27394:56:0::1;-1:-1:-1::0;;;;;27394:27:0;::::1;27422:9:::0;27322:61;27394:27:::1;:56::i;:::-;27468:62;::::0;;-1:-1:-1;;;;;14186:32:1;;;14168:51;;14250:2;14235:18;;14228:34;;;27468:62:0;::::1;::::0;::::1;::::0;14141:18:1;27468:62:0::1;13994:274:1::0;21857:209:0;21945:4;21962:74;21971:10;21983:7;22025:10;21992:30;22002:10;22014:7;21992:9;:30::i;:::-;:43;;;;:::i;:::-;21962:8;:74::i;29152:488::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29278:24:0;::::1;29270:49;;;;-1:-1:-1::0;;;29270:49:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29338:24:0;::::1;29330:49;;;;-1:-1:-1::0;;;29330:49:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29398:22:0;::::1;29390:47;;;;-1:-1:-1::0;;;29390:47:0::1;;;;;;;:::i;:::-;29448:18;:31:::0;;-1:-1:-1;;;;;29448:31:0;;::::1;-1:-1:-1::0;;;;;;29448:31:0;;::::1;::::0;::::1;::::0;;;29490:18:::1;:31:::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;29532:16:::1;:27:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;29577:55:::1;::::0;;14646:34:1;;;14711:2;14696:18;;14689:43;;;;14748:18;;;14741:43;29577:55:0::1;::::0;14596:2:1;14581:18;29577:55:0::1;;;;;;;;29152:488:::0;;;:::o;19936:267::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20037:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:37;::::1;;:23;::::0;;::::1;:37;;::::0;20029:61:::1;;;;-1:-1:-1::0;;;20029:61:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20101:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:36;;-1:-1:-1;;20101:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;20155:40;;20101:36;;:23;20155:40:::1;::::0;::::1;19936:267:::0;;:::o;27546:348::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;27656:12:::1;:20:::0;;;27687:17:::1;:30:::0;;;27728:17:::1;:30:::0;;;27785:37:::1;27748:10:::0;27785:21:::1;27671:5:::0;27707:10;27785:9:::1;:21::i;:37::-;27769:13;:53:::0;27840:46:::1;::::0;;10498:25:1;;;10554:2;10539:18;;10532:34;;;10582:18;;;10575:34;;;27840:46:0::1;::::0;10486:2:1;10471:18;27840:46:0::1;10296:319:1::0;33134:808:0;17381:8;;-1:-1:-1;;;;;17381:8:0;17367:10;:22;17359:47;;;;-1:-1:-1;;;17359:47:0;;;;;;;:::i;:::-;33239:5:::1;33235:620;;33269:3;33261:43;;;::::0;-1:-1:-1;;;33261:43:0;;15337:2:1;33261:43:0::1;::::0;::::1;15319:21:1::0;15376:2;15356:18;;;15349:30;15415:29;15395:18;;;15388:57;15462:18;;33261:43:0::1;15135:351:1::0;33261:43:0::1;33328:9;33319:18;;33358:6;-1:-1:-1::0;;;;;33358:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33352:28:0::1;;33388:6;33352:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;33412:48;33447:4;33453:6;33419;-1:-1:-1::0;;;;;33419:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33412:34:0::1;::::0;:48;:34:::1;:48::i;:::-;33235:620;;;33495:3;33492:352;;;33529:10;33519:21;::::0;;;:9:::1;:21;::::0;;;;:31;;33544:6;;33519:21;:31:::1;::::0;33544:6;;33519:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;33579:4:0::1;33569:15;;::::0;;;:9:::1;:15;::::0;;;;:25;;33588:6;;33569:15;:25:::1;::::0;33588:6;;33569:25:::1;:::i;:::-;::::0;;;-1:-1:-1;;33618:34:0::1;::::0;2049:25:1;;;33639:4:0::1;-1:-1:-1::0;;;;;33618:34:0::1;::::0;33627:10:::1;::::0;-1:-1:-1;;;;;;;;;;;33618:34:0;2037:2:1;2022:18;33618:34:0::1;;;;;;;33492:352;;;-1:-1:-1::0;;;;;33705:4:0::1;33695:15;;::::0;;;:9:::1;:15;::::0;;;;:25;;33714:6;;33695:15;:25:::1;::::0;33714:6;;33695:25:::1;:::i;:::-;::::0;;;-1:-1:-1;;33749:10:0::1;33739:21;::::0;;;:9:::1;:21;::::0;;;;:31;;33764:6;;33739:21;:31:::1;::::0;33764:6;;33739:31:::1;:::i;:::-;::::0;;;-1:-1:-1;;33794:34:0::1;::::0;2049:25:1;;;33809:10:0::1;::::0;-1:-1:-1;;;;;33803:4:0::1;33794:34;::::0;-1:-1:-1;;;;;;;;;;;33794:34:0;2037:2:1;2022:18;33794:34:0::1;;;;;;;33492:352;33871:4;-1:-1:-1::0;;;;;33865:16:0::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33930:3;33899:35;;33915:5;33899:35;;;33922:6;33899:35;;;;2049:25:1::0;;2037:2;2022:18;;1903:177;33899:35:0::1;;;;;;;;33134:808:::0;;;:::o;20440:206::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;20534:7:::1;20516:25;;:14;;;;;;;;;;;:25;;::::0;20508:49:::1;;;;-1:-1:-1::0;;;20508:49:0::1;;;;;;;:::i;:::-;20568:14;:24:::0;;-1:-1:-1;;20568:24:0::1;;::::0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;20610:28:::1;::::0;::::1;::::0;-1:-1:-1;;20610:28:0::1;20440:206:::0;:::o;32441:685::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;32569:8;32604:24;;::::1;32595:61;;;::::0;-1:-1:-1;;;32595:61:0;;16079:2:1;32595:61:0::1;::::0;::::1;16061:21:1::0;16118:2;16098:18;;;16091:30;16157:25;16137:18;;;16130:53;16200:18;;32595:61:0::1;15877:347:1::0;32595:61:0::1;32667:21;32718:9:::0;32713:289:::1;32737:6;32733:1;:10;32713:289;;;32873:7;;32881:1;32873:10;;;;;;;:::i;:::-;;;;;;;32847:9;:22;32857:8;;32866:1;32857:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32847:22:0::1;-1:-1:-1::0;;;;;32847:22:0::1;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;32915:7:0;;-1:-1:-1;32915:7:0;32923:1;32915:10;;::::1;;;;;:::i;:::-;;;;;;;32898:27;;;;;:::i;:::-;;;32966:8;;32975:1;32966:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32945:45:0::1;32954:10;-1:-1:-1::0;;;;;;;;;;;32979:7:0;;32987:1;32979:10;;::::1;;;;;:::i;:::-;;;;;;;32945:45;;;;2049:25:1::0;;2037:2;2022:18;;1903:177;32945:45:0::1;;;;;;;;32745:3:::0;::::1;::::0;::::1;:::i;:::-;;;;32713:289;;;-1:-1:-1::0;33022:10:0::1;33012:21;::::0;;;:9:::1;:21;::::0;;;;:38;;33037:13;;33012:21;:38:::1;::::0;33037:13;;33012:38:::1;:::i;:::-;::::0;;;-1:-1:-1;;33068:50:0::1;::::0;;16675:25:1;;;16731:2;16716:18;;16709:34;;;33084:10:0::1;::::0;33068:50:::1;::::0;16648:18:1;33068:50:0::1;;;;;;;32541:585;;32441:685:::0;;;;:::o;12448:128::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;12513:32:::1;::::0;12542:1:::1;5473:51:1::0;;12513:32:0::1;::::0;5461:2:1;5446:18;12513:32:0::1;;;;;;;12572:1;12556:18:::0;;-1:-1:-1;;;;;;12556:18:0::1;::::0;;12448:128::o;20654:306::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;20733:14:::1;::::0;::::1;;20732:15;20724:44;;;::::0;-1:-1:-1;;;20724:44:0;;16956:2:1;20724:44:0::1;::::0;::::1;16938:21:1::0;16995:2;16975:18;;;16968:30;-1:-1:-1;;;17014:18:1;;;17007:46;17070:18;;20724:44:0::1;16754:340:1::0;20724:44:0::1;20779:14;:21:::0;;-1:-1:-1;;20779:21:0::1;20796:4;20779:21;::::0;;20814:11:::1;::::0;20779:14:::1;20814:16:::0;20811:99:::1;;20883:27;:15;20903:6:::0;20883:19:::1;:27::i;:::-;20869:11;:41:::0;20811:99:::1;20936:16;::::0;::::1;::::0;;;::::1;20654:306:::0;:::o;21155:437::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;21308:21:::1;:32:::0;;-1:-1:-1;;21308:32:0::1;::::0;::::1;;::::0;;::::1;::::0;;;21352:13:::1;:26:::0;;;21389:15:::1;:27:::0;;;21427:25:::1;:54:::0;;;21499:85:::1;::::0;;10498:25:1;;;10554:2;10539:18;;10532:34;;;10582:18;;;10575:34;;;21499:85:0::1;::::0;10486:2:1;10471:18;21499:85:0::1;;;;;;;21155:437:::0;;;;:::o;22074:407::-;22167:4;22184:24;22211:30;22221:10;22233:7;22211:9;:30::i;:::-;22184:57;;22280:15;22260:16;:35;;22252:85;;;;-1:-1:-1;;;22252:85:0;;17301:2:1;22252:85:0;;;17283:21:1;17340:2;17320:18;;;17313:30;17379:34;17359:18;;;17352:62;-1:-1:-1;;;17430:18:1;;;17423:35;17475:19;;22252:85:0;17099:401:1;22252:85:0;22373:65;22382:10;22394:7;22422:15;22403:16;:34;22373:8;:65::i;18973:139::-;19051:4;19058:40;19068:10;19080:9;19091:6;19058:9;:40::i;11776:95::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11837:19:0::1;;::::0;;;11859:4:::1;11837:19;::::0;;;;;;;:26;;-1:-1:-1;;11837:26:0::1;::::0;;::::1;::::0;;11776:95::o;19663:265::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19764:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:37;::::1;;:23;::::0;;::::1;:37;;::::0;19756:61:::1;;;;-1:-1:-1::0;;;19756:61:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19828:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;:36;;-1:-1:-1;;19828:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;19882:38;;19828:36;;:23;19882:38:::1;::::0;::::1;19663:265:::0;;:::o;19118:127::-;-1:-1:-1;;;;;19216:18:0;;;19199:7;19216:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19118:127::o;11879:98::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11942:19:0::1;11964:5;11942:19:::0;;;:14:::1;:19;::::0;;;;:27;;-1:-1:-1;;11942:27:0::1;::::0;;11879:98::o;12215:221::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12300:17:0;::::1;12292:42;;;;-1:-1:-1::0;;;12292:42:0::1;;;;;;;:::i;:::-;12345:5;:11:::0;;-1:-1:-1;;;;;;12345:11:0::1;-1:-1:-1::0;;;;;12345:11:0;::::1;::::0;;::::1;::::0;;12367:19;;;-1:-1:-1;12367:19:0::1;::::0;;;;;;;;:26;;-1:-1:-1;;12367:26:0::1;::::0;;::::1;::::0;;;12409:25;;5473:51:1;;;12409:25:0::1;::::0;5446:18:1;12409:25:0::1;;;;;;;12215:221:::0;:::o;26578:548::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;26697:1:::1;26681:12;:17;;26673:72;;;::::0;-1:-1:-1;;;26673:72:0;;17923:2:1;26673:72:0::1;::::0;::::1;17905:21:1::0;17962:2;17942:18;;;17935:30;18001:34;17981:18;;;17974:62;-1:-1:-1;;;18052:18:1;;;18045:40;18102:19;;26673:72:0::1;17721:406:1::0;26673:72:0::1;26775:6;26764:7;:17;;26756:69;;;::::0;-1:-1:-1;;;26756:69:0;;18334:2:1;26756:69:0::1;::::0;::::1;18316:21:1::0;18373:2;18353:18;;;18346:30;18412:34;18392:18;;;18385:62;-1:-1:-1;;;18463:18:1;;;18456:37;18510:19;;26756:69:0::1;18132:403:1::0;26756:69:0::1;26836:18;26891:8;26874:12:::0;14107:15:::1;14044:1;14107:2;:15;:::i;:::-;14092:31;::::0;:11:::1;:31;:::i;:::-;26859:27;;;;:::i;:::-;26857:42;;;;:::i;:::-;26836:63:::0;-1:-1:-1;26910:22:0::1;26964:8;26952:7:::0;14107:15:::1;14044:1;14107:2;:15;:::i;:::-;14092:31;::::0;:11:::1;:31;:::i;:::-;26937:22;;;;:::i;:::-;26935:37;;;;:::i;:::-;26983:12;:25:::0;;;27019:16:::1;:33:::0;;;27070:48:::1;::::0;;16675:25:1;;;16731:2;16716:18;;16709:34;;;27019:33:0;;-1:-1:-1;27070:48:0::1;::::0;16648:18:1;27070:48:0::1;16501:248:1::0;33950:214:0;17381:8;;-1:-1:-1;;;;;17381:8:0;17367:10;:22;17359:47;;;;-1:-1:-1;;;17359:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34034:26:0;::::1;34026:51;;;;-1:-1:-1::0;;;34026:51:0::1;;;;;;;:::i;:::-;34088:8;:23:::0;;-1:-1:-1;;;;;;34088:23:0::1;-1:-1:-1::0;;;;;34088:23:0;::::1;::::0;;::::1;::::0;;;34127:29:::1;::::0;::::1;::::0;-1:-1:-1;;34127:29:0::1;33950:214:::0;:::o;20211:221::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20300:16:0;::::1;;::::0;;;:6:::1;:16;::::0;;;;;:26;::::1;;:16;::::0;;::::1;:26;;::::0;20292:50:::1;;;;-1:-1:-1::0;;;20292:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20353:16:0;::::1;;::::0;;;:6:::1;:16;::::0;;;;;:25;;-1:-1:-1;;20353:25:0::1;::::0;::::1;;::::0;;::::1;::::0;;;20396:28;;20353:25;;:16;20396:28:::1;::::0;::::1;20211:221:::0;;:::o;27902:617::-;11704:24;11717:10;11704:12;:24::i;:::-;11696:48;;;;-1:-1:-1;;;11696:48:0;;;;;;;:::i;:::-;28024:21:::1;28004:17;28083:43;28113:12:::0;28083:25:::1;28024:21:::0;28097:10;28083:13:::1;:25::i;:43::-;28056:70:::0;-1:-1:-1;28137:20:0::1;28160:23;28056:70:::0;28181:1:::1;28160:20;:23::i;:::-;28206:14;::::0;28137:46;;-1:-1:-1;28194:41:0::1;::::0;-1:-1:-1;;;;;28206:14:0::1;28137:46:::0;28194:11:::1;:41::i;:::-;28258:14;::::0;28246:41:::1;::::0;-1:-1:-1;;;;;28258:14:0::1;28274:12:::0;28246:11:::1;:41::i;:::-;28310:14;::::0;28298:41:::1;::::0;-1:-1:-1;;;;;28310:14:0::1;28326:12:::0;28298:11:::1;:41::i;:::-;28362:14;::::0;28350:41:::1;::::0;-1:-1:-1;;;;;28362:14:0::1;28378:12:::0;28350:11:::1;:41::i;:::-;28430:14;::::0;28446::::1;::::0;28462::::1;::::0;28478::::1;::::0;28409:102:::1;::::0;;-1:-1:-1;;;;;28430:14:0;;::::1;19059:34:1::0;;28446:14:0;;::::1;19124:2:1::0;19109:18;;19102:43;28462:14:0;;::::1;19161:18:1::0;;;19154:43;28478:14:0;;;::::1;19228:2:1::0;19213:18;;19206:43;19280:3;19265:19;;19258:35;;;28409:102:0;;::::1;::::0;;;;19008:3:1;28409:102:0;;::::1;27993:526;;;27902:617:::0;;:::o;12096:107::-;-1:-1:-1;;;;;12176:19:0;12152:4;12176:19;;;:14;:19;;;;;;;;;12096:107::o;22489:372::-;-1:-1:-1;;;;;22617:19:0;;22609:68;;;;-1:-1:-1;;;22609:68:0;;19506:2:1;22609:68:0;;;19488:21:1;19545:2;19525:18;;;19518:30;19584:34;19564:18;;;19557:62;-1:-1:-1;;;19635:18:1;;;19628:34;19679:19;;22609:68:0;19304:400:1;22609:68:0;-1:-1:-1;;;;;22696:21:0;;22688:68;;;;-1:-1:-1;;;22688:68:0;;19911:2:1;22688:68:0;;;19893:21:1;19950:2;19930:18;;;19923:30;19989:34;19969:18;;;19962:62;-1:-1:-1;;;20040:18:1;;;20033:32;20082:19;;22688:68:0;19709:398:1;22688:68:0;-1:-1:-1;;;;;22769:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;22821:32;;2049:25:1;;;22821:32:0;;2022:18:1;22821:32:0;1903:177:1;1695:98:0;1753:7;1780:5;1784:1;1780;:5;:::i;1801:98::-;1859:7;1886:5;1890:1;1886;:5;:::i;1483:98::-;1541:7;1568:5;1572:1;1568;:5;:::i;22869:453::-;23004:24;23031:25;23041:5;23048:7;23031:9;:25::i;:::-;23004:52;;-1:-1:-1;;23071:16:0;:37;23067:248;;23153:6;23133:16;:26;;23125:68;;;;-1:-1:-1;;;23125:68:0;;20314:2:1;23125:68:0;;;20296:21:1;20353:2;20333:18;;;20326:30;20392:31;20372:18;;;20365:59;20441:18;;23125:68:0;20112:353:1;23125:68:0;23237:51;23246:5;23253:7;23281:6;23262:16;:25;23237:8;:51::i;:::-;22993:329;22869:453;;;:::o;23330:1517::-;23419:37;23430:6;23438:9;23449:6;23419:10;:37::i;:::-;-1:-1:-1;;;;;23503:21:0;;23469:12;23503:21;;;:13;:21;;;;;;23484:4;;23503:21;;;:49;;-1:-1:-1;;;;;;23528:24:0;;;;;;:13;:24;;;;;;;;23503:49;23499:429;;;-1:-1:-1;23579:5:0;23499:429;;;23627:14;;;;23619:44;;;;-1:-1:-1;;;23619:44:0;;20672:2:1;23619:44:0;;;20654:21:1;20711:2;20691:18;;;20684:30;-1:-1:-1;;;20730:18:1;;;20723:47;20787:18;;23619:44:0;20470:341:1;23619:44:0;23696:12;;23686:6;:22;;23678:75;;;;-1:-1:-1;;;23678:75:0;;21018:2:1;23678:75:0;;;21000:21:1;21057:2;21037:18;;;21030:30;21096:34;21076:18;;;21069:62;-1:-1:-1;;;21147:18:1;;;21140:38;21195:19;;23678:75:0;20816:404:1;23678:75:0;23785:4;-1:-1:-1;;;;;23772:17:0;:9;-1:-1:-1;;;;;23772:17:0;;23768:147;;23851:16;;-1:-1:-1;;;;;23818:20:0;;;;;;:9;:20;;;;;;:29;;23841:6;;23818:29;:::i;:::-;:49;;23810:89;;;;-1:-1:-1;;;23810:89:0;;21427:2:1;23810:89:0;;;21409:21:1;21466:2;21446:18;;;21439:30;21505:29;21485:18;;;21478:57;21552:18;;23810:89:0;21225:351:1;23810:89:0;23940:31;23997:4;-1:-1:-1;;;;;23987:14:0;:6;-1:-1:-1;;;;;23987:14:0;;23984:392;;24036:19;24018:37;;24094:6;-1:-1:-1;;;;;24073:28:0;:9;-1:-1:-1;;;;;24073:28:0;;;:62;;;;;24124:11;;24105:15;:30;;24073:62;24070:126;;;-1:-1:-1;;;;;24156:17:0;;;;;;:6;:17;;;;;:24;;-1:-1:-1;;24156:24:0;24176:4;24156:24;;;24070:126;23984:392;;;24230:4;-1:-1:-1;;;;;24217:17:0;:9;-1:-1:-1;;;;;24217:17:0;;24213:163;;-1:-1:-1;24269:20:0;24213:163;;;-1:-1:-1;24340:24:0;24213:163;24400:9;;:16;;24414:1;24400:13;:16::i;:::-;24388:9;:28;24430:30;24445:6;24453;24430:14;:30::i;:::-;24427:118;;;24476:29;24491:13;;24476:14;:29::i;:::-;24532:1;24520:9;:13;24427:118;-1:-1:-1;;;;;24577:17:0;;;;;;:9;:17;;;;;;:29;;24599:6;24577:21;:29::i;:::-;-1:-1:-1;;;;;24557:17:0;;;;;;:9;:17;;;;;:49;;;;24642:7;:64;;24700:6;24642:64;;;24652:45;24665:6;24673;24681:15;24652:12;:45::i;:::-;-1:-1:-1;;;;;24740:20:0;;;;;;:9;:20;;;;;;24617:89;;-1:-1:-1;24740:40:0;;24617:89;24740:24;:40::i;:::-;-1:-1:-1;;;;;24717:20:0;;;;;;;:9;:20;;;;;;;:63;;;;24796:43;;;;;;-1:-1:-1;;;;;;;;;;;24796:43:0;;;24824:14;2049:25:1;;2037:2;2022:18;;1903:177;24796:43:0;;;;;;;;23408:1439;;;23330:1517;;;:::o;1589:98::-;1647:7;1674:5;1678:1;1674;:5;:::i;8188:211::-;8332:58;;;-1:-1:-1;;;;;14186:32:1;;8332:58:0;;;14168:51:1;14235:18;;;;14228:34;;;8332:58:0;;;;;;;;;;14141:18:1;;;;8332:58:0;;;;;;;;-1:-1:-1;;;;;8332:58:0;-1:-1:-1;;;8332:58:0;;;8305:86;;8325:5;;8305:19;:86::i;:::-;8188:211;;;:::o;32207:226::-;32285:6;32295:1;32285:11;32282:23;;32207:226;;:::o;32282:23::-;32316:12;32342:9;-1:-1:-1;;;;;32334:23:0;32365:6;32334:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32315:61;;;32395:7;32387:38;;;;-1:-1:-1;;;32387:38:0;;21993:2:1;32387:38:0;;;21975:21:1;22032:2;22012:18;;;22005:30;-1:-1:-1;;;22051:18:1;;;22044:48;22109:18;;32387:38:0;21791:342:1;24855:382:0;-1:-1:-1;;;;;24960:21:0;;;;;;:13;:21;;;;;;;;24959:22;24951:45;;;;-1:-1:-1;;;24951:45:0;;22340:2:1;24951:45:0;;;22322:21:1;22379:2;22359:18;;;22352:30;-1:-1:-1;;;22398:18:1;;;22391:40;22448:18;;24951:45:0;22138:334:1;24951:45:0;-1:-1:-1;;;;;25016:24:0;;;;;;:13;:24;;;;;;;;25015:25;25007:48;;;;-1:-1:-1;;;25007:48:0;;22340:2:1;25007:48:0;;;22322:21:1;22379:2;22359:18;;;22352:30;-1:-1:-1;;;22398:18:1;;;22391:40;22448:18;;25007:48:0;22138:334:1;25007:48:0;25083:1;25074:6;:10;25066:64;;;;-1:-1:-1;;;25066:64:0;;22679:2:1;25066:64:0;;;22661:21:1;22718:2;22698:18;;;22691:30;22757:34;22737:18;;;22730:62;-1:-1:-1;;;22808:18:1;;;22801:39;22857:19;;25066:64:0;22477:405:1;25066:64:0;-1:-1:-1;;;;;18947:18:0;;18930:7;18947:18;;;:9;:18;;;;;;25149:6;:27;;25141:88;;;;-1:-1:-1;;;25141:88:0;;23089:2:1;25141:88:0;;;23071:21:1;23128:2;23108:18;;;23101:30;23167:34;23147:18;;;23140:62;-1:-1:-1;;;23218:18:1;;;23211:47;23275:19;;25141:88:0;22887:413:1;30208:376:0;30330:15;;30406:13;;30396:4;30287;18947:18;;;:9;:18;;;;;;30438:8;;30287:4;;30320:25;;;;-1:-1:-1;30378:41:0;;30438:8;;30437:9;:34;;;;-1:-1:-1;30450:21:0;;;;30437:34;:46;;;;;30475:8;30437:46;:103;;;;;30515:25;;30502:9;;:38;;30437:103;:121;;;;;30544:14;30437:121;:139;;;;;30572:4;-1:-1:-1;;;;;30562:14:0;:6;-1:-1:-1;;;;;30562:14:0;;;30437:139;30430:146;30208:376;-1:-1:-1;;;;;30208:376:0:o;30592:814::-;17255:8;:15;;-1:-1:-1;;17255:15:0;17266:4;17255:15;;;30723:13:::1;::::0;30700:17:::1;::::0;17255:8;;30689:55:::1;::::0;30742:1:::1;::::0;30689:48:::1;::::0;;;:6;;:10:::1;:29::i;:55::-;30663:81:::0;-1:-1:-1;30755:20:0::1;30778:27;:6:::0;30663:81;30778:10:::1;:27::i;:::-;30755:50:::0;-1:-1:-1;30843:21:0::1;30875:30;30755:50:::0;30875:16:::1;:30::i;:::-;30918:20;30941:41;:21;30967:14:::0;30941:25:::1;:41::i;:::-;30918:64;;30993:19;31015:43;31033:24;31055:1;31033:17;;:21;;:24;;;;:::i;:::-;31015:13;::::0;;:17:::1;:43::i;:::-;30993:65:::0;-1:-1:-1;31074:19:0;;31071:141:::1;;31109:90;31122:15;31139:59;31196:1;31139:52;31179:11;31139:35;31156:17;;31139:12;:16;;:35;;;;:::i;:59::-;31109:12;:90::i;:::-;31325:18;::::0;31362:17:::1;::::0;31313:85:::1;::::0;-1:-1:-1;;;;;31325:18:0::1;::::0;31345:52:::1;::::0;31385:11;;31345:35:::1;::::0;:12;;:16:::1;:35::i;:52::-;31313:11;:85::i;:::-;-1:-1:-1::0;;17294:8:0;:16;;-1:-1:-1;;17294:16:0;;;-1:-1:-1;;;;30592:814:0:o;25245:1325::-;25350:7;25370:14;25387:4;:21;25392:15;25387:21;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;25387:21:0;;;25370:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25439:14:0;;;;:6;:14;;;;;;;25370:38;;-1:-1:-1;;25439:14:0;;:32;;;;-1:-1:-1;25457:14:0;;;;;;;25439:32;:71;;25498:3;:12;;;25439:71;;;25474:20;25491:3;14768:5;25474:20;:::i;:::-;25419:91;;25544:9;25557:1;25544:14;25540:60;;25582:6;25575:13;;;;;;25540:60;25610:17;25630:43;14768:5;25631:21;:6;25642:9;25631:10;:21::i;25630:43::-;25610:63;;25684:18;25705:43;25738:9;25706:26;25720:3;:11;;;25706:9;:13;;:26;;;;:::i;25705:43::-;25684:64;;25759:21;25783:46;25819:9;25784:29;25798:3;:14;;;25784:9;:13;;:29;;;;:::i;25783:46::-;25759:70;-1:-1:-1;25842:20:0;25865:44;25759:70;25865:25;:9;25879:10;25865:13;:25::i;:44::-;25842:67;-1:-1:-1;25925:14:0;;25922:176;;14156:42;25983:24;;:9;:24;;;;:40;;26012:10;25983:28;:40::i;:::-;14156:42;25956:24;;;;:9;:24;;;:67;;;;:24;26043:43;-1:-1:-1;;;;;26043:43:0;;;-1:-1:-1;;;;;;;;;;;26043:43:0;;;26075:10;2049:25:1;;2037:2;2022:18;;1903:177;26043:43:0;;;;;;;;25922:176;26111:17;;26108:221;;26202:16;;-1:-1:-1;;;;;26202:16:0;26184:36;;;;:9;:36;;;;;;:55;;26225:13;26184:40;:55::i;:::-;26163:16;;;-1:-1:-1;;;;;26163:16:0;;;26145:36;;;;:9;:36;;;;;;;;;:94;;;;26284:16;;26259:58;;2049:25:1;;;26284:16:0;;;;26259:58;;;;-1:-1:-1;;;;;;;;;;;26259:58:0;2022:18:1;26259:58:0;;;;;;;26108:221;26342:16;;26339:182;;26420:4;26402:24;;;;:9;:24;;;;;;:42;;26431:12;26402:28;:42::i;:::-;26393:4;26375:24;;;;:9;:24;;;;;;;:69;;;;26464:45;;-1:-1:-1;;;;;26464:45:0;;;-1:-1:-1;;;;;;;;;;;26464:45:0;;;26496:12;2049:25:1;;2037:2;2022:18;;1903:177;26464:45:0;;;;;;;;26339:182;26539:21;:6;26550:9;26539:10;:21::i;:::-;26532:28;25245:1325;-1:-1:-1;;;;;;;;;;25245:1325:0:o;10611:716::-;11035:23;11061:69;11089:4;11061:69;;;;;;;;;;;;;;;;;11069:5;-1:-1:-1;;;;;11061:27:0;;;:69;;;;;:::i;:::-;11145:17;;11035:95;;-1:-1:-1;11145:21:0;11141:179;;11242:10;11231:30;;;;;;;;;;;;:::i;:::-;11223:85;;;;-1:-1:-1;;;11223:85:0;;23757:2:1;11223:85:0;;;23739:21:1;23796:2;23776:18;;;23769:30;23835:34;23815:18;;;23808:62;-1:-1:-1;;;23886:18:1;;;23879:40;23936:19;;11223:85:0;23555:406:1;31765:434:0;31855:16;;;31869:1;31855:16;;;;;;;;31831:21;;31855:16;;;;;;;;;;-1:-1:-1;31855:16:0;31831:40;;31900:4;31882;31887:1;31882:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;31882:23:0;;;-1:-1:-1;;;;;31882:23:0;;;;;31926:6;-1:-1:-1;;;;;31926:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31916:4;31921:1;31916:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;31916:23:0;;;-1:-1:-1;;;;;31916:23:0;;;;;31950:53;31967:4;31982:6;31991:11;31950:8;:53::i;:::-;32014:177;;-1:-1:-1;;;32014:177:0;;-1:-1:-1;;;;;32014:6:0;:57;;;;:177;;32086:11;;32112:1;;32128:4;;32155;;32175:15;;32014:177;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31820:379;31765:434;:::o;31414:343::-;31495:53;31512:4;31527:6;31536:11;31495:8;:53::i;:::-;31700:18;;31559:190;;-1:-1:-1;;;31559:190:0;;31622:4;31559:190;;;25424:34:1;25474:18;;;25467:34;;;31668:1:0;25517:18:1;;;25510:34;;;25560:18;;;25553:34;-1:-1:-1;;;;;31700:18:0;;;25603:19:1;;;25596:44;31733:15:0;25656:19:1;;;25649:35;31559:6:0;:22;;;;;;31589:9;;25358:19:1;;31559:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;31414:343;;:::o;4122:229::-;4259:12;4291:52;4313:6;4321:4;4327:1;4330:12;4291:21;:52::i;:::-;4284:59;4122:229;-1:-1:-1;;;;4122:229:0:o;4627:455::-;4797:12;4855:5;4830:21;:30;;4822:81;;;;-1:-1:-1;;;4822:81:0;;26208:2:1;4822:81:0;;;26190:21:1;26247:2;26227:18;;;26220:30;26286:34;26266:18;;;26259:62;-1:-1:-1;;;26337:18:1;;;26330:36;26383:19;;4822:81:0;26006:402:1;4822:81:0;4915:12;4929:23;4956:6;-1:-1:-1;;;;;4956:11:0;4975:5;4982:4;4956:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4914:73;;;;5005:69;5032:6;5040:7;5049:10;5061:12;5005:26;:69::i;:::-;4998:76;4627:455;-1:-1:-1;;;;;;;4627:455:0:o;6186:644::-;6371:12;6400:7;6396:427;;;6428:10;:17;6449:1;6428:22;6424:290;;-1:-1:-1;;;;;3563:19:0;;;6638:60;;;;-1:-1:-1;;;6638:60:0;;26894:2:1;6638:60:0;;;26876:21:1;26933:2;26913:18;;;26906:30;26972:31;26952:18;;;26945:59;27021:18;;6638:60:0;26692:353:1;6638:60:0;-1:-1:-1;6735:10:0;6728:17;;6396:427;6778:33;6786:10;6798:12;7312:17;;:21;7308:388;;7544:10;7538:17;7601:15;7588:10;7584:2;7580:19;7573:44;7308:388;7671:12;7664:20;;-1:-1:-1;;;7664:20:0;;;;;;;;:::i;14:258:1:-;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;-1:-1:-1;;262:1:1;244:16;;237:27;14:258::o;277:383::-;426:2;415:9;408:21;389:4;458:6;452:13;501:6;496:2;485:9;481:18;474:34;517:66;576:6;571:2;560:9;556:18;551:2;543:6;539:15;517:66;:::i;:::-;644:2;623:15;-1:-1:-1;;619:29:1;604:45;;;;651:2;600:54;;277:383;-1:-1:-1;;277:383:1:o;665:131::-;-1:-1:-1;;;;;740:31:1;;730:42;;720:70;;786:1;783;776:12;720:70;665:131;:::o;801:315::-;869:6;877;930:2;918:9;909:7;905:23;901:32;898:52;;;946:1;943;936:12;898:52;985:9;972:23;1004:31;1029:5;1004:31;:::i;:::-;1054:5;1106:2;1091:18;;;;1078:32;;-1:-1:-1;;;801:315:1:o;1313:156::-;1394:20;;1443:1;1433:12;;1423:40;;1459:1;1456;1449:12;1423:40;1313:156;;;:::o;1474:424::-;1580:6;1588;1596;1604;1657:3;1645:9;1636:7;1632:23;1628:33;1625:53;;;1674:1;1671;1664:12;1625:53;1697:42;1729:9;1697:42;:::i;:::-;1687:52;1786:2;1771:18;;1758:32;;-1:-1:-1;1837:2:1;1822:18;;1809:32;;1888:2;1873:18;1860:32;;-1:-1:-1;1474:424:1;-1:-1:-1;;;1474:424:1:o;2085:456::-;2162:6;2170;2178;2231:2;2219:9;2210:7;2206:23;2202:32;2199:52;;;2247:1;2244;2237:12;2199:52;2286:9;2273:23;2305:31;2330:5;2305:31;:::i;:::-;2355:5;-1:-1:-1;2412:2:1;2397:18;;2384:32;2425:33;2384:32;2425:33;:::i;:::-;2085:456;;2477:7;;-1:-1:-1;;;2531:2:1;2516:18;;;;2503:32;;2085:456::o;2546:247::-;2605:6;2658:2;2646:9;2637:7;2633:23;2629:32;2626:52;;;2674:1;2671;2664:12;2626:52;2713:9;2700:23;2732:31;2757:5;2732:31;:::i;2987:671::-;3073:6;3081;3089;3097;3150:3;3138:9;3129:7;3125:23;3121:33;3118:53;;;3167:1;3164;3157:12;3118:53;3206:9;3193:23;3225:31;3250:5;3225:31;:::i;:::-;3275:5;-1:-1:-1;3332:2:1;3317:18;;3304:32;3345:33;3304:32;3345:33;:::i;:::-;3397:7;-1:-1:-1;3456:2:1;3441:18;;3428:32;3469:33;3428:32;3469:33;:::i;:::-;3521:7;-1:-1:-1;3580:2:1;3565:18;;3552:32;3593:33;3552:32;3593:33;:::i;:::-;2987:671;;;;-1:-1:-1;2987:671:1;;-1:-1:-1;;2987:671:1:o;3663:219::-;3742:6;3795:2;3783:9;3774:7;3770:23;3766:32;3763:52;;;3811:1;3808;3801:12;3763:52;3834:42;3866:9;3834:42;:::i;4283:529::-;4360:6;4368;4376;4429:2;4417:9;4408:7;4404:23;4400:32;4397:52;;;4445:1;4442;4435:12;4397:52;4484:9;4471:23;4503:31;4528:5;4503:31;:::i;:::-;4553:5;-1:-1:-1;4610:2:1;4595:18;;4582:32;4623:33;4582:32;4623:33;:::i;:::-;4675:7;-1:-1:-1;4734:2:1;4719:18;;4706:32;4747:33;4706:32;4747:33;:::i;:::-;4799:7;4789:17;;;4283:529;;;;;:::o;4817:118::-;4903:5;4896:13;4889:21;4882:5;4879:32;4869:60;;4925:1;4922;4915:12;4940:382;5005:6;5013;5066:2;5054:9;5045:7;5041:23;5037:32;5034:52;;;5082:1;5079;5072:12;5034:52;5121:9;5108:23;5140:31;5165:5;5140:31;:::i;:::-;5190:5;-1:-1:-1;5247:2:1;5232:18;;5219:32;5260:30;5219:32;5260:30;:::i;:::-;5309:7;5299:17;;;4940:382;;;;;:::o;5535:316::-;5612:6;5620;5628;5681:2;5669:9;5660:7;5656:23;5652:32;5649:52;;;5697:1;5694;5687:12;5649:52;-1:-1:-1;;5720:23:1;;;5790:2;5775:18;;5762:32;;-1:-1:-1;5841:2:1;5826:18;;;5813:32;;5535:316;-1:-1:-1;5535:316:1:o;5856:444::-;5927:6;5935;5943;5996:2;5984:9;5975:7;5971:23;5967:32;5964:52;;;6012:1;6009;6002:12;5964:52;6051:9;6038:23;6070:28;6092:5;6070:28;:::i;:::-;6117:5;-1:-1:-1;6169:2:1;6154:18;;6141:32;;-1:-1:-1;6225:2:1;6210:18;;6197:32;6238:30;6197:32;6238:30;:::i;6305:241::-;6361:6;6414:2;6402:9;6393:7;6389:23;6385:32;6382:52;;;6430:1;6427;6420:12;6382:52;6469:9;6456:23;6488:28;6510:5;6488:28;:::i;6551:367::-;6614:8;6624:6;6678:3;6671:4;6663:6;6659:17;6655:27;6645:55;;6696:1;6693;6686:12;6645:55;-1:-1:-1;6719:20:1;;6762:18;6751:30;;6748:50;;;6794:1;6791;6784:12;6748:50;6831:4;6823:6;6819:17;6807:29;;6891:3;6884:4;6874:6;6871:1;6867:14;6859:6;6855:27;6851:38;6848:47;6845:67;;;6908:1;6905;6898:12;6845:67;6551:367;;;;;:::o;6923:773::-;7045:6;7053;7061;7069;7122:2;7110:9;7101:7;7097:23;7093:32;7090:52;;;7138:1;7135;7128:12;7090:52;7178:9;7165:23;7207:18;7248:2;7240:6;7237:14;7234:34;;;7264:1;7261;7254:12;7234:34;7303:70;7365:7;7356:6;7345:9;7341:22;7303:70;:::i;:::-;7392:8;;-1:-1:-1;7277:96:1;-1:-1:-1;7480:2:1;7465:18;;7452:32;;-1:-1:-1;7496:16:1;;;7493:36;;;7525:1;7522;7515:12;7493:36;;7564:72;7628:7;7617:8;7606:9;7602:24;7564:72;:::i;:::-;6923:773;;;;-1:-1:-1;7655:8:1;-1:-1:-1;;;;6923:773:1:o;7701:180::-;7760:6;7813:2;7801:9;7792:7;7788:23;7784:32;7781:52;;;7829:1;7826;7819:12;7781:52;-1:-1:-1;7852:23:1;;7701:180;-1:-1:-1;7701:180:1:o;7886:446::-;7969:6;7977;7985;7993;8046:3;8034:9;8025:7;8021:23;8017:33;8014:53;;;8063:1;8060;8053:12;8014:53;8102:9;8089:23;8121:28;8143:5;8121:28;:::i;8337:388::-;8405:6;8413;8466:2;8454:9;8445:7;8441:23;8437:32;8434:52;;;8482:1;8479;8472:12;8434:52;8521:9;8508:23;8540:31;8565:5;8540:31;:::i;:::-;8590:5;-1:-1:-1;8647:2:1;8632:18;;8619:32;8660:33;8619:32;8660:33;:::i;8990:248::-;9058:6;9066;9119:2;9107:9;9098:7;9094:23;9090:32;9087:52;;;9135:1;9132;9125:12;9087:52;-1:-1:-1;;9158:23:1;;;9228:2;9213:18;;;9200:32;;-1:-1:-1;8990:248:1:o;9467:336::-;9669:2;9651:21;;;9708:2;9688:18;;;9681:30;-1:-1:-1;;;9742:2:1;9727:18;;9720:42;9794:2;9779:18;;9467:336::o;10164:127::-;10225:10;10220:3;10216:20;10213:1;10206:31;10256:4;10253:1;10246:15;10280:4;10277:1;10270:15;10966:127;11027:10;11022:3;11018:20;11015:1;11008:31;11058:4;11055:1;11048:15;11082:4;11079:1;11072:15;11098:422;11187:1;11230:5;11187:1;11244:270;11265:7;11255:8;11252:21;11244:270;;;11324:4;11320:1;11316:6;11312:17;11306:4;11303:27;11300:53;;;11333:18;;:::i;:::-;11383:7;11373:8;11369:22;11366:55;;;11403:16;;;;11366:55;11482:22;;;;11442:15;;;;11244:270;;;11248:3;11098:422;;;;;:::o;11525:806::-;11574:5;11604:8;11594:80;;-1:-1:-1;11645:1:1;11659:5;;11594:80;11693:4;11683:76;;-1:-1:-1;11730:1:1;11744:5;;11683:76;11775:4;11793:1;11788:59;;;;11861:1;11856:130;;;;11768:218;;11788:59;11818:1;11809:10;;11832:5;;;11856:130;11893:3;11883:8;11880:17;11877:43;;;11900:18;;:::i;:::-;-1:-1:-1;;11956:1:1;11942:16;;11971:5;;11768:218;;12070:2;12060:8;12057:16;12051:3;12045:4;12042:13;12038:36;12032:2;12022:8;12019:16;12014:2;12008:4;12005:12;12001:35;11998:77;11995:159;;;-1:-1:-1;12107:19:1;;;12139:5;;11995:159;12186:34;12211:8;12205:4;12186:34;:::i;:::-;12256:6;12252:1;12248:6;12244:19;12235:7;12232:32;12229:58;;;12267:18;;:::i;:::-;12305:20;;11525:806;-1:-1:-1;;;11525:806:1:o;12336:140::-;12394:5;12423:47;12464:4;12454:8;12450:19;12444:4;12423:47;:::i;12481:168::-;12521:7;12587:1;12583;12579:6;12575:14;12572:1;12569:21;12564:1;12557:9;12550:17;12546:45;12543:71;;;12594:18;;:::i;:::-;-1:-1:-1;12634:9:1;;12481:168::o;12654:335::-;12856:2;12838:21;;;12895:2;12875:18;;;12868:30;-1:-1:-1;;;12929:2:1;12914:18;;12907:41;12980:2;12965:18;;12654:335::o;12994:336::-;13196:2;13178:21;;;13235:2;13215:18;;;13208:30;-1:-1:-1;;;13269:2:1;13254:18;;13247:42;13321:2;13306:18;;12994:336::o;13805:184::-;13875:6;13928:2;13916:9;13907:7;13903:23;13899:32;13896:52;;;13944:1;13941;13934:12;13896:52;-1:-1:-1;13967:16:1;;13805:184;-1:-1:-1;13805:184:1:o;14273:128::-;14313:3;14344:1;14340:6;14337:1;14334:13;14331:39;;;14350:18;;:::i;:::-;-1:-1:-1;14386:9:1;;14273:128::o;14795:335::-;14997:2;14979:21;;;15036:2;15016:18;;;15009:30;-1:-1:-1;;;15070:2:1;15055:18;;15048:41;15121:2;15106:18;;14795:335::o;15491:251::-;15561:6;15614:2;15602:9;15593:7;15589:23;15585:32;15582:52;;;15630:1;15627;15620:12;15582:52;15662:9;15656:16;15681:31;15706:5;15681:31;:::i;15747:125::-;15787:4;15815:1;15812;15809:8;15806:34;;;15820:18;;:::i;:::-;-1:-1:-1;15857:9:1;;15747:125::o;16229:127::-;16290:10;16285:3;16281:20;16278:1;16271:31;16321:4;16318:1;16311:15;16345:4;16342:1;16335:15;16361:135;16400:3;16421:17;;;16418:43;;16441:18;;:::i;:::-;-1:-1:-1;16488:1:1;16477:13;;16361:135::o;18540:217::-;18580:1;18606;18596:132;;18650:10;18645:3;18641:20;18638:1;18631:31;18685:4;18682:1;18675:15;18713:4;18710:1;18703:15;18596:132;-1:-1:-1;18742:9:1;;18540:217::o;23305:245::-;23372:6;23425:2;23413:9;23404:7;23400:23;23396:32;23393:52;;;23441:1;23438;23431:12;23393:52;23473:9;23467:16;23492:28;23514:5;23492:28;:::i;24098:980::-;24360:4;24408:3;24397:9;24393:19;24439:6;24428:9;24421:25;24465:2;24503:6;24498:2;24487:9;24483:18;24476:34;24546:3;24541:2;24530:9;24526:18;24519:31;24570:6;24605;24599:13;24636:6;24628;24621:22;24674:3;24663:9;24659:19;24652:26;;24713:2;24705:6;24701:15;24687:29;;24734:1;24744:195;24758:6;24755:1;24752:13;24744:195;;;24823:13;;-1:-1:-1;;;;;24819:39:1;24807:52;;24914:15;;;;24879:12;;;;24855:1;24773:9;24744:195;;;-1:-1:-1;;;;;;;24995:32:1;;;;24990:2;24975:18;;24968:60;-1:-1:-1;;;25059:3:1;25044:19;25037:35;24956:3;24098:980;-1:-1:-1;;;24098:980:1:o;25695:306::-;25783:6;25791;25799;25852:2;25840:9;25831:7;25827:23;25823:32;25820:52;;;25868:1;25865;25858:12;25820:52;25897:9;25891:16;25881:26;;25947:2;25936:9;25932:18;25926:25;25916:35;;25991:2;25980:9;25976:18;25970:25;25960:35;;25695:306;;;;;:::o;26413:274::-;26542:3;26580:6;26574:13;26596:53;26642:6;26637:3;26630:4;26622:6;26618:17;26596:53;:::i;:::-;26665:16;;;;;26413:274;-1:-1:-1;;26413:274:1:o

Swarm Source

ipfs://792dd7bcb4cf8e10e6d3112f3b3858d5a7b0ac95b1756a3f8f9c9681b8215aad
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.