ETH Price: $2,545.16 (-4.40%)
Gas: 1 Gwei

Token

Bullwinkle (BWK)
 

Overview

Max Total Supply

1,500,000,000,000,000,000 BWK

Holders

60

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
6,601,376,388,465,932.15240498 BWK

Value
$0.00
0xba6441cd7dcfe01bad8deac19d2366a6da1ac253
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:
Bullwinkle

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-27
*/

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

/**
 * IERC20
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);

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

    function transfer(address recipient, uint256 amount) external returns (bool);

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

/**
 * ReentrancyGuard
 */
abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

/**
 * SafeMath
 * Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 */
library SafeMath {

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

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

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

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

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

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

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

/**
 * Address
 * Collection of functions related to the address type
 */
library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            codehash := extcodehash(account)
        }
        return (codehash != accountHash && codehash != 0x0);
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

    function _functionCallWithValue(
        address target,
        bytes memory data,
        uint256 weiValue,
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{value: weiValue}(data);
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * Ownable
 * Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 */
contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

    function geUnlockTime() public view returns (uint256) {
        return _lockTime;
    }

    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }

    function unlock() public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock");
        require(block.timestamp > _lockTime, "Contract is locked until 7 days");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

/**
 * IUniswapV2Factory
 */
interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint256);

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

/**
 * IUniswapV2Pair
 */
interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

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

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

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

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

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    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 (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to) external returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);
}

/**
 * IUniswapV2Router02
 */
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

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

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

library EnumerableSet {
    struct Set {
        bytes32[] _values;
        mapping (bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
      
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { 
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;
            bytes32 lastvalue = set._values[lastIndex];

            set._values[toDeleteIndex] = lastvalue;
            set._indexes[lastvalue] = valueIndex;

            set._values.pop();

            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set
    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet
    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet
    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

/**
 * COIN
 */
contract Bullwinkle is Context, IERC20, Ownable, ReentrancyGuard {
    // Import our libraries
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    // Mapping and addressSets
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromReward;
    EnumerableSet.AddressSet private _excludedFromSellLock;
    mapping (address => uint256) private _sellLock;
    EnumerableSet.AddressSet private _excludedFromBuyLock;
    mapping (address => uint256) private _buyLock;
    address[] private _excludedFromReward;

    // Addresses
    address Marketing_ADDRESS = 0xCE303fb3D4Ca4304De67E5753f130D905550d4A0;
    address private constant ROUTER_ADDRESS = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    // Token name
    string private _name = "Bullwinkle";
    string private _symbol = "BWK";

    // Decimals
    uint8 private _decimals = 9;

    // Max supply
    // @note: 10**9 means a 1 with 9 zeroes.  
    // @note: 1 * 10**9 is 1 with 9 decimals.
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 1500000000000000000 * 10**9;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));

    // Max Wallet in tokens
    uint256 public _maxWalletSize = 9000000000000000 * 10**9;

    
    // Buy tax in percentage
    /*
      Marketing fee includes development fees(2%)  charity fees (2%) and marketing fees (6%) itself
      MarketingFeeBuy = developmentFeeBuy + charityFeeBuy + marketingFeeBuy
      10 = 2 + 2 + 6
    */
    uint256 private MarketingFeeBuy = 10;
    uint256 private liquidityFeeBuy = 2;
    uint256 private rewardFeeBuy = 2;
    uint256 private totalFeeBuy = 14;

    // Sell tax in percentage
  
    /*
      Marketing fee includes development fees(2%)  charity fees (2%) and marketing fees (17%) itself
      MarketingFeeSell = developmentFee + charityFee + marketingFeeSell
      21 = 2 + 2 + 17
    */
    uint256 private MarketingFeeSell = 21 ; 
    uint256 private liquidityFeeSell = 2;
    uint256 private rewardFeeSell = 2 ;
    uint256 private totalFeeSell = 25;

   
  
    uint256 private _tHODLrRewardsTotal;
    uint256 private _rewardFee;
    uint256 private _previousRewardFee;
    uint256 private _MarketingFee;
    uint256 private _previousMarketingFee;
    uint256 private _liquidityFee;
    uint256 private _previousLiquidityFee;


    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    event TransferBurn(address indexed from, address indexed burnAddress, uint256 value);

    /* Constructor */
    constructor() {
        _rOwned[_msgSender()] = _rTotal;
        // Setup Router
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(ROUTER_ADDRESS);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        uniswapV2Router = _uniswapV2Router;
        // Exclude
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromReward[address(this)] = true;
        _isExcludedFromFee[Marketing_ADDRESS] = true;
        _isExcludedFromReward[Marketing_ADDRESS] = true;
        emit Transfer(address(0), _msgSender(), _tTotal);
    }


    bool public tradingEnabled;

    /**
     * All of our read functions
     */

    // Get token name
    function name() public view returns (string memory) {
        return _name;
    }

    // Get token ticker
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    // Get decimals
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    // Get total supply
    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    // Get balance of address
    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcludedFromReward[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

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

   

    // Get all the buy fees
    function getAllBuyFees() public view returns (uint256 _liquidityFeeBuy, uint256 _MarketingFeeBuy, uint256 _rewardFeeBuy){
        return (liquidityFeeBuy, MarketingFeeBuy, rewardFeeBuy);
    }

    // Get all the sell fees
    function getAllSellFees() public view returns (uint256 _liquidityFeeSell, uint256 _MarketingFeeSell, uint256 _rewardFeeSell){
        return (liquidityFeeSell, MarketingFeeSell, rewardFeeSell);
    }

    // Get HODLr rewards
    function totalHODLrRewards() public view returns (uint256) {
        return _tHODLrRewardsTotal;
    }

    

    // Get reflections from token
    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns (uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount, , , , , , ) = _getValues(tAmount);
            return rAmount;
        } else {
            (, uint256 rTransferAmount, , , , , ) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    
    // Get tokens from reflection
    function tokenFromReflection(uint256 rAmount) public view returns (uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate = _getRate();
        return rAmount.div(currentRate);
    }

    // Get if an address is excluded from rewards
    function isExcludedFromReward(address account) public view returns (bool) {
        return _isExcludedFromReward[account];
    }

    // Get if an address is excluded from fees
    function isExcludedFromFee(address account) public view returns (bool) {
        return _isExcludedFromFee[account];
    }

    /**
    * All of our write functions
    */

    // Withdraw from account 
    function withdraw() external onlyOwner nonReentrant {
        uint256 balance = IERC20(address(this)).balanceOf(address(this));
        IERC20(address(this)).transfer(msg.sender, balance);
        payable(msg.sender).transfer(address(this).balance);
    }

    // Transfer tokens
    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    // Approve and address
    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    // TransferFrom
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    // Increase allowance to spend
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    // Decrease allowance to spend
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    // Deliver
    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcludedFromReward[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount, , , , , , ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tHODLrRewardsTotal = _tHODLrRewardsTotal.add(tAmount);
    }

    // Exclude and address from rewards
    function excludeFromReward(address account) public onlyOwner {
        require(!_isExcludedFromReward[account], "Account is already excluded");
        if (_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcludedFromReward[account] = true;
        _excludedFromReward.push(account);
    }

    // Include an address from rewards
    function includeInReward(address account) external onlyOwner {
        require(_isExcludedFromReward[account], "Account is already excluded");
        for (uint256 i = 0; i < _excludedFromReward.length; i++) {
            if (_excludedFromReward[i] == account) {
                _excludedFromReward[i] = _excludedFromReward[_excludedFromReward.length - 1];
                _tOwned[account] = 0;
                _isExcludedFromReward[account] = false;
                _excludedFromReward.pop();
                break;
            }
        }
    }

    // Exclude an address from the fees
    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    // Include an address in the fees
    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    

    // Sets all the buy taxes, cant be higher than the max
    function setBuyFeesInPercentage(uint256 _liquidityFeeBuy, uint256 _MarketingFeeBuy, uint256 _rewardFeeBuy) external onlyOwner {
        liquidityFeeBuy = _liquidityFeeBuy;
        MarketingFeeBuy = _MarketingFeeBuy;
        rewardFeeBuy = _rewardFeeBuy;
     totalFeeBuy = _liquidityFeeBuy.add(_MarketingFeeBuy).add(_rewardFeeBuy); 
    }

    // Sets all the sell taxes, needs to be lower than the max
    function setSellFeesInPercentage(uint256 _liquidityFeeSell, uint256 _MarketingFeeSell, uint256 _rewardFeeSell) external onlyOwner {
        liquidityFeeSell = _liquidityFeeSell;
        MarketingFeeSell = _MarketingFeeSell;
        rewardFeeSell = _rewardFeeSell;
        totalFeeSell = _liquidityFeeSell.add(_MarketingFeeSell).add(_rewardFeeSell);
    }

    // Set the max sell tx percentage 
    // TODO: Make this work with decimals or tokens instead of percentage


     // Set the max buy tx percentage 
    // TODO: Make this work with decimals or tokens instead of percentage
  

    // Set the max wallet percentage 
    // TODO: Make this work with decimals or tokens instead of percentage
    function setMaxWalletPercent(uint256 maxWalletPercent) external onlyOwner {
        _maxWalletSize = _tTotal.mul(maxWalletPercent).div(10**2);
    }

    // Enable trading 
    // @note: Can't disable trading after enabling
    function openTheGates() public onlyOwner{
        tradingEnabled = true;
    }

    /**
      * Private functions
      */
    
    receive() external payable {}

    function _HODLrFee(uint256 rHODLrFee, uint256 tHODLrFee) private {
        _rTotal = _rTotal.sub(rHODLrFee);
        _tHODLrRewardsTotal = _tHODLrRewardsTotal.add(tHODLrFee);
    }

    // TODO: We should find a contract using seperate taxes (liquidity/reflection and burn) for 
    // buying and selling.
    function _getValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        (uint256 tTransferAmount, uint256 tHODLrFee, uint256 tMarketing, uint256 tLiquidity) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rHODLrFee) = _getRValues(tAmount, tHODLrFee, tMarketing, _getRate(), tLiquidity);
        return (rAmount, rTransferAmount, rHODLrFee, tTransferAmount, tHODLrFee, tMarketing, tLiquidity);
    }

    function _getTValues(uint256 tAmount)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tHODLrFee = calculateRewardFee(tAmount);
        uint256 tMarketing = calculateMarketingFee(tAmount);
        uint256 tLiquidity = calculateLiquidityFee(tAmount);
        uint256 tTransferAmount = tAmount.sub(tHODLrFee).sub(tMarketing).sub(tLiquidity);
        return (tTransferAmount, tHODLrFee, tMarketing, tLiquidity );
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tHODLrFee,
        uint256 tMarketing,
        uint256 currentRate,
        uint256 tLiquidity
    )
        private
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rHODLrFee = tHODLrFee.mul(currentRate);
        uint256 rMarketing = tMarketing.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rHODLrFee).sub(rMarketing).sub(rLiquidity);
        return (rAmount, rTransferAmount, rHODLrFee);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excludedFromReward.length; i++) {
            if (_rOwned[_excludedFromReward[i]] > rSupply || _tOwned[_excludedFromReward[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excludedFromReward[i]]);
            tSupply = tSupply.sub(_tOwned[_excludedFromReward[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 currentRate =  _getRate();
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity);
        if(_isExcludedFromFee[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity);
    }

    function calculateRewardFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_rewardFee).div(10**2);
    }

    function calculateMarketingFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_MarketingFee).div(10**2);
    }

    
    function calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_liquidityFee).div(
            10**2
        );
    }

    function removeAllFee() private {
        if (_rewardFee == 0 && _MarketingFee == 0 && _liquidityFee == 0 ) return;
        _previousRewardFee = _rewardFee;
        _previousMarketingFee = _MarketingFee;
        _previousLiquidityFee = _liquidityFee;
        _liquidityFee = 0;
        _rewardFee = 0;
        _MarketingFee = 0;
    }

    function restoreAllFee() private {
        _rewardFee = _previousRewardFee;
        _MarketingFee = _previousMarketingFee;
        _liquidityFee = _previousLiquidityFee;
       
    }

    // Set the correct fees for buying or selling
    function setCorrectFees(bool isSell) private {
        if (isSell){
            // Set the fees to selling
            _liquidityFee = liquidityFeeSell;
            _rewardFee = rewardFeeSell;
            _MarketingFee = MarketingFeeSell ;
            
        } else {
            // Set the fees to buying
            _liquidityFee = liquidityFeeBuy;
            _rewardFee = rewardFeeBuy;
            _MarketingFee = MarketingFeeBuy;
        }
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        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);
    }

    // Main transfer function where we do our checks
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
       
        // Check if we are buying or selling
        bool isSell=to==uniswapV2Pair|| to == ROUTER_ADDRESS;

        // Check if trading is enabled
        if (from != owner() && to != owner()) {
             require(tradingEnabled,"trading not yet enabled");
        }

        // Check max wallet
        if (from != owner() && to != owner()) {
            if (to != uniswapV2Pair && to != Marketing_ADDRESS) {
                require(balanceOf(to) + amount <= _maxWalletSize, "Transfer amount exceeds the bag size.");
            } 
        }
        
        

        // Set the buy or sell fees
        setCorrectFees(isSell);

        // Check if we need to use fees
        bool takeFee = true;
        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }
        _tokenTransfer(from, to, amount, takeFee);
    }


    /**
      * All the transfer functions
      */

    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee
    ) private {
        if (!takeFee) removeAllFee();
        if (_isExcludedFromReward[sender] && !_isExcludedFromReward[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcludedFromReward[sender] && !_isExcludedFromReward[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcludedFromReward[sender] && _isExcludedFromReward[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
        if (!takeFee) restoreAllFee();
    }

    function _transferMarketing(uint256 tMarketing) private {
        uint256 currentRate = _getRate();
        uint256 rMarketing = tMarketing.mul(currentRate);
        _rOwned[Marketing_ADDRESS] = _rOwned[Marketing_ADDRESS].add(rMarketing);
        if (_isExcludedFromReward[Marketing_ADDRESS]) _tOwned[Marketing_ADDRESS] = _tOwned[Marketing_ADDRESS].add(tMarketing);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rHODLrFee, uint256 tTransferAmount, uint256 tHODLrFee, uint256 tMarketing, uint256 tLiquidity) =
            _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _transferMarketing(tMarketing);
        _HODLrFee(rHODLrFee, tHODLrFee);
        emit TransferBurn(sender, Marketing_ADDRESS, tMarketing);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rHODLrFee, uint256 tTransferAmount, uint256 tHODLrFee, uint256 tMarketing, uint256 tLiquidity) =
            _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _transferMarketing(tMarketing);
        _HODLrFee(rHODLrFee, tHODLrFee);
        emit TransferBurn(sender, Marketing_ADDRESS, tMarketing);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rHODLrFee, uint256 tTransferAmount, uint256 tHODLrFee, uint256 tMarketing, uint256 tLiquidity) =
            _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _transferMarketing(tMarketing);
        _HODLrFee(rHODLrFee, tHODLrFee);
        _takeLiquidity(tLiquidity);
        emit TransferBurn(sender, Marketing_ADDRESS, tMarketing) ;
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rHODLrFee, uint256 tTransferAmount, uint256 tHODLrFee, uint256 tMarketing, uint256 tLiquidity) =
            _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _transferMarketing(tMarketing);
        _HODLrFee(rHODLrFee, tHODLrFee);
        _takeLiquidity(tLiquidity);
        emit TransferBurn(sender, Marketing_ADDRESS, tMarketing);
        emit Transfer(sender, recipient, tTransferAmount);
    }



}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"burnAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferBurn","type":"event"},{"inputs":[],"name":"_maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllBuyFees","outputs":[{"internalType":"uint256","name":"_liquidityFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_MarketingFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_rewardFeeBuy","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllSellFees","outputs":[{"internalType":"uint256","name":"_liquidityFeeSell","type":"uint256"},{"internalType":"uint256","name":"_MarketingFeeSell","type":"uint256"},{"internalType":"uint256","name":"_rewardFeeSell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInReward","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":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTheGates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_MarketingFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_rewardFeeBuy","type":"uint256"}],"name":"setBuyFeesInPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWalletPercent","type":"uint256"}],"name":"setMaxWalletPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeSell","type":"uint256"},{"internalType":"uint256","name":"_MarketingFeeSell","type":"uint256"},{"internalType":"uint256","name":"_rewardFeeSell","type":"uint256"}],"name":"setSellFeesInPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalHODLrRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

601080546001600160a01b03191673ce303fb3d4ca4304de67e5753f130d905550d4a0179055610100604052600a60c08190526942756c6c77696e6b6c6560b01b60e0908152620000549160119190620003c8565b506040805180820190915260038082526242574b60e81b60209092019182526200008191601291620003c8565b506013805460ff191660091790556b04d8c55aefb8c05b5c0000006014819055620000af906000196200046e565b620000bd9060001962000491565b6015556a0771d2fa45345aa9000000601655600a60175560026018556002601955600e601a556015601b556002601c556002601d556019601e553480156200010457600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060016003556015543360009081526004602081815260409283902093909355815163c45a015560e01b81529151737a250d5630b4cf539739df2c5dacb4c659f2488d93849363c45a01559381810193918290030181865afa158015620001b0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d69190620004b7565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000224573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024a9190620004b7565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000298573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002be9190620004b7565b6001600160a01b0390811660a0528116608052600160076000620002ea6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152600780855283822080548716600190811790915560088087528584208054891683179055601080548616855292875285842080548916831790559154909316825290935291208054909216179055620003713390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef601454604051620003b991815260200190565b60405180910390a35062000526565b828054620003d690620004e9565b90600052602060002090601f016020900481019282620003fa576000855562000445565b82601f106200041557805160ff191683800117855562000445565b8280016001018555821562000445579182015b828111156200044557825182559160200191906001019062000428565b506200045392915062000457565b5090565b5b8082111562000453576000815560010162000458565b6000826200048c57634e487b7160e01b600052601260045260246000fd5b500690565b600082821015620004b257634e487b7160e01b600052601160045260246000fd5b500390565b600060208284031215620004ca57600080fd5b81516001600160a01b0381168114620004e257600080fd5b9392505050565b600181811c90821680620004fe57607f821691505b602082108114156200052057634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05161291b6200055a60003960008181610446015281816116d90152611800015260006102a2015261291b6000f3fe6080604052600436106102295760003560e01c8063682394d711610123578063a457c2d7116100ab578063dd62ed3e1161006f578063dd62ed3e146106a3578063e2663503146106e9578063e4e50868146106fe578063ea2f0b3714610719578063f2fde38b1461073957600080fd5b8063a457c2d714610619578063a69df4b514610639578063a9059cbb1461064e578063b6c523241461066e578063dd4670641461068357600080fd5b806382bf293c116100f257806382bf293c1461057757806388f82020146105975780638da5cb5b146105d05780638f9a55c0146105ee57806395d89b411461060457600080fd5b8063682394d71461050d57806370a082311461052d578063715018a61461054d5780637bbdad111461056257600080fd5b80633bd5d173116101b157806349bd5a5e1161017557806349bd5a5e146104345780634ada218b1461046857806352390c02146104825780635342acb4146104a25780635c1a1db2146104db57600080fd5b80633bd5d1731461039f5780633ccfd60b146103bf57806342495791146103d4578063437823ec146103f45780634549b0391461041457600080fd5b806323b872dd116101f857806323b872dd146102fb5780632d8381191461031b578063313ce5671461033b5780633685d4191461035d578063395093511461037f57600080fd5b806306fdde0314610235578063095ea7b3146102605780631694505e1461029057806318160ddd146102dc57600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061024a610759565b604051610257919061255d565b60405180910390f35b34801561026c57600080fd5b5061028061027b3660046125ce565b6107eb565b6040519015158152602001610257565b34801561029c57600080fd5b506102c47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610257565b3480156102e857600080fd5b506014545b604051908152602001610257565b34801561030757600080fd5b506102806103163660046125f8565b610802565b34801561032757600080fd5b506102ed610336366004612634565b61086b565b34801561034757600080fd5b5060135460405160ff9091168152602001610257565b34801561036957600080fd5b5061037d61037836600461264d565b6108f4565b005b34801561038b57600080fd5b5061028061039a3660046125ce565b610aab565b3480156103ab57600080fd5b5061037d6103ba366004612634565b610ae1565b3480156103cb57600080fd5b5061037d610bcd565b3480156103e057600080fd5b5061037d6103ef366004612668565b610d52565b34801561040057600080fd5b5061037d61040f36600461264d565b610da7565b34801561042057600080fd5b506102ed61042f3660046126a2565b610df5565b34801561044057600080fd5b506102c47f000000000000000000000000000000000000000000000000000000000000000081565b34801561047457600080fd5b506026546102809060ff1681565b34801561048e57600080fd5b5061037d61049d36600461264d565b610e84565b3480156104ae57600080fd5b506102806104bd36600461264d565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156104e757600080fd5b50601c54601b54601d545b60408051938452602084019290925290820152606001610257565b34801561051957600080fd5b5061037d610528366004612668565b610fd7565b34801561053957600080fd5b506102ed61054836600461264d565b611026565b34801561055957600080fd5b5061037d611085565b34801561056e57600080fd5b5061037d6110e7565b34801561058357600080fd5b5061037d610592366004612634565b611120565b3480156105a357600080fd5b506102806105b236600461264d565b6001600160a01b031660009081526008602052604090205460ff1690565b3480156105dc57600080fd5b506000546001600160a01b03166102c4565b3480156105fa57600080fd5b506102ed60165481565b34801561061057600080fd5b5061024a611170565b34801561062557600080fd5b506102806106343660046125ce565b61117f565b34801561064557600080fd5b5061037d6111ce565b34801561065a57600080fd5b506102806106693660046125ce565b6112d4565b34801561067a57600080fd5b506002546102ed565b34801561068f57600080fd5b5061037d61069e366004612634565b6112e1565b3480156106af57600080fd5b506102ed6106be3660046126d2565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b3480156106f557600080fd5b50601f546102ed565b34801561070a57600080fd5b506018546017546019546104f2565b34801561072557600080fd5b5061037d61073436600461264d565b611366565b34801561074557600080fd5b5061037d61075436600461264d565b6113b1565b60606011805461076890612705565b80601f016020809104026020016040519081016040528092919081815260200182805461079490612705565b80156107e15780601f106107b6576101008083540402835291602001916107e1565b820191906000526020600020905b8154815290600101906020018083116107c457829003601f168201915b5050505050905090565b60006107f8338484611489565b5060015b92915050565b600061080f8484846115ad565b610861843361085c85604051806060016040528060288152602001612879602891396001600160a01b038a166000908152600660209081526040808320338452909152902054919061192d565b611489565b5060019392505050565b60006015548211156108d75760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b60006108e1611967565b90506108ed838261198a565b9392505050565b6000546001600160a01b0316331461091e5760405162461bcd60e51b81526004016108ce90612740565b6001600160a01b03811660009081526008602052604090205460ff166109865760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016108ce565b60005b600f54811015610aa757816001600160a01b0316600f82815481106109b0576109b0612775565b6000918252602090912001546001600160a01b03161415610a9557600f80546109db906001906127a1565b815481106109eb576109eb612775565b600091825260209091200154600f80546001600160a01b039092169183908110610a1757610a17612775565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600582526040808220829055600890925220805460ff19169055600f805480610a6f57610a6f6127b8565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610a9f816127ce565b915050610989565b5050565b3360008181526006602090815260408083206001600160a01b038716845290915281205490916107f891859061085c90866119cc565b3360008181526008602052604090205460ff1615610b565760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b60648201526084016108ce565b6000610b6183611a2b565b5050506001600160a01b038616600090815260046020526040902054939450610b8f93925084915050611a86565b6001600160a01b038316600090815260046020526040902055601554610bb59082611a86565b601555601f54610bc590846119cc565b601f55505050565b6000546001600160a01b03163314610bf75760405162461bcd60e51b81526004016108ce90612740565b60026003541415610c4a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108ce565b60026003556040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa158015610c8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb191906127e9565b60405163a9059cbb60e01b815233600482015260248101829052909150309063a9059cbb906044016020604051808303816000875af1158015610cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1c9190612802565b5060405133904780156108fc02916000818181858888f19350505050158015610d49573d6000803e3d6000fd5b50506001600355565b6000546001600160a01b03163314610d7c5760405162461bcd60e51b81526004016108ce90612740565b601883905560178290556019819055610d9f81610d9985856119cc565b906119cc565b601a55505050565b6000546001600160a01b03163314610dd15760405162461bcd60e51b81526004016108ce90612740565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000601454831115610e495760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016108ce565b81610e69576000610e5984611a2b565b509496506107fc95505050505050565b6000610e7484611a2b565b509396506107fc95505050505050565b6000546001600160a01b03163314610eae5760405162461bcd60e51b81526004016108ce90612740565b6001600160a01b03811660009081526008602052604090205460ff1615610f175760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016108ce565b6001600160a01b03811660009081526004602052604090205415610f71576001600160a01b038116600090815260046020526040902054610f579061086b565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b03166000818152600860205260408120805460ff19166001908117909155600f805491820181559091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319169091179055565b6000546001600160a01b031633146110015760405162461bcd60e51b81526004016108ce90612740565b601c839055601b829055601d81905561101e81610d9985856119cc565b601e55505050565b6001600160a01b03811660009081526008602052604081205460ff161561106357506001600160a01b031660009081526005602052604090205490565b6001600160a01b0382166000908152600460205260409020546107fc9061086b565b6000546001600160a01b031633146110af5760405162461bcd60e51b81526004016108ce90612740565b600080546040516001600160a01b03909116906000805160206128a1833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146111115760405162461bcd60e51b81526004016108ce90612740565b6026805460ff19166001179055565b6000546001600160a01b0316331461114a5760405162461bcd60e51b81526004016108ce90612740565b61116a606461116483601454611ac890919063ffffffff16565b9061198a565b60165550565b60606012805461076890612705565b60006107f8338461085c856040518060600160405280602581526020016128c1602591393360009081526006602090815260408083206001600160a01b038d168452909152902054919061192d565b6001546001600160a01b031633146112345760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b60648201526084016108ce565b60025442116112855760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c203720646179730060448201526064016108ce565b600154600080546040516001600160a01b0393841693909116916000805160206128a183398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b60006107f83384846115ad565b6000546001600160a01b0316331461130b5760405162461bcd60e51b81526004016108ce90612740565b60008054600180546001600160a01b03199081166001600160a01b0384161790915516905561133a814261281f565b600255600080546040516001600160a01b03909116906000805160206128a1833981519152908390a350565b6000546001600160a01b031633146113905760405162461bcd60e51b81526004016108ce90612740565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b031633146113db5760405162461bcd60e51b81526004016108ce90612740565b6001600160a01b0381166114405760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ce565b600080546040516001600160a01b03808516939216916000805160206128a183398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166114eb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108ce565b6001600160a01b03821661154c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108ce565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166116115760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108ce565b6001600160a01b0382166116735760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108ce565b600081116116d55760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108ce565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316148061173357506001600160a01b038316737a250d5630b4cf539739df2c5dacb4c659f2488d145b90506117476000546001600160a01b031690565b6001600160a01b0316846001600160a01b03161415801561177657506000546001600160a01b03848116911614155b156117cd5760265460ff166117cd5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c656400000000000000000060448201526064016108ce565b6000546001600160a01b038581169116148015906117f957506000546001600160a01b03848116911614155b156118c6577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415801561184e57506010546001600160a01b03848116911614155b156118c6576016548261186085611026565b61186a919061281f565b11156118c65760405162461bcd60e51b815260206004820152602560248201527f5472616e7366657220616d6f756e74206578636565647320746865206261672060448201526439b4bd329760d91b60648201526084016108ce565b6118cf81611b47565b6001600160a01b03841660009081526007602052604090205460019060ff168061191157506001600160a01b03841660009081526007602052604090205460ff165b1561191a575060005b61192685858584611b78565b5050505050565b600081848411156119515760405162461bcd60e51b81526004016108ce919061255d565b50600061195e84866127a1565b95945050505050565b6000806000611974611cfb565b9092509050611983828261198a565b9250505090565b60006108ed83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e7d565b6000806119d9838561281f565b9050838110156108ed5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016108ce565b6000806000806000806000806000806000611a458c611eab565b93509350935093506000806000611a668f8787611a60611967565b88611f00565b919f509d509b509599509397509195509350505050919395979092949650565b60006108ed83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061192d565b600082611ad7575060006107fc565b6000611ae38385612837565b905082611af08583612856565b146108ed5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016108ce565b8015611b6257601c54602455601d54602055601b5460225550565b6018546024556019546020556017546022555b50565b80611b8557611b85611f62565b6001600160a01b03841660009081526008602052604090205460ff168015611bc657506001600160a01b03831660009081526008602052604090205460ff16155b15611bdb57611bd6848484611fa7565b611cd9565b6001600160a01b03841660009081526008602052604090205460ff16158015611c1c57506001600160a01b03831660009081526008602052604090205460ff165b15611c2c57611bd6848484612132565b6001600160a01b03841660009081526008602052604090205460ff16158015611c6e57506001600160a01b03831660009081526008602052604090205460ff16155b15611c7e57611bd68484846121f1565b6001600160a01b03841660009081526008602052604090205460ff168015611cbe57506001600160a01b03831660009081526008602052604090205460ff165b15611cce57611bd68484846122af565b611cd98484846121f1565b80611cf557611cf5602154602055602354602255602554602455565b50505050565b6015546014546000918291825b600f54811015611e4d578260046000600f8481548110611d2a57611d2a612775565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611d9557508160056000600f8481548110611d6e57611d6e612775565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611dab57601554601454945094505050509091565b611df160046000600f8481548110611dc557611dc5612775565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611a86565b9250611e3960056000600f8481548110611e0d57611e0d612775565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611a86565b915080611e45816127ce565b915050611d08565b50601454601554611e5d9161198a565b821015611e74576015546014549350935050509091565b90939092509050565b60008183611e9e5760405162461bcd60e51b81526004016108ce919061255d565b50600061195e8486612856565b6000806000806000611ebc8661239d565b90506000611ec9876123b9565b90506000611ed6886123d5565b90506000611ef082611eea85818d89611a86565b90611a86565b9993985091965094509092505050565b6000808080611f0f8987611ac8565b90506000611f1d8988611ac8565b90506000611f2b8989611ac8565b90506000611f39888a611ac8565b90506000611f4d82611eea85818989611a86565b949d949c50929a509298505050505050505050565b602054158015611f725750602254155b8015611f7e5750602454155b15611f8557565b6020805460215560228054602355602480546025556000908190559182905555565b6000806000806000806000611fbb88611a2b565b965096509650965096509650965061200188600560008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611a8690919063ffffffff16565b6001600160a01b038b166000908152600560209081526040808320939093556004905220546120309088611a86565b6001600160a01b03808c1660009081526004602052604080822093909355908b168152205461205f90876119cc565b6001600160a01b038a16600090815260046020526040902055612081816123f1565b61208a8261247a565b6120948584612539565b6010546040518381526001600160a01b03918216918c16907f61a114146810c6557dedd314dae835429358ca71b5ffdccc4ef651238ae0f7d49060200160405180910390a3886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161211e91815260200190565b60405180910390a350505050505050505050565b600080600080600080600061214688611a2b565b965096509650965096509650965061218c87600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611a8690919063ffffffff16565b6001600160a01b03808c16600090815260046020908152604080832094909455918c168152600590915220546121c290856119cc565b6001600160a01b038a1660009081526005602090815260408083209390935560049052205461205f90876119cc565b600080600080600080600061220588611a2b565b965096509650965096509650965061224b87600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611a8690919063ffffffff16565b6001600160a01b03808c1660009081526004602052604080822093909355908b168152205461227a90876119cc565b6001600160a01b038a1660009081526004602052604090205561229c8261247a565b6122a68584612539565b612094816123f1565b60008060008060008060006122c388611a2b565b965096509650965096509650965061230988600560008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611a8690919063ffffffff16565b6001600160a01b038b166000908152600560209081526040808320939093556004905220546123389088611a86565b6001600160a01b03808c16600090815260046020908152604080832094909455918c1681526005909152205461236e90856119cc565b6001600160a01b038a1660009081526005602090815260408083209390935560049052205461227a90876119cc565b60006107fc606461116460205485611ac890919063ffffffff16565b60006107fc606461116460225485611ac890919063ffffffff16565b60006107fc606461116460245485611ac890919063ffffffff16565b60006123fb611967565b905060006124098383611ac8565b3060009081526004602052604090205490915061242690826119cc565b3060009081526004602090815260408083209390935560079052205460ff1615612475573060009081526005602052604090205461246490846119cc565b306000908152600560205260409020555b505050565b6000612484611967565b905060006124928383611ac8565b6010546001600160a01b03166000908152600460205260409020549091506124ba90826119cc565b601080546001600160a01b03908116600090815260046020908152604080832095909555925490911681526008909152205460ff1615612475576010546001600160a01b031660009081526005602052604090205461251990846119cc565b6010546001600160a01b0316600090815260056020526040902055505050565b6015546125469083611a86565b601555601f5461255690826119cc565b601f555050565b600060208083528351808285015260005b8181101561258a5785810183015185820160400152820161256e565b8181111561259c576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b03811681146125c957600080fd5b919050565b600080604083850312156125e157600080fd5b6125ea836125b2565b946020939093013593505050565b60008060006060848603121561260d57600080fd5b612616846125b2565b9250612624602085016125b2565b9150604084013590509250925092565b60006020828403121561264657600080fd5b5035919050565b60006020828403121561265f57600080fd5b6108ed826125b2565b60008060006060848603121561267d57600080fd5b505081359360208301359350604090920135919050565b8015158114611b7557600080fd5b600080604083850312156126b557600080fd5b8235915060208301356126c781612694565b809150509250929050565b600080604083850312156126e557600080fd5b6126ee836125b2565b91506126fc602084016125b2565b90509250929050565b600181811c9082168061271957607f821691505b6020821081141561273a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156127b3576127b361278b565b500390565b634e487b7160e01b600052603160045260246000fd5b60006000198214156127e2576127e261278b565b5060010190565b6000602082840312156127fb57600080fd5b5051919050565b60006020828403121561281457600080fd5b81516108ed81612694565b600082198211156128325761283261278b565b500190565b60008160001904831182151516156128515761285161278b565b500290565b60008261287357634e487b7160e01b600052601260045260246000fd5b50049056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212209f8af3fa4a9a10c71c3726b957d2507b3232a11d59b9ac870be7565eae1c567564736f6c634300080b0033

Deployed Bytecode

0x6080604052600436106102295760003560e01c8063682394d711610123578063a457c2d7116100ab578063dd62ed3e1161006f578063dd62ed3e146106a3578063e2663503146106e9578063e4e50868146106fe578063ea2f0b3714610719578063f2fde38b1461073957600080fd5b8063a457c2d714610619578063a69df4b514610639578063a9059cbb1461064e578063b6c523241461066e578063dd4670641461068357600080fd5b806382bf293c116100f257806382bf293c1461057757806388f82020146105975780638da5cb5b146105d05780638f9a55c0146105ee57806395d89b411461060457600080fd5b8063682394d71461050d57806370a082311461052d578063715018a61461054d5780637bbdad111461056257600080fd5b80633bd5d173116101b157806349bd5a5e1161017557806349bd5a5e146104345780634ada218b1461046857806352390c02146104825780635342acb4146104a25780635c1a1db2146104db57600080fd5b80633bd5d1731461039f5780633ccfd60b146103bf57806342495791146103d4578063437823ec146103f45780634549b0391461041457600080fd5b806323b872dd116101f857806323b872dd146102fb5780632d8381191461031b578063313ce5671461033b5780633685d4191461035d578063395093511461037f57600080fd5b806306fdde0314610235578063095ea7b3146102605780631694505e1461029057806318160ddd146102dc57600080fd5b3661023057005b600080fd5b34801561024157600080fd5b5061024a610759565b604051610257919061255d565b60405180910390f35b34801561026c57600080fd5b5061028061027b3660046125ce565b6107eb565b6040519015158152602001610257565b34801561029c57600080fd5b506102c47f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610257565b3480156102e857600080fd5b506014545b604051908152602001610257565b34801561030757600080fd5b506102806103163660046125f8565b610802565b34801561032757600080fd5b506102ed610336366004612634565b61086b565b34801561034757600080fd5b5060135460405160ff9091168152602001610257565b34801561036957600080fd5b5061037d61037836600461264d565b6108f4565b005b34801561038b57600080fd5b5061028061039a3660046125ce565b610aab565b3480156103ab57600080fd5b5061037d6103ba366004612634565b610ae1565b3480156103cb57600080fd5b5061037d610bcd565b3480156103e057600080fd5b5061037d6103ef366004612668565b610d52565b34801561040057600080fd5b5061037d61040f36600461264d565b610da7565b34801561042057600080fd5b506102ed61042f3660046126a2565b610df5565b34801561044057600080fd5b506102c47f0000000000000000000000006f61deee83e28690eea684fc7bb525e9a26e93d781565b34801561047457600080fd5b506026546102809060ff1681565b34801561048e57600080fd5b5061037d61049d36600461264d565b610e84565b3480156104ae57600080fd5b506102806104bd36600461264d565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156104e757600080fd5b50601c54601b54601d545b60408051938452602084019290925290820152606001610257565b34801561051957600080fd5b5061037d610528366004612668565b610fd7565b34801561053957600080fd5b506102ed61054836600461264d565b611026565b34801561055957600080fd5b5061037d611085565b34801561056e57600080fd5b5061037d6110e7565b34801561058357600080fd5b5061037d610592366004612634565b611120565b3480156105a357600080fd5b506102806105b236600461264d565b6001600160a01b031660009081526008602052604090205460ff1690565b3480156105dc57600080fd5b506000546001600160a01b03166102c4565b3480156105fa57600080fd5b506102ed60165481565b34801561061057600080fd5b5061024a611170565b34801561062557600080fd5b506102806106343660046125ce565b61117f565b34801561064557600080fd5b5061037d6111ce565b34801561065a57600080fd5b506102806106693660046125ce565b6112d4565b34801561067a57600080fd5b506002546102ed565b34801561068f57600080fd5b5061037d61069e366004612634565b6112e1565b3480156106af57600080fd5b506102ed6106be3660046126d2565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b3480156106f557600080fd5b50601f546102ed565b34801561070a57600080fd5b506018546017546019546104f2565b34801561072557600080fd5b5061037d61073436600461264d565b611366565b34801561074557600080fd5b5061037d61075436600461264d565b6113b1565b60606011805461076890612705565b80601f016020809104026020016040519081016040528092919081815260200182805461079490612705565b80156107e15780601f106107b6576101008083540402835291602001916107e1565b820191906000526020600020905b8154815290600101906020018083116107c457829003601f168201915b5050505050905090565b60006107f8338484611489565b5060015b92915050565b600061080f8484846115ad565b610861843361085c85604051806060016040528060288152602001612879602891396001600160a01b038a166000908152600660209081526040808320338452909152902054919061192d565b611489565b5060019392505050565b60006015548211156108d75760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b60006108e1611967565b90506108ed838261198a565b9392505050565b6000546001600160a01b0316331461091e5760405162461bcd60e51b81526004016108ce90612740565b6001600160a01b03811660009081526008602052604090205460ff166109865760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016108ce565b60005b600f54811015610aa757816001600160a01b0316600f82815481106109b0576109b0612775565b6000918252602090912001546001600160a01b03161415610a9557600f80546109db906001906127a1565b815481106109eb576109eb612775565b600091825260209091200154600f80546001600160a01b039092169183908110610a1757610a17612775565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600582526040808220829055600890925220805460ff19169055600f805480610a6f57610a6f6127b8565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80610a9f816127ce565b915050610989565b5050565b3360008181526006602090815260408083206001600160a01b038716845290915281205490916107f891859061085c90866119cc565b3360008181526008602052604090205460ff1615610b565760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b60648201526084016108ce565b6000610b6183611a2b565b5050506001600160a01b038616600090815260046020526040902054939450610b8f93925084915050611a86565b6001600160a01b038316600090815260046020526040902055601554610bb59082611a86565b601555601f54610bc590846119cc565b601f55505050565b6000546001600160a01b03163314610bf75760405162461bcd60e51b81526004016108ce90612740565b60026003541415610c4a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108ce565b60026003556040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa158015610c8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb191906127e9565b60405163a9059cbb60e01b815233600482015260248101829052909150309063a9059cbb906044016020604051808303816000875af1158015610cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1c9190612802565b5060405133904780156108fc02916000818181858888f19350505050158015610d49573d6000803e3d6000fd5b50506001600355565b6000546001600160a01b03163314610d7c5760405162461bcd60e51b81526004016108ce90612740565b601883905560178290556019819055610d9f81610d9985856119cc565b906119cc565b601a55505050565b6000546001600160a01b03163314610dd15760405162461bcd60e51b81526004016108ce90612740565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000601454831115610e495760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016108ce565b81610e69576000610e5984611a2b565b509496506107fc95505050505050565b6000610e7484611a2b565b509396506107fc95505050505050565b6000546001600160a01b03163314610eae5760405162461bcd60e51b81526004016108ce90612740565b6001600160a01b03811660009081526008602052604090205460ff1615610f175760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c75646564000000000060448201526064016108ce565b6001600160a01b03811660009081526004602052604090205415610f71576001600160a01b038116600090815260046020526040902054610f579061086b565b6001600160a01b0382166000908152600560205260409020555b6001600160a01b03166000818152600860205260408120805460ff19166001908117909155600f805491820181559091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319169091179055565b6000546001600160a01b031633146110015760405162461bcd60e51b81526004016108ce90612740565b601c839055601b829055601d81905561101e81610d9985856119cc565b601e55505050565b6001600160a01b03811660009081526008602052604081205460ff161561106357506001600160a01b031660009081526005602052604090205490565b6001600160a01b0382166000908152600460205260409020546107fc9061086b565b6000546001600160a01b031633146110af5760405162461bcd60e51b81526004016108ce90612740565b600080546040516001600160a01b03909116906000805160206128a1833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146111115760405162461bcd60e51b81526004016108ce90612740565b6026805460ff19166001179055565b6000546001600160a01b0316331461114a5760405162461bcd60e51b81526004016108ce90612740565b61116a606461116483601454611ac890919063ffffffff16565b9061198a565b60165550565b60606012805461076890612705565b60006107f8338461085c856040518060600160405280602581526020016128c1602591393360009081526006602090815260408083206001600160a01b038d168452909152902054919061192d565b6001546001600160a01b031633146112345760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b60648201526084016108ce565b60025442116112855760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c203720646179730060448201526064016108ce565b600154600080546040516001600160a01b0393841693909116916000805160206128a183398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b60006107f83384846115ad565b6000546001600160a01b0316331461130b5760405162461bcd60e51b81526004016108ce90612740565b60008054600180546001600160a01b03199081166001600160a01b0384161790915516905561133a814261281f565b600255600080546040516001600160a01b03909116906000805160206128a1833981519152908390a350565b6000546001600160a01b031633146113905760405162461bcd60e51b81526004016108ce90612740565b6001600160a01b03166000908152600760205260409020805460ff19169055565b6000546001600160a01b031633146113db5760405162461bcd60e51b81526004016108ce90612740565b6001600160a01b0381166114405760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ce565b600080546040516001600160a01b03808516939216916000805160206128a183398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166114eb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108ce565b6001600160a01b03821661154c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108ce565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166116115760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108ce565b6001600160a01b0382166116735760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108ce565b600081116116d55760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108ce565b60007f0000000000000000000000006f61deee83e28690eea684fc7bb525e9a26e93d76001600160a01b0316836001600160a01b0316148061173357506001600160a01b038316737a250d5630b4cf539739df2c5dacb4c659f2488d145b90506117476000546001600160a01b031690565b6001600160a01b0316846001600160a01b03161415801561177657506000546001600160a01b03848116911614155b156117cd5760265460ff166117cd5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c656400000000000000000060448201526064016108ce565b6000546001600160a01b038581169116148015906117f957506000546001600160a01b03848116911614155b156118c6577f0000000000000000000000006f61deee83e28690eea684fc7bb525e9a26e93d76001600160a01b0316836001600160a01b03161415801561184e57506010546001600160a01b03848116911614155b156118c6576016548261186085611026565b61186a919061281f565b11156118c65760405162461bcd60e51b815260206004820152602560248201527f5472616e7366657220616d6f756e74206578636565647320746865206261672060448201526439b4bd329760d91b60648201526084016108ce565b6118cf81611b47565b6001600160a01b03841660009081526007602052604090205460019060ff168061191157506001600160a01b03841660009081526007602052604090205460ff165b1561191a575060005b61192685858584611b78565b5050505050565b600081848411156119515760405162461bcd60e51b81526004016108ce919061255d565b50600061195e84866127a1565b95945050505050565b6000806000611974611cfb565b9092509050611983828261198a565b9250505090565b60006108ed83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e7d565b6000806119d9838561281f565b9050838110156108ed5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016108ce565b6000806000806000806000806000806000611a458c611eab565b93509350935093506000806000611a668f8787611a60611967565b88611f00565b919f509d509b509599509397509195509350505050919395979092949650565b60006108ed83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061192d565b600082611ad7575060006107fc565b6000611ae38385612837565b905082611af08583612856565b146108ed5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016108ce565b8015611b6257601c54602455601d54602055601b5460225550565b6018546024556019546020556017546022555b50565b80611b8557611b85611f62565b6001600160a01b03841660009081526008602052604090205460ff168015611bc657506001600160a01b03831660009081526008602052604090205460ff16155b15611bdb57611bd6848484611fa7565b611cd9565b6001600160a01b03841660009081526008602052604090205460ff16158015611c1c57506001600160a01b03831660009081526008602052604090205460ff165b15611c2c57611bd6848484612132565b6001600160a01b03841660009081526008602052604090205460ff16158015611c6e57506001600160a01b03831660009081526008602052604090205460ff16155b15611c7e57611bd68484846121f1565b6001600160a01b03841660009081526008602052604090205460ff168015611cbe57506001600160a01b03831660009081526008602052604090205460ff165b15611cce57611bd68484846122af565b611cd98484846121f1565b80611cf557611cf5602154602055602354602255602554602455565b50505050565b6015546014546000918291825b600f54811015611e4d578260046000600f8481548110611d2a57611d2a612775565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611d9557508160056000600f8481548110611d6e57611d6e612775565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611dab57601554601454945094505050509091565b611df160046000600f8481548110611dc557611dc5612775565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490611a86565b9250611e3960056000600f8481548110611e0d57611e0d612775565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390611a86565b915080611e45816127ce565b915050611d08565b50601454601554611e5d9161198a565b821015611e74576015546014549350935050509091565b90939092509050565b60008183611e9e5760405162461bcd60e51b81526004016108ce919061255d565b50600061195e8486612856565b6000806000806000611ebc8661239d565b90506000611ec9876123b9565b90506000611ed6886123d5565b90506000611ef082611eea85818d89611a86565b90611a86565b9993985091965094509092505050565b6000808080611f0f8987611ac8565b90506000611f1d8988611ac8565b90506000611f2b8989611ac8565b90506000611f39888a611ac8565b90506000611f4d82611eea85818989611a86565b949d949c50929a509298505050505050505050565b602054158015611f725750602254155b8015611f7e5750602454155b15611f8557565b6020805460215560228054602355602480546025556000908190559182905555565b6000806000806000806000611fbb88611a2b565b965096509650965096509650965061200188600560008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611a8690919063ffffffff16565b6001600160a01b038b166000908152600560209081526040808320939093556004905220546120309088611a86565b6001600160a01b03808c1660009081526004602052604080822093909355908b168152205461205f90876119cc565b6001600160a01b038a16600090815260046020526040902055612081816123f1565b61208a8261247a565b6120948584612539565b6010546040518381526001600160a01b03918216918c16907f61a114146810c6557dedd314dae835429358ca71b5ffdccc4ef651238ae0f7d49060200160405180910390a3886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161211e91815260200190565b60405180910390a350505050505050505050565b600080600080600080600061214688611a2b565b965096509650965096509650965061218c87600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611a8690919063ffffffff16565b6001600160a01b03808c16600090815260046020908152604080832094909455918c168152600590915220546121c290856119cc565b6001600160a01b038a1660009081526005602090815260408083209390935560049052205461205f90876119cc565b600080600080600080600061220588611a2b565b965096509650965096509650965061224b87600460008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611a8690919063ffffffff16565b6001600160a01b03808c1660009081526004602052604080822093909355908b168152205461227a90876119cc565b6001600160a01b038a1660009081526004602052604090205561229c8261247a565b6122a68584612539565b612094816123f1565b60008060008060008060006122c388611a2b565b965096509650965096509650965061230988600560008d6001600160a01b03166001600160a01b0316815260200190815260200160002054611a8690919063ffffffff16565b6001600160a01b038b166000908152600560209081526040808320939093556004905220546123389088611a86565b6001600160a01b03808c16600090815260046020908152604080832094909455918c1681526005909152205461236e90856119cc565b6001600160a01b038a1660009081526005602090815260408083209390935560049052205461227a90876119cc565b60006107fc606461116460205485611ac890919063ffffffff16565b60006107fc606461116460225485611ac890919063ffffffff16565b60006107fc606461116460245485611ac890919063ffffffff16565b60006123fb611967565b905060006124098383611ac8565b3060009081526004602052604090205490915061242690826119cc565b3060009081526004602090815260408083209390935560079052205460ff1615612475573060009081526005602052604090205461246490846119cc565b306000908152600560205260409020555b505050565b6000612484611967565b905060006124928383611ac8565b6010546001600160a01b03166000908152600460205260409020549091506124ba90826119cc565b601080546001600160a01b03908116600090815260046020908152604080832095909555925490911681526008909152205460ff1615612475576010546001600160a01b031660009081526005602052604090205461251990846119cc565b6010546001600160a01b0316600090815260056020526040902055505050565b6015546125469083611a86565b601555601f5461255690826119cc565b601f555050565b600060208083528351808285015260005b8181101561258a5785810183015185820160400152820161256e565b8181111561259c576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b03811681146125c957600080fd5b919050565b600080604083850312156125e157600080fd5b6125ea836125b2565b946020939093013593505050565b60008060006060848603121561260d57600080fd5b612616846125b2565b9250612624602085016125b2565b9150604084013590509250925092565b60006020828403121561264657600080fd5b5035919050565b60006020828403121561265f57600080fd5b6108ed826125b2565b60008060006060848603121561267d57600080fd5b505081359360208301359350604090920135919050565b8015158114611b7557600080fd5b600080604083850312156126b557600080fd5b8235915060208301356126c781612694565b809150509250929050565b600080604083850312156126e557600080fd5b6126ee836125b2565b91506126fc602084016125b2565b90509250929050565b600181811c9082168061271957607f821691505b6020821081141561273a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156127b3576127b361278b565b500390565b634e487b7160e01b600052603160045260246000fd5b60006000198214156127e2576127e261278b565b5060010190565b6000602082840312156127fb57600080fd5b5051919050565b60006020828403121561281457600080fd5b81516108ed81612694565b600082198211156128325761283261278b565b500190565b60008160001904831182151516156128515761285161278b565b500290565b60008261287357634e487b7160e01b600052601260045260246000fd5b50049056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63658be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e045524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212209f8af3fa4a9a10c71c3726b957d2507b3232a11d59b9ac870be7565eae1c567564736f6c634300080b0033

Deployed Bytecode Sourcemap

20941:22444:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24629:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27866:161;;;;;;;;;;-1:-1:-1;27866:161:0;;;;;:::i;:::-;;:::i;:::-;;;1218:14:1;;1211:22;1193:41;;1181:2;1166:18;27866:161:0;1053:187:1;23604:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1436:32:1;;;1418:51;;1406:2;1391:18;23604:51:0;1245:230:1;24977:95:0;;;;;;;;;;-1:-1:-1;25057:7:0;;24977:95;;;1626:25:1;;;1614:2;1599:18;24977:95:0;1480:177:1;28056:347:0;;;;;;;;;;-1:-1:-1;28056:347:0;;;;;:::i;:::-;;:::i;26658:253::-;;;;;;;;;;-1:-1:-1;26658:253:0;;;;;:::i;:::-;;:::i;24861:83::-;;;;;;;;;;-1:-1:-1;24927:9:0;;24861:83;;24927:9;;;;2322:36:1;;2310:2;2295:18;24861:83:0;2180:184:1;29873:557:0;;;;;;;;;;-1:-1:-1;29873:557:0;;;;;:::i;:::-;;:::i;:::-;;28447:218;;;;;;;;;;-1:-1:-1;28447:218:0;;;;;:::i;:::-;;:::i;29002:412::-;;;;;;;;;;-1:-1:-1;29002:412:0;;;;;:::i;:::-;;:::i;27372:259::-;;;;;;;;;;;;;:::i;30823:343::-;;;;;;;;;;-1:-1:-1;30823:343:0;;;;;:::i;:::-;;:::i;30479:111::-;;;;;;;;;;-1:-1:-1;30479:111:0;;;;;:::i;:::-;;:::i;26158:451::-;;;;;;;;;;-1:-1:-1;26158:451:0;;;;;:::i;:::-;;:::i;23662:38::-;;;;;;;;;;;;;;;24517:26;;;;;;;;;;-1:-1:-1;24517:26:0;;;;;;;;29463:362;;;;;;;;;;-1:-1:-1;29463:362:0;;;;;:::i;:::-;;:::i;27156:124::-;;;;;;;;;;-1:-1:-1;27156:124:0;;;;;:::i;:::-;-1:-1:-1;;;;;27245:27:0;27221:4;27245:27;;;:18;:27;;;;;;;;;27156:124;25768:201;;;;;;;;;;-1:-1:-1;25911:16:0;;25929;;25947:13;;25768:201;;;;3728:25:1;;;3784:2;3769:18;;3762:34;;;;3812:18;;;3805:34;3716:2;3701:18;25768:201:0;3526:319:1;31238:359:0;;;;;;;;;;-1:-1:-1;31238:359:0;;;;;:::i;:::-;;:::i;25111:208::-;;;;;;;;;;-1:-1:-1;25111:208:0;;;;;:::i;:::-;;:::i;6818:148::-;;;;;;;;;;;;;:::i;32193:80::-;;;;;;;;;;;;;:::i;31959:150::-;;;;;;;;;;-1:-1:-1;31959:150:0;;;;;:::i;:::-;;:::i;26970:130::-;;;;;;;;;;-1:-1:-1;26970:130:0;;;;;:::i;:::-;-1:-1:-1;;;;;27062:30:0;27038:4;27062:30;;;:21;:30;;;;;;;;;26970:130;6604:79;;;;;;;;;;-1:-1:-1;6642:7:0;6669:6;-1:-1:-1;;;;;6669:6:0;6604:79;;22412:56;;;;;;;;;;;;;;;;24745:87;;;;;;;;;;;;;:::i;28709:269::-;;;;;;;;;;-1:-1:-1;28709:269:0;;;;;:::i;:::-;;:::i;7557:304::-;;;;;;;;;;;;;:::i;27663:167::-;;;;;;;;;;-1:-1:-1;27663:167:0;;;;;:::i;:::-;;:::i;7226:89::-;;;;;;;;;;-1:-1:-1;7298:9:0;;7226:89;;7323:226;;;;;;;;;;-1:-1:-1;7323:226:0;;;;;:::i;:::-;;:::i;25349:143::-;;;;;;;;;;-1:-1:-1;25349:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;25457:18:0;;;25430:7;25457:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;25349:143;26003:104;;;;;;;;;;-1:-1:-1;26080:19:0;;26003:104;;25536:194;;;;;;;;;;-1:-1:-1;25675:15:0;;25692;;25709:12;;25536:194;;30637:110;;;;;;;;;;-1:-1:-1;30637:110:0;;;;;:::i;:::-;;:::i;6974:244::-;;;;;;;;;;-1:-1:-1;6974:244:0;;;;;:::i;:::-;;:::i;24629:83::-;24666:13;24699:5;24692:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24629:83;:::o;27866:161::-;27941:4;27958:39;3050:10;27981:7;27990:6;27958:8;:39::i;:::-;-1:-1:-1;28015:4:0;27866:161;;;;;:::o;28056:347::-;28188:4;28205:36;28215:6;28223:9;28234:6;28205:9;:36::i;:::-;28252:121;28261:6;3050:10;28283:89;28321:6;28283:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28283:19:0;;;;;;:11;:19;;;;;;;;3050:10;28283:33;;;;;;;;;;:37;:89::i;:::-;28252:8;:121::i;:::-;-1:-1:-1;28391:4:0;28056:347;;;;;:::o;26658:253::-;26725:7;26764;;26753;:18;;26745:73;;;;-1:-1:-1;;;26745:73:0;;4702:2:1;26745:73:0;;;4684:21:1;4741:2;4721:18;;;4714:30;4780:34;4760:18;;;4753:62;-1:-1:-1;;;4831:18:1;;;4824:40;4881:19;;26745:73:0;;;;;;;;;26829:19;26851:10;:8;:10::i;:::-;26829:32;-1:-1:-1;26879:24:0;:7;26829:32;26879:11;:24::i;:::-;26872:31;26658:253;-1:-1:-1;;;26658:253:0:o;29873:557::-;6731:6;;-1:-1:-1;;;;;6731:6:0;3050:10;6731:22;6723:67;;;;-1:-1:-1;;;6723:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29953:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;29945:70;;;::::0;-1:-1:-1;;;29945:70:0;;5474:2:1;29945:70:0::1;::::0;::::1;5456:21:1::0;5513:2;5493:18;;;5486:30;5552:29;5532:18;;;5525:57;5599:18;;29945:70:0::1;5272:351:1::0;29945:70:0::1;30031:9;30026:397;30050:19;:26:::0;30046:30;::::1;30026:397;;;30128:7;-1:-1:-1::0;;;;;30102:33:0::1;:19;30122:1;30102:22;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;30102:22:0::1;:33;30098:314;;;30181:19;30201:26:::0;;:30:::1;::::0;30230:1:::1;::::0;30201:30:::1;:::i;:::-;30181:51;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;30156:19:::1;:22:::0;;-1:-1:-1;;;;;30181:51:0;;::::1;::::0;30176:1;;30156:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:76:::0;;-1:-1:-1;;;;;;30156:76:0::1;-1:-1:-1::0;;;;;30156:76:0;;::::1;;::::0;;30251:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;30290:21:::1;:30:::0;;;;:38;;-1:-1:-1;;30290:38:0::1;::::0;;30347:19:::1;:25:::0;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;30347:25:0;;;;;-1:-1:-1;;;;;;30347:25:0::1;::::0;;;;;30026:397:::1;29873:557:::0;:::o;30098:314::-:1;30078:3:::0;::::1;::::0;::::1;:::i;:::-;;;;30026:397;;;;29873:557:::0;:::o;28447:218::-;3050:10;28535:4;28584:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;28584:34:0;;;;;;;;;;28535:4;;28552:83;;28575:7;;28584:50;;28623:10;28584:38;:50::i;29002:412::-;3050:10;29054:14;29103:29;;;:21;:29;;;;;;;;29102:30;29094:87;;;;-1:-1:-1;;;29094:87:0;;6496:2:1;29094:87:0;;;6478:21:1;6535:2;6515:18;;;6508:30;6574:34;6554:18;;;6547:62;-1:-1:-1;;;6625:18:1;;;6618:42;6677:19;;29094:87:0;6294:408:1;29094:87:0;29193:15;29224:19;29235:7;29224:10;:19::i;:::-;-1:-1:-1;;;;;;;;29272:15:0;;;;;;:7;:15;;;;;;29192:51;;-1:-1:-1;29272:28:0;;:15;-1:-1:-1;29192:51:0;;-1:-1:-1;;29272:19:0;:28::i;:::-;-1:-1:-1;;;;;29254:15:0;;;;;;:7;:15;;;;;:46;29321:7;;:20;;29333:7;29321:11;:20::i;:::-;29311:7;:30;29374:19;;:32;;29398:7;29374:23;:32::i;:::-;29352:19;:54;-1:-1:-1;;;29002:412:0:o;27372:259::-;6731:6;;-1:-1:-1;;;;;6731:6:0;3050:10;6731:22;6723:67;;;;-1:-1:-1;;;6723:67:0;;;;;;;:::i;:::-;960:1:::1;1106:7;;:19;;1098:63;;;::::0;-1:-1:-1;;;1098:63:0;;6909:2:1;1098:63:0::1;::::0;::::1;6891:21:1::0;6948:2;6928:18;;;6921:30;6987:33;6967:18;;;6960:61;7038:18;;1098:63:0::1;6707:355:1::0;1098:63:0::1;960:1;1172:7;:18:::0;27453:46:::2;::::0;-1:-1:-1;;;27453:46:0;;27468:4:::2;27453:46;::::0;::::2;1418:51:1::0;;;27435:15:0::2;::::0;27453:31:::2;::::0;1391:18:1;;27453:46:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27510:51;::::0;-1:-1:-1;;;27510:51:0;;27541:10:::2;27510:51;::::0;::::2;7430::1::0;7497:18;;;7490:34;;;27435:64:0;;-1:-1:-1;27525:4:0::2;::::0;27510:30:::2;::::0;7403:18:1;;27510:51:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;27572:51:0::2;::::0;27580:10:::2;::::0;27601:21:::2;27572:51:::0;::::2;;;::::0;::::2;::::0;;;27601:21;27580:10;27572:51;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;916:1:0::1;1213:7;:22:::0;27372:259::o;30823:343::-;6731:6;;-1:-1:-1;;;;;6731:6:0;3050:10;6731:22;6723:67;;;;-1:-1:-1;;;6723:67:0;;;;;;;:::i;:::-;30960:15:::1;:34:::0;;;31005:15:::1;:34:::0;;;31050:12:::1;:28:::0;;;31100:57:::1;31065:13:::0;31100:38:::1;30978:16:::0;31023;31100:20:::1;:38::i;:::-;:42:::0;::::1;:57::i;:::-;31086:11;:71:::0;-1:-1:-1;;;30823:343:0:o;30479:111::-;6731:6;;-1:-1:-1;;;;;6731:6:0;3050:10;6731:22;6723:67;;;;-1:-1:-1;;;6723:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30548:27:0::1;;::::0;;;:18:::1;:27;::::0;;;;:34;;-1:-1:-1;;30548:34:0::1;30578:4;30548:34;::::0;;30479:111::o;26158:451::-;26249:7;26288;;26277;:18;;26269:62;;;;-1:-1:-1;;;26269:62:0;;7987:2:1;26269:62:0;;;7969:21:1;8026:2;8006:18;;;7999:30;8065:33;8045:18;;;8038:61;8116:18;;26269:62:0;7785:355:1;26269:62:0;26347:17;26342:260;;26382:15;26413:19;26424:7;26413:10;:19::i;:::-;-1:-1:-1;26381:51:0;;-1:-1:-1;26447:14:0;;-1:-1:-1;;;;;;26447:14:0;26342:260;26497:23;26534:19;26545:7;26534:10;:19::i;:::-;-1:-1:-1;26494:59:0;;-1:-1:-1;26568:22:0;;-1:-1:-1;;;;;;26568:22:0;29463:362;6731:6;;-1:-1:-1;;;;;6731:6:0;3050:10;6731:22;6723:67;;;;-1:-1:-1;;;6723:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29544:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;29543:31;29535:71;;;::::0;-1:-1:-1;;;29535:71:0;;5474:2:1;29535:71:0::1;::::0;::::1;5456:21:1::0;5513:2;5493:18;;;5486:30;5552:29;5532:18;;;5525:57;5599:18;;29535:71:0::1;5272:351:1::0;29535:71:0::1;-1:-1:-1::0;;;;;29621:16:0;::::1;29640:1;29621:16:::0;;;:7:::1;:16;::::0;;;;;:20;29617:109:::1;;-1:-1:-1::0;;;;;29697:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;29677:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;29658:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;29617:109:::1;-1:-1:-1::0;;;;;29736:30:0::1;;::::0;;;:21:::1;:30;::::0;;;;:37;;-1:-1:-1;;29736:37:0::1;29769:4;29736:37:::0;;::::1;::::0;;;29784:19:::1;:33:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;29784:33:0::1;::::0;;::::1;::::0;;29463:362::o;31238:359::-;6731:6;;-1:-1:-1;;;;;6731:6:0;3050:10;6731:22;6723:67;;;;-1:-1:-1;;;6723:67:0;;;;;;;:::i;:::-;31379:16:::1;:36:::0;;;31426:16:::1;:36:::0;;;31473:13:::1;:30:::0;;;31529:60:::1;31489:14:::0;31529:40:::1;31398:17:::0;31445;31529:21:::1;:40::i;:60::-;31514:12;:75:::0;-1:-1:-1;;;31238:359:0:o;25111:208::-;-1:-1:-1;;;;;25201:30:0;;25177:7;25201:30;;;:21;:30;;;;;;;;25197:59;;;-1:-1:-1;;;;;;25240:16:0;;;;;:7;:16;;;;;;;25111:208::o;25197:59::-;-1:-1:-1;;;;;25294:16:0;;;;;;:7;:16;;;;;;25274:37;;:19;:37::i;6818:148::-;6731:6;;-1:-1:-1;;;;;6731:6:0;3050:10;6731:22;6723:67;;;;-1:-1:-1;;;6723:67:0;;;;;;;:::i;:::-;6925:1:::1;6909:6:::0;;6888:40:::1;::::0;-1:-1:-1;;;;;6909:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;6888:40:0;6925:1;;6888:40:::1;6956:1;6939:19:::0;;-1:-1:-1;;;;;;6939:19:0::1;::::0;;6818:148::o;32193:80::-;6731:6;;-1:-1:-1;;;;;6731:6:0;3050:10;6731:22;6723:67;;;;-1:-1:-1;;;6723:67:0;;;;;;;:::i;:::-;32244:14:::1;:21:::0;;-1:-1:-1;;32244:21:0::1;32261:4;32244:21;::::0;;32193:80::o;31959:150::-;6731:6;;-1:-1:-1;;;;;6731:6:0;3050:10;6731:22;6723:67;;;;-1:-1:-1;;;6723:67:0;;;;;;;:::i;:::-;32061:40:::1;32095:5;32061:29;32073:16;32061:7;;:11;;:29;;;;:::i;:::-;:33:::0;::::1;:40::i;:::-;32044:14;:57:::0;-1:-1:-1;31959:150:0:o;24745:87::-;24784:13;24817:7;24810:14;;;;;:::i;28709:269::-;28802:4;28819:129;3050:10;28842:7;28851:96;28890:15;28851:96;;;;;;;;;;;;;;;;;3050:10;28851:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;28851:34:0;;;;;;;;;;;;:38;:96::i;7557:304::-;7609:14;;-1:-1:-1;;;;;7609:14:0;7627:10;7609:28;7601:76;;;;-1:-1:-1;;;7601:76:0;;8347:2:1;7601:76:0;;;8329:21:1;8386:2;8366:18;;;8359:30;8425:34;8405:18;;;8398:62;-1:-1:-1;;;8476:18:1;;;8469:33;8519:19;;7601:76:0;8145:399:1;7601:76:0;7714:9;;7696:15;:27;7688:71;;;;-1:-1:-1;;;7688:71:0;;8751:2:1;7688:71:0;;;8733:21:1;8790:2;8770:18;;;8763:30;8829:33;8809:18;;;8802:61;8880:18;;7688:71:0;8549:355:1;7688:71:0;7804:14;;;7796:6;;7775:44;;-1:-1:-1;;;;;7804:14:0;;;;7796:6;;;;-1:-1:-1;;;;;;;;;;;7775:44:0;;7839:14;;;7830:23;;-1:-1:-1;;;;;;7830:23:0;-1:-1:-1;;;;;7839:14:0;;;7830:23;;;;;;7557:304::o;27663:167::-;27741:4;27758:42;3050:10;27782:9;27793:6;27758:9;:42::i;7323:226::-;6731:6;;-1:-1:-1;;;;;6731:6:0;3050:10;6731:22;6723:67;;;;-1:-1:-1;;;6723:67:0;;;;;;;:::i;:::-;7404:6:::1;::::0;;;7387:23;;-1:-1:-1;;;;;;7387:23:0;;::::1;-1:-1:-1::0;;;;;7404:6:0;::::1;7387:23;::::0;;;7421:19:::1;::::0;;7463:22:::1;7481:4:::0;7463:15:::1;:22;:::i;:::-;7451:9;:34:::0;7538:1:::1;7522:6:::0;;7501:40:::1;::::0;-1:-1:-1;;;;;7522:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;7501:40:0;7538:1;;7501:40:::1;7323:226:::0;:::o;30637:110::-;6731:6;;-1:-1:-1;;;;;6731:6:0;3050:10;6731:22;6723:67;;;;-1:-1:-1;;;6723:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30704:27:0::1;30734:5;30704:27:::0;;;:18:::1;:27;::::0;;;;:35;;-1:-1:-1;;30704:35:0::1;::::0;;30637:110::o;6974:244::-;6731:6;;-1:-1:-1;;;;;6731:6:0;3050:10;6731:22;6723:67;;;;-1:-1:-1;;;6723:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7063:22:0;::::1;7055:73;;;::::0;-1:-1:-1;;;7055:73:0;;9244:2:1;7055:73:0::1;::::0;::::1;9226:21:1::0;9283:2;9263:18;;;9256:30;9322:34;9302:18;;;9295:62;-1:-1:-1;;;9373:18:1;;;9366:36;9419:19;;7055:73:0::1;9042:402:1::0;7055:73:0::1;7165:6;::::0;;7144:38:::1;::::0;-1:-1:-1;;;;;7144:38:0;;::::1;::::0;7165:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;7144:38:0;::::1;7193:6;:17:::0;;-1:-1:-1;;;;;;7193:17:0::1;-1:-1:-1::0;;;;;7193:17:0;;;::::1;::::0;;;::::1;::::0;;6974:244::o;37268:369::-;-1:-1:-1;;;;;37395:19:0;;37387:68;;;;-1:-1:-1;;;37387:68:0;;9651:2:1;37387:68:0;;;9633:21:1;9690:2;9670:18;;;9663:30;9729:34;9709:18;;;9702:62;-1:-1:-1;;;9780:18:1;;;9773:34;9824:19;;37387:68:0;9449:400:1;37387:68:0;-1:-1:-1;;;;;37474:21:0;;37466:68;;;;-1:-1:-1;;;37466:68:0;;10056:2:1;37466:68:0;;;10038:21:1;10095:2;10075:18;;;10068:30;10134:34;10114:18;;;10107:62;-1:-1:-1;;;10185:18:1;;;10178:32;10227:19;;37466:68:0;9854:398:1;37466:68:0;-1:-1:-1;;;;;37545:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;37597:32;;1626:25:1;;;37597:32:0;;1599:18:1;37597:32:0;;;;;;;37268:369;;;:::o;37699:1233::-;-1:-1:-1;;;;;37821:18:0;;37813:68;;;;-1:-1:-1;;;37813:68:0;;10459:2:1;37813:68:0;;;10441:21:1;10498:2;10478:18;;;10471:30;10537:34;10517:18;;;10510:62;-1:-1:-1;;;10588:18:1;;;10581:35;10633:19;;37813:68:0;10257:401:1;37813:68:0;-1:-1:-1;;;;;37900:16:0;;37892:64;;;;-1:-1:-1;;;37892:64:0;;10865:2:1;37892:64:0;;;10847:21:1;10904:2;10884:18;;;10877:30;10943:34;10923:18;;;10916:62;-1:-1:-1;;;10994:18:1;;;10987:33;11037:19;;37892:64:0;10663:399:1;37892:64:0;37984:1;37975:6;:10;37967:64;;;;-1:-1:-1;;;37967:64:0;;11269:2:1;37967:64:0;;;11251:21:1;11308:2;11288:18;;;11281:30;11347:34;11327:18;;;11320:62;-1:-1:-1;;;11398:18:1;;;11391:39;11447:19;;37967:64:0;11067:405:1;37967:64:0;38097:11;38113:13;-1:-1:-1;;;;;38109:17:0;:2;-1:-1:-1;;;;;38109:17:0;;:40;;;-1:-1:-1;;;;;;38129:20:0;;21898:42;38129:20;38109:40;38097:52;;38214:7;6642;6669:6;-1:-1:-1;;;;;6669:6:0;;6604:79;38214:7;-1:-1:-1;;;;;38206:15:0;:4;-1:-1:-1;;;;;38206:15:0;;;:32;;;;-1:-1:-1;6642:7:0;6669:6;-1:-1:-1;;;;;38225:13:0;;;6669:6;;38225:13;;38206:32;38202:115;;;38264:14;;;;38256:49;;;;-1:-1:-1;;;38256:49:0;;11679:2:1;38256:49:0;;;11661:21:1;11718:2;11698:18;;;11691:30;11757:25;11737:18;;;11730:53;11800:18;;38256:49:0;11477:347:1;38256:49:0;6642:7;6669:6;-1:-1:-1;;;;;38362:15:0;;;6669:6;;38362:15;;;;:32;;-1:-1:-1;6642:7:0;6669:6;-1:-1:-1;;;;;38381:13:0;;;6669:6;;38381:13;;38362:32;38358:242;;;38421:13;-1:-1:-1;;;;;38415:19:0;:2;-1:-1:-1;;;;;38415:19:0;;;:46;;;;-1:-1:-1;38444:17:0;;-1:-1:-1;;;;;38438:23:0;;;38444:17;;38438:23;;38415:46;38411:177;;;38516:14;;38506:6;38490:13;38500:2;38490:9;:13::i;:::-;:22;;;;:::i;:::-;:40;;38482:90;;;;-1:-1:-1;;;38482:90:0;;12031:2:1;38482:90:0;;;12013:21:1;12070:2;12050:18;;;12043:30;12109:34;12089:18;;;12082:62;-1:-1:-1;;;12160:18:1;;;12153:35;12205:19;;38482:90:0;11829:401:1;38482:90:0;38669:22;38684:6;38669:14;:22::i;:::-;-1:-1:-1;;;;;38779:24:0;;38745:12;38779:24;;;:18;:24;;;;;;38760:4;;38779:24;;;:50;;-1:-1:-1;;;;;;38807:22:0;;;;;;:18;:22;;;;;;;;38779:50;38775:98;;;-1:-1:-1;38856:5:0;38775:98;38883:41;38898:4;38904:2;38908:6;38916:7;38883:14;:41::i;:::-;37802:1130;;37699:1233;;;:::o;1713:224::-;1833:7;1869:12;1861:6;;;;1853:29;;;;-1:-1:-1;;;1853:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1893:9:0;1905:5;1909:1;1905;:5;:::i;:::-;1893:17;1713:224;-1:-1:-1;;;;;1713:224:0:o;34568:164::-;34610:7;34631:15;34648;34667:19;:17;:19::i;:::-;34630:56;;-1:-1:-1;34630:56:0;-1:-1:-1;34704:20:0;34630:56;;34704:11;:20::i;:::-;34697:27;;;;34568:164;:::o;2199:132::-;2257:7;2284:39;2288:1;2291;2284:39;;;;;;;;;;;;;;;;;:3;:39::i;1382:179::-;1440:7;;1472:5;1476:1;1472;:5;:::i;:::-;1460:17;;1501:1;1496;:6;;1488:46;;;;-1:-1:-1;;;1488:46:0;;12437:2:1;1488:46:0;;;12419:21:1;12476:2;12456:18;;;12449:30;12515:29;12495:18;;;12488:57;12562:18;;1488:46:0;12235:351:1;32687:631:0;32787:7;32809;32831;32853;32875;32897;32919;32955:23;32980:17;32999:18;33019;33041:20;33053:7;33041:11;:20::i;:::-;32954:107;;;;;;;;33073:15;33090:23;33115:17;33136:67;33148:7;33157:9;33168:10;33180;:8;:10::i;:::-;33192;33136:11;:67::i;:::-;33072:131;;-1:-1:-1;33072:131:0;-1:-1:-1;33072:131:0;-1:-1:-1;33259:15:0;;-1:-1:-1;33276:9:0;;-1:-1:-1;33287:10:0;;-1:-1:-1;33299:10:0;-1:-1:-1;;;;32687:631:0;;;;;;;;;:::o;1569:136::-;1627:7;1654:43;1658:1;1661;1654:43;;;;;;;;;;;;;;;;;:3;:43::i;1945:246::-;2003:7;2027:6;2023:47;;-1:-1:-1;2057:1:0;2050:8;;2023:47;2080:9;2092:5;2096:1;2092;:5;:::i;:::-;2080:17;-1:-1:-1;2125:1:0;2116:5;2120:1;2080:17;2116:5;:::i;:::-;:10;2108:56;;;;-1:-1:-1;;;2108:56:0;;13188:2:1;2108:56:0;;;13170:21:1;13227:2;13207:18;;;13200:30;13266:34;13246:18;;;13239:62;-1:-1:-1;;;13317:18:1;;;13310:31;13358:19;;2108:56:0;12986:397:1;36795:465:0;36855:6;36851:402;;;36933:16;;36917:13;:32;36977:13;;36964:10;:26;37021:16;;37005:13;:32;36795:465;:::o;36851:402::-;37140:15;;37124:13;:31;37183:12;;37170:10;:25;37226:15;;37210:13;:31;36851:402;36795:465;:::o;38999:914::-;39155:7;39150:28;;39164:14;:12;:14::i;:::-;-1:-1:-1;;;;;39193:29:0;;;;;;:21;:29;;;;;;;;:66;;;;-1:-1:-1;;;;;;39227:32:0;;;;;;:21;:32;;;;;;;;39226:33;39193:66;39189:677;;;39276:48;39298:6;39306:9;39317:6;39276:21;:48::i;:::-;39189:677;;;-1:-1:-1;;;;;39347:29:0;;;;;;:21;:29;;;;;;;;39346:30;:66;;;;-1:-1:-1;;;;;;39380:32:0;;;;;;:21;:32;;;;;;;;39346:66;39342:524;;;39429:46;39449:6;39457:9;39468:6;39429:19;:46::i;39342:524::-;-1:-1:-1;;;;;39498:29:0;;;;;;:21;:29;;;;;;;;39497:30;:67;;;;-1:-1:-1;;;;;;39532:32:0;;;;;;:21;:32;;;;;;;;39531:33;39497:67;39493:373;;;39581:44;39599:6;39607:9;39618:6;39581:17;:44::i;39493:373::-;-1:-1:-1;;;;;39647:29:0;;;;;;:21;:29;;;;;;;;:65;;;;-1:-1:-1;;;;;;39680:32:0;;;;;;:21;:32;;;;;;;;39647:65;39643:223;;;39729:48;39751:6;39759:9;39770:6;39729:21;:48::i;39643:223::-;39810:44;39828:6;39836:9;39847:6;39810:17;:44::i;:::-;39881:7;39876:29;;39890:15;36605:18;;36592:10;:31;36650:21;;36634:13;:37;36698:21;;36682:13;:37;36548:188;39890:15;38999:914;;;;:::o;34740:606::-;34838:7;;34874;;34791;;;;;34892:339;34916:19;:26;34912:30;;34892:339;;;35002:7;34968;:31;34976:19;34996:1;34976:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;34976:22:0;34968:31;;;;;;;;;;;;;:41;;:86;;;35047:7;35013;:31;35021:19;35041:1;35021:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35021:22:0;35013:31;;;;;;;;;;;;;:41;34968:86;34964:117;;;35064:7;;35073;;35056:25;;;;;;;34740:606;;:::o;34964:117::-;35106:44;35118:7;:31;35126:19;35146:1;35126:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35126:22:0;35118:31;;;;;;;;;;;;;35106:7;;:11;:44::i;:::-;35096:54;;35175:44;35187:7;:31;35195:19;35215:1;35195:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;35195:22:0;35187:31;;;;;;;;;;;;;35175:7;;:11;:44::i;:::-;35165:54;-1:-1:-1;34944:3:0;;;;:::i;:::-;;;;34892:339;;;-1:-1:-1;35267:7:0;;35255;;:20;;:11;:20::i;:::-;35245:7;:30;35241:61;;;35285:7;;35294;;35277:25;;;;;;34740:606;;:::o;35241:61::-;35321:7;;35330;;-1:-1:-1;34740:606:0;-1:-1:-1;34740:606:0:o;2339:223::-;2459:7;2494:12;2487:5;2479:28;;;;-1:-1:-1;;;2479:28:0;;;;;;;;:::i;:::-;-1:-1:-1;2518:9:0;2530:5;2534:1;2530;:5;:::i;33326:543::-;33427:7;33449;33471;33493;33528:17;33548:27;33567:7;33548:18;:27::i;:::-;33528:47;;33586:18;33607:30;33629:7;33607:21;:30::i;:::-;33586:51;;33648:18;33669:30;33691:7;33669:21;:30::i;:::-;33648:51;-1:-1:-1;33710:23:0;33736:54;33648:51;33736:38;33763:10;33736:38;:7;33748:9;33736:11;:22::i;:::-;:26;;:38::i;:54::-;33710:80;33826:9;;-1:-1:-1;33837:10:0;;-1:-1:-1;33837:10:0;-1:-1:-1;33326:543:0;;-1:-1:-1;;;33326:543:0:o;33877:683::-;34110:7;;;;34207:24;:7;34219:11;34207;:24::i;:::-;34189:42;-1:-1:-1;34242:17:0;34262:26;:9;34276:11;34262:13;:26::i;:::-;34242:46;-1:-1:-1;34299:18:0;34320:27;:10;34335:11;34320:14;:27::i;:::-;34299:48;-1:-1:-1;34358:18:0;34379:27;:10;34394:11;34379:14;:27::i;:::-;34358:48;-1:-1:-1;34417:23:0;34443:54;34358:48;34443:38;34470:10;34443:38;:7;34455:9;34443:11;:22::i;:54::-;34516:7;;;;-1:-1:-1;34542:9:0;;-1:-1:-1;33877:683:0;;-1:-1:-1;;;;;;;;;33877:683:0:o;36198:342::-;36245:10;;:15;:37;;;;-1:-1:-1;36264:13:0;;:18;36245:37;:59;;;;-1:-1:-1;36286:13:0;;:18;36245:59;36241:73;;;36198:342::o;36241:73::-;36345:10;;;36324:18;:31;36390:13;;;36366:21;:37;36438:13;;;36414:21;:37;-1:-1:-1;36462:17:0;;;;36490:14;;;;36515:17;36198:342::o;40305:756::-;40442:15;40459:23;40484:17;40503:23;40528:17;40547:18;40567;40602:19;40613:7;40602:10;:19::i;:::-;40441:180;;;;;;;;;;;;;;40650:28;40670:7;40650;:15;40658:6;-1:-1:-1;;;;;40650:15:0;-1:-1:-1;;;;;40650:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;40632:15:0;;;;;;:7;:15;;;;;;;;:46;;;;40707:7;:15;;;;:28;;40727:7;40707:19;:28::i;:::-;-1:-1:-1;;;;;40689:15:0;;;;;;;:7;:15;;;;;;:46;;;;40767:18;;;;;;;:39;;40790:15;40767:22;:39::i;:::-;-1:-1:-1;;;;;40746:18:0;;;;;;:7;:18;;;;;:60;40817:26;40832:10;40817:14;:26::i;:::-;40854:30;40873:10;40854:18;:30::i;:::-;40895:31;40905:9;40916;40895;:31::i;:::-;40963:17;;40942:51;;1626:25:1;;;-1:-1:-1;;;;;40963:17:0;;;;40942:51;;;;;1614:2:1;1599:18;40942:51:0;;;;;;;41026:9;-1:-1:-1;;;;;41009:44:0;41018:6;-1:-1:-1;;;;;41009:44:0;;41037:15;41009:44;;;;1626:25:1;;1614:2;1599:18;;1480:177;41009:44:0;;;;;;;;40430:631;;;;;;;40305:756;;;:::o;41069:768::-;41204:15;41221:23;41246:17;41265:23;41290:17;41309:18;41329;41364:19;41375:7;41364:10;:19::i;:::-;41203:180;;;;;;;;;;;;;;41412:28;41432:7;41412;:15;41420:6;-1:-1:-1;;;;;41412:15:0;-1:-1:-1;;;;;41412:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;41394:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;41472:18;;;;;:7;:18;;;;;:39;;41495:15;41472:22;:39::i;:::-;-1:-1:-1;;;;;41451:18:0;;;;;;:7;:18;;;;;;;;:60;;;;41543:7;:18;;;;:39;;41566:15;41543:22;:39::i;41845:696::-;41978:15;41995:23;42020:17;42039:23;42064:17;42083:18;42103;42138:19;42149:7;42138:10;:19::i;:::-;41977:180;;;;;;;;;;;;;;42186:28;42206:7;42186;:15;42194:6;-1:-1:-1;;;;;42186:15:0;-1:-1:-1;;;;;42186:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;42168:15:0;;;;;;;:7;:15;;;;;;:46;;;;42246:18;;;;;;;:39;;42269:15;42246:22;:39::i;:::-;-1:-1:-1;;;;;42225:18:0;;;;;;:7;:18;;;;;:60;42296:30;42315:10;42296:18;:30::i;:::-;42337:31;42347:9;42358;42337;:31::i;:::-;42379:26;42394:10;42379:14;:26::i;42549:827::-;42686:15;42703:23;42728:17;42747:23;42772:17;42791:18;42811;42846:19;42857:7;42846:10;:19::i;:::-;42685:180;;;;;;;;;;;;;;42894:28;42914:7;42894;:15;42902:6;-1:-1:-1;;;;;42894:15:0;-1:-1:-1;;;;;42894:15:0;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;-1:-1:-1;;;;;42876:15:0;;;;;;:7;:15;;;;;;;;:46;;;;42951:7;:15;;;;:28;;42971:7;42951:19;:28::i;:::-;-1:-1:-1;;;;;42933:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;43011:18;;;;;:7;:18;;;;;:39;;43034:15;43011:22;:39::i;:::-;-1:-1:-1;;;;;42990:18:0;;;;;;:7;:18;;;;;;;;:60;;;;43082:7;:18;;;;:39;;43105:15;43082:22;:39::i;35724:136::-;35791:7;35818:34;35846:5;35818:23;35830:10;;35818:7;:11;;:23;;;;:::i;35868:142::-;35938:7;35965:37;35996:5;35965:26;35977:13;;35965:7;:11;;:26;;;;:::i;36024:166::-;36094:7;36121:61;36166:5;36121:26;36133:13;;36121:7;:11;;:26;;;;:::i;35354:362::-;35417:19;35440:10;:8;:10::i;:::-;35417:33;-1:-1:-1;35461:18:0;35482:27;:10;35417:33;35482:14;:27::i;:::-;35561:4;35545:22;;;;:7;:22;;;;;;35461:48;;-1:-1:-1;35545:38:0;;35461:48;35545:26;:38::i;:::-;35536:4;35520:22;;;;:7;:22;;;;;;;;:63;;;;35597:18;:33;;;;;;35594:114;;;35686:4;35670:22;;;;:7;:22;;;;;;:38;;35697:10;35670:26;:38::i;:::-;35661:4;35645:22;;;;:7;:22;;;;;:63;35594:114;35406:310;;35354:362;:::o;39921:376::-;39988:19;40010:10;:8;:10::i;:::-;39988:32;-1:-1:-1;40031:18:0;40052:27;:10;39988:32;40052:14;:27::i;:::-;40127:17;;-1:-1:-1;;;;;40127:17:0;40119:26;;;;:7;:26;;;;;;40031:48;;-1:-1:-1;40119:42:0;;40031:48;40119:30;:42::i;:::-;40098:17;;;-1:-1:-1;;;;;40098:17:0;;;40090:26;;;;:7;:26;;;;;;;;:71;;;;40198:17;;;;;40176:40;;:21;:40;;;;;;;40172:117;;;40255:17;;-1:-1:-1;;;;;40255:17:0;40247:26;;;;:7;:26;;;;;;:42;;40278:10;40247:30;:42::i;:::-;40226:17;;-1:-1:-1;;;;;40226:17:0;40218:26;;;;:7;:26;;;;;:71;39977:320;;39921:376;:::o;32370:183::-;32456:7;;:22;;32468:9;32456:11;:22::i;:::-;32446:7;:32;32511:19;;:34;;32535:9;32511:23;:34::i;:::-;32489:19;:56;-1:-1:-1;;32370:183:0:o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:173::-;684:20;;-1:-1:-1;;;;;733:31:1;;723:42;;713:70;;779:1;776;769:12;713:70;616:173;;;:::o;794:254::-;862:6;870;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;962:29;981:9;962:29;:::i;:::-;952:39;1038:2;1023:18;;;;1010:32;;-1:-1:-1;;;794:254:1:o;1662:328::-;1739:6;1747;1755;1808:2;1796:9;1787:7;1783:23;1779:32;1776:52;;;1824:1;1821;1814:12;1776:52;1847:29;1866:9;1847:29;:::i;:::-;1837:39;;1895:38;1929:2;1918:9;1914:18;1895:38;:::i;:::-;1885:48;;1980:2;1969:9;1965:18;1952:32;1942:42;;1662:328;;;;;:::o;1995:180::-;2054:6;2107:2;2095:9;2086:7;2082:23;2078:32;2075:52;;;2123:1;2120;2113:12;2075:52;-1:-1:-1;2146:23:1;;1995:180;-1:-1:-1;1995:180:1:o;2369:186::-;2428:6;2481:2;2469:9;2460:7;2456:23;2452:32;2449:52;;;2497:1;2494;2487:12;2449:52;2520:29;2539:9;2520:29;:::i;2560:316::-;2637:6;2645;2653;2706:2;2694:9;2685:7;2681:23;2677:32;2674:52;;;2722:1;2719;2712:12;2674:52;-1:-1:-1;;2745:23:1;;;2815:2;2800:18;;2787:32;;-1:-1:-1;2866:2:1;2851:18;;;2838:32;;2560:316;-1:-1:-1;2560:316:1:o;2881:118::-;2967:5;2960:13;2953:21;2946:5;2943:32;2933:60;;2989:1;2986;2979:12;3004:309;3069:6;3077;3130:2;3118:9;3109:7;3105:23;3101:32;3098:52;;;3146:1;3143;3136:12;3098:52;3182:9;3169:23;3159:33;;3242:2;3231:9;3227:18;3214:32;3255:28;3277:5;3255:28;:::i;:::-;3302:5;3292:15;;;3004:309;;;;;:::o;3850:260::-;3918:6;3926;3979:2;3967:9;3958:7;3954:23;3950:32;3947:52;;;3995:1;3992;3985:12;3947:52;4018:29;4037:9;4018:29;:::i;:::-;4008:39;;4066:38;4100:2;4089:9;4085:18;4066:38;:::i;:::-;4056:48;;3850:260;;;;;:::o;4115:380::-;4194:1;4190:12;;;;4237;;;4258:61;;4312:4;4304:6;4300:17;4290:27;;4258:61;4365:2;4357:6;4354:14;4334:18;4331:38;4328:161;;;4411:10;4406:3;4402:20;4399:1;4392:31;4446:4;4443:1;4436:15;4474:4;4471:1;4464:15;4328:161;;4115:380;;;:::o;4911:356::-;5113:2;5095:21;;;5132:18;;;5125:30;5191:34;5186:2;5171:18;;5164:62;5258:2;5243:18;;4911:356::o;5628:127::-;5689:10;5684:3;5680:20;5677:1;5670:31;5720:4;5717:1;5710:15;5744:4;5741:1;5734:15;5760:127;5821:10;5816:3;5812:20;5809:1;5802:31;5852:4;5849:1;5842:15;5876:4;5873:1;5866:15;5892:125;5932:4;5960:1;5957;5954:8;5951:34;;;5965:18;;:::i;:::-;-1:-1:-1;6002:9:1;;5892:125::o;6022:127::-;6083:10;6078:3;6074:20;6071:1;6064:31;6114:4;6111:1;6104:15;6138:4;6135:1;6128:15;6154:135;6193:3;-1:-1:-1;;6214:17:1;;6211:43;;;6234:18;;:::i;:::-;-1:-1:-1;6281:1:1;6270:13;;6154:135::o;7067:184::-;7137:6;7190:2;7178:9;7169:7;7165:23;7161:32;7158:52;;;7206:1;7203;7196:12;7158:52;-1:-1:-1;7229:16:1;;7067:184;-1:-1:-1;7067:184:1:o;7535:245::-;7602:6;7655:2;7643:9;7634:7;7630:23;7626:32;7623:52;;;7671:1;7668;7661:12;7623:52;7703:9;7697:16;7722:28;7744:5;7722:28;:::i;8909:128::-;8949:3;8980:1;8976:6;8973:1;8970:13;8967:39;;;8986:18;;:::i;:::-;-1:-1:-1;9022:9:1;;8909:128::o;12591:168::-;12631:7;12697:1;12693;12689:6;12685:14;12682:1;12679:21;12674:1;12667:9;12660:17;12656:45;12653:71;;;12704:18;;:::i;:::-;-1:-1:-1;12744:9:1;;12591:168::o;12764:217::-;12804:1;12830;12820:132;;12874:10;12869:3;12865:20;12862:1;12855:31;12909:4;12906:1;12899:15;12937:4;12934:1;12927:15;12820:132;-1:-1:-1;12966:9:1;;12764:217::o

Swarm Source

ipfs://9f8af3fa4a9a10c71c3726b957d2507b3232a11d59b9ac870be7565eae1c5675
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.