ETH Price: $3,165.94 (+1.21%)
Gas: 2 Gwei

Token

Gold Coin - 猫に小判 (GC)
 

Overview

Max Total Supply

149,617,732,262,072,309,955.85923634334236802 GC

Holders

56

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
mayian.eth
Balance
387,348,315.258454241844917077 GC

Value
$0.00
0x067753a1d65293af77c0074b2afd535d3cbc21ed
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:
GoldCoin

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-04
*/

//猫に小判
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

interface IERC20 {
    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);

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        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 _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    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;
}

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

contract GoldCoin is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;

    bool private _swapping;

    address private _swapFeeReceiver;
    
    uint256 public maxTransactionAmount;
    uint256 public maxWallet;

    uint256 public swapTokensThreshold;
        
    bool public limitsInEffect = true;

    uint256 public totalFees;
    uint256 private _marketingFee;
    uint256 private _liquidityFee;
    uint256 private _protocolFee;
    
    uint256 private _tokensForMarketing;
    uint256 private _tokensForLiquidity;
    uint256 private _tokensForStaking;
    
    // staking pool vars
    uint256 public totalStaked;
    address public stakingToken;
    address public rewardToken;
    uint256 [] public apr;

    bool public stakingEnabled = false;
    uint256 public totalClaimed;

    struct Staking {
        uint256 creationTime;
        uint256 staked;
    }

    struct Staker {
        address staker;
        uint256 start;
        uint256 staked;
        uint256 earned;
    }

    struct ClaimHistory {
        uint256[] dates;
        uint256[] amounts;
    }

    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) private _automatedMarketMakerPairs;

    // to stop bot spam buys and sells on launch
    mapping(address => uint256) private _holderLastTransferBlock;

    // stake data
    mapping(address => mapping(uint256 => Staker)) private _stakers;
    mapping(address => ClaimHistory) private _claimHistory;
    Staking[] public stakings;

    /**
     * @dev Throws if called by any account other than the _swapFeeReceiver
     */
    modifier teamOROwner() {
        require(_swapFeeReceiver == _msgSender() || owner() == _msgSender(), "Caller is not the _swapFeeReceiver address nor owner.");
        _;
    }

    modifier isStakingEnabled() {
        require(stakingEnabled, "Staking is not enabled.");
        _;
    }

    constructor() ERC20(unicode"Gold Coin - 猫に小判", "GC") payable {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        _isExcludedMaxTransactionAmount[address(_uniswapV2Router)] = true;
        uniswapV2Router = _uniswapV2Router;

        uint256 marketingFee = 0;
        uint256 liquidityFee = 0;
        uint256 protocolFee = 0;

        uint256 totalSupply = 5e11 * 1e18;

        maxTransactionAmount = totalSupply * 1 / 100;
        maxWallet = totalSupply * 2 / 100;
        swapTokensThreshold = totalSupply * 1 / 1000;
        
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _protocolFee = protocolFee;
        totalFees = _marketingFee + _liquidityFee + _protocolFee;

        _swapFeeReceiver = owner();

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        
        _isExcludedMaxTransactionAmount[owner()] = true;
        _isExcludedMaxTransactionAmount[address(this)] = true;
        _isExcludedMaxTransactionAmount[address(0xdead)] = true;
        
        stakingToken = address(this);
        rewardToken = address(this);
        apr.push(77);

        _mint(address(this), totalSupply);
    }

    /**
    * @dev Once live, can never be switched off
    */
    function startTrading() external teamOROwner {
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH());
        _isExcludedMaxTransactionAmount[address(uniswapV2Pair)] = true;
        _automatedMarketMakerPairs[address(uniswapV2Pair)] = true;

        _approve(address(this), address(uniswapV2Router), balanceOf(address(this)));
        uniswapV2Router.addLiquidityETH{value: address(this).balance} (
            address(this),
            balanceOf(address(this)),
            0,
            0,
            owner(),
            block.timestamp
        );
    }

    /**
    * @dev Remove limits after token is somewhat stable
    */
    function removeLimits() external teamOROwner {
        limitsInEffect = false;
    }

    /**
    * @dev Exclude from fee calculation
    */
    function excludeFromFees(address account, bool excluded) public teamOROwner {
        _isExcludedFromFees[account] = excluded;
    }
    
    /**
    * @dev Update token fees (max set to initial fee)
    */
    function updateFees(uint256 marketingFee, uint256 liquidityFee, uint256 protocolFee) external onlyOwner {
        _marketingFee = marketingFee;
        _liquidityFee = liquidityFee;
        _protocolFee = protocolFee;

        totalFees = _marketingFee + _liquidityFee + _protocolFee;

        require(totalFees <= 10, "Must keep fees at 10% or less");
    }

    function addStakingAPR(uint256 _apr) external onlyOwner {
        require (_apr != 0, "can not update apr to zero!");
        apr.push(_apr);
    }

    function decreaseStakingAPR() external onlyOwner {
        apr.pop();
    }

    function updateStakingAPR (uint256 _apr, uint256 _index) external onlyOwner {
        require (apr[_index] != _apr, "can not update apr to same value!");
        apr[_index] = _apr;
    }

    /**
    * @dev Update wallet that receives fees and newly added LP
    */
    function updateFeeReceiver(address newWallet) external teamOROwner {
        _swapFeeReceiver = newWallet;
    }

    /**
    * @dev Very important function. 
    * Updates the threshold of how many tokens that must be in the contract calculation for fees to be taken
    */
    function updateSwapTokensThreshold(uint256 newThreshold) external teamOROwner returns (bool) {
  	    require(newThreshold >= totalSupply() * 1 / 100000, "Swap threshold cannot be lower than 0.001% total supply.");
  	    require(newThreshold <= totalSupply() * 5 / 1000, "Swap threshold cannot be higher than 0.5% total supply.");
  	    swapTokensThreshold = newThreshold;
  	    return true;
  	}

    /**
    * @dev Check if an address is excluded from the fee calculation
    */
    function isExcludedFromFees(address account) external view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        // all to secure a smooth launch
        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0xdead) &&
                !_swapping
            ) {
                if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
                    require(_holderLastTransferBlock[tx.origin] < block.number, "_transfer:: Transfer Delay enabled.  Only one purchase per block allowed.");
                    _holderLastTransferBlock[tx.origin] = block.number;
                }

                // on buy
                if (_automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Buy transfer amount exceeds the maxTransactionAmount.");
                    require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
                
                // on sell
                else if (_automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                    require(amount <= maxTransactionAmount, "_transfer:: Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded");
                }
            }
        }
        
		uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensThreshold;
        if (
            canSwap &&
            !_swapping &&
            !_automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            _swapping = true;
            swapBack();
            _swapping = false;
        }

        bool takeFee = !_swapping;

        // if any addy belongs to _isExcludedFromFee or isn't a swap then remove the fee
        if (
            _isExcludedFromFees[from] || 
            _isExcludedFromFees[to] || 
            (!_automatedMarketMakerPairs[from] && !_automatedMarketMakerPairs[to])
        ) takeFee = false;
        
        uint256 fees = 0;
        if (takeFee) {
            fees = amount.mul(totalFees).div(100);
            _tokensForLiquidity += fees * _liquidityFee / totalFees;
            _tokensForStaking += fees * _protocolFee / totalFees;
            _tokensForMarketing += fees * _marketingFee / totalFees;
            
            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
        	
        	amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    function _swapTokensForEth(uint256 tokenAmount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            _swapFeeReceiver,
            block.timestamp
        );
    }

    function swapBack() internal {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + _tokensForStaking;
        
        if (contractBalance == 0 || totalTokensToSwap == 0) return;
        if (contractBalance > swapTokensThreshold) contractBalance = swapTokensThreshold;
        
        
        // half of the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * _tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        _swapTokensForEth(amountToSwapForETH);
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(totalTokensToSwap);
        uint256 ethForStaking = ethBalance.mul(_tokensForStaking).div(totalTokensToSwap);
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForStaking;
        
        _tokensForLiquidity = 0;
        _tokensForMarketing = 0;
        _tokensForStaking = 0;

        payable(_swapFeeReceiver).transfer(ethForMarketing.add(ethForStaking));
                
        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            _addLiquidity(liquidityTokens, ethForLiquidity);
        }
    }

    /**
    * @dev Transfer eth stuck in contract to _swapFeeReceiver
    */
    function withdrawContractETH() external {
        payable(_swapFeeReceiver).transfer(address(this).balance);
    }

    /**
    * @dev In case swap wont do it and sells/buys might be blocked
    */
    function forceSwap() external teamOROwner {
        _swapTokensForEth(balanceOf(address(this)));
    }

    /**
        *
        * @dev Staking part starts here
        *
    */

    /**
    * @dev Checks if holder is staking
    */
    function isStaking(address stakerAddr, uint256 staking) public view returns (bool) {
        return _stakers[stakerAddr][staking].staker == stakerAddr;
    }

    /**
    * @dev Returns how much staker is staking
    */
    function userStaked(address staker, uint256 staking) public view returns (uint256) {
        return _stakers[staker][staking].staked;
    }

    /**
    * @dev Returns how much staker has claimed over time
    */
    function userClaimHistory(address staker) public view returns (ClaimHistory memory) {
        return _claimHistory[staker];
    }

    /**
    * @dev Returns how much staker has earned
    */
    function userEarned(address staker, uint256 staking) public view returns (uint256) {
        uint256 currentlyEarned = _userEarned(staker, staking);
        uint256 previouslyEarned = _stakers[msg.sender][staking].earned;

        if (previouslyEarned > 0) return currentlyEarned.add(previouslyEarned);
        return currentlyEarned;
    }

    function _userEarned(address staker, uint256 staking) private view returns (uint256) {
        require(isStaking(staker, staking), "User is not staking.");

        uint256 staked = userStaked(staker, staking);
        uint256 stakersStartInSeconds = _stakers[staker][staking].start.div(1 seconds);
        uint256 blockTimestampInSeconds = block.timestamp.div(1 seconds);
        uint256 secondsStaked = blockTimestampInSeconds.sub(stakersStartInSeconds);

        uint256 earn = staked.mul(apr[staking]).div(100);
        uint256 rewardPerSec = earn.div(365).div(24).div(60).div(60);
        uint256 earned = rewardPerSec.mul(secondsStaked);

        return earned;
    }
 
    /**
    * @dev Stake tokens in staking
    */
    function stake(uint256 stakeAmount, uint256 staking) external isStakingEnabled {

        // Check user is registered as staker
        if (isStaking(msg.sender, staking)) {
            _stakers[msg.sender][staking].staked += stakeAmount;
            _stakers[msg.sender][staking].earned += _userEarned(msg.sender, staking);
            _stakers[msg.sender][staking].start = block.timestamp;
        } else {
            _stakers[msg.sender][staking] = Staker(msg.sender, block.timestamp, stakeAmount, 0);
        }

        stakings[staking].staked += stakeAmount;
        totalStaked += stakeAmount;
        _burn(msg.sender, stakeAmount);
    }
    
    /**
    * @dev Claim earned tokens from stake in staking
    */
    function claim(uint256 staking) external isStakingEnabled {
        require(isStaking(msg.sender, staking), "You are not staking!?");

        uint256 reward = userEarned(msg.sender, staking);

        _claimHistory[msg.sender].dates.push(block.timestamp);
        _claimHistory[msg.sender].amounts.push(reward);
        totalClaimed += reward;

        _mint(msg.sender, reward);

        _stakers[msg.sender][staking].start = block.timestamp;
        _stakers[msg.sender][staking].earned = 0;
    }

    /**
    * @dev Claim earned and staked tokens from staking
    */
    function unstake(uint256 staking) external {
        require(isStaking(msg.sender, staking), "You are not staking!?");

        uint256 reward = userEarned(msg.sender, staking);

        if (stakingEnabled) {
            _claimHistory[msg.sender].dates.push(block.timestamp);
            _claimHistory[msg.sender].amounts.push(reward);
            totalClaimed += reward;

            _mint(msg.sender, _stakers[msg.sender][staking].staked.add(reward));
        } else {
            _mint(msg.sender, _stakers[msg.sender][staking].staked);
        }

        stakings[staking].staked -= _stakers[msg.sender][staking].staked;
        totalStaked -= _stakers[msg.sender][staking].staked;

        delete _stakers[msg.sender][staking];
    }

    /**
    * @dev Creates staking 
    */
    function createStaking() external teamOROwner {
        Staking memory staking = Staking(block.timestamp, 0);
        stakings.push(staking);
    }

    /**
    * @dev Returns amount of stakings
    */
    function amountOfStakings() public view returns (uint256) {
        return stakings.length;
    }

    /**
    * @dev Enables/disables staking
    */
    function setStakingState(bool onoff) external teamOROwner {
        stakingEnabled = onoff;
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"_apr","type":"uint256"}],"name":"addStakingAPR","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":[],"name":"amountOfStakings","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":"uint256","name":"","type":"uint256"}],"name":"apr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"staking","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","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":"decreaseStakingAPR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stakerAddr","type":"address"},{"internalType":"uint256","name":"staking","type":"uint256"}],"name":"isStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setStakingState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"internalType":"uint256","name":"staking","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakings","outputs":[{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"uint256","name":"staked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","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","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"staking","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_apr","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"updateStakingAPR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"updateSwapTokensThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"userClaimHistory","outputs":[{"components":[{"internalType":"uint256[]","name":"dates","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct GoldCoin.ClaimHistory","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"staking","type":"uint256"}],"name":"userEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"staking","type":"uint256"}],"name":"userStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawContractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600c805460ff1990811660011790915560188054909116815560808181527f476f6c6420436f696e202d20e78cabe381abe5b08fe588a4000000000000000060a0908152610100604052600260c090815261474360f01b60e05291926200006991600391620004bd565b5080516200007f906004906020840190620004bd565b5050506200009c62000096620002dd60201b60201c565b620002e1565b737a250d5630b4cf539739df2c5dacb4c659f2488d6000818152601b6020527f737a8aa320b777139cfebe450e173d90b49df21bdde0d83dcfdff4abee7622ee805460ff19166001908117909155600680546001600160a01b03191684179055819081906c064f964e68233a76f520000000906064906200011f9083906200063c565b6200012b91906200061b565b60095560646200013d8260026200063c565b6200014991906200061b565b600a556103e86200015c8260016200063c565b6200016891906200061b565b600b55600e849055600f83905560108290558162000187848662000600565b62000193919062000600565b600d55620001a062000333565b600880546001600160a01b0319166001600160a01b0392909216919091179055620001d6620001ce62000333565b600162000342565b620001e330600162000342565b620001f261dead600162000342565b6001601b60006200020262000333565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530808252601b9093529081208054841660019081179091557f6790d4910a095e0e04c8daa388834616a295bac3f59038957b6d0b93a2d2168480549094168117909355601580546001600160a01b0319908116841790915560168054909116831790556017805493840181559052604d7fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1590920191909155620002d29082620003df565b5050505050620006b1565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b031690565b6200034c620002dd565b6008546001600160a01b03908116911614806200038c57506200036e620002dd565b6001600160a01b03166200038162000333565b6001600160a01b0316145b620003b45760405162461bcd60e51b8152600401620003ab9062000563565b60405180910390fd5b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b6001600160a01b038216620004085760405162461bcd60e51b8152600401620003ab90620005c0565b6200041660008383620004b8565b80600260008282546200042a919062000600565b90915550506001600160a01b038216600090815260208190526040812080548392906200045990849062000600565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906200049e908590620005f7565b60405180910390a3620004b460008383620004b8565b5050565b505050565b828054620004cb906200065e565b90600052602060002090601f016020900481019282620004ef57600085556200053a565b82601f106200050a57805160ff19168380011785556200053a565b828001600101855582156200053a579182015b828111156200053a5782518255916020019190600101906200051d565b50620005489291506200054c565b5090565b5b808211156200054857600081556001016200054d565b60208082526035908201527f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660408201527f65722061646472657373206e6f72206f776e65722e0000000000000000000000606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b600082198211156200061657620006166200069b565b500190565b6000826200063757634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156200065957620006596200069b565b500290565b6002810460018216806200067357607f821691505b602082108114156200069557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6134de80620006c16000396000f3fe6080604052600436106102975760003560e01c8063751039fc1161015a578063c4f0c1fc116100c1578063dd62ed3e1161007a578063dd62ed3e1461076e578063df778d261461078e578063f2d03be1146107a3578063f2fde38b146107c3578063f7c618c1146107e3578063f8b45b05146107f85761029e565b8063c4f0c1fc146106cc578063c649e389146106fa578063c69bebe41461070f578063c8c8ebe41461072f578063cef8513914610744578063d54ad2a1146107595761029e565b80638da5cb5b116101135780638da5cb5b1461062257806395d89b4114610637578063a39b21531461064c578063a457c2d71461066c578063a9059cbb1461068c578063c0246668146106ac5761029e565b8063751039fc146105785780637b0472f01461058d578063817b1cd2146105ad57806382d04a12146105c25780638baa63b2146105e25780638c3da91e146106025761029e565b806339509351116101fe5780634fd2bdbb116101b75780634fd2bdbb146104ca57806352b90f8b146104df5780636ceb23a1146104f457806370a0823114610521578063715018a61461054157806372f702f3146105565761029e565b806339509351146104205780633b51e5cf146104405780633dd5b2da146104605780634093e7d5146104755780634a62bb65146104955780634fbee193146104aa5761029e565b806323b872dd1161025057806323b872dd14610369578063245fc1ba14610389578063293230b8146103a95780632e17de78146103be578063313ce567146103de578063379607f5146104005761029e565b806306fdde03146102a3578063095ea7b3146102ce57806313114a9d146102fb57806318160ddd1461031d5780631cfff51b1461033257806322429085146103475761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102b861080d565b6040516102c59190612bde565b60405180910390f35b3480156102da57600080fd5b506102ee6102e9366004612a5a565b61089f565b6040516102c59190612bd3565b34801561030757600080fd5b506103106108c3565b6040516102c5919061333f565b34801561032957600080fd5b506103106108c9565b34801561033e57600080fd5b506102ee6108cf565b34801561035357600080fd5b50610367610362366004612ad8565b6108d8565b005b34801561037557600080fd5b506102ee6103843660046129e6565b61096e565b34801561039557600080fd5b506102ee6103a4366004612a5a565b61099c565b3480156103b557600080fd5b506103676109ca565b3480156103ca57600080fd5b506103676103d9366004612a9f565b610cbc565b3480156103ea57600080fd5b506103f3610e89565b6040516102c591906133c6565b34801561040c57600080fd5b5061036761041b366004612a9f565b610e8e565b34801561042c57600080fd5b506102ee61043b366004612a5a565b610f6b565b34801561044c57600080fd5b5061036761045b366004612a85565b610fb2565b34801561046c57600080fd5b50610367611024565b34801561048157600080fd5b50610310610490366004612a5a565b611060565b3480156104a157600080fd5b506102ee6110af565b3480156104b657600080fd5b506102ee6104c5366004612976565b6110b8565b3480156104d657600080fd5b506103676110da565b3480156104eb57600080fd5b506103106111b0565b34801561050057600080fd5b5061051461050f366004612976565b6111b6565b6040516102c591906132fd565b34801561052d57600080fd5b5061031061053c366004612976565b61128e565b34801561054d57600080fd5b506103676112a9565b34801561056257600080fd5b5061056b6112f4565b6040516102c59190612b6a565b34801561058457600080fd5b50610367611303565b34801561059957600080fd5b506103676105a8366004612ab7565b61136e565b3480156105b957600080fd5b5061031061150e565b3480156105ce57600080fd5b506103676105dd366004612a9f565b611514565b3480156105ee57600080fd5b506102ee6105fd366004612a9f565b6115a5565b34801561060e57600080fd5b5061036761061d366004612ab7565b61168e565b34801561062e57600080fd5b5061056b61174a565b34801561064357600080fd5b506102b8611759565b34801561065857600080fd5b50610310610667366004612a5a565b611768565b34801561067857600080fd5b506102ee610687366004612a5a565b611793565b34801561069857600080fd5b506102ee6106a7366004612a5a565b6117f4565b3480156106b857600080fd5b506103676106c7366004612a26565b61180c565b3480156106d857600080fd5b506106ec6106e7366004612a9f565b611896565b6040516102c59291906133b8565b34801561070657600080fd5b506103676118c4565b34801561071b57600080fd5b5061036761072a366004612976565b61193a565b34801561073b57600080fd5b506103106119bb565b34801561075057600080fd5b506103106119c1565b34801561076557600080fd5b506103106119c7565b34801561077a57600080fd5b506103106107893660046129ae565b6119cd565b34801561079a57600080fd5b506103676119f8565b3480156107af57600080fd5b506103106107be366004612a9f565b611a68565b3480156107cf57600080fd5b506103676107de366004612976565b611a89565b3480156107ef57600080fd5b5061056b611af7565b34801561080457600080fd5b50610310611b06565b60606003805461081c90613442565b80601f016020809104026020016040519081016040528092919081815260200182805461084890613442565b80156108955780601f1061086a57610100808354040283529160200191610895565b820191906000526020600020905b81548152906001019060200180831161087857829003601f168201915b5050505050905090565b6000806108aa611b0c565b90506108b7818585611b10565b60019150505b92915050565b600d5481565b60025490565b60185460ff1681565b6108e0611b0c565b6001600160a01b03166108f161174a565b6001600160a01b0316146109205760405162461bcd60e51b815260040161091790613016565b60405180910390fd5b600e839055600f82905560108190558061093a83856133d4565b61094491906133d4565b600d819055600a10156109695760405162461bcd60e51b815260040161091790612ce3565b505050565b600080610979611b0c565b9050610986858285611bc4565b610991858585611c0e565b506001949350505050565b6001600160a01b039182166000818152601e6020908152604080832094835293905291909120549091161490565b6109d2611b0c565b6008546001600160a01b0390811691161480610a0d57506109f1611b0c565b6001600160a01b0316610a0261174a565b6001600160a01b0316145b610a295760405162461bcd60e51b815260040161091790612f1b565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610a7757600080fd5b505afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf9190612992565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610b0c57600080fd5b505afa158015610b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b449190612992565b6040518363ffffffff1660e01b8152600401610b61929190612b7e565b602060405180830381600087803b158015610b7b57600080fd5b505af1158015610b8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb39190612992565b600780546001600160a01b0319166001600160a01b039283161780825582166000908152601b60209081526040808320805460ff199081166001908117909255945486168452601c9092529091208054909216179055600654610c2191309116610c1c8261128e565b611b10565b6006546001600160a01b031663f305d7194730610c3d8161128e565b600080610c4861174a565b426040518863ffffffff1660e01b8152600401610c6a96959493929190612b98565b6060604051808303818588803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906109699190612b03565b610cc6338261099c565b610ce25760405162461bcd60e51b81526004016109179061304b565b6000610cee3383611060565b60185490915060ff1615610d8457336000908152601f602090815260408220805460018181018355828552838520429201919091559081018054918201815583529082200182905560198054839290610d489084906133d4565b9091555050336000818152601e60209081526040808320868452909152902060020154610d7f9190610d7a9084612138565b61214b565b610dac565b336000818152601e60209081526040808320868452909152902060020154610dac919061214b565b336000908152601e60209081526040808320858452825290912060020154815490919084908110610ded57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001016000828254610e0d919061342b565b9091555050336000908152601e602090815260408083208584529091528120600201546014805491929091610e4390849061342b565b9091555050336000908152601e6020908152604080832094835293905291822080546001600160a01b031916815560018101839055600281018390556003019190915550565b601290565b60185460ff16610eb05760405162461bcd60e51b815260040161091790612fdf565b610eba338261099c565b610ed65760405162461bcd60e51b81526004016109179061304b565b6000610ee23383611060565b336000908152601f6020908152604082208054600181810183558285528385204292019190915590810180549182018155835290822001829055601980549293508392909190610f339084906133d4565b90915550610f439050338261214b565b50336000908152601e6020908152604080832093835292905290812042600182015560030155565b600080610f76611b0c565b6001600160a01b038082166000908152600160209081526040808320938916835292905220549091506108b79082908690610c1c9087906133d4565b610fba611b0c565b6008546001600160a01b0390811691161480610ff55750610fd9611b0c565b6001600160a01b0316610fea61174a565b6001600160a01b0316145b6110115760405162461bcd60e51b815260040161091790612f1b565b6018805460ff1916911515919091179055565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561105d573d6000803e3d6000fd5b50565b60008061106d8484612213565b336000908152601e6020908152604080832087845290915290206003015490915080156110a75761109e8282612138565b925050506108bd565b509392505050565b600c5460ff1681565b6001600160a01b0381166000908152601a602052604090205460ff165b919050565b6110e2611b0c565b6008546001600160a01b039081169116148061111d5750611101611b0c565b6001600160a01b031661111261174a565b6001600160a01b0316145b6111395760405162461bcd60e51b815260040161091790612f1b565b604080518082019091524281526000602080830182815281546001810183559190925291517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb600290930292830155517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bc90910155565b60205490565b6111be61294c565b6001600160a01b0382166000908152601f6020908152604091829020825181546060938102820184018552938101848152909391928492849184018282801561122657602002820191906000526020600020905b815481526020019060010190808311611212575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561127e57602002820191906000526020600020905b81548152602001906001019080831161126a575b5050505050815250509050919050565b6001600160a01b031660009081526020819052604090205490565b6112b1611b0c565b6001600160a01b03166112c261174a565b6001600160a01b0316146112e85760405162461bcd60e51b815260040161091790613016565b6112f26000612318565b565b6015546001600160a01b031681565b61130b611b0c565b6008546001600160a01b0390811691161480611346575061132a611b0c565b6001600160a01b031661133b61174a565b6001600160a01b0316145b6113625760405162461bcd60e51b815260040161091790612f1b565b600c805460ff19169055565b60185460ff166113905760405162461bcd60e51b815260040161091790612fdf565b61139a338261099c565b1561143457336000908152601e60209081526040808320848452909152812060020180548492906113cc9084906133d4565b909155506113dc90503382612213565b336000908152601e60209081526040808320858452909152812060030180549091906114099084906133d4565b9091555050336000908152601e6020908152604080832084845290915290204260019091015561149f565b6040805160808101825233808252426020808401918252838501878152600060608601818152948152601e8352868120888252909252949020925183546001600160a01b0319166001600160a01b039091161783555160018301559151600282015590516003909101555b81602082815481106114c157634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010160008282546114e191906133d4565b9250508190555081601460008282546114fa91906133d4565b9091555061150a9050338361236a565b5050565b60145481565b61151c611b0c565b6001600160a01b031661152d61174a565b6001600160a01b0316146115535760405162461bcd60e51b815260040161091790613016565b806115705760405162461bcd60e51b8152600401610917906132c6565b601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150155565b60006115af611b0c565b6008546001600160a01b03908116911614806115ea57506115ce611b0c565b6001600160a01b03166115df61174a565b6001600160a01b0316145b6116065760405162461bcd60e51b815260040161091790612f1b565b620186a06116126108c9565b61161d90600161340c565b61162791906133ec565b8210156116465760405162461bcd60e51b815260040161091790612ebe565b6103e86116516108c9565b61165c90600561340c565b61166691906133ec565b8211156116855760405162461bcd60e51b815260040161091790612e61565b50600b55600190565b611696611b0c565b6001600160a01b03166116a761174a565b6001600160a01b0316146116cd5760405162461bcd60e51b815260040161091790613016565b81601782815481106116ef57634e487b7160e01b600052603260045260246000fd5b906000526020600020015414156117185760405162461bcd60e51b815260040161091790612c5f565b816017828154811061173a57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001555050565b6005546001600160a01b031690565b60606004805461081c90613442565b6001600160a01b03919091166000908152601e60209081526040808320938352929052206002015490565b60008061179e611b0c565b6001600160a01b03808216600090815260016020908152604080832093891683529290522054909150838110156117e75760405162461bcd60e51b81526004016109179061324a565b6109918286868403611b10565b6000806117ff611b0c565b90506108b7818585611c0e565b611814611b0c565b6008546001600160a01b039081169116148061184f5750611833611b0c565b6001600160a01b031661184461174a565b6001600160a01b0316145b61186b5760405162461bcd60e51b815260040161091790612f1b565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b602081815481106118a657600080fd5b60009182526020909120600290910201805460019091015490915082565b6118cc611b0c565b6001600160a01b03166118dd61174a565b6001600160a01b0316146119035760405162461bcd60e51b815260040161091790613016565b601780548061192257634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055565b611942611b0c565b6008546001600160a01b039081169116148061197d5750611961611b0c565b6001600160a01b031661197261174a565b6001600160a01b0316145b6119995760405162461bcd60e51b815260040161091790612f1b565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60095481565b600b5481565b60195481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611a00611b0c565b6008546001600160a01b0390811691161480611a3b5750611a1f611b0c565b6001600160a01b0316611a3061174a565b6001600160a01b0316145b611a575760405162461bcd60e51b815260040161091790612f1b565b6112f2611a633061128e565b61245b565b60178181548110611a7857600080fd5b600091825260209091200154905081565b611a91611b0c565b6001600160a01b0316611aa261174a565b6001600160a01b031614611ac85760405162461bcd60e51b815260040161091790613016565b6001600160a01b038116611aee5760405162461bcd60e51b815260040161091790612d5c565b61105d81612318565b6016546001600160a01b031681565b600a5481565b3390565b6001600160a01b038316611b365760405162461bcd60e51b815260040161091790613168565b6001600160a01b038216611b5c5760405162461bcd60e51b815260040161091790612da2565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611bb790859061333f565b60405180910390a3505050565b6000611bd084846119cd565b90506000198114611c085781811015611bfb5760405162461bcd60e51b815260040161091790612de4565b611c088484848403611b10565b50505050565b6001600160a01b038316611c345760405162461bcd60e51b815260040161091790613123565b6001600160a01b038216611c5a5760405162461bcd60e51b815260040161091790612ca0565b80611c7057611c6b838360006125e0565b610969565b600c5460ff1615611ee357611c8361174a565b6001600160a01b0316836001600160a01b031614158015611cbd5750611ca761174a565b6001600160a01b0316826001600160a01b031614155b8015611cd457506001600160a01b03821661dead14155b8015611cea5750600754600160a01b900460ff16155b15611ee357611cf761174a565b6001600160a01b0316826001600160a01b031614158015611d2657506006546001600160a01b03838116911614155b8015611d4057506007546001600160a01b03838116911614155b15611d8657326000908152601d60205260409020544311611d735760405162461bcd60e51b815260040161091790612f70565b326000908152601d602052604090204390555b6001600160a01b0383166000908152601c602052604090205460ff168015611dc757506001600160a01b0382166000908152601b602052604090205460ff16155b15611e2757600954811115611dee5760405162461bcd60e51b8152600401610917906131ac565b600a54611dfa8361128e565b611e0490836133d4565b1115611e225760405162461bcd60e51b815260040161091790613213565b611ee3565b6001600160a01b0382166000908152601c602052604090205460ff168015611e6857506001600160a01b0383166000908152601b602052604090205460ff16155b15611e8f57600954811115611e225760405162461bcd60e51b8152600401610917906130bb565b6001600160a01b0382166000908152601b602052604090205460ff16611ee357600a54611ebb8361128e565b611ec590836133d4565b1115611ee35760405162461bcd60e51b815260040161091790613213565b6000611eee3061128e565b600b5490915081108015908190611f0f5750600754600160a01b900460ff16155b8015611f3457506001600160a01b0385166000908152601c602052604090205460ff16155b8015611f5957506001600160a01b0385166000908152601a602052604090205460ff16155b8015611f7e57506001600160a01b0384166000908152601a602052604090205460ff16155b15611fac576007805460ff60a01b1916600160a01b179055611f9e612704565b6007805460ff60a01b191690555b6007546001600160a01b0386166000908152601a602052604090205460ff600160a01b909204821615911680611ffa57506001600160a01b0385166000908152601a602052604090205460ff165b8061204257506001600160a01b0386166000908152601c602052604090205460ff1615801561204257506001600160a01b0385166000908152601c602052604090205460ff16155b1561204b575060005b6000811561212457612073606461206d600d548861287790919063ffffffff16565b90612883565b9050600d54600f5482612086919061340c565b61209091906133ec565b601260008282546120a191906133d4565b9091555050600d546010546120b6908361340c565b6120c091906133ec565b601360008282546120d191906133d4565b9091555050600d54600e546120e6908361340c565b6120f091906133ec565b6011600082825461210191906133d4565b90915550508015612117576121178730836125e0565b612121818661342b565b94505b61212f8787876125e0565b50505050505050565b600061214482846133d4565b9392505050565b6001600160a01b0382166121715760405162461bcd60e51b81526004016109179061328f565b61217d60008383610969565b806002600082825461218f91906133d4565b90915550506001600160a01b038216600090815260208190526040812080548392906121bc9084906133d4565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906121ff90859061333f565b60405180910390a361150a60008383610969565b600061221f838361099c565b61223b5760405162461bcd60e51b815260040161091790612c31565b60006122478484611768565b6001600160a01b0385166000908152601e602090815260408083208784529091528120600190810154929350909161227e91612883565b9050600061228d426001612883565b9050600061229b828461288f565b905060006122e2606461206d60178a815481106122c857634e487b7160e01b600052603260045260246000fd5b90600052602060002001548861287790919063ffffffff16565b905060006122fc603c61206d81816018818861016d612883565b9050600061230a8285612877565b9a9950505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166123905760405162461bcd60e51b81526004016109179061307a565b61239c82600083610969565b6001600160a01b038216600090815260208190526040902054818110156123d55760405162461bcd60e51b815260040161091790612d1a565b6001600160a01b038316600090815260208190526040812083830390556002805484929061240490849061342b565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061244790869061333f565b60405180910390a361096983600084610969565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061249e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156124f257600080fd5b505afa158015612506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252a9190612992565b8160018151811061254b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526006546125719130911684611b10565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906125aa908590600090869030904290600401613348565b600060405180830381600087803b1580156125c457600080fd5b505af11580156125d8573d6000803e3d6000fd5b505050505050565b6001600160a01b0383166126065760405162461bcd60e51b815260040161091790613123565b6001600160a01b03821661262c5760405162461bcd60e51b815260040161091790612ca0565b612637838383610969565b6001600160a01b038316600090815260208190526040902054818110156126705760405162461bcd60e51b815260040161091790612e1b565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906126a79084906133d4565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126f1919061333f565b60405180910390a3611c08848484610969565b600061270f3061128e565b9050600060135460115460125461272691906133d4565b61273091906133d4565b905081158061273d575080155b156127495750506112f2565b600b5482111561275957600b5491505b60006002826012548561276c919061340c565b61277691906133ec565b61278091906133ec565b9050600061278e848361288f565b90504761279a8261245b565b60006127a6478361288f565b905060006127c38661206d6011548561287790919063ffffffff16565b905060006127e08761206d6013548661287790919063ffffffff16565b90506000816127ef848661342b565b6127f9919061342b565b6000601281905560118190556013556008549091506001600160a01b03166108fc6128248585612138565b6040518115909202916000818181858888f1935050505015801561284c573d6000803e3d6000fd5b5060008711801561285d5750600081115b1561286c5761286c878261289b565b505050505050505050565b6000612144828461340c565b600061214482846133ec565b6000612144828461342b565b6006546128b39030906001600160a01b031684611b10565b60065460085460405163f305d71960e01b81526001600160a01b039283169263f305d7199285926128f39230928992600092839216904290600401612b98565b6060604051808303818588803b15801561290c57600080fd5b505af1158015612920573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129459190612b03565b5050505050565b604051806040016040528060608152602001606081525090565b803580151581146110d557600080fd5b600060208284031215612987578081fd5b813561214481613493565b6000602082840312156129a3578081fd5b815161214481613493565b600080604083850312156129c0578081fd5b82356129cb81613493565b915060208301356129db81613493565b809150509250929050565b6000806000606084860312156129fa578081fd5b8335612a0581613493565b92506020840135612a1581613493565b929592945050506040919091013590565b60008060408385031215612a38578182fd5b8235612a4381613493565b9150612a5160208401612966565b90509250929050565b60008060408385031215612a6c578182fd5b8235612a7781613493565b946020939093013593505050565b600060208284031215612a96578081fd5b61214482612966565b600060208284031215612ab0578081fd5b5035919050565b60008060408385031215612ac9578182fd5b50508035926020909101359150565b600080600060608486031215612aec578283fd5b505081359360208301359350604090920135919050565b600080600060608486031215612b17578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015612b5f57815187529582019590820190600101612b43565b509495945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b6000602080835283518082850152825b81811015612c0a57858101830151858201604001528201612bee565b81811115612c1b5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601490820152732ab9b2b91034b9903737ba1039ba30b5b4b7339760611b604082015260600190565b60208082526021908201527f63616e206e6f74207570646174652061707220746f2073616d652076616c75656040820152602160f81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601d908201527f4d757374206b656570206665657320617420313025206f72206c657373000000604082015260600190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601d908201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526037908201527f53776170207468726573686f6c642063616e6e6f74206265206869676865722060408201527f7468616e20302e352520746f74616c20737570706c792e000000000000000000606082015260800190565b60208082526038908201527f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460408201527f68616e20302e3030312520746f74616c20737570706c792e0000000000000000606082015260800190565b60208082526035908201527f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660408201527432b91030b2323932b9b9903737b91037bbb732b91760591b606082015260800190565b60208082526049908201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60408201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6060820152681030b63637bbb2b21760b91b608082015260a00190565b60208082526017908201527f5374616b696e67206973206e6f7420656e61626c65642e000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260159082015274596f7520617265206e6f74207374616b696e67213f60581b604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526042908201527f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460408201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e6060820152613a1760f11b608082015260a00190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526041908201527f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060408201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e746060820152601760f91b608082015260a00190565b6020808252601f908201527f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b6020808252601b908201527f63616e206e6f74207570646174652061707220746f207a65726f210000000000604082015260600190565b6000602082528251604060208401526133196060840182612b30565b90506020840151601f198483030160408501526133368282612b30565b95945050505050565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156133975784516001600160a01b031683529383019391830191600101613372565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b60ff91909116815260200190565b600082198211156133e7576133e761347d565b500190565b60008261340757634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156134265761342661347d565b500290565b60008282101561343d5761343d61347d565b500390565b60028104600182168061345657607f821691505b6020821081141561347757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461105d57600080fdfea26469706673582212209609dc6e2e37a46958d7a0772166d4ac5e41891f3b1eaadf762fde7e373a5d2364736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102975760003560e01c8063751039fc1161015a578063c4f0c1fc116100c1578063dd62ed3e1161007a578063dd62ed3e1461076e578063df778d261461078e578063f2d03be1146107a3578063f2fde38b146107c3578063f7c618c1146107e3578063f8b45b05146107f85761029e565b8063c4f0c1fc146106cc578063c649e389146106fa578063c69bebe41461070f578063c8c8ebe41461072f578063cef8513914610744578063d54ad2a1146107595761029e565b80638da5cb5b116101135780638da5cb5b1461062257806395d89b4114610637578063a39b21531461064c578063a457c2d71461066c578063a9059cbb1461068c578063c0246668146106ac5761029e565b8063751039fc146105785780637b0472f01461058d578063817b1cd2146105ad57806382d04a12146105c25780638baa63b2146105e25780638c3da91e146106025761029e565b806339509351116101fe5780634fd2bdbb116101b75780634fd2bdbb146104ca57806352b90f8b146104df5780636ceb23a1146104f457806370a0823114610521578063715018a61461054157806372f702f3146105565761029e565b806339509351146104205780633b51e5cf146104405780633dd5b2da146104605780634093e7d5146104755780634a62bb65146104955780634fbee193146104aa5761029e565b806323b872dd1161025057806323b872dd14610369578063245fc1ba14610389578063293230b8146103a95780632e17de78146103be578063313ce567146103de578063379607f5146104005761029e565b806306fdde03146102a3578063095ea7b3146102ce57806313114a9d146102fb57806318160ddd1461031d5780631cfff51b1461033257806322429085146103475761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102b861080d565b6040516102c59190612bde565b60405180910390f35b3480156102da57600080fd5b506102ee6102e9366004612a5a565b61089f565b6040516102c59190612bd3565b34801561030757600080fd5b506103106108c3565b6040516102c5919061333f565b34801561032957600080fd5b506103106108c9565b34801561033e57600080fd5b506102ee6108cf565b34801561035357600080fd5b50610367610362366004612ad8565b6108d8565b005b34801561037557600080fd5b506102ee6103843660046129e6565b61096e565b34801561039557600080fd5b506102ee6103a4366004612a5a565b61099c565b3480156103b557600080fd5b506103676109ca565b3480156103ca57600080fd5b506103676103d9366004612a9f565b610cbc565b3480156103ea57600080fd5b506103f3610e89565b6040516102c591906133c6565b34801561040c57600080fd5b5061036761041b366004612a9f565b610e8e565b34801561042c57600080fd5b506102ee61043b366004612a5a565b610f6b565b34801561044c57600080fd5b5061036761045b366004612a85565b610fb2565b34801561046c57600080fd5b50610367611024565b34801561048157600080fd5b50610310610490366004612a5a565b611060565b3480156104a157600080fd5b506102ee6110af565b3480156104b657600080fd5b506102ee6104c5366004612976565b6110b8565b3480156104d657600080fd5b506103676110da565b3480156104eb57600080fd5b506103106111b0565b34801561050057600080fd5b5061051461050f366004612976565b6111b6565b6040516102c591906132fd565b34801561052d57600080fd5b5061031061053c366004612976565b61128e565b34801561054d57600080fd5b506103676112a9565b34801561056257600080fd5b5061056b6112f4565b6040516102c59190612b6a565b34801561058457600080fd5b50610367611303565b34801561059957600080fd5b506103676105a8366004612ab7565b61136e565b3480156105b957600080fd5b5061031061150e565b3480156105ce57600080fd5b506103676105dd366004612a9f565b611514565b3480156105ee57600080fd5b506102ee6105fd366004612a9f565b6115a5565b34801561060e57600080fd5b5061036761061d366004612ab7565b61168e565b34801561062e57600080fd5b5061056b61174a565b34801561064357600080fd5b506102b8611759565b34801561065857600080fd5b50610310610667366004612a5a565b611768565b34801561067857600080fd5b506102ee610687366004612a5a565b611793565b34801561069857600080fd5b506102ee6106a7366004612a5a565b6117f4565b3480156106b857600080fd5b506103676106c7366004612a26565b61180c565b3480156106d857600080fd5b506106ec6106e7366004612a9f565b611896565b6040516102c59291906133b8565b34801561070657600080fd5b506103676118c4565b34801561071b57600080fd5b5061036761072a366004612976565b61193a565b34801561073b57600080fd5b506103106119bb565b34801561075057600080fd5b506103106119c1565b34801561076557600080fd5b506103106119c7565b34801561077a57600080fd5b506103106107893660046129ae565b6119cd565b34801561079a57600080fd5b506103676119f8565b3480156107af57600080fd5b506103106107be366004612a9f565b611a68565b3480156107cf57600080fd5b506103676107de366004612976565b611a89565b3480156107ef57600080fd5b5061056b611af7565b34801561080457600080fd5b50610310611b06565b60606003805461081c90613442565b80601f016020809104026020016040519081016040528092919081815260200182805461084890613442565b80156108955780601f1061086a57610100808354040283529160200191610895565b820191906000526020600020905b81548152906001019060200180831161087857829003601f168201915b5050505050905090565b6000806108aa611b0c565b90506108b7818585611b10565b60019150505b92915050565b600d5481565b60025490565b60185460ff1681565b6108e0611b0c565b6001600160a01b03166108f161174a565b6001600160a01b0316146109205760405162461bcd60e51b815260040161091790613016565b60405180910390fd5b600e839055600f82905560108190558061093a83856133d4565b61094491906133d4565b600d819055600a10156109695760405162461bcd60e51b815260040161091790612ce3565b505050565b600080610979611b0c565b9050610986858285611bc4565b610991858585611c0e565b506001949350505050565b6001600160a01b039182166000818152601e6020908152604080832094835293905291909120549091161490565b6109d2611b0c565b6008546001600160a01b0390811691161480610a0d57506109f1611b0c565b6001600160a01b0316610a0261174a565b6001600160a01b0316145b610a295760405162461bcd60e51b815260040161091790612f1b565b600660009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015610a7757600080fd5b505afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf9190612992565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610b0c57600080fd5b505afa158015610b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b449190612992565b6040518363ffffffff1660e01b8152600401610b61929190612b7e565b602060405180830381600087803b158015610b7b57600080fd5b505af1158015610b8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb39190612992565b600780546001600160a01b0319166001600160a01b039283161780825582166000908152601b60209081526040808320805460ff199081166001908117909255945486168452601c9092529091208054909216179055600654610c2191309116610c1c8261128e565b611b10565b6006546001600160a01b031663f305d7194730610c3d8161128e565b600080610c4861174a565b426040518863ffffffff1660e01b8152600401610c6a96959493929190612b98565b6060604051808303818588803b158015610c8357600080fd5b505af1158015610c97573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906109699190612b03565b610cc6338261099c565b610ce25760405162461bcd60e51b81526004016109179061304b565b6000610cee3383611060565b60185490915060ff1615610d8457336000908152601f602090815260408220805460018181018355828552838520429201919091559081018054918201815583529082200182905560198054839290610d489084906133d4565b9091555050336000818152601e60209081526040808320868452909152902060020154610d7f9190610d7a9084612138565b61214b565b610dac565b336000818152601e60209081526040808320868452909152902060020154610dac919061214b565b336000908152601e60209081526040808320858452825290912060020154815490919084908110610ded57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001016000828254610e0d919061342b565b9091555050336000908152601e602090815260408083208584529091528120600201546014805491929091610e4390849061342b565b9091555050336000908152601e6020908152604080832094835293905291822080546001600160a01b031916815560018101839055600281018390556003019190915550565b601290565b60185460ff16610eb05760405162461bcd60e51b815260040161091790612fdf565b610eba338261099c565b610ed65760405162461bcd60e51b81526004016109179061304b565b6000610ee23383611060565b336000908152601f6020908152604082208054600181810183558285528385204292019190915590810180549182018155835290822001829055601980549293508392909190610f339084906133d4565b90915550610f439050338261214b565b50336000908152601e6020908152604080832093835292905290812042600182015560030155565b600080610f76611b0c565b6001600160a01b038082166000908152600160209081526040808320938916835292905220549091506108b79082908690610c1c9087906133d4565b610fba611b0c565b6008546001600160a01b0390811691161480610ff55750610fd9611b0c565b6001600160a01b0316610fea61174a565b6001600160a01b0316145b6110115760405162461bcd60e51b815260040161091790612f1b565b6018805460ff1916911515919091179055565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561105d573d6000803e3d6000fd5b50565b60008061106d8484612213565b336000908152601e6020908152604080832087845290915290206003015490915080156110a75761109e8282612138565b925050506108bd565b509392505050565b600c5460ff1681565b6001600160a01b0381166000908152601a602052604090205460ff165b919050565b6110e2611b0c565b6008546001600160a01b039081169116148061111d5750611101611b0c565b6001600160a01b031661111261174a565b6001600160a01b0316145b6111395760405162461bcd60e51b815260040161091790612f1b565b604080518082019091524281526000602080830182815281546001810183559190925291517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb600290930292830155517fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bc90910155565b60205490565b6111be61294c565b6001600160a01b0382166000908152601f6020908152604091829020825181546060938102820184018552938101848152909391928492849184018282801561122657602002820191906000526020600020905b815481526020019060010190808311611212575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561127e57602002820191906000526020600020905b81548152602001906001019080831161126a575b5050505050815250509050919050565b6001600160a01b031660009081526020819052604090205490565b6112b1611b0c565b6001600160a01b03166112c261174a565b6001600160a01b0316146112e85760405162461bcd60e51b815260040161091790613016565b6112f26000612318565b565b6015546001600160a01b031681565b61130b611b0c565b6008546001600160a01b0390811691161480611346575061132a611b0c565b6001600160a01b031661133b61174a565b6001600160a01b0316145b6113625760405162461bcd60e51b815260040161091790612f1b565b600c805460ff19169055565b60185460ff166113905760405162461bcd60e51b815260040161091790612fdf565b61139a338261099c565b1561143457336000908152601e60209081526040808320848452909152812060020180548492906113cc9084906133d4565b909155506113dc90503382612213565b336000908152601e60209081526040808320858452909152812060030180549091906114099084906133d4565b9091555050336000908152601e6020908152604080832084845290915290204260019091015561149f565b6040805160808101825233808252426020808401918252838501878152600060608601818152948152601e8352868120888252909252949020925183546001600160a01b0319166001600160a01b039091161783555160018301559151600282015590516003909101555b81602082815481106114c157634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010160008282546114e191906133d4565b9250508190555081601460008282546114fa91906133d4565b9091555061150a9050338361236a565b5050565b60145481565b61151c611b0c565b6001600160a01b031661152d61174a565b6001600160a01b0316146115535760405162461bcd60e51b815260040161091790613016565b806115705760405162461bcd60e51b8152600401610917906132c6565b601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c150155565b60006115af611b0c565b6008546001600160a01b03908116911614806115ea57506115ce611b0c565b6001600160a01b03166115df61174a565b6001600160a01b0316145b6116065760405162461bcd60e51b815260040161091790612f1b565b620186a06116126108c9565b61161d90600161340c565b61162791906133ec565b8210156116465760405162461bcd60e51b815260040161091790612ebe565b6103e86116516108c9565b61165c90600561340c565b61166691906133ec565b8211156116855760405162461bcd60e51b815260040161091790612e61565b50600b55600190565b611696611b0c565b6001600160a01b03166116a761174a565b6001600160a01b0316146116cd5760405162461bcd60e51b815260040161091790613016565b81601782815481106116ef57634e487b7160e01b600052603260045260246000fd5b906000526020600020015414156117185760405162461bcd60e51b815260040161091790612c5f565b816017828154811061173a57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001555050565b6005546001600160a01b031690565b60606004805461081c90613442565b6001600160a01b03919091166000908152601e60209081526040808320938352929052206002015490565b60008061179e611b0c565b6001600160a01b03808216600090815260016020908152604080832093891683529290522054909150838110156117e75760405162461bcd60e51b81526004016109179061324a565b6109918286868403611b10565b6000806117ff611b0c565b90506108b7818585611c0e565b611814611b0c565b6008546001600160a01b039081169116148061184f5750611833611b0c565b6001600160a01b031661184461174a565b6001600160a01b0316145b61186b5760405162461bcd60e51b815260040161091790612f1b565b6001600160a01b03919091166000908152601a60205260409020805460ff1916911515919091179055565b602081815481106118a657600080fd5b60009182526020909120600290910201805460019091015490915082565b6118cc611b0c565b6001600160a01b03166118dd61174a565b6001600160a01b0316146119035760405162461bcd60e51b815260040161091790613016565b601780548061192257634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055565b611942611b0c565b6008546001600160a01b039081169116148061197d5750611961611b0c565b6001600160a01b031661197261174a565b6001600160a01b0316145b6119995760405162461bcd60e51b815260040161091790612f1b565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60095481565b600b5481565b60195481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611a00611b0c565b6008546001600160a01b0390811691161480611a3b5750611a1f611b0c565b6001600160a01b0316611a3061174a565b6001600160a01b0316145b611a575760405162461bcd60e51b815260040161091790612f1b565b6112f2611a633061128e565b61245b565b60178181548110611a7857600080fd5b600091825260209091200154905081565b611a91611b0c565b6001600160a01b0316611aa261174a565b6001600160a01b031614611ac85760405162461bcd60e51b815260040161091790613016565b6001600160a01b038116611aee5760405162461bcd60e51b815260040161091790612d5c565b61105d81612318565b6016546001600160a01b031681565b600a5481565b3390565b6001600160a01b038316611b365760405162461bcd60e51b815260040161091790613168565b6001600160a01b038216611b5c5760405162461bcd60e51b815260040161091790612da2565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611bb790859061333f565b60405180910390a3505050565b6000611bd084846119cd565b90506000198114611c085781811015611bfb5760405162461bcd60e51b815260040161091790612de4565b611c088484848403611b10565b50505050565b6001600160a01b038316611c345760405162461bcd60e51b815260040161091790613123565b6001600160a01b038216611c5a5760405162461bcd60e51b815260040161091790612ca0565b80611c7057611c6b838360006125e0565b610969565b600c5460ff1615611ee357611c8361174a565b6001600160a01b0316836001600160a01b031614158015611cbd5750611ca761174a565b6001600160a01b0316826001600160a01b031614155b8015611cd457506001600160a01b03821661dead14155b8015611cea5750600754600160a01b900460ff16155b15611ee357611cf761174a565b6001600160a01b0316826001600160a01b031614158015611d2657506006546001600160a01b03838116911614155b8015611d4057506007546001600160a01b03838116911614155b15611d8657326000908152601d60205260409020544311611d735760405162461bcd60e51b815260040161091790612f70565b326000908152601d602052604090204390555b6001600160a01b0383166000908152601c602052604090205460ff168015611dc757506001600160a01b0382166000908152601b602052604090205460ff16155b15611e2757600954811115611dee5760405162461bcd60e51b8152600401610917906131ac565b600a54611dfa8361128e565b611e0490836133d4565b1115611e225760405162461bcd60e51b815260040161091790613213565b611ee3565b6001600160a01b0382166000908152601c602052604090205460ff168015611e6857506001600160a01b0383166000908152601b602052604090205460ff16155b15611e8f57600954811115611e225760405162461bcd60e51b8152600401610917906130bb565b6001600160a01b0382166000908152601b602052604090205460ff16611ee357600a54611ebb8361128e565b611ec590836133d4565b1115611ee35760405162461bcd60e51b815260040161091790613213565b6000611eee3061128e565b600b5490915081108015908190611f0f5750600754600160a01b900460ff16155b8015611f3457506001600160a01b0385166000908152601c602052604090205460ff16155b8015611f5957506001600160a01b0385166000908152601a602052604090205460ff16155b8015611f7e57506001600160a01b0384166000908152601a602052604090205460ff16155b15611fac576007805460ff60a01b1916600160a01b179055611f9e612704565b6007805460ff60a01b191690555b6007546001600160a01b0386166000908152601a602052604090205460ff600160a01b909204821615911680611ffa57506001600160a01b0385166000908152601a602052604090205460ff165b8061204257506001600160a01b0386166000908152601c602052604090205460ff1615801561204257506001600160a01b0385166000908152601c602052604090205460ff16155b1561204b575060005b6000811561212457612073606461206d600d548861287790919063ffffffff16565b90612883565b9050600d54600f5482612086919061340c565b61209091906133ec565b601260008282546120a191906133d4565b9091555050600d546010546120b6908361340c565b6120c091906133ec565b601360008282546120d191906133d4565b9091555050600d54600e546120e6908361340c565b6120f091906133ec565b6011600082825461210191906133d4565b90915550508015612117576121178730836125e0565b612121818661342b565b94505b61212f8787876125e0565b50505050505050565b600061214482846133d4565b9392505050565b6001600160a01b0382166121715760405162461bcd60e51b81526004016109179061328f565b61217d60008383610969565b806002600082825461218f91906133d4565b90915550506001600160a01b038216600090815260208190526040812080548392906121bc9084906133d4565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906121ff90859061333f565b60405180910390a361150a60008383610969565b600061221f838361099c565b61223b5760405162461bcd60e51b815260040161091790612c31565b60006122478484611768565b6001600160a01b0385166000908152601e602090815260408083208784529091528120600190810154929350909161227e91612883565b9050600061228d426001612883565b9050600061229b828461288f565b905060006122e2606461206d60178a815481106122c857634e487b7160e01b600052603260045260246000fd5b90600052602060002001548861287790919063ffffffff16565b905060006122fc603c61206d81816018818861016d612883565b9050600061230a8285612877565b9a9950505050505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166123905760405162461bcd60e51b81526004016109179061307a565b61239c82600083610969565b6001600160a01b038216600090815260208190526040902054818110156123d55760405162461bcd60e51b815260040161091790612d1a565b6001600160a01b038316600090815260208190526040812083830390556002805484929061240490849061342b565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061244790869061333f565b60405180910390a361096983600084610969565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061249e57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156124f257600080fd5b505afa158015612506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252a9190612992565b8160018151811061254b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526006546125719130911684611b10565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906125aa908590600090869030904290600401613348565b600060405180830381600087803b1580156125c457600080fd5b505af11580156125d8573d6000803e3d6000fd5b505050505050565b6001600160a01b0383166126065760405162461bcd60e51b815260040161091790613123565b6001600160a01b03821661262c5760405162461bcd60e51b815260040161091790612ca0565b612637838383610969565b6001600160a01b038316600090815260208190526040902054818110156126705760405162461bcd60e51b815260040161091790612e1b565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906126a79084906133d4565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126f1919061333f565b60405180910390a3611c08848484610969565b600061270f3061128e565b9050600060135460115460125461272691906133d4565b61273091906133d4565b905081158061273d575080155b156127495750506112f2565b600b5482111561275957600b5491505b60006002826012548561276c919061340c565b61277691906133ec565b61278091906133ec565b9050600061278e848361288f565b90504761279a8261245b565b60006127a6478361288f565b905060006127c38661206d6011548561287790919063ffffffff16565b905060006127e08761206d6013548661287790919063ffffffff16565b90506000816127ef848661342b565b6127f9919061342b565b6000601281905560118190556013556008549091506001600160a01b03166108fc6128248585612138565b6040518115909202916000818181858888f1935050505015801561284c573d6000803e3d6000fd5b5060008711801561285d5750600081115b1561286c5761286c878261289b565b505050505050505050565b6000612144828461340c565b600061214482846133ec565b6000612144828461342b565b6006546128b39030906001600160a01b031684611b10565b60065460085460405163f305d71960e01b81526001600160a01b039283169263f305d7199285926128f39230928992600092839216904290600401612b98565b6060604051808303818588803b15801561290c57600080fd5b505af1158015612920573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129459190612b03565b5050505050565b604051806040016040528060608152602001606081525090565b803580151581146110d557600080fd5b600060208284031215612987578081fd5b813561214481613493565b6000602082840312156129a3578081fd5b815161214481613493565b600080604083850312156129c0578081fd5b82356129cb81613493565b915060208301356129db81613493565b809150509250929050565b6000806000606084860312156129fa578081fd5b8335612a0581613493565b92506020840135612a1581613493565b929592945050506040919091013590565b60008060408385031215612a38578182fd5b8235612a4381613493565b9150612a5160208401612966565b90509250929050565b60008060408385031215612a6c578182fd5b8235612a7781613493565b946020939093013593505050565b600060208284031215612a96578081fd5b61214482612966565b600060208284031215612ab0578081fd5b5035919050565b60008060408385031215612ac9578182fd5b50508035926020909101359150565b600080600060608486031215612aec578283fd5b505081359360208301359350604090920135919050565b600080600060608486031215612b17578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015612b5f57815187529582019590820190600101612b43565b509495945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b901515815260200190565b6000602080835283518082850152825b81811015612c0a57858101830151858201604001528201612bee565b81811115612c1b5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601490820152732ab9b2b91034b9903737ba1039ba30b5b4b7339760611b604082015260600190565b60208082526021908201527f63616e206e6f74207570646174652061707220746f2073616d652076616c75656040820152602160f81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601d908201527f4d757374206b656570206665657320617420313025206f72206c657373000000604082015260600190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601d908201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526037908201527f53776170207468726573686f6c642063616e6e6f74206265206869676865722060408201527f7468616e20302e352520746f74616c20737570706c792e000000000000000000606082015260800190565b60208082526038908201527f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460408201527f68616e20302e3030312520746f74616c20737570706c792e0000000000000000606082015260800190565b60208082526035908201527f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660408201527432b91030b2323932b9b9903737b91037bbb732b91760591b606082015260800190565b60208082526049908201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60408201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6060820152681030b63637bbb2b21760b91b608082015260a00190565b60208082526017908201527f5374616b696e67206973206e6f7420656e61626c65642e000000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260159082015274596f7520617265206e6f74207374616b696e67213f60581b604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526042908201527f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460408201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e6060820152613a1760f11b608082015260a00190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526041908201527f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060408201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e746060820152601760f91b608082015260a00190565b6020808252601f908201527f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b6020808252601b908201527f63616e206e6f74207570646174652061707220746f207a65726f210000000000604082015260600190565b6000602082528251604060208401526133196060840182612b30565b90506020840151601f198483030160408501526133368282612b30565b95945050505050565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156133975784516001600160a01b031683529383019391830191600101613372565b50506001600160a01b03969096166060850152505050608001529392505050565b918252602082015260400190565b60ff91909116815260200190565b600082198211156133e7576133e761347d565b500190565b60008261340757634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156134265761342661347d565b500290565b60008282101561343d5761343d61347d565b500390565b60028104600182168061345657607f821691505b6020821081141561347757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461105d57600080fdfea26469706673582212209609dc6e2e37a46958d7a0772166d4ac5e41891f3b1eaadf762fde7e373a5d2364736f6c63430008000033

Deployed Bytecode Sourcemap

18173:17206:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1649:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2581:201;;;;;;;;;;-1:-1:-1;2581:201:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18582:24::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1970:108::-;;;;;;;;;;;;;:::i;19012:34::-;;;;;;;;;;;;;:::i;23087:366::-;;;;;;;;;;-1:-1:-1;23087:366:0;;;;;:::i;:::-;;:::i;:::-;;2790:295;;;;;;;;;;-1:-1:-1;2790:295:0;;;;;:::i;:::-;;:::i;30956:159::-;;;;;;;;;;-1:-1:-1;30956:159:0;;;;;:::i;:::-;;:::i;21997:638::-;;;;;;;;;;;;;:::i;34054:757::-;;;;;;;;;;-1:-1:-1;34054:757:0;;;;;:::i;:::-;;:::i;1869:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33460:513::-;;;;;;;;;;-1:-1:-1;33460:513:0;;;;;:::i;:::-;;:::i;3093:240::-;;;;;;;;;;-1:-1:-1;3093:240:0;;;;;:::i;:::-;;:::i;35240:99::-;;;;;;;;;;-1:-1:-1;35240:99:0;;;;;:::i;:::-;;:::i;30496:116::-;;;;;;;;;;;;;:::i;31614:346::-;;;;;;;;;;-1:-1:-1;31614:346:0;;;;;:::i;:::-;;:::i;18540:33::-;;;;;;;;;;;;;:::i;24768:127::-;;;;;;;;;;-1:-1:-1;24768:127:0;;;;;:::i;:::-;;:::i;34865:150::-;;;;;;;;;;;;;:::i;35079:99::-;;;;;;;;;;;;;:::i;31411:131::-;;;;;;;;;;-1:-1:-1;31411:131:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2086:127::-;;;;;;;;;;-1:-1:-1;2086:127:0;;;;;:::i;:::-;;:::i;15011:103::-;;;;;;;;;;;;;:::i;18915:27::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22717:86::-;;;;;;;;;;;;;:::i;32716:661::-;;;;;;;;;;-1:-1:-1;32716:661:0;;;;;:::i;:::-;;:::i;18882:26::-;;;;;;;;;;;;;:::i;23461:150::-;;;;;;;;;;-1:-1:-1;23461:150:0;;;;;:::i;:::-;;:::i;24270:404::-;;;;;;;;;;-1:-1:-1;24270:404:0;;;;;:::i;:::-;;:::i;23704:190::-;;;;;;;;;;-1:-1:-1;23704:190:0;;;;;:::i;:::-;;:::i;14788:87::-;;;;;;;;;;;;;:::i;1757:104::-;;;;;;;;;;;;;:::i;31187:141::-;;;;;;;;;;-1:-1:-1;31187:141:0;;;;;:::i;:::-;;:::i;3341:438::-;;;;;;;;;;-1:-1:-1;3341:438:0;;;;;:::i;:::-;;:::i;2221:193::-;;;;;;;;;;-1:-1:-1;2221:193:0;;;;;:::i;:::-;;:::i;22869:134::-;;;;;;;;;;-1:-1:-1;22869:134:0;;;;;:::i;:::-;;:::i;20069:25::-;;;;;;;;;;-1:-1:-1;20069:25:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;23619:77::-;;;;;;;;;;;;;:::i;23983:114::-;;;;;;;;;;-1:-1:-1;23983:114:0;;;;;:::i;:::-;;:::i;18414:35::-;;;;;;;;;;;;;:::i;18489:34::-;;;;;;;;;;;;;:::i;19053:27::-;;;;;;;;;;;;;:::i;2422:151::-;;;;;;;;;;-1:-1:-1;2422:151:0;;;;;:::i;:::-;;:::i;30705:104::-;;;;;;;;;;;;;:::i;18982:21::-;;;;;;;;;;-1:-1:-1;18982:21:0;;;;;:::i;:::-;;:::i;15122:201::-;;;;;;;;;;-1:-1:-1;15122:201:0;;;;;:::i;:::-;;:::i;18949:26::-;;;;;;;;;;;;;:::i;18456:24::-;;;;;;;;;;;;;:::i;1649:100::-;1703:13;1736:5;1729:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1649:100;:::o;2581:201::-;2664:4;2681:13;2697:12;:10;:12::i;:::-;2681:28;;2720:32;2729:5;2736:7;2745:6;2720:8;:32::i;:::-;2770:4;2763:11;;;2581:201;;;;;:::o;18582:24::-;;;;:::o;1970:108::-;2058:12;;1970:108;:::o;19012:34::-;;;;;;:::o;23087:366::-;14934:12;:10;:12::i;:::-;-1:-1:-1;;;;;14923:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14923:23:0;;14915:68;;;;-1:-1:-1;;;14915:68:0;;;;;;;:::i;:::-;;;;;;;;;23202:13:::1;:28:::0;;;23241:13:::1;:28:::0;;;23280:12:::1;:26:::0;;;23295:11;23331:29:::1;23257:12:::0;23218;23331:29:::1;:::i;:::-;:44;;;;:::i;:::-;23319:9;:56:::0;;;23409:2:::1;-1:-1:-1::0;23396:15:0::1;23388:57;;;;-1:-1:-1::0;;;23388:57:0::1;;;;;;;:::i;:::-;23087:366:::0;;;:::o;2790:295::-;2921:4;2938:15;2956:12;:10;:12::i;:::-;2938:30;;2979:38;2995:4;3001:7;3010:6;2979:15;:38::i;:::-;3028:27;3038:4;3044:2;3048:6;3028:9;:27::i;:::-;-1:-1:-1;3073:4:0;;2790:295;-1:-1:-1;;;;2790:295:0:o;30956:159::-;-1:-1:-1;;;;;31057:50:0;;;31033:4;31057:20;;;:8;:20;;;;;;;;:29;;;;;;;;;;:36;;;;:50;;30956:159::o;21997:638::-;20260:12;:10;:12::i;:::-;20240:16;;-1:-1:-1;;;;;20240:16:0;;;:32;;;;:59;;;20287:12;:10;:12::i;:::-;-1:-1:-1;;;;;20276:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20276:23:0;;20240:59;20232:125;;;;-1:-1:-1;;;20232:125:0;;;;;;;:::i;:::-;22087:15:::1;;;;;;;;;-1:-1:-1::0;;;;;22087:15:0::1;-1:-1:-1::0;;;;;22087:23:0::1;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22069:55:0::1;;22133:4;22140:15;;;;;;;;;-1:-1:-1::0;;;;;22140:15:0::1;-1:-1:-1::0;;;;;22140:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22069:94;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22053:13;:110:::0;;-1:-1:-1;;;;;;22053:110:0::1;-1:-1:-1::0;;;;;22053:110:0;;::::1;;::::0;;;22214:13;::::1;-1:-1:-1::0;22174:55:0;;;:31:::1;:55;::::0;;;;;;;:62;;-1:-1:-1;;22174:62:0;;::::1;-1:-1:-1::0;22174:62:0;;::::1;::::0;;;22282:13;;;::::1;22247:50:::0;;:26:::1;:50:::0;;;;;;:57;;;;::::1;;::::0;;22349:15:::1;::::0;22317:75:::1;::::0;22334:4:::1;::::0;22349:15:::1;22367:24;22334:4:::0;22367:9:::1;:24::i;:::-;22317:8;:75::i;:::-;22403:15;::::0;-1:-1:-1;;;;;22403:15:0::1;:31;22442:21;22488:4;22508:24;22488:4:::0;22508:9:::1;:24::i;:::-;22547:1;22563::::0;22579:7:::1;:5;:7::i;:::-;22601:15;22403:224;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34054:757::-:0;34116:30;34126:10;34138:7;34116:9;:30::i;:::-;34108:64;;;;-1:-1:-1;;;34108:64:0;;;;;;;:::i;:::-;34185:14;34202:31;34213:10;34225:7;34202:10;:31::i;:::-;34250:14;;34185:48;;-1:-1:-1;34250:14:0;;34246:370;;;34295:10;34281:25;;;;:13;:25;;;;;;;:53;;;;;;;;;;;;;;34318:15;34281:53;;;;;;34349:33;;;:46;;;;;;;;;;;;;;;;34410:12;:22;;34388:6;;34281:25;34410:22;;34388:6;;34410:22;:::i;:::-;;;;-1:-1:-1;;34455:10:0;34467:20;;;;:8;:20;;;;;;;;:29;;;;;;;;:36;;;34449:67;;34455:10;34467:48;;34508:6;34467:40;:48::i;:::-;34449:5;:67::i;:::-;34246:370;;;34555:10;34567:20;;;;:8;:20;;;;;;;;:29;;;;;;;;:36;;;34549:55;;34555:10;34549:5;:55::i;:::-;34665:10;34656:20;;;;:8;:20;;;;;;;;:29;;;;;;;;:36;;;34628:17;;34656:36;;:20;34677:7;;34628:17;;;;-1:-1:-1;;;34628:17:0;;;;;;;;;;;;;;;;;;;:24;;;:64;;;;;;;:::i;:::-;;;;-1:-1:-1;;34727:10:0;34718:20;;;;:8;:20;;;;;;;;:29;;;;;;;;:36;;;34703:11;:51;;34718:36;;34703:11;;:51;;34718:36;;34703:51;:::i;:::-;;;;-1:-1:-1;;34783:10:0;34774:20;;;;:8;:20;;;;;;;;:29;;;;;;;;;34767:36;;-1:-1:-1;;;;;;34767:36:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34054:757:0:o;1869:93::-;1952:2;1869:93;:::o;33460:513::-;20432:14;;;;20424:50;;;;-1:-1:-1;;;20424:50:0;;;;;;;:::i;:::-;33537:30:::1;33547:10;33559:7;33537:9;:30::i;:::-;33529:64;;;;-1:-1:-1::0;;;33529:64:0::1;;;;;;;:::i;:::-;33606:14;33623:31;33634:10;33646:7;33623:10;:31::i;:::-;33681:10;33667:25;::::0;;;:13:::1;:25;::::0;;;;;;:53;;::::1;::::0;;::::1;::::0;;;;;;;;33704:15:::1;33667:53:::0;::::1;::::0;;;;33731:33;;::::1;:46:::0;;;;::::1;::::0;;;;;;;::::1;::::0;;;33788:12:::1;:22:::0;;33606:48;;-1:-1:-1;33606:48:0;;33788:12;;33667:25;33788:22:::1;::::0;33606:48;;33788:22:::1;:::i;:::-;::::0;;;-1:-1:-1;33823:25:0::1;::::0;-1:-1:-1;33829:10:0::1;33841:6:::0;33823:5:::1;:25::i;:::-;-1:-1:-1::0;33870:10:0::1;33861:20;::::0;;;:8:::1;:20;::::0;;;;;;;:29;;;;;;;;;33899:15:::1;33861:35;::::0;::::1;:53:::0;33925:36:::1;;:40:::0;33460:513::o;3093:240::-;3181:4;3198:13;3214:12;:10;:12::i;:::-;-1:-1:-1;;;;;3262:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;3198:28;;-1:-1:-1;3237:66:0;;3198:28;;3253:7;;3262:40;;3292:10;;3262:40;:::i;35240:99::-;20260:12;:10;:12::i;:::-;20240:16;;-1:-1:-1;;;;;20240:16:0;;;:32;;;;:59;;;20287:12;:10;:12::i;:::-;-1:-1:-1;;;;;20276:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20276:23:0;;20240:59;20232:125;;;;-1:-1:-1;;;20232:125:0;;;;;;;:::i;:::-;35309:14:::1;:22:::0;;-1:-1:-1;;35309:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35240:99::o;30496:116::-;30555:16;;30547:57;;-1:-1:-1;;;;;30555:16:0;;;;30582:21;30547:57;;;;;30555:16;30547:57;30555:16;30547:57;30582:21;30555:16;30547:57;;;;;;;;;;;;;;;;;;;;;30496:116::o;31614:346::-;31688:7;31708:23;31734:28;31746:6;31754:7;31734:11;:28::i;:::-;31809:10;31773:24;31800:20;;;:8;:20;;;;;;;;:29;;;;;;;;:36;;;31708:54;;-1:-1:-1;31853:20:0;;31849:70;;31882:37;:15;31902:16;31882:19;:37::i;:::-;31875:44;;;;;;31849:70;-1:-1:-1;31937:15:0;31614:346;-1:-1:-1;;;31614:346:0:o;18540:33::-;;;;;;:::o;24768:127::-;-1:-1:-1;;;;;24859:28:0;;24835:4;24859:28;;;:19;:28;;;;;;;;24768:127;;;;:::o;34865:150::-;20260:12;:10;:12::i;:::-;20240:16;;-1:-1:-1;;;;;20240:16:0;;;:32;;;;:59;;;20287:12;:10;:12::i;:::-;-1:-1:-1;;;;;20276:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20276:23:0;;20240:59;20232:125;;;;-1:-1:-1;;;20232:125:0;;;;;;;:::i;:::-;34947:27:::1;::::0;;;;::::1;::::0;;;34955:15:::1;34947:27:::0;;-1:-1:-1;34947:27:0::1;::::0;;::::1;::::0;;;34985:22;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;34865:150::o;35079:99::-;35155:8;:15;35079:99;:::o;31411:131::-;31474:19;;:::i;:::-;-1:-1:-1;;;;;31513:21:0;;;;;;:13;:21;;;;;;;;;31506:28;;;;;;;;;;;;;;;;;;;;;;31513:21;;31506:28;;31513:21;;31506:28;;31513:21;31506:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31411:131;;;:::o;2086:127::-;-1:-1:-1;;;;;2187:18:0;2160:7;2187:18;;;;;;;;;;;;2086:127::o;15011:103::-;14934:12;:10;:12::i;:::-;-1:-1:-1;;;;;14923:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14923:23:0;;14915:68;;;;-1:-1:-1;;;14915:68:0;;;;;;;:::i;:::-;15076:30:::1;15103:1;15076:18;:30::i;:::-;15011:103::o:0;18915:27::-;;;-1:-1:-1;;;;;18915:27:0;;:::o;22717:86::-;20260:12;:10;:12::i;:::-;20240:16;;-1:-1:-1;;;;;20240:16:0;;;:32;;;;:59;;;20287:12;:10;:12::i;:::-;-1:-1:-1;;;;;20276:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20276:23:0;;20240:59;20232:125;;;;-1:-1:-1;;;20232:125:0;;;;;;;:::i;:::-;22773:14:::1;:22:::0;;-1:-1:-1;;22773:22:0::1;::::0;;22717:86::o;32716:661::-;20432:14;;;;20424:50;;;;-1:-1:-1;;;20424:50:0;;;;;;;:::i;:::-;32859:30:::1;32869:10;32881:7;32859:9;:30::i;:::-;32855:385;;;32915:10;32906:20;::::0;;;:8:::1;:20;::::0;;;;;;;:29;;;;;;;;:36:::1;;:51:::0;;32946:11;;32906:20;:51:::1;::::0;32946:11;;32906:51:::1;:::i;:::-;::::0;;;-1:-1:-1;33012:32:0::1;::::0;-1:-1:-1;33024:10:0::1;33036:7:::0;33012:11:::1;:32::i;:::-;32981:10;32972:20;::::0;;;:8:::1;:20;::::0;;;;;;;:29;;;;;;;;:36:::1;;:72:::0;;:36;;:20;:72:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;33068:10:0::1;33059:20;::::0;;;:8:::1;:20;::::0;;;;;;;:29;;;;;;;;33097:15:::1;33059:35;::::0;;::::1;:53:::0;32855:385:::1;;;33177:51;::::0;;::::1;::::0;::::1;::::0;;33184:10:::1;33177:51:::0;;;33196:15:::1;33177:51;::::0;;::::1;::::0;;;;;;;;;-1:-1:-1;33177:51:0;;;;;;33145:20;;;:8:::1;:20:::0;;;;;:29;;;;;;;;;:83;;;;-1:-1:-1;;;;;;33145:83:0::1;-1:-1:-1::0;;;;;33145:83:0;;::::1;;::::0;;;-1:-1:-1;33145:83:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;32855:385:::1;33280:11;33252:8;33261:7;33252:17;;;;;;-1:-1:-1::0;;;33252:17:0::1;;;;;;;;;;;;;;;;;;;:24;;;:39;;;;;;;:::i;:::-;;;;;;;;33317:11;33302;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;33339:30:0::1;::::0;-1:-1:-1;33345:10:0::1;33357:11:::0;33339:5:::1;:30::i;:::-;32716:661:::0;;:::o;18882:26::-;;;;:::o;23461:150::-;14934:12;:10;:12::i;:::-;-1:-1:-1;;;;;14923:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14923:23:0;;14915:68;;;;-1:-1:-1;;;14915:68:0;;;;;;;:::i;:::-;23537:9;23528:50:::1;;;;-1:-1:-1::0;;;23528:50:0::1;;;;;;;:::i;:::-;23589:3;:14:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;23589:14:0;;;;;::::1;::::0;23461:150::o;24270:404::-;24357:4;20260:12;:10;:12::i;:::-;20240:16;;-1:-1:-1;;;;;20240:16:0;;;:32;;;;:59;;;20287:12;:10;:12::i;:::-;-1:-1:-1;;;;;20276:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20276:23:0;;20240:59;20232:125;;;;-1:-1:-1;;;20232:125:0;;;;;;;:::i;:::-;24417:6:::1;24397:13;:11;:13::i;:::-;:17;::::0;24413:1:::1;24397:17;:::i;:::-;:26;;;;:::i;:::-;24381:12;:42;;24373:111;;;;-1:-1:-1::0;;;24373:111:0::1;;;;;;;:::i;:::-;24538:4;24518:13;:11;:13::i;:::-;:17;::::0;24534:1:::1;24518:17;:::i;:::-;:24;;;;:::i;:::-;24502:12;:40;;24494:108;;;;-1:-1:-1::0;;;24494:108:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;24612:19:0::1;:34:::0;24663:4:::1;::::0;24270:404::o;23704:190::-;14934:12;:10;:12::i;:::-;-1:-1:-1;;;;;14923:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14923:23:0;;14915:68;;;;-1:-1:-1;;;14915:68:0;;;;;;;:::i;:::-;23815:4:::1;23800:3;23804:6;23800:11;;;;;;-1:-1:-1::0;;;23800:11:0::1;;;;;;;;;;;;;;;;;:19;;23791:66;;;;-1:-1:-1::0;;;23791:66:0::1;;;;;;;:::i;:::-;23882:4;23868:3;23872:6;23868:11;;;;;;-1:-1:-1::0;;;23868:11:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:18:::0;-1:-1:-1;;23704:190:0:o;14788:87::-;14861:6;;-1:-1:-1;;;;;14861:6:0;14788:87;:::o;1757:104::-;1813:13;1846:7;1839:14;;;;;:::i;31187:141::-;-1:-1:-1;;;;;31288:16:0;;;;31261:7;31288:16;;;:8;:16;;;;;;;;:25;;;;;;;:32;;;;31187:141::o;3341:438::-;3434:4;3451:13;3467:12;:10;:12::i;:::-;-1:-1:-1;;;;;3517:18:0;;;3490:24;3517:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;3451:28;;-1:-1:-1;3563:35:0;;;;3555:85;;;;-1:-1:-1;;;3555:85:0;;;;;;;:::i;:::-;3676:60;3685:5;3692:7;3720:15;3701:16;:34;3676:8;:60::i;2221:193::-;2300:4;2317:13;2333:12;:10;:12::i;:::-;2317:28;;2356;2366:5;2373:2;2377:6;2356:9;:28::i;22869:134::-;20260:12;:10;:12::i;:::-;20240:16;;-1:-1:-1;;;;;20240:16:0;;;:32;;;;:59;;;20287:12;:10;:12::i;:::-;-1:-1:-1;;;;;20276:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20276:23:0;;20240:59;20232:125;;;;-1:-1:-1;;;20232:125:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22956:28:0;;;::::1;;::::0;;;:19:::1;:28;::::0;;;;:39;;-1:-1:-1;;22956:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;22869:134::o;20069:25::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20069:25:0;:::o;23619:77::-;14934:12;:10;:12::i;:::-;-1:-1:-1;;;;;14923:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14923:23:0;;14915:68;;;;-1:-1:-1;;;14915:68:0;;;;;;;:::i;:::-;23679:3:::1;:9;;;;;-1:-1:-1::0;;;23679:9:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;23619:77::o:0;23983:114::-;20260:12;:10;:12::i;:::-;20240:16;;-1:-1:-1;;;;;20240:16:0;;;:32;;;;:59;;;20287:12;:10;:12::i;:::-;-1:-1:-1;;;;;20276:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20276:23:0;;20240:59;20232:125;;;;-1:-1:-1;;;20232:125:0;;;;;;;:::i;:::-;24061:16:::1;:28:::0;;-1:-1:-1;;;;;;24061:28:0::1;-1:-1:-1::0;;;;;24061:28:0;;;::::1;::::0;;;::::1;::::0;;23983:114::o;18414:35::-;;;;:::o;18489:34::-;;;;:::o;19053:27::-;;;;:::o;2422:151::-;-1:-1:-1;;;;;2538:18:0;;;2511:7;2538:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;2422:151::o;30705:104::-;20260:12;:10;:12::i;:::-;20240:16;;-1:-1:-1;;;;;20240:16:0;;;:32;;;;:59;;;20287:12;:10;:12::i;:::-;-1:-1:-1;;;;;20276:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;20276:23:0;;20240:59;20232:125;;;;-1:-1:-1;;;20232:125:0;;;;;;;:::i;:::-;30758:43:::1;30776:24;30794:4;30776:9;:24::i;:::-;30758:17;:43::i;18982:21::-:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18982:21:0;:::o;15122:201::-;14934:12;:10;:12::i;:::-;-1:-1:-1;;;;;14923:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14923:23:0;;14915:68;;;;-1:-1:-1;;;14915:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15211:22:0;::::1;15203:73;;;;-1:-1:-1::0;;;15203:73:0::1;;;;;;;:::i;:::-;15287:28;15306:8;15287:18;:28::i;18949:26::-:0;;;-1:-1:-1;;;;;18949:26:0;;:::o;18456:24::-;;;;:::o;111:98::-;191:10;111:98;:::o;5472:380::-;-1:-1:-1;;;;;5608:19:0;;5600:68;;;;-1:-1:-1;;;5600:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5687:21:0;;5679:68;;;;-1:-1:-1;;;5679:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5760:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;5812:32;;;;;5790:6;;5812:32;:::i;:::-;;;;;;;;5472:380;;;:::o;5860:453::-;5995:24;6022:25;6032:5;6039:7;6022:9;:25::i;:::-;5995:52;;-1:-1:-1;;6062:16:0;:37;6058:248;;6144:6;6124:16;:26;;6116:68;;;;-1:-1:-1;;;6116:68:0;;;;;;;:::i;:::-;6228:51;6237:5;6244:7;6272:6;6253:16;:25;6228:8;:51::i;:::-;5860:453;;;;:::o;24903:3202::-;-1:-1:-1;;;;;25035:18:0;;25027:68;;;;-1:-1:-1;;;25027:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25114:16:0;;25106:64;;;;-1:-1:-1;;;25106:64:0;;;;;;;:::i;:::-;25195:11;25191:93;;25223:28;25239:4;25245:2;25249:1;25223:15;:28::i;:::-;25266:7;;25191:93;25342:14;;;;25338:1440;;;25403:7;:5;:7::i;:::-;-1:-1:-1;;;;;25395:15:0;:4;-1:-1:-1;;;;;25395:15:0;;;:49;;;;;25437:7;:5;:7::i;:::-;-1:-1:-1;;;;;25431:13:0;:2;-1:-1:-1;;;;;25431:13:0;;;25395:49;:91;;;;-1:-1:-1;;;;;;25465:21:0;;25479:6;25465:21;;25395:91;:122;;;;-1:-1:-1;25508:9:0;;-1:-1:-1;;;25508:9:0;;;;25507:10;25395:122;25373:1394;;;25562:7;:5;:7::i;:::-;-1:-1:-1;;;;;25556:13:0;:2;-1:-1:-1;;;;;25556:13:0;;;:47;;;;-1:-1:-1;25587:15:0;;-1:-1:-1;;;;;25573:30:0;;;25587:15;;25573:30;;25556:47;:79;;;;-1:-1:-1;25621:13:0;;-1:-1:-1;;;;;25607:28:0;;;25621:13;;25607:28;;25556:79;25552:336;;;25692:9;25667:35;;;;:24;:35;;;;;;25705:12;-1:-1:-1;25659:136:0;;;;-1:-1:-1;;;25659:136:0;;;;;;;:::i;:::-;25843:9;25818:35;;;;:24;:35;;;;;25856:12;25818:50;;25552:336;-1:-1:-1;;;;;25939:32:0;;;;;;:26;:32;;;;;;;;:72;;;;-1:-1:-1;;;;;;25976:35:0;;;;;;:31;:35;;;;;;;;25975:36;25939:72;25935:817;;;26054:20;;26044:6;:30;;26036:108;;;;-1:-1:-1;;;26036:108:0;;;;;;;:::i;:::-;26201:9;;26184:13;26194:2;26184:9;:13::i;:::-;26175:22;;:6;:22;:::i;:::-;:35;;26167:79;;;;-1:-1:-1;;;26167:79:0;;;;;;;:::i;:::-;25935:817;;;-1:-1:-1;;;;;26339:30:0;;;;;;:26;:30;;;;;;;;:72;;;;-1:-1:-1;;;;;;26374:37:0;;;;;;:31;:37;;;;;;;;26373:38;26339:72;26335:417;;;26454:20;;26444:6;:30;;26436:109;;;;-1:-1:-1;;;26436:109:0;;;;;;;:::i;26335:417::-;-1:-1:-1;;;;;26593:35:0;;;;;;:31;:35;;;;;;;;26588:164;;26687:9;;26670:13;26680:2;26670:9;:13::i;:::-;26661:22;;:6;:22;:::i;:::-;:35;;26653:79;;;;-1:-1:-1;;;26653:79:0;;;;;;;:::i;:::-;26792:28;26823:24;26841:4;26823:9;:24::i;:::-;26897:19;;26792:55;;-1:-1:-1;26873:43:0;;;;;;;26945:34;;-1:-1:-1;26970:9:0;;-1:-1:-1;;;26970:9:0;;;;26969:10;26945:34;:84;;;;-1:-1:-1;;;;;;26997:32:0;;;;;;:26;:32;;;;;;;;26996:33;26945:84;:127;;;;-1:-1:-1;;;;;;27047:25:0;;;;;;:19;:25;;;;;;;;27046:26;26945:127;:168;;;;-1:-1:-1;;;;;;27090:23:0;;;;;;:19;:23;;;;;;;;27089:24;26945:168;26927:298;;;27140:9;:16;;-1:-1:-1;;;;27140:16:0;-1:-1:-1;;;27140:16:0;;;27171:10;:8;:10::i;:::-;27196:9;:17;;-1:-1:-1;;;;27196:17:0;;;26927:298;27253:9;;-1:-1:-1;;;;;27383:25:0;;27237:12;27383:25;;;:19;:25;;;;;;27253:9;-1:-1:-1;;;27253:9:0;;;;;27252:10;;27383:25;;:66;;-1:-1:-1;;;;;;27426:23:0;;;;;;:19;:23;;;;;;;;27383:66;:154;;;-1:-1:-1;;;;;;27469:32:0;;;;;;:26;:32;;;;;;;;27468:33;:68;;;;-1:-1:-1;;;;;;27506:30:0;;;;;;:26;:30;;;;;;;;27505:31;27468:68;27365:199;;;-1:-1:-1;27559:5:0;27365:199;27585:12;27616:7;27612:440;;;27647:30;27673:3;27647:21;27658:9;;27647:6;:10;;:21;;;;:::i;:::-;:25;;:30::i;:::-;27640:37;;27738:9;;27722:13;;27715:4;:20;;;;:::i;:::-;:32;;;;:::i;:::-;27692:19;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;27805:9:0;;27790:12;;27783:19;;:4;:19;:::i;:::-;:31;;;;:::i;:::-;27762:17;;:52;;;;;;;:::i;:::-;;;;-1:-1:-1;;27875:9:0;;27859:13;;27852:20;;:4;:20;:::i;:::-;:32;;;;:::i;:::-;27829:19;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;27917:8:0;;27913:91;;27946:42;27962:4;27976;27983;27946:15;:42::i;:::-;28026:14;28036:4;28026:14;;:::i;:::-;;;27612:440;28064:33;28080:4;28086:2;28090:6;28064:15;:33::i;:::-;24903:3202;;;;;;;:::o;16902:98::-;16960:7;16987:5;16991:1;16987;:5;:::i;:::-;16980:12;16902:98;-1:-1:-1;;;16902:98:0:o;4466:399::-;-1:-1:-1;;;;;4550:21:0;;4542:65;;;;-1:-1:-1;;;4542:65:0;;;;;;;:::i;:::-;4620:49;4649:1;4653:7;4662:6;4620:20;:49::i;:::-;4698:6;4682:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;4715:18:0;;:9;:18;;;;;;;;;;:28;;4737:6;;4715:9;:28;;4737:6;;4715:28;:::i;:::-;;;;-1:-1:-1;;4759:37:0;;-1:-1:-1;;;;;4759:37:0;;;4776:1;;4759:37;;;;4789:6;;4759:37;:::i;:::-;;;;;;;;4809:48;4837:1;4841:7;4850:6;4809:19;:48::i;31968:686::-;32044:7;32072:26;32082:6;32090:7;32072:9;:26::i;:::-;32064:59;;;;-1:-1:-1;;;32064:59:0;;;;;;;:::i;:::-;32136:14;32153:27;32164:6;32172:7;32153:10;:27::i;:::-;-1:-1:-1;;;;;32223:16:0;;32191:29;32223:16;;;:8;:16;;;;;;;;:25;;;;;;;;32259:9;32223:31;;;;32136:44;;-1:-1:-1;32191:29:0;;32223:46;;:35;:46::i;:::-;32191:78;-1:-1:-1;32280:31:0;32314:30;:15;32334:9;32314:19;:30::i;:::-;32280:64;-1:-1:-1;32355:21:0;32379:50;32280:64;32407:21;32379:27;:50::i;:::-;32355:74;;32442:12;32457:33;32486:3;32457:24;32468:3;32472:7;32468:12;;;;;;-1:-1:-1;;;32468:12:0;;;;;;;;;;;;;;;;;32457:6;:10;;:24;;;;:::i;:33::-;32442:48;-1:-1:-1;32501:20:0;32524:37;32558:2;32524:29;32558:2;32524:29;32542:2;32524:29;32442:48;32533:3;32524:8;:13::i;:37::-;32501:60;-1:-1:-1;32572:14:0;32589:31;32501:60;32606:13;32589:16;:31::i;:::-;32572:48;31968:686;-1:-1:-1;;;;;;;;;;31968:686:0:o;15331:191::-;15424:6;;;-1:-1:-1;;;;;15441:17:0;;;-1:-1:-1;;;;;;15441:17:0;;;;;;;15474:40;;15424:6;;;15441:17;15424:6;;15474:40;;15405:16;;15474:40;15331:191;;:::o;4873:591::-;-1:-1:-1;;;;;4957:21:0;;4949:67;;;;-1:-1:-1;;;4949:67:0;;;;;;;:::i;:::-;5029:49;5050:7;5067:1;5071:6;5029:20;:49::i;:::-;-1:-1:-1;;;;;5116:18:0;;5091:22;5116:18;;;;;;;;;;;5153:24;;;;5145:71;;;;-1:-1:-1;;;5145:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5252:18:0;;:9;:18;;;;;;;;;;5273:23;;;5252:44;;5318:12;:22;;5290:6;;5252:9;5318:22;;5290:6;;5318:22;:::i;:::-;;;;-1:-1:-1;;5358:37:0;;5384:1;;-1:-1:-1;;;;;5358:37:0;;;;;;;5388:6;;5358:37;:::i;:::-;;;;;;;;5408:48;5428:7;5445:1;5449:6;5408:19;:48::i;28113:477::-;28205:16;;;28219:1;28205:16;;;;;;;;28181:21;;28205:16;;;;;;;;;;-1:-1:-1;28205:16:0;28181:40;;28250:4;28232;28237:1;28232:7;;;;;;-1:-1:-1;;;28232:7:0;;;;;;;;;-1:-1:-1;;;;;28232:23:0;;;:7;;;;;;;;;;:23;;;;28276:15;;:22;;;-1:-1:-1;;;28276:22:0;;;;:15;;;;;:20;;:22;;;;;28232:7;;28276:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28266:4;28271:1;28266:7;;;;;;-1:-1:-1;;;28266:7:0;;;;;;;;;-1:-1:-1;;;;;28266:32:0;;;:7;;;;;;;;;:32;28343:15;;28311:62;;28328:4;;28343:15;28361:11;28311:8;:62::i;:::-;28386:15;;:196;;-1:-1:-1;;;28386:196:0;;-1:-1:-1;;;;;28386:15:0;;;;:66;;:196;;28467:11;;28386:15;;28509:4;;28536;;28556:15;;28386:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28113:477;;:::o;3787:671::-;-1:-1:-1;;;;;3918:18:0;;3910:68;;;;-1:-1:-1;;;3910:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3997:16:0;;3989:64;;;;-1:-1:-1;;;3989:64:0;;;;;;;:::i;:::-;4066:38;4087:4;4093:2;4097:6;4066:20;:38::i;:::-;-1:-1:-1;;;;;4139:15:0;;4117:19;4139:15;;;;;;;;;;;4173:21;;;;4165:72;;;;-1:-1:-1;;;4165:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4273:15:0;;;:9;:15;;;;;;;;;;;4291:20;;;4273:38;;4333:13;;;;;;;;:23;;4305:6;;4273:9;4333:23;;4305:6;;4333:23;:::i;:::-;;;;;;;;4389:2;-1:-1:-1;;;;;4374:26:0;4383:4;-1:-1:-1;;;;;4374:26:0;;4393:6;4374:26;;;;;;:::i;:::-;;;;;;;;4413:37;4433:4;4439:2;4443:6;4413:19;:37::i;28979:1429::-;29019:23;29045:24;29063:4;29045:9;:24::i;:::-;29019:50;;29080:25;29152:17;;29130:19;;29108;;:41;;;;:::i;:::-;:61;;;;:::i;:::-;29080:89;-1:-1:-1;29194:20:0;;;:46;;-1:-1:-1;29218:22:0;;29194:46;29190:59;;;29242:7;;;;29190:59;29281:19;;29263:15;:37;29259:80;;;29320:19;;29302:37;;29259:80;29421:23;29507:1;29487:17;29465:19;;29447:15;:37;;;;:::i;:::-;:57;;;;:::i;:::-;:61;;;;:::i;:::-;29421:87;-1:-1:-1;29519:26:0;29548:36;:15;29421:87;29548:19;:36::i;:::-;29519:65;-1:-1:-1;29633:21:0;29667:37;29519:65;29667:17;:37::i;:::-;29725:18;29746:44;:21;29772:17;29746:25;:44::i;:::-;29725:65;;29801:23;29827:58;29867:17;29827:35;29842:19;;29827:10;:14;;:35;;;;:::i;:58::-;29801:84;;29896:21;29920:56;29958:17;29920:33;29935:17;;29920:10;:14;;:33;;;;:::i;:56::-;29896:80;-1:-1:-1;29987:23:0;29896:80;30013:28;30026:15;30013:10;:28;:::i;:::-;:44;;;;:::i;:::-;30100:1;30078:19;:23;;;30112:19;:23;;;30146:17;:21;30188:16;;29987:70;;-1:-1:-1;;;;;;30188:16:0;30180:70;30215:34;:15;30235:13;30215:19;:34::i;:::-;30180:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30301:1;30283:15;:19;:42;;;;;30324:1;30306:15;:19;30283:42;30279:122;;;30342:47;30356:15;30373;30342:13;:47::i;:::-;28979:1429;;;;;;;;;:::o;17114:98::-;17172:7;17199:5;17203:1;17199;:5;:::i;17220:98::-;17278:7;17305:5;17309:1;17305;:5;:::i;17008:98::-;17066:7;17093:5;17097:1;17093;:5;:::i;28598:373::-;28713:15;;28681:62;;28698:4;;-1:-1:-1;;;;;28713:15:0;28731:11;28681:8;:62::i;:::-;28756:15;;28906:16;;28756:207;;-1:-1:-1;;;28756:207:0;;-1:-1:-1;;;;;28756:15:0;;;;:31;;28795:9;;28756:207;;28828:4;;28848:11;;28756:15;;;;28906:16;;28937:15;;28756:207;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;28598:373;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;14:162:1:-;81:20;;137:13;;130:21;120:32;;110:2;;166:1;163;156:12;181:259;;293:2;281:9;272:7;268:23;264:32;261:2;;;314:6;306;299:22;261:2;358:9;345:23;377:33;404:5;377:33;:::i;445:263::-;;568:2;556:9;547:7;543:23;539:32;536:2;;;589:6;581;574:22;536:2;626:9;620:16;645:33;672:5;645:33;:::i;713:402::-;;;842:2;830:9;821:7;817:23;813:32;810:2;;;863:6;855;848:22;810:2;907:9;894:23;926:33;953:5;926:33;:::i;:::-;978:5;-1:-1:-1;1035:2:1;1020:18;;1007:32;1048:35;1007:32;1048:35;:::i;:::-;1102:7;1092:17;;;800:315;;;;;:::o;1120:470::-;;;;1266:2;1254:9;1245:7;1241:23;1237:32;1234:2;;;1287:6;1279;1272:22;1234:2;1331:9;1318:23;1350:33;1377:5;1350:33;:::i;:::-;1402:5;-1:-1:-1;1459:2:1;1444:18;;1431:32;1472:35;1431:32;1472:35;:::i;:::-;1224:366;;1526:7;;-1:-1:-1;;;1580:2:1;1565:18;;;;1552:32;;1224:366::o;1595:329::-;;;1721:2;1709:9;1700:7;1696:23;1692:32;1689:2;;;1742:6;1734;1727:22;1689:2;1786:9;1773:23;1805:33;1832:5;1805:33;:::i;:::-;1857:5;-1:-1:-1;1881:37:1;1914:2;1899:18;;1881:37;:::i;:::-;1871:47;;1679:245;;;;;:::o;1929:327::-;;;2058:2;2046:9;2037:7;2033:23;2029:32;2026:2;;;2079:6;2071;2064:22;2026:2;2123:9;2110:23;2142:33;2169:5;2142:33;:::i;:::-;2194:5;2246:2;2231:18;;;;2218:32;;-1:-1:-1;;;2016:240:1:o;2261:192::-;;2370:2;2358:9;2349:7;2345:23;2341:32;2338:2;;;2391:6;2383;2376:22;2338:2;2419:28;2437:9;2419:28;:::i;2458:190::-;;2570:2;2558:9;2549:7;2545:23;2541:32;2538:2;;;2591:6;2583;2576:22;2538:2;-1:-1:-1;2619:23:1;;2528:120;-1:-1:-1;2528:120:1:o;2653:258::-;;;2782:2;2770:9;2761:7;2757:23;2753:32;2750:2;;;2803:6;2795;2788:22;2750:2;-1:-1:-1;;2831:23:1;;;2901:2;2886:18;;;2873:32;;-1:-1:-1;2740:171:1:o;2916:326::-;;;;3062:2;3050:9;3041:7;3037:23;3033:32;3030:2;;;3083:6;3075;3068:22;3030:2;-1:-1:-1;;3111:23:1;;;3181:2;3166:18;;3153:32;;-1:-1:-1;3232:2:1;3217:18;;;3204:32;;3020:222;-1:-1:-1;3020:222:1:o;3247:316::-;;;;3404:2;3392:9;3383:7;3379:23;3375:32;3372:2;;;3425:6;3417;3410:22;3372:2;3459:9;3453:16;3443:26;;3509:2;3498:9;3494:18;3488:25;3478:35;;3553:2;3542:9;3538:18;3532:25;3522:35;;3362:201;;;;;:::o;3568:443::-;;3665:5;3659:12;3692:6;3687:3;3680:19;3718:4;3747:2;3742:3;3738:12;3731:19;;3784:2;3777:5;3773:14;3805:3;3817:169;3831:6;3828:1;3825:13;3817:169;;;3892:13;;3880:26;;3926:12;;;;3961:15;;;;3853:1;3846:9;3817:169;;;-1:-1:-1;4002:3:1;;3635:376;-1:-1:-1;;;;;3635:376:1:o;4016:203::-;-1:-1:-1;;;;;4180:32:1;;;;4162:51;;4150:2;4135:18;;4117:102::o;4224:304::-;-1:-1:-1;;;;;4454:15:1;;;4436:34;;4506:15;;4501:2;4486:18;;4479:43;4386:2;4371:18;;4353:175::o;4533:607::-;-1:-1:-1;;;;;4892:15:1;;;4874:34;;4939:2;4924:18;;4917:34;;;;4982:2;4967:18;;4960:34;;;;5025:2;5010:18;;5003:34;;;;5074:15;;;5068:3;5053:19;;5046:44;4854:3;5106:19;;5099:35;;;;4823:3;4808:19;;4790:350::o;5145:187::-;5310:14;;5303:22;5285:41;;5273:2;5258:18;;5240:92::o;5337:603::-;;5478:2;5507;5496:9;5489:21;5539:6;5533:13;5582:6;5577:2;5566:9;5562:18;5555:34;5607:4;5620:140;5634:6;5631:1;5628:13;5620:140;;;5729:14;;;5725:23;;5719:30;5695:17;;;5714:2;5691:26;5684:66;5649:10;;5620:140;;;5778:6;5775:1;5772:13;5769:2;;;5848:4;5843:2;5834:6;5823:9;5819:22;5815:31;5808:45;5769:2;-1:-1:-1;5924:2:1;5903:15;-1:-1:-1;;5899:29:1;5884:45;;;;5931:2;5880:54;;5458:482;-1:-1:-1;;;5458:482:1:o;5945:344::-;6147:2;6129:21;;;6186:2;6166:18;;;6159:30;-1:-1:-1;;;6220:2:1;6205:18;;6198:50;6280:2;6265:18;;6119:170::o;6294:397::-;6496:2;6478:21;;;6535:2;6515:18;;;6508:30;6574:34;6569:2;6554:18;;6547:62;-1:-1:-1;;;6640:2:1;6625:18;;6618:31;6681:3;6666:19;;6468:223::o;6696:399::-;6898:2;6880:21;;;6937:2;6917:18;;;6910:30;6976:34;6971:2;6956:18;;6949:62;-1:-1:-1;;;7042:2:1;7027:18;;7020:33;7085:3;7070:19;;6870:225::o;7100:353::-;7302:2;7284:21;;;7341:2;7321:18;;;7314:30;7380:31;7375:2;7360:18;;7353:59;7444:2;7429:18;;7274:179::o;7458:398::-;7660:2;7642:21;;;7699:2;7679:18;;;7672:30;7738:34;7733:2;7718:18;;7711:62;-1:-1:-1;;;7804:2:1;7789:18;;7782:32;7846:3;7831:19;;7632:224::o;7861:402::-;8063:2;8045:21;;;8102:2;8082:18;;;8075:30;8141:34;8136:2;8121:18;;8114:62;-1:-1:-1;;;8207:2:1;8192:18;;8185:36;8253:3;8238:19;;8035:228::o;8268:398::-;8470:2;8452:21;;;8509:2;8489:18;;;8482:30;8548:34;8543:2;8528:18;;8521:62;-1:-1:-1;;;8614:2:1;8599:18;;8592:32;8656:3;8641:19;;8442:224::o;8671:353::-;8873:2;8855:21;;;8912:2;8892:18;;;8885:30;8951:31;8946:2;8931:18;;8924:59;9015:2;9000:18;;8845:179::o;9029:402::-;9231:2;9213:21;;;9270:2;9250:18;;;9243:30;9309:34;9304:2;9289:18;;9282:62;-1:-1:-1;;;9375:2:1;9360:18;;9353:36;9421:3;9406:19;;9203:228::o;9436:419::-;9638:2;9620:21;;;9677:2;9657:18;;;9650:30;9716:34;9711:2;9696:18;;9689:62;9787:25;9782:2;9767:18;;9760:53;9845:3;9830:19;;9610:245::o;9860:420::-;10062:2;10044:21;;;10101:2;10081:18;;;10074:30;10140:34;10135:2;10120:18;;10113:62;10211:26;10206:2;10191:18;;10184:54;10270:3;10255:19;;10034:246::o;10285:417::-;10487:2;10469:21;;;10526:2;10506:18;;;10499:30;10565:34;10560:2;10545:18;;10538:62;-1:-1:-1;;;10631:2:1;10616:18;;10609:51;10692:3;10677:19;;10459:243::o;10707:477::-;10909:2;10891:21;;;10948:2;10928:18;;;10921:30;10987:34;10982:2;10967:18;;10960:62;11058:34;11053:2;11038:18;;11031:62;-1:-1:-1;;;11124:3:1;11109:19;;11102:40;11174:3;11159:19;;10881:303::o;11189:347::-;11391:2;11373:21;;;11430:2;11410:18;;;11403:30;11469:25;11464:2;11449:18;;11442:53;11527:2;11512:18;;11363:173::o;11541:356::-;11743:2;11725:21;;;11762:18;;;11755:30;11821:34;11816:2;11801:18;;11794:62;11888:2;11873:18;;11715:182::o;11902:345::-;12104:2;12086:21;;;12143:2;12123:18;;;12116:30;-1:-1:-1;;;12177:2:1;12162:18;;12155:51;12238:2;12223:18;;12076:171::o;12252:397::-;12454:2;12436:21;;;12493:2;12473:18;;;12466:30;12532:34;12527:2;12512:18;;12505:62;-1:-1:-1;;;12598:2:1;12583:18;;12576:31;12639:3;12624:19;;12426:223::o;12654:470::-;12856:2;12838:21;;;12895:2;12875:18;;;12868:30;12934:34;12929:2;12914:18;;12907:62;13005:34;13000:2;12985:18;;12978:62;-1:-1:-1;;;13071:3:1;13056:19;;13049:33;13114:3;13099:19;;12828:296::o;13129:401::-;13331:2;13313:21;;;13370:2;13350:18;;;13343:30;13409:34;13404:2;13389:18;;13382:62;-1:-1:-1;;;13475:2:1;13460:18;;13453:35;13520:3;13505:19;;13303:227::o;13535:400::-;13737:2;13719:21;;;13776:2;13756:18;;;13749:30;13815:34;13810:2;13795:18;;13788:62;-1:-1:-1;;;13881:2:1;13866:18;;13859:34;13925:3;13910:19;;13709:226::o;13940:469::-;14142:2;14124:21;;;14181:2;14161:18;;;14154:30;14220:34;14215:2;14200:18;;14193:62;14291:34;14286:2;14271:18;;14264:62;-1:-1:-1;;;14357:3:1;14342:19;;14335:32;14399:3;14384:19;;14114:295::o;14414:355::-;14616:2;14598:21;;;14655:2;14635:18;;;14628:30;14694:33;14689:2;14674:18;;14667:61;14760:2;14745:18;;14588:181::o;14774:401::-;14976:2;14958:21;;;15015:2;14995:18;;;14988:30;15054:34;15049:2;15034:18;;15027:62;-1:-1:-1;;;15120:2:1;15105:18;;15098:35;15165:3;15150:19;;14948:227::o;15180:355::-;15382:2;15364:21;;;15421:2;15401:18;;;15394:30;15460:33;15455:2;15440:18;;15433:61;15526:2;15511:18;;15354:181::o;15540:351::-;15742:2;15724:21;;;15781:2;15761:18;;;15754:30;15820:29;15815:2;15800:18;;15793:57;15882:2;15867:18;;15714:177::o;15896:575::-;;16085:2;16074:9;16067:21;16123:6;16117:13;16166:4;16161:2;16150:9;16146:18;16139:32;16194:68;16258:2;16247:9;16243:18;16229:12;16194:68;:::i;:::-;16180:82;;16311:2;16303:6;16299:15;16293:22;16385:2;16381:7;16369:9;16361:6;16357:22;16353:36;16346:4;16335:9;16331:20;16324:66;16407:58;16458:6;16442:14;16407:58;:::i;:::-;16399:66;16057:414;-1:-1:-1;;;;;16057:414:1:o;16476:177::-;16622:25;;;16610:2;16595:18;;16577:76::o;16658:983::-;;16968:3;16957:9;16953:19;16999:6;16988:9;16981:25;17025:2;17063:6;17058:2;17047:9;17043:18;17036:34;17106:3;17101:2;17090:9;17086:18;17079:31;17130:6;17165;17159:13;17196:6;17188;17181:22;17234:3;17223:9;17219:19;17212:26;;17273:2;17265:6;17261:15;17247:29;;17294:4;17307:195;17321:6;17318:1;17315:13;17307:195;;;17386:13;;-1:-1:-1;;;;;17382:39:1;17370:52;;17477:15;;;;17442:12;;;;17418:1;17336:9;17307:195;;;-1:-1:-1;;;;;;;17558:32:1;;;;17553:2;17538:18;;17531:60;-1:-1:-1;;;17622:3:1;17607:19;17600:35;17519:3;16929:712;-1:-1:-1;;;16929:712:1:o;17646:248::-;17820:25;;;17876:2;17861:18;;17854:34;17808:2;17793:18;;17775:119::o;17899:184::-;18071:4;18059:17;;;;18041:36;;18029:2;18014:18;;17996:87::o;18088:128::-;;18159:1;18155:6;18152:1;18149:13;18146:2;;;18165:18;;:::i;:::-;-1:-1:-1;18201:9:1;;18136:80::o;18221:217::-;;18287:1;18277:2;;-1:-1:-1;;;18312:31:1;;18366:4;18363:1;18356:15;18394:4;18319:1;18384:15;18277:2;-1:-1:-1;18423:9:1;;18267:171::o;18443:168::-;;18549:1;18545;18541:6;18537:14;18534:1;18531:21;18526:1;18519:9;18512:17;18508:45;18505:2;;;18556:18;;:::i;:::-;-1:-1:-1;18596:9:1;;18495:116::o;18616:125::-;;18684:1;18681;18678:8;18675:2;;;18689:18;;:::i;:::-;-1:-1:-1;18726:9:1;;18665:76::o;18746:380::-;18831:1;18821:12;;18878:1;18868:12;;;18889:2;;18943:4;18935:6;18931:17;18921:27;;18889:2;18996;18988:6;18985:14;18965:18;18962:38;18959:2;;;19042:10;19037:3;19033:20;19030:1;19023:31;19077:4;19074:1;19067:15;19105:4;19102:1;19095:15;18959:2;;18801:325;;;:::o;19131:127::-;19192:10;19187:3;19183:20;19180:1;19173:31;19223:4;19220:1;19213:15;19247:4;19244:1;19237:15;19263:133;-1:-1:-1;;;;;19340:31:1;;19330:42;;19320:2;;19386:1;19383;19376:12

Swarm Source

ipfs://9609dc6e2e37a46958d7a0772166d4ac5e41891f3b1eaadf762fde7e373a5d23
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.