ETH Price: $3,454.22 (+1.43%)
Gas: 9 Gwei

Token

6PackRick (6PR)
 

Overview

Max Total Supply

420,690,000,000,000 6PR

Holders

223

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
99,986,479,462.424830429773801453 6PR

Value
$0.00
0x17ebe0aa8e590250dd8e6d1d2e105598593974cf
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:
SixPackRick

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 4 of 4: SixPackRick.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.8.18;

import {ERC20UniswapV2InternalSwaps, ERC20} from "./ERC20UniswapV2InternalSwaps.sol";
import {Owned} from "Owned.sol";

/**
 * @title 6 Pack Rick token contract
 *
 * @notice 6PR has a 2% transfer tax, with 50% of tax used for adding liquidity.
 * 6PR is launched as a fair launch with 132 ETH hardcap.
 *
 * https://6packrick.com
 */
contract SixPackRick is
    ERC20("6PackRick", "6PR", 18),
    ERC20UniswapV2InternalSwaps,
    Owned
{
    /** @notice The presale states. */
    enum PresaleState {
        CLOSED,
        OPEN_FOR_WHITELIST,
        OPEN_FOR_PUBLIC,
        COMPLETED
    }

    /** @notice Percentage of supply allocated for presale participants (50%). */
    uint256 public constant SHARE_PRESALE = 50;
    /** @notice Percentage of supply allocated for initial liquidity (30%).*/
    uint256 public constant SHARE_LIQUIDITY = 30;
    /** @notice Percentage of supply allocated for team, marketing, cex listings, etc. (20%). */
    uint256 public constant SHARE_OTHER = 20;
    /** @notice Hardcap in ETH for presale (132 ETH). */
    uint256 public constant PRESALE_HARDCAP = 132 ether;
    /** @notice Per account limit in ETH for presale (0.6 ETH). */
    uint256 public constant PRESALE_ACCOUNT_LIMIT = 0.6 ether;
    /** @notice Minimum threshold in ETH to trigger #swapTokensAndAddLiquidity. */
    uint256 public constant SWAP_THRESHOLD_ETH_MIN = 0.005 ether;
    /** @notice Maximum threshold in ETH to trigger #swapTokensAndAddLiquidity. */
    uint256 public constant SWAP_THRESHOLD_ETH_MAX = 50 ether;
    /** @notice Transfer tax in percent (2%). 50% of this fee is used to add liquidity. */
    uint256 public constant TRANSFER_TAX = 2;

    uint256 private constant _MAX_SUPPLY = 420_690_000_000_000 ether;
    uint256 private constant _SUPPLY_PRESALE =
        (_MAX_SUPPLY * SHARE_PRESALE) / 100;
    uint256 private constant _SUPPLY_LIQUIDITY =
        (_MAX_SUPPLY * SHARE_LIQUIDITY) / 100;
    uint256 private constant _SUPPLY_OTHER =
        _MAX_SUPPLY - _SUPPLY_PRESALE - _SUPPLY_LIQUIDITY;

    /** @notice Tax recipient wallet. */
    address public taxRecipient = 0x9134A698F674D3a0D9154Ce812662526E279A8EF;
    /** @notice Whether address is extempt from transfer tax. */
    mapping(address => bool) public taxFreeAccount;
    /** @notice Whether address is an exchange pool. */
    mapping(address => bool) public isExchangePool;
    /** @notice Threshold in ETH of tokens to collect before triggering #swapTokensAndAddLiquidity. */
    uint256 public swapThresholdEth = 0.1 ether;
    /** @notice Tax manager. @dev Can **NOT** change transfer taxes. */
    address public taxManager;
    /** @notice Whether address is whitelisted for early presale access. */
    mapping(address => bool) public presaleWhitelist;
    /** @notice Presale commitment in ETH per address. */
    mapping(address => uint256) public commitment;
    /** @notice Presale amount of claimed tokens per address. */
    mapping(address => uint256) public claimedTokens;
    /** @notice Presale total commitment in ETH. */
    uint256 public totalCommitments;
    /** @notice Presale total amount of claimed tokens. */
    uint256 public totalClaimed;
    /** @notice Current presale state. */
    PresaleState public presaleState;
    /** @notice Whether buys and sells in the same block are blocked to prevent sandwitch attacks. */
    bool public limitPerBlockTransfers = true;

    /** @notice Anti sniper bot measure for initial opening of trading. */
    uint256 private _tradeableAfterBlock = type(uint256).max;
    /** @notice Anti sandwitch bot measure while limitPerBlockTransfers is enabled. */
    mapping(bytes32 => bool) private _perBlock;

    event CommitedToPresale(address indexed account, uint256 amount);
    event PresaleOpened();
    event TradingEnabled();
    event PublicPresaleOpened();
    event PresaleCompleted(uint256 totalCommitments);
    event PresaleClaimed(address indexed account, uint256 amount);
    event TaxRecipientChanged(address indexed taxRecipient);
    event SwapThresholdChanged(uint256 swapThresholdEth);
    event TaxFreeStateChanged(address indexed account, bool indexed taxFree);
    event ExchangePoolStateChanged(
        address indexed account,
        bool indexed isExchangePool
    );
    event TaxManagerChanged(address indexed taxManager);
    event LimitPerBlockTransfersChangeed(bool indexed limitPerBlockTransfers);
    event SwappedTokensAndAddedLiquidity(
        uint256 tokensSwapped,
        uint256 tokensAddedToLiquidity,
        uint256 wethAddedToLiquidity,
        uint256 wethCollected
    );

    error TradingNotOpenYet();
    error MaxAccountLimitExceeded();
    error HardcapExceeded();
    error NotWhitelistedForPresale();
    error PresaleClosed();
    error PresaleNotCompleted();
    error AlreadyClaimed();
    error NothingCommitted();
    error Unauthorized();
    error InvalidSwapThreshold();
    error NoContract();
    error TradeAlreadyOpend();
    error InvalidBlockDelay();
    error InvalidParameters();
    error InvalidState();
    error NoSameBlockBuySell();
    error ZeroTransfer();
    error NoCommittments();
    error TransferToZeroAddress();

    modifier onlyTaxManager() {
        if (msg.sender != taxManager) {
            revert Unauthorized();
        }
        _;
    }

    constructor() Owned(msg.sender) {
        taxManager = msg.sender;
        emit TaxManagerChanged(msg.sender);

        taxFreeAccount[msg.sender] = true;
        emit TaxFreeStateChanged(msg.sender, true);
        taxFreeAccount[taxRecipient] = true;
        emit TaxFreeStateChanged(taxRecipient, true);
        isExchangePool[pair] = true;
        emit ExchangePoolStateChanged(pair, true);

        _mint(address(this), _SUPPLY_PRESALE + _SUPPLY_LIQUIDITY);
        _mint(msg.sender, _SUPPLY_OTHER);
    }

    /** @dev Users can send ETH directly to **this** contract to participate */
    receive() external payable {
        commitToPresale();
    }

    /** @notice IERC20#transfer */
    function transfer(
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        if (amount == 0) {
            revert ZeroTransfer();
        }
        if (to == address(0)) {
            revert TransferToZeroAddress();
        }
        if (!taxFreeAccount[msg.sender] && !taxFreeAccount[to]) {
            if (block.number <= _tradeableAfterBlock) {
                revert TradingNotOpenYet();
            }
            if (limitPerBlockTransfers) {
                _enforceTransferLimit(msg.sender, to);
            }

            uint256 fee = (amount * TRANSFER_TAX) / 100;
            super.transfer(address(this), fee);
            unchecked {
                amount -= fee;
            }

            if (isExchangePool[to]) {
                _swapTokensAndAddLiquidity(swapThresholdToken());
            }
        }
        return super.transfer(to, amount);
    }

    /** @notice IERC20#transferFrom */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        if (amount == 0) {
            revert ZeroTransfer();
        }
        if (to == address(0)) {
            revert TransferToZeroAddress();
        }
        if (
            !taxFreeAccount[from] &&
            !taxFreeAccount[to] &&
            !taxFreeAccount[msg.sender]
        ) {
            if (block.number <= _tradeableAfterBlock) {
                revert TradingNotOpenYet();
            }
            if (limitPerBlockTransfers) {
                _enforceTransferLimit(from, to);
            }

            uint256 fee = (amount * TRANSFER_TAX) / 100;
            super.transferFrom(from, address(this), fee);
            unchecked {
                amount -= fee;
            }

            if (isExchangePool[to]) {
                _swapTokensAndAddLiquidity(swapThresholdToken());
            }
        }
        return super.transferFrom(from, to, amount);
    }

    // *** Tax Manager Interface ***

    /**
     * @notice Set `taxFree` state of `account`.
     * @param account account
     * @param taxFree true if `account` should be extempt from transfer taxes.
     * @dev Only callable by taxManager.
     */
    function setTaxFreeAccount(
        address account,
        bool taxFree
    ) external onlyTaxManager {
        if (taxFreeAccount[account] == taxFree) {
            revert InvalidParameters();
        }
        taxFreeAccount[account] = taxFree;
        emit TaxFreeStateChanged(account, taxFree);
    }

    /**
     * @notice Set `exchangePool` state of `account`
     * @param account account
     * @param exchangePool whether `account` is an exchangePool
     * @dev ExchangePool state is used to decide if transfer is a swap
     * and should trigger #swapTokensAndAddLiquidity.
     */
    function setExchangePool(
        address account,
        bool exchangePool
    ) external onlyTaxManager {
        if (isExchangePool[account] == exchangePool) {
            revert InvalidParameters();
        }
        isExchangePool[account] = exchangePool;
        emit ExchangePoolStateChanged(account, exchangePool);
    }

    /**
     * @notice Transfer taxManager role to `newTaxManager`.
     * @param newTaxManager new taxManager
     * @dev Only callable by taxManager.
     */
    function transferTaxManager(address newTaxManager) external onlyTaxManager {
        if (newTaxManager == taxManager) {
            revert InvalidParameters();
        }
        taxManager = newTaxManager;
        emit TaxManagerChanged(newTaxManager);
    }

    /**
     * @notice Change the amount of tokens collected via tax before a swap is triggered.
     * @param newSwapThresholdEth new threshold received in ETH
     * @dev Only callable by taxManager
     */
    function setSwapThresholdEth(
        uint256 newSwapThresholdEth
    ) external onlyTaxManager {
        if (
            newSwapThresholdEth < SWAP_THRESHOLD_ETH_MIN ||
            newSwapThresholdEth > SWAP_THRESHOLD_ETH_MAX ||
            newSwapThresholdEth == swapThresholdEth
        ) {
            revert InvalidSwapThreshold();
        }
        swapThresholdEth = newSwapThresholdEth;
        emit SwapThresholdChanged(newSwapThresholdEth);
    }

    /**
     * @notice Set whether or not to limit buy/sells to single per block to prevent
     * sandwitch attacks.
     * @param newLimitPerBlockTransfers new state
     * @dev Only callable by taxManager
     */
    function setLimitPerBlockTransfers(
        bool newLimitPerBlockTransfers
    ) external onlyTaxManager {
        if (newLimitPerBlockTransfers == limitPerBlockTransfers) {
            revert InvalidParameters();
        }
        limitPerBlockTransfers = newLimitPerBlockTransfers;
        emit LimitPerBlockTransfersChangeed(newLimitPerBlockTransfers);
    }

    /**
     * @notice Change the address receiving the 1% tax in WETH.
     * @param newTaxRecipient new adddress receiving the 1% tax in WETH.
     * @dev Only callable by taxManager.
     */
    function setTaxRecipient(address newTaxRecipient) external onlyTaxManager {
        if (newTaxRecipient == address(0) || taxRecipient == newTaxRecipient) {
            revert InvalidParameters();
        }
        taxRecipient = newTaxRecipient;
        emit TaxRecipientChanged(newTaxRecipient);
    }

    // *** presale interface ***

    /**
     * @notice Whitelist wallet addresses for ealry presale access.
     * @param accounts accounts to whitelist
     */
    function whitelistForPresale(
        address[] calldata accounts
    ) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; ++i) {
            presaleWhitelist[accounts[i]] = true;
        }
    }

    /**
     * @notice Open presale for whitelisted users.
     * @dev Called after #whitelistForPresale.
     */
    function openPresale() external onlyOwner {
        if (presaleState != PresaleState.CLOSED) {
            revert InvalidState();
        }
        presaleState = PresaleState.OPEN_FOR_WHITELIST;
        emit PresaleOpened();
    }

    /**
     * @notice Open presale for all users.
     * @dev Called after #openPresale.
     */
    function openPublicPresale() external onlyOwner {
        if (presaleState != PresaleState.OPEN_FOR_WHITELIST) {
            revert InvalidState();
        }
        presaleState = PresaleState.OPEN_FOR_PUBLIC;
        emit PublicPresaleOpened();
    }

    /**
     * @notice Complete the presale.
     * @dev Adds 60% of collected ETH with 30% of totalSupply to Liquidity.
     * Sends the remaining 40% of collected ETH to current owner.
     * Called after #openPublicPresale.
     */
    function completePresale() external onlyOwner {
        if (presaleState != PresaleState.OPEN_FOR_PUBLIC) {
            revert InvalidState();
        }
        if (totalCommitments == 0) {
            revert NoCommittments();
        }

        presaleState = PresaleState.COMPLETED;

        uint256 amountEthForLiquidity = (totalCommitments * _SUPPLY_LIQUIDITY) /
            _SUPPLY_PRESALE;
        _addInitialLiquidityEth(
            _SUPPLY_LIQUIDITY,
            amountEthForLiquidity,
            msg.sender
        );

        _sweepEth(msg.sender);

        emit PresaleCompleted(totalCommitments);
    }

    /**
     * @notice Enable trading.
     * @param blocksDelay variable number of blocks to delay the actual start of trading, [1-5].
     * @dev Exact start is delayed a variable amount of 1-5 blocks to make it harder for automated bots.
     * Called after #completePresale.
     */
    function enableTrading(uint256 blocksDelay) external onlyOwner {
        if (_tradeableAfterBlock != type(uint256).max) {
            revert TradeAlreadyOpend();
        }
        if (blocksDelay == 0 || blocksDelay > 5) {
            revert InvalidBlockDelay();
        }
        if (presaleState != PresaleState.COMPLETED) {
            revert PresaleNotCompleted();
        }
        _tradeableAfterBlock = block.number + blocksDelay;
        emit TradingEnabled();

        // renounce ownership
        transferOwnership(address(0));
    }

    /**
     * @notice Claim callers presale tokens.
     * @dev Callable once presaleCompleted.
     */
    function claimPresale() external {
        address account = msg.sender;

        if (_isContract(account)) {
            revert NoContract();
        }
        if (presaleState != PresaleState.COMPLETED) {
            revert PresaleNotCompleted();
        }
        if (commitment[account] == 0) {
            revert NothingCommitted();
        }
        if (claimedTokens[account] != 0) {
            revert AlreadyClaimed();
        }

        uint256 amountTokens = (_SUPPLY_PRESALE * commitment[account]) /
            totalCommitments;
        claimedTokens[account] = amountTokens;
        totalClaimed += amountTokens;

        _transferFromContractBalance(account, amountTokens);

        emit PresaleClaimed(account, amountTokens);
    }

    /** @notice Returns amount of tokens to be claimed by presale participants. */
    function unclaimedSupply() external view returns (uint256) {
        return _SUPPLY_PRESALE - totalClaimed;
    }

    /**
     * @notice Returns false if trading was not enabled yet.
     * Trading can not be paused once enabled.
     */
    function isTradeOpen() external view returns (bool) {
        return block.number > _tradeableAfterBlock;
    }

    /**
     * @notice Commit ETH to presale.
     * Presale supply is claimable proportionally for all presale participants.
     * Presale has a 132 ETH hardcap and 0.6 ETH per wallet limit.
     * Users can also send ETH directly to **this** contract to participate.
     * @dev Callable once presaleOpen.
     */
    function commitToPresale() public payable {
        address account = msg.sender;
        if (_isContract(account)) {
            revert NoContract();
        }
        if (
            presaleState == PresaleState.OPEN_FOR_WHITELIST &&
            !presaleWhitelist[account]
        ) {
            revert NotWhitelistedForPresale();
        }
        if (
            presaleState != PresaleState.OPEN_FOR_WHITELIST &&
            presaleState != PresaleState.OPEN_FOR_PUBLIC
        ) {
            revert PresaleClosed();
        }

        commitment[account] += msg.value;
        totalCommitments += msg.value;

        if (totalCommitments > PRESALE_HARDCAP) {
            revert HardcapExceeded();
        }
        if (commitment[account] > PRESALE_ACCOUNT_LIMIT) {
            revert MaxAccountLimitExceeded();
        }

        emit CommitedToPresale(account, msg.value);
    }

    /**
     * @notice Threshold of how many tokens to collect from tax before
     * calling #swapTokensAndAddLiquidity.
     * @dev Depends on swapThresholdEth which can be configured by taxManager.
     * Restricted to 5% of liquidity.
     */
    function swapThresholdToken() public view returns (uint256) {
        (uint reserveToken, uint reserveWeth) = _getReserve();
        uint256 maxSwapEth = (reserveWeth * 5) / 100;
        return
            _getAmountToken(
                swapThresholdEth > maxSwapEth ? maxSwapEth : swapThresholdEth,
                reserveToken,
                reserveWeth
            );
    }

    /**
     * @notice Swap 3/4 of `amountToken` collected from tax to WETH to add to
     * liquidity and send to taxRecipient.
     */
    function _swapTokensAndAddLiquidity(uint256 amountToken) internal {
        if (
            balanceOf[address(this)] + totalClaimed <
            amountToken + _SUPPLY_PRESALE
        ) {
            return;
        }

        uint256 amountToSell = (amountToken * 3) / 4;
        uint256 amountToAddToLiquidity = amountToken - amountToSell;

        _swapForWETH(amountToSell, address(this));

        uint256 amountWethAddedToLiquidity = _addLiquidity(
            amountToAddToLiquidity,
            address(0xdead)
        );
        uint256 amountWethCollected = _sweepWeth(taxRecipient);

        emit SwappedTokensAndAddedLiquidity(
            amountToSell,
            amountToAddToLiquidity,
            amountWethAddedToLiquidity,
            amountWethCollected
        );
    }

    /**
     * @dev Enforce a one buy/sell per block limit to prevent sandwitch attacks.
     * These checks come with a gas cost tradeoff and can be configured via
     * limitPerBlockTransfers.
     * @param from sender
     * @param to receiver
     */
    function _enforceTransferLimit(address from, address to) internal {
        bool toPool = isExchangePool[to];
        bool fromPool = isExchangePool[from];
        if (fromPool && !toPool) {
            bytes32 key = keccak256(abi.encodePacked(block.number, to));
            if (_perBlock[key]) {
                revert NoSameBlockBuySell();
            }
            _perBlock[key] = true;
        } else if (!fromPool && toPool) {
            bytes32 key = keccak256(abi.encodePacked(block.number, from));
            if (_perBlock[key]) {
                revert NoSameBlockBuySell();
            }
            _perBlock[key] = true;
        }
    }
}

File 1 of 4: ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

File 2 of 4: ERC20UniswapV2InternalSwaps.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.8.18;

import {ERC20} from "ERC20.sol";

interface IUniswapV2Pair {
    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1);

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

    function mint(address to) external;
}

interface IUniswapV2Factory {
    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);
}

interface IERC20 {
    function transferFrom(address from, address to, uint amount) external;

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

    function approve(address spender, uint256 amount) external;
}

interface IWETH {
    function deposit() external payable;
}

/**
 * @notice UniswapV2Pair does not allow to receive to token0 or token1.
 * As a workaround, this contract can receive tokens and has max approval
 * for the creator.
 */
contract ERC20HolderWithApproval {
    constructor(address token) {
        IERC20(token).approve(msg.sender, type(uint256).max);
    }
}

/**
 * @notice Gas optimized ERC20 token based on solmate's ERC20 contract.
 * @dev Optimizations assume a UniswapV2 WETH pair as main liquidity.
 */
abstract contract ERC20UniswapV2InternalSwaps is ERC20 {
    address private constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address private constant FACTORY =
        0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f;
    address private immutable wethReceiver;
    address public immutable pair;

    error InvalidAddress();

    constructor() {
        // assumption to save additional gas
        if (address(this) >= WETH) {
            revert InvalidAddress();
        }
        pair = IUniswapV2Factory(FACTORY).createPair(address(this), WETH);
        wethReceiver = address(new ERC20HolderWithApproval(WETH));
    }

    /**
     * @dev Swap tokens to WETH directly on pair, to save gas.
     * No check for minimal return, susceptible to price manipulation!
     */
    function _swapForWETH(uint amountToken, address to) internal {
        uint amountWeth = _getAmountWeth(amountToken);
        _transferFromContractBalance(pair, amountToken);
        // Pair prevents receiving tokens to one of the pairs addresses
        IUniswapV2Pair(pair).swap(0, amountWeth, wethReceiver, new bytes(0));
        IERC20(WETH).transferFrom(wethReceiver, to, amountWeth);
    }

    /**
     * @dev Add tokens and WETH to liquidity, directly on pair, to save gas.
     * No check for minimal return, susceptible to price manipulation!
     * Sufficient WETH in contract balancee assumed!
     */
    function _addLiquidity(
        uint amountToken,
        address to
    ) internal returns (uint amountWeth) {
        amountWeth = _quoteToken(amountToken);
        _transferFromContractBalance(pair, amountToken);
        IERC20(WETH).transferFrom(address(this), pair, amountWeth);
        IUniswapV2Pair(pair).mint(to);
    }

    /**
     * @dev Add tokens and WETH as initial liquidity, directly on pair, to save gas.
     * No checks performed. Caller has to make sure to have access to the token before public!
     * Sufficient WETH in contract balancee assumed!
     */
    function _addInitialLiquidity(
        uint amountToken,
        uint amountWeth,
        address to
    ) internal {
        _transferFromContractBalance(pair, amountToken);
        IERC20(WETH).transferFrom(address(this), pair, amountWeth);
        IUniswapV2Pair(pair).mint(to);
    }

    /**
     * @dev Add tokens and ETH as initial liquidity, directly on pair, to save gas.
     * No checks performed. Caller has to make sure to have access to the token before public!
     * Sufficient ETH in contract balancee assumed!
     */
    function _addInitialLiquidityEth(
        uint amountToken,
        uint amountEth,
        address to
    ) internal {
        IWETH(WETH).deposit{value: amountEth}();
        _addInitialLiquidity(amountToken, amountEth, to);
    }

    /** @dev Transfer all WETH from contract balance to `to`. */
    function _sweepWeth(address to) internal returns (uint amountWeth) {
        amountWeth = IERC20(WETH).balanceOf(address(this));
        IERC20(WETH).transferFrom(address(this), to, amountWeth);
    }

    /** @dev Transfer all ETH from contract balance to `to`. */
    function _sweepEth(address to) internal {
        _safeTransferETH(to, address(this).balance);
    }

    /** @dev Quote `amountToken` in ETH, assuming no fees (used for liquidity). */
    function _quoteToken(
        uint amountToken
    ) internal view returns (uint amountEth) {
        (uint reserveToken, uint reserveEth) = IUniswapV2Pair(pair)
            .getReserves();
        amountEth = (amountToken * reserveEth) / reserveToken;
    }

    /** @dev Quote `amountToken` in WETH, assuming 0.3% uniswap fees (used for swap). */
    function _getAmountWeth(
        uint amounToken
    ) internal view returns (uint amountWeth) {
        (uint reserveToken, uint reserveWeth) = IUniswapV2Pair(pair)
            .getReserves();
        uint amountTokenWithFee = amounToken * 997;
        uint numerator = amountTokenWithFee * reserveWeth;
        uint denominator = (reserveToken * 1000) + amountTokenWithFee;
        amountWeth = numerator / denominator;
    }

    /** @dev Quote `amountWeth` in tokens, assuming 0.3% uniswap fees (used for swap). */
    function _getAmountToken(
        uint amounWeth,
        uint reserveToken,
        uint reserveWeth
    ) internal pure returns (uint amountToken) {
        uint numerator = reserveToken * amounWeth * 1000;
        uint denominator = (reserveWeth - amounWeth) * 997;
        amountToken = (numerator / denominator) + 1;
    }

    /** @dev Get reserves of pair. */
    function _getReserve()
        internal
        view
        returns (uint reserveToken, uint reserveWeth)
    {
        (reserveToken, reserveWeth) = IUniswapV2Pair(pair).getReserves();
    }

    /** @dev Transfer `amount` ETH to `to` gas efficiently. */
    function _safeTransferETH(address to, uint256 amount) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly { // solhint-disable-line no-inline-assembly
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /** @dev Returns true if `_address` is a contract. */
    function _isContract(address _address) internal view returns (bool) {
        uint32 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(_address)
        }
        return (size > 0);
    }

    /** @dev Transfeer `amount` tokens from contract balance to `to`. */
    function _transferFromContractBalance(
        address to,
        uint256 amount
    ) internal returns (bool) {
        balanceOf[address(this)] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(this), to, amount);

        return true;
    }
}

File 3 of 4: Owned.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

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

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(address _owner) {
        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function transferOwnership(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnershipTransferred(msg.sender, newOwner);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"HardcapExceeded","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidBlockDelay","type":"error"},{"inputs":[],"name":"InvalidParameters","type":"error"},{"inputs":[],"name":"InvalidState","type":"error"},{"inputs":[],"name":"InvalidSwapThreshold","type":"error"},{"inputs":[],"name":"MaxAccountLimitExceeded","type":"error"},{"inputs":[],"name":"NoCommittments","type":"error"},{"inputs":[],"name":"NoContract","type":"error"},{"inputs":[],"name":"NoSameBlockBuySell","type":"error"},{"inputs":[],"name":"NotWhitelistedForPresale","type":"error"},{"inputs":[],"name":"NothingCommitted","type":"error"},{"inputs":[],"name":"PresaleClosed","type":"error"},{"inputs":[],"name":"PresaleNotCompleted","type":"error"},{"inputs":[],"name":"TradeAlreadyOpend","type":"error"},{"inputs":[],"name":"TradingNotOpenYet","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"ZeroTransfer","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CommitedToPresale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"isExchangePool","type":"bool"}],"name":"ExchangePoolStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"limitPerBlockTransfers","type":"bool"}],"name":"LimitPerBlockTransfersChangeed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PresaleClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalCommitments","type":"uint256"}],"name":"PresaleCompleted","type":"event"},{"anonymous":false,"inputs":[],"name":"PresaleOpened","type":"event"},{"anonymous":false,"inputs":[],"name":"PublicPresaleOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"swapThresholdEth","type":"uint256"}],"name":"SwapThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensAddedToLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wethAddedToLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wethCollected","type":"uint256"}],"name":"SwappedTokensAndAddedLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"bool","name":"taxFree","type":"bool"}],"name":"TaxFreeStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"taxManager","type":"address"}],"name":"TaxManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"taxRecipient","type":"address"}],"name":"TaxRecipientChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_ACCOUNT_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_HARDCAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_OTHER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWAP_THRESHOLD_ETH_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWAP_THRESHOLD_ETH_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_TAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","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":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"commitToPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"commitment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"completePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocksDelay","type":"uint256"}],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExchangePool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradeOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitPerBlockTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openPublicPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presaleState","outputs":[{"internalType":"enum SixPackRick.PresaleState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exchangePool","type":"bool"}],"name":"setExchangePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newLimitPerBlockTransfers","type":"bool"}],"name":"setLimitPerBlockTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSwapThresholdEth","type":"uint256"}],"name":"setSwapThresholdEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"taxFree","type":"bool"}],"name":"setTaxFreeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTaxRecipient","type":"address"}],"name":"setTaxRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThresholdEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThresholdToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxFreeAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCommitments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTaxManager","type":"address"}],"name":"transferTaxManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unclaimedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"whitelistForPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

610120604052600780546001600160a01b031916739134a698f674d3a0d9154ce812662526e279a8ef17905567016345785d8a0000600a556011805461ff0019166101001790556000196012553480156200005957600080fd5b503360405180604001604052806009815260200168365061636b5269636b60b81b815250604051806040016040528060038152602001621b282960e91b81525060128260009081620000ac919062000601565b506001620000bb838262000601565b5060ff81166080524660a052620000d162000445565b60c052505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2301090506200010d5760405163e6c4247b60e01b815260040160405180910390fd5b6040516364e329cb60e11b815230600482015273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26024820152735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9063c9c65396906044016020604051808303816000875af115801562000179573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019f9190620006cd565b6001600160a01b03166101005260405173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290620001d0906200054e565b6001600160a01b039091168152602001604051809103906000f080158015620001fd573d6000803e3d6000fd5b506001600160a01b0390811660e052600680546001600160a01b03191691831691821790556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600b80546001600160a01b031916339081179091556040517f4f06221442f29c68561a21b361dae6cd59eeb67b7cded6395d590a4e1d2fd3a290600090a233600081815260086020526040808220805460ff19166001908117909155905190929160008051602062003c7283398151915291a3600780546001600160a01b03908116600090815260086020526040808220805460ff191660019081179091559354905192169160008051602062003c728339815191529190a3610100516001600160a01b0316600081815260096020526040808220805460ff1916600190811790915590519092917fd3763f1074087e38245af8391cfa3acdb23e0553090104fd7b85667d7328752991a3620003c23060646200037b601e6d14bddab3e51a57cff87a5000000062000715565b62000387919062000735565b6064620003a460326d14bddab3e51a57cff87a5000000062000715565b620003b0919062000735565b620003bc919062000758565b620004e1565b6200043f336064620003e4601e6d14bddab3e51a57cff87a5000000062000715565b620003f0919062000735565b60646200040d60326d14bddab3e51a57cff87a5000000062000715565b62000419919062000735565b62000433906d14bddab3e51a57cff87a500000006200076e565b620003bc91906200076e565b62000802565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600060405162000479919062000784565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060026000828254620004f5919062000758565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b61010b8062003b6783390190565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200058757607f821691505b602082108103620005a857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620005fc57600081815260208120601f850160051c81016020861015620005d75750805b601f850160051c820191505b81811015620005f857828155600101620005e3565b5050505b505050565b81516001600160401b038111156200061d576200061d6200055c565b62000635816200062e845462000572565b84620005ae565b602080601f8311600181146200066d5760008415620006545750858301515b600019600386901b1c1916600185901b178555620005f8565b600085815260208120601f198616915b828110156200069e578886015182559484019460019091019084016200067d565b5085821015620006bd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215620006e057600080fd5b81516001600160a01b0381168114620006f857600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176200072f576200072f620006ff565b92915050565b6000826200075357634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156200072f576200072f620006ff565b818103818111156200072f576200072f620006ff565b6000808354620007948162000572565b60018281168015620007af5760018114620007c557620007f6565b60ff1984168752821515830287019450620007f6565b8760005260208060002060005b85811015620007ed5781548a820152908401908201620007d2565b50505082870194505b50929695505050505050565b60805160a05160c05160e051610100516132cc6200089b600039600081816107940152818161259901528181612699015281816126fe0152818161283d015281816128800152818161293301528181612aad01528181612af001528181612ba301528181612c360152612d2101526000818161272e015261279e015260006111cf0152600061119a015260006104d301526132cc6000f3fe6080604052600436106103385760003560e01c806381e172ca116101b0578063bda347be116100ec578063dd62ed3e11610095578063e09d6bc61161006f578063e09d6bc61461092d578063eb8835ab1461094d578063f2fde38b1461097d578063f5a4fa1e1461099d57600080fd5b8063dd62ed3e146108c3578063ddf4d519146108fb578063dfc56b111461091057600080fd5b8063d54ad2a1116100c6578063d54ad2a11461086d578063d8e8a09414610883578063dc5cd7ae146108a357600080fd5b8063bda347be14610830578063d173dffb14610838578063d505accf1461084d57600080fd5b806399fbde7d11610159578063a8aa1b3111610133578063a8aa1b3114610782578063a9059cbb146107b6578063a960c65f146107d6578063b18f0de21461080357600080fd5b806399fbde7d14610738578063a2aa18ad1461074d578063a4bd440b1461076d57600080fd5b80638da5cb5b1161018a5780638da5cb5b146106ee5780638dd983121461070e57806395d89b411461072357600080fd5b806381e172ca1461069657806382aa7c68146106b15780638897b1a7146106d157600080fd5b80633644e5151161027f57806367cf6f1011610228578063737ea06e11610202578063737ea06e1461061357806378bb86d31461063357806378e3079e146106495780637ecebe001461066957600080fd5b806367cf6f10146105b557806370a08231146105ca57806370e7c575146105f757600080fd5b806352fd28a61161025957806352fd28a6146105695780635afefc0914610589578063609014441461059e57600080fd5b80633644e515146105075780634201ed1b1461051c5780634d2377301461053157600080fd5b806318160ddd116102e1578063263b8237116102bb578063263b82371461048c5780632cb686fe146104ac578063313ce567146104c157600080fd5b806318160ddd1461042657806318f60b691461043c57806323b872dd1461046c57600080fd5b80630d0c31b7116103125780630d0c31b7146103bc5780631465000e146103e35780631725fb6b1461040757600080fd5b8063046ef9a51461034c57806306fdde0314610361578063095ea7b31461038c57600080fd5b36610347576103456109cd565b005b600080fd5b34801561035857600080fd5b50610345610c23565b34801561036d57600080fd5b50610376610e36565b6040516103839190612e12565b60405180910390f35b34801561039857600080fd5b506103ac6103a7366004612e41565b610ec4565b6040519015158152602001610383565b3480156103c857600080fd5b506011546103d69060ff1681565b6040516103839190612e81565b3480156103ef57600080fd5b506103f9600a5481565b604051908152602001610383565b34801561041357600080fd5b506011546103ac90610100900460ff1681565b34801561043257600080fd5b506103f960025481565b34801561044857600080fd5b506103ac610457366004612ea9565b60096020526000908152604090205460ff1681565b34801561047857600080fd5b506103ac610487366004612ec4565b610f31565b34801561049857600080fd5b506103456104a7366004612f10565b6110d7565b3480156104b857600080fd5b506103f9603281565b3480156104cd57600080fd5b506104f57f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610383565b34801561051357600080fd5b506103f9611196565b34801561052857600080fd5b506103f9601481565b34801561053d57600080fd5b50600b54610551906001600160a01b031681565b6040516001600160a01b039091168152602001610383565b34801561057557600080fd5b50610345610584366004612f10565b6111f1565b34801561059557600080fd5b506103f96112b0565b3480156105aa57600080fd5b5060125443116103ac565b3480156105c157600080fd5b506103456112e5565b3480156105d657600080fd5b506103f96105e5366004612ea9565b60036020526000908152604090205481565b34801561060357600080fd5b506103f9670853a0d2313c000081565b34801561061f57600080fd5b50600754610551906001600160a01b031681565b34801561063f57600080fd5b506103f9600f5481565b34801561065557600080fd5b50610345610664366004612ea9565b61148e565b34801561067557600080fd5b506103f9610684366004612ea9565b60056020526000908152604090205481565b3480156106a257600080fd5b506103f96611c37937e0800081565b3480156106bd57600080fd5b506103456106cc366004612f43565b611550565b3480156106dd57600080fd5b506103f9680727de34a24f90000081565b3480156106fa57600080fd5b50600654610551906001600160a01b031681565b34801561071a57600080fd5b506103456116ad565b34801561072f57600080fd5b50610376611765565b34801561074457600080fd5b506103f9601e81565b34801561075957600080fd5b50610345610768366004612ea9565b611772565b34801561077957600080fd5b50610345611822565b34801561078e57600080fd5b506105517f000000000000000000000000000000000000000000000000000000000000000081565b3480156107c257600080fd5b506103ac6107d1366004612e41565b6118da565b3480156107e257600080fd5b506103f96107f1366004612ea9565b600e6020526000908152604090205481565b34801561080f57600080fd5b506103f961081e366004612ea9565b600d6020526000908152604090205481565b6103456109cd565b34801561084457600080fd5b506103f9600281565b34801561085957600080fd5b50610345610868366004612f5c565b611a53565b34801561087957600080fd5b506103f960105481565b34801561088f57600080fd5b5061034561089e366004612fcf565b611cc1565b3480156108af57600080fd5b506103456108be366004612fea565b611d7b565b3480156108cf57600080fd5b506103f96108de36600461305f565b600460209081526000928352604080842090915290825290205481565b34801561090757600080fd5b506103f9611e39565b34801561091c57600080fd5b506103f96802b5e3af16b188000081565b34801561093957600080fd5b50610345610948366004612f43565b611e8b565b34801561095957600080fd5b506103ac610968366004612ea9565b600c6020526000908152604090205460ff1681565b34801561098957600080fd5b50610345610998366004612ea9565b611f4a565b3480156109a957600080fd5b506103ac6109b8366004612ea9565b60086020526000908152604090205460ff1681565b33803b63ffffffff1615610a0d576040517f0c3b563c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160115460ff166003811115610a2657610a26612e6b565b148015610a4c57506001600160a01b0381166000908152600c602052604090205460ff16155b15610a83576040517fc7acae6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160115460ff166003811115610a9c57610a9c612e6b565b14158015610ac15750600260115460ff166003811115610abe57610abe612e6b565b14155b15610af8576040517f178883df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152600d602052604081208054349290610b2090849061309f565b9250508190555034600f6000828254610b39919061309f565b9091555050600f54680727de34a24f9000001015610b83576040517faf4a113f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152600d6020526040902054670853a0d2313c00001015610bdd576040517f1ba602ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001600160a01b03167f5b32366e01f1031d9eea11f55e693d225ce96b46c3761591c85f4ee8c34baa0834604051610c1891815260200190565b60405180910390a250565b33803b63ffffffff1615610c63576040517f0c3b563c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360115460ff166003811115610c7c57610c7c612e6b565b14610cb3576040517fcebeeca300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152600d60205260408120549003610d04576040517f835a24b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152600e602052604090205415610d54576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f546001600160a01b0382166000908152600d60205260408120549091906064610d8e60326d14bddab3e51a57cff87a500000006130b2565b610d9891906130c9565b610da291906130b2565b610dac91906130c9565b6001600160a01b0383166000908152600e60205260408120829055601080549293508392909190610dde90849061309f565b90915550610dee90508282611fec565b50816001600160a01b03167f0352332f702f094a528e3002d331329d6bdab7dfd9b1f45864ca583ea0636ee882604051610e2a91815260200190565b60405180910390a25050565b60008054610e43906130eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6f906130eb565b8015610ebc5780601f10610e9157610100808354040283529160200191610ebc565b820191906000526020600020905b815481529060010190602001808311610e9f57829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610f1f9086815260200190565b60405180910390a35060015b92915050565b600081600003610f6d576040517f10cadee300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316610fad576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03841660009081526008602052604090205460ff16158015610fef57506001600160a01b03831660009081526008602052604090205460ff16155b801561100b57503360009081526008602052604090205460ff16155b156110c457601254431161104b576040517fb92b389400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601154610100900460ff1615611065576110658484612064565b600060646110746002856130b2565b61107e91906130c9565b905061108b853083612210565b506001600160a01b038416600090815260096020526040902054928190039260ff16156110c2576110c26110bd611e39565b612302565b505b6110cf848484612210565b949350505050565b600b546001600160a01b03163314611101576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03821660009081526009602052604090205481151560ff90911615150361114257604051630e52390960e41b815260040160405180910390fd5b6001600160a01b038216600081815260096020526040808220805460ff191685151590811790915590519092917fd3763f1074087e38245af8391cfa3acdb23e0553090104fd7b85667d7328752991a35050565b60007f000000000000000000000000000000000000000000000000000000000000000046146111cc576111c7612405565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b600b546001600160a01b0316331461121b576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03821660009081526008602052604090205481151560ff90911615150361125c57604051630e52390960e41b815260040160405180910390fd5b6001600160a01b038216600081815260086020526040808220805460ff191685151590811790915590519092917f02ebf20869d52e173b3abfc35a2c8f7efc7901edff0691526afa5d21fa2ce92291a35050565b60105460009060646112d160326d14bddab3e51a57cff87a500000006130b2565b6112db91906130c9565b6111c79190613125565b6006546001600160a01b031633146113335760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b600260115460ff16600381111561134c5761134c612e6b565b1461136a5760405163baf3f0f760e01b815260040160405180910390fd5b600f546000036113a6576040517f725699da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6011805460ff19166003179055600060646113d060326d14bddab3e51a57cff87a500000006130b2565b6113da91906130c9565b60646113f5601e6d14bddab3e51a57cff87a500000006130b2565b6113ff91906130c9565b600f5461140c91906130b2565b61141691906130c9565b90506114476064611436601e6d14bddab3e51a57cff87a500000006130b2565b61144091906130c9565b823361249f565b61145033612512565b7f6882b4e9381959c371492b71e5cc926ee0b176e95804510eeac6c20044b5b5a2600f5460405161148391815260200190565b60405180910390a150565b600b546001600160a01b031633146114b8576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03811615806114db57506007546001600160a01b038281169116145b156114f957604051630e52390960e41b815260040160405180910390fd5b6007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f252e37823f8325a28d11c9bfaa110c2e0587d3e41cf2a02d5de57536c058e68990600090a250565b6006546001600160a01b031633146115995760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161132a565b600019601254146115d6576040517f4bdc31d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015806115e35750600581115b1561161a576040517f43cc518900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360115460ff16600381111561163357611633612e6b565b1461166a576040517fcebeeca300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611674814361309f565b6012556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a16116aa6000611f4a565b50565b6006546001600160a01b031633146116f65760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161132a565b600060115460ff16600381111561170f5761170f612e6b565b1461172d5760405163baf3f0f760e01b815260040160405180910390fd5b6011805460ff191660011790556040517fbac8edc4f6a45ce4a46327dbea4b1181366b50f7356984a5e1c92ebe3cb21c1290600090a1565b60018054610e43906130eb565b600b546001600160a01b0316331461179c576040516282b42960e81b815260040160405180910390fd5b600b546001600160a01b03908116908216036117cb57604051630e52390960e41b815260040160405180910390fd5b600b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f4f06221442f29c68561a21b361dae6cd59eeb67b7cded6395d590a4e1d2fd3a290600090a250565b6006546001600160a01b0316331461186b5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161132a565b600160115460ff16600381111561188457611884612e6b565b146118a25760405163baf3f0f760e01b815260040160405180910390fd5b6011805460ff191660021790556040517f825d3b5d27bcd5858c26a77c2fb6a6569a9ca1c51c9d64f4f7b921571fb5a6aa90600090a1565b600081600003611916576040517f10cadee300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316611956576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526008602052604090205460ff1615801561198f57506001600160a01b03831660009081526008602052604090205460ff16155b15611a425760125443116119cf576040517fb92b389400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601154610100900460ff16156119e9576119e93384612064565b600060646119f86002856130b2565b611a0291906130c9565b9050611a0e308261251c565b506001600160a01b038416600090815260096020526040902054928190039260ff1615611a4057611a406110bd611e39565b505b611a4c838361251c565b9392505050565b42841015611aa35760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f45585049524544000000000000000000604482015260640161132a565b60006001611aaf611196565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f19010000000000000000000000000000000000000000000000000000000000006101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611bd6573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611c0c5750876001600160a01b0316816001600160a01b0316145b611c585760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f5349474e4552000000000000000000000000000000000000604482015260640161132a565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600b546001600160a01b03163314611ceb576040516282b42960e81b815260040160405180910390fd5b601154610100900460ff16151581151503611d1957604051630e52390960e41b815260040160405180910390fd5b601180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100831515908102919091179091556040517f472ad5654cb114032bf56da56673f88d6c14a156b1f3aeb86470d5175787625190600090a250565b6006546001600160a01b03163314611dc45760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161132a565b60005b81811015611e34576001600c6000858585818110611de757611de7613138565b9050602002016020810190611dfc9190612ea9565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611e2d8161314e565b9050611dc7565b505050565b6000806000611e46612594565b909250905060006064611e5a8360056130b2565b611e6491906130c9565b9050611e8381600a5411611e7a57600a54611e7c565b815b8484612633565b935050505090565b600b546001600160a01b03163314611eb5576040516282b42960e81b815260040160405180910390fd5b6611c37937e08000811080611ed257506802b5e3af16b188000081115b80611ede5750600a5481145b15611f15576040517fcb9e92ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a8190556040518181527f9ff241d1f1e0c30788ac08c45391c423cc5ef3e67f66a46b95a9a8f394759f3690602001611483565b6006546001600160a01b03163314611f935760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161132a565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b3060009081526003602052604081208054839190839061200d908490613125565b90915550506001600160a01b038316600081815260036020526040908190208054850190555130907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610f1f9086815260200190565b6001600160a01b0380821660009081526009602052604080822054928516825290205460ff9182169116808015612099575081155b1561214e57600043846040516020016120ce92919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b60408051601f1981840301815291815281516020928301206000818152601390935291205490915060ff1615612130576040517fdbfc980f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000908152601360205260409020805460ff1916600117905561220a565b801580156121595750815b1561220a576000438560405160200161218e92919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b60408051601f1981840301815291815281516020928301206000818152601390935291205490915060ff16156121f0576040517fdbfc980f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000908152601360205260409020805460ff191660011790555b50505050565b6001600160a01b0383166000908152600460209081526040808320338452909152812054600019811461226c576122478382613125565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b03851660009081526003602052604081208054859290612294908490613125565b90915550506001600160a01b03808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122ef9087815260200190565b60405180910390a3506001949350505050565b606461231d60326d14bddab3e51a57cff87a500000006130b2565b61232791906130c9565b612331908261309f565b6010543060009081526003602052604090205461234e919061309f565b10156123575750565b600060046123668360036130b2565b61237091906130c9565b9050600061237e8284613125565b905061238a8230612687565b60006123988261dead61282b565b6007549091506000906123b3906001600160a01b0316612997565b6040805186815260208101869052908101849052606081018290529091507f598c0e945de578e5da9796301f9b516503483732932c44cbd6cca187431cfd9d9060800160405180910390a15050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516124379190613168565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156124ee57600080fd5b505af1158015612502573d6000803e3d6000fd5b5050505050611e34838383612aa8565b6116aa8147612bd4565b3360009081526003602052604081208054839190839061253d908490613125565b90915550506001600160a01b038316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610f1f9086815260200190565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b81526004016040805180830381865afa1580156125f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126189190613225565b6dffffffffffffffffffffffffffff91821694911692509050565b60008061264085856130b2565b61264c906103e86130b2565b9050600061265a8685613125565b612666906103e56130b2565b905061267281836130c9565b61267d90600161309f565b9695505050505050565b600061269283612c2f565b90506126be7f000000000000000000000000000000000000000000000000000000000000000084611fec565b5060408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000009092526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163022c0d9f91612757919085907f0000000000000000000000000000000000000000000000000000000000000000906024810161324f565b600060405180830381600087803b15801561277157600080fd5b505af1158015612785573d6000803e3d6000fd5b50506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152851660248201526044810184905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292506323b872dd91506064015b600060405180830381600087803b15801561280e57600080fd5b505af1158015612822573d6000803e3d6000fd5b50505050505050565b600061283683612d1a565b90506128627f000000000000000000000000000000000000000000000000000000000000000084611fec565b506040516323b872dd60e01b81523060048201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660248201526044810182905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906323b872dd90606401600060405180830381600087803b1580156128e557600080fd5b505af11580156128f9573d6000803e3d6000fd5b50506040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301527f0000000000000000000000000000000000000000000000000000000000000000169250636a6278429150602401600060405180830381600087803b15801561297957600080fd5b505af115801561298d573d6000803e3d6000fd5b5050505092915050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a0823190602401602060405180830381865afa158015612a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a26919061327d565b6040516323b872dd60e01b81523060048201526001600160a01b03841660248201526044810182905290915073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906323b872dd90606401600060405180830381600087803b158015612a8b57600080fd5b505af1158015612a9f573d6000803e3d6000fd5b50505050919050565b612ad27f000000000000000000000000000000000000000000000000000000000000000084611fec565b506040516323b872dd60e01b81523060048201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660248201526044810183905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906323b872dd90606401600060405180830381600087803b158015612b5557600080fd5b505af1158015612b69573d6000803e3d6000fd5b50506040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169250636a62784291506024016127f4565b600080600080600085875af1905080611e345760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c454400000000000000000000000000604482015260640161132a565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b81526004016040805180830381865afa158015612c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb59190613225565b6dffffffffffffffffffffffffffff91821693501690506000612cda856103e56130b2565b90506000612ce883836130b2565b9050600082612cf9866103e86130b2565b612d03919061309f565b9050612d0f81836130c9565b979650505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b81526004016040805180830381865afa158015612d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da09190613225565b6dffffffffffffffffffffffffffff918216935016905081612dc282866130b2565b6110cf91906130c9565b6000815180845260005b81811015612df257602081850181015186830182015201612dd6565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611a4c6020830184612dcc565b80356001600160a01b0381168114612e3c57600080fd5b919050565b60008060408385031215612e5457600080fd5b612e5d83612e25565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b6020810160048310612ea357634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215612ebb57600080fd5b611a4c82612e25565b600080600060608486031215612ed957600080fd5b612ee284612e25565b9250612ef060208501612e25565b9150604084013590509250925092565b80358015158114612e3c57600080fd5b60008060408385031215612f2357600080fd5b612f2c83612e25565b9150612f3a60208401612f00565b90509250929050565b600060208284031215612f5557600080fd5b5035919050565b600080600080600080600060e0888a031215612f7757600080fd5b612f8088612e25565b9650612f8e60208901612e25565b95506040880135945060608801359350608088013560ff81168114612fb257600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600060208284031215612fe157600080fd5b611a4c82612f00565b60008060208385031215612ffd57600080fd5b823567ffffffffffffffff8082111561301557600080fd5b818501915085601f83011261302957600080fd5b81358181111561303857600080fd5b8660208260051b850101111561304d57600080fd5b60209290920196919550909350505050565b6000806040838503121561307257600080fd5b61307b83612e25565b9150612f3a60208401612e25565b634e487b7160e01b600052601160045260246000fd5b80820180821115610f2b57610f2b613089565b8082028115828204841417610f2b57610f2b613089565b6000826130e657634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806130ff57607f821691505b60208210810361311f57634e487b7160e01b600052602260045260246000fd5b50919050565b81810381811115610f2b57610f2b613089565b634e487b7160e01b600052603260045260246000fd5b6000600019820361316157613161613089565b5060010190565b600080835481600182811c91508083168061318457607f831692505b602080841082036131a357634e487b7160e01b86526022600452602486fd5b8180156131b757600181146131cc576131f9565b60ff19861689528415158502890196506131f9565b60008a81526020902060005b868110156131f15781548b8201529085019083016131d8565b505084890196505b509498975050505050505050565b80516dffffffffffffffffffffffffffff81168114612e3c57600080fd5b6000806040838503121561323857600080fd5b61324183613207565b9150612f3a60208401613207565b8481528360208201526001600160a01b038316604082015260806060820152600061267d6080830184612dcc565b60006020828403121561328f57600080fd5b505191905056fea26469706673582212207e0197f1ab3b4c7adb1242682b87f3d0763827eeccfd21fed6d9c486d4ce09ae64736f6c634300081200336080604052348015600f57600080fd5b5060405161010b38038061010b833981016040819052602c916090565b60405163095ea7b360e01b815233600482015260001960248201526001600160a01b0382169063095ea7b390604401600060405180830381600087803b158015607457600080fd5b505af11580156087573d6000803e3d6000fd5b505050505060be565b60006020828403121560a157600080fd5b81516001600160a01b038116811460b757600080fd5b9392505050565b603f806100cc6000396000f3fe6080604052600080fdfea26469706673582212204d994052626b05c12cd5910e44b736ec0b01e2ef2456ec32610203f99a1e11c764736f6c6343000812003302ebf20869d52e173b3abfc35a2c8f7efc7901edff0691526afa5d21fa2ce922

Deployed Bytecode

0x6080604052600436106103385760003560e01c806381e172ca116101b0578063bda347be116100ec578063dd62ed3e11610095578063e09d6bc61161006f578063e09d6bc61461092d578063eb8835ab1461094d578063f2fde38b1461097d578063f5a4fa1e1461099d57600080fd5b8063dd62ed3e146108c3578063ddf4d519146108fb578063dfc56b111461091057600080fd5b8063d54ad2a1116100c6578063d54ad2a11461086d578063d8e8a09414610883578063dc5cd7ae146108a357600080fd5b8063bda347be14610830578063d173dffb14610838578063d505accf1461084d57600080fd5b806399fbde7d11610159578063a8aa1b3111610133578063a8aa1b3114610782578063a9059cbb146107b6578063a960c65f146107d6578063b18f0de21461080357600080fd5b806399fbde7d14610738578063a2aa18ad1461074d578063a4bd440b1461076d57600080fd5b80638da5cb5b1161018a5780638da5cb5b146106ee5780638dd983121461070e57806395d89b411461072357600080fd5b806381e172ca1461069657806382aa7c68146106b15780638897b1a7146106d157600080fd5b80633644e5151161027f57806367cf6f1011610228578063737ea06e11610202578063737ea06e1461061357806378bb86d31461063357806378e3079e146106495780637ecebe001461066957600080fd5b806367cf6f10146105b557806370a08231146105ca57806370e7c575146105f757600080fd5b806352fd28a61161025957806352fd28a6146105695780635afefc0914610589578063609014441461059e57600080fd5b80633644e515146105075780634201ed1b1461051c5780634d2377301461053157600080fd5b806318160ddd116102e1578063263b8237116102bb578063263b82371461048c5780632cb686fe146104ac578063313ce567146104c157600080fd5b806318160ddd1461042657806318f60b691461043c57806323b872dd1461046c57600080fd5b80630d0c31b7116103125780630d0c31b7146103bc5780631465000e146103e35780631725fb6b1461040757600080fd5b8063046ef9a51461034c57806306fdde0314610361578063095ea7b31461038c57600080fd5b36610347576103456109cd565b005b600080fd5b34801561035857600080fd5b50610345610c23565b34801561036d57600080fd5b50610376610e36565b6040516103839190612e12565b60405180910390f35b34801561039857600080fd5b506103ac6103a7366004612e41565b610ec4565b6040519015158152602001610383565b3480156103c857600080fd5b506011546103d69060ff1681565b6040516103839190612e81565b3480156103ef57600080fd5b506103f9600a5481565b604051908152602001610383565b34801561041357600080fd5b506011546103ac90610100900460ff1681565b34801561043257600080fd5b506103f960025481565b34801561044857600080fd5b506103ac610457366004612ea9565b60096020526000908152604090205460ff1681565b34801561047857600080fd5b506103ac610487366004612ec4565b610f31565b34801561049857600080fd5b506103456104a7366004612f10565b6110d7565b3480156104b857600080fd5b506103f9603281565b3480156104cd57600080fd5b506104f57f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610383565b34801561051357600080fd5b506103f9611196565b34801561052857600080fd5b506103f9601481565b34801561053d57600080fd5b50600b54610551906001600160a01b031681565b6040516001600160a01b039091168152602001610383565b34801561057557600080fd5b50610345610584366004612f10565b6111f1565b34801561059557600080fd5b506103f96112b0565b3480156105aa57600080fd5b5060125443116103ac565b3480156105c157600080fd5b506103456112e5565b3480156105d657600080fd5b506103f96105e5366004612ea9565b60036020526000908152604090205481565b34801561060357600080fd5b506103f9670853a0d2313c000081565b34801561061f57600080fd5b50600754610551906001600160a01b031681565b34801561063f57600080fd5b506103f9600f5481565b34801561065557600080fd5b50610345610664366004612ea9565b61148e565b34801561067557600080fd5b506103f9610684366004612ea9565b60056020526000908152604090205481565b3480156106a257600080fd5b506103f96611c37937e0800081565b3480156106bd57600080fd5b506103456106cc366004612f43565b611550565b3480156106dd57600080fd5b506103f9680727de34a24f90000081565b3480156106fa57600080fd5b50600654610551906001600160a01b031681565b34801561071a57600080fd5b506103456116ad565b34801561072f57600080fd5b50610376611765565b34801561074457600080fd5b506103f9601e81565b34801561075957600080fd5b50610345610768366004612ea9565b611772565b34801561077957600080fd5b50610345611822565b34801561078e57600080fd5b506105517f00000000000000000000000055497d6fe4cb2beec4e1e4cd76aff2157349f06881565b3480156107c257600080fd5b506103ac6107d1366004612e41565b6118da565b3480156107e257600080fd5b506103f96107f1366004612ea9565b600e6020526000908152604090205481565b34801561080f57600080fd5b506103f961081e366004612ea9565b600d6020526000908152604090205481565b6103456109cd565b34801561084457600080fd5b506103f9600281565b34801561085957600080fd5b50610345610868366004612f5c565b611a53565b34801561087957600080fd5b506103f960105481565b34801561088f57600080fd5b5061034561089e366004612fcf565b611cc1565b3480156108af57600080fd5b506103456108be366004612fea565b611d7b565b3480156108cf57600080fd5b506103f96108de36600461305f565b600460209081526000928352604080842090915290825290205481565b34801561090757600080fd5b506103f9611e39565b34801561091c57600080fd5b506103f96802b5e3af16b188000081565b34801561093957600080fd5b50610345610948366004612f43565b611e8b565b34801561095957600080fd5b506103ac610968366004612ea9565b600c6020526000908152604090205460ff1681565b34801561098957600080fd5b50610345610998366004612ea9565b611f4a565b3480156109a957600080fd5b506103ac6109b8366004612ea9565b60086020526000908152604090205460ff1681565b33803b63ffffffff1615610a0d576040517f0c3b563c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160115460ff166003811115610a2657610a26612e6b565b148015610a4c57506001600160a01b0381166000908152600c602052604090205460ff16155b15610a83576040517fc7acae6d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160115460ff166003811115610a9c57610a9c612e6b565b14158015610ac15750600260115460ff166003811115610abe57610abe612e6b565b14155b15610af8576040517f178883df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152600d602052604081208054349290610b2090849061309f565b9250508190555034600f6000828254610b39919061309f565b9091555050600f54680727de34a24f9000001015610b83576040517faf4a113f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152600d6020526040902054670853a0d2313c00001015610bdd576040517f1ba602ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001600160a01b03167f5b32366e01f1031d9eea11f55e693d225ce96b46c3761591c85f4ee8c34baa0834604051610c1891815260200190565b60405180910390a250565b33803b63ffffffff1615610c63576040517f0c3b563c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360115460ff166003811115610c7c57610c7c612e6b565b14610cb3576040517fcebeeca300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152600d60205260408120549003610d04576040517f835a24b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0381166000908152600e602052604090205415610d54576040517f646cf55800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600f546001600160a01b0382166000908152600d60205260408120549091906064610d8e60326d14bddab3e51a57cff87a500000006130b2565b610d9891906130c9565b610da291906130b2565b610dac91906130c9565b6001600160a01b0383166000908152600e60205260408120829055601080549293508392909190610dde90849061309f565b90915550610dee90508282611fec565b50816001600160a01b03167f0352332f702f094a528e3002d331329d6bdab7dfd9b1f45864ca583ea0636ee882604051610e2a91815260200190565b60405180910390a25050565b60008054610e43906130eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6f906130eb565b8015610ebc5780601f10610e9157610100808354040283529160200191610ebc565b820191906000526020600020905b815481529060010190602001808311610e9f57829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610f1f9086815260200190565b60405180910390a35060015b92915050565b600081600003610f6d576040517f10cadee300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316610fad576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03841660009081526008602052604090205460ff16158015610fef57506001600160a01b03831660009081526008602052604090205460ff16155b801561100b57503360009081526008602052604090205460ff16155b156110c457601254431161104b576040517fb92b389400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601154610100900460ff1615611065576110658484612064565b600060646110746002856130b2565b61107e91906130c9565b905061108b853083612210565b506001600160a01b038416600090815260096020526040902054928190039260ff16156110c2576110c26110bd611e39565b612302565b505b6110cf848484612210565b949350505050565b600b546001600160a01b03163314611101576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03821660009081526009602052604090205481151560ff90911615150361114257604051630e52390960e41b815260040160405180910390fd5b6001600160a01b038216600081815260096020526040808220805460ff191685151590811790915590519092917fd3763f1074087e38245af8391cfa3acdb23e0553090104fd7b85667d7328752991a35050565b60007f000000000000000000000000000000000000000000000000000000000000000146146111cc576111c7612405565b905090565b507fd62e9b2cf3adb9d9067910b46f7016c1436044f6c511a420704cc378fb7fa05790565b600b546001600160a01b0316331461121b576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03821660009081526008602052604090205481151560ff90911615150361125c57604051630e52390960e41b815260040160405180910390fd5b6001600160a01b038216600081815260086020526040808220805460ff191685151590811790915590519092917f02ebf20869d52e173b3abfc35a2c8f7efc7901edff0691526afa5d21fa2ce92291a35050565b60105460009060646112d160326d14bddab3e51a57cff87a500000006130b2565b6112db91906130c9565b6111c79190613125565b6006546001600160a01b031633146113335760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b600260115460ff16600381111561134c5761134c612e6b565b1461136a5760405163baf3f0f760e01b815260040160405180910390fd5b600f546000036113a6576040517f725699da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6011805460ff19166003179055600060646113d060326d14bddab3e51a57cff87a500000006130b2565b6113da91906130c9565b60646113f5601e6d14bddab3e51a57cff87a500000006130b2565b6113ff91906130c9565b600f5461140c91906130b2565b61141691906130c9565b90506114476064611436601e6d14bddab3e51a57cff87a500000006130b2565b61144091906130c9565b823361249f565b61145033612512565b7f6882b4e9381959c371492b71e5cc926ee0b176e95804510eeac6c20044b5b5a2600f5460405161148391815260200190565b60405180910390a150565b600b546001600160a01b031633146114b8576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03811615806114db57506007546001600160a01b038281169116145b156114f957604051630e52390960e41b815260040160405180910390fd5b6007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f252e37823f8325a28d11c9bfaa110c2e0587d3e41cf2a02d5de57536c058e68990600090a250565b6006546001600160a01b031633146115995760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161132a565b600019601254146115d6576040517f4bdc31d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015806115e35750600581115b1561161a576040517f43cc518900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600360115460ff16600381111561163357611633612e6b565b1461166a576040517fcebeeca300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611674814361309f565b6012556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a16116aa6000611f4a565b50565b6006546001600160a01b031633146116f65760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161132a565b600060115460ff16600381111561170f5761170f612e6b565b1461172d5760405163baf3f0f760e01b815260040160405180910390fd5b6011805460ff191660011790556040517fbac8edc4f6a45ce4a46327dbea4b1181366b50f7356984a5e1c92ebe3cb21c1290600090a1565b60018054610e43906130eb565b600b546001600160a01b0316331461179c576040516282b42960e81b815260040160405180910390fd5b600b546001600160a01b03908116908216036117cb57604051630e52390960e41b815260040160405180910390fd5b600b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517f4f06221442f29c68561a21b361dae6cd59eeb67b7cded6395d590a4e1d2fd3a290600090a250565b6006546001600160a01b0316331461186b5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161132a565b600160115460ff16600381111561188457611884612e6b565b146118a25760405163baf3f0f760e01b815260040160405180910390fd5b6011805460ff191660021790556040517f825d3b5d27bcd5858c26a77c2fb6a6569a9ca1c51c9d64f4f7b921571fb5a6aa90600090a1565b600081600003611916576040517f10cadee300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038316611956576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360009081526008602052604090205460ff1615801561198f57506001600160a01b03831660009081526008602052604090205460ff16155b15611a425760125443116119cf576040517fb92b389400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601154610100900460ff16156119e9576119e93384612064565b600060646119f86002856130b2565b611a0291906130c9565b9050611a0e308261251c565b506001600160a01b038416600090815260096020526040902054928190039260ff1615611a4057611a406110bd611e39565b505b611a4c838361251c565b9392505050565b42841015611aa35760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f45585049524544000000000000000000604482015260640161132a565b60006001611aaf611196565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f19010000000000000000000000000000000000000000000000000000000000006101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611bd6573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611c0c5750876001600160a01b0316816001600160a01b0316145b611c585760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f5349474e4552000000000000000000000000000000000000604482015260640161132a565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b600b546001600160a01b03163314611ceb576040516282b42960e81b815260040160405180910390fd5b601154610100900460ff16151581151503611d1957604051630e52390960e41b815260040160405180910390fd5b601180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100831515908102919091179091556040517f472ad5654cb114032bf56da56673f88d6c14a156b1f3aeb86470d5175787625190600090a250565b6006546001600160a01b03163314611dc45760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161132a565b60005b81811015611e34576001600c6000858585818110611de757611de7613138565b9050602002016020810190611dfc9190612ea9565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611e2d8161314e565b9050611dc7565b505050565b6000806000611e46612594565b909250905060006064611e5a8360056130b2565b611e6491906130c9565b9050611e8381600a5411611e7a57600a54611e7c565b815b8484612633565b935050505090565b600b546001600160a01b03163314611eb5576040516282b42960e81b815260040160405180910390fd5b6611c37937e08000811080611ed257506802b5e3af16b188000081115b80611ede5750600a5481145b15611f15576040517fcb9e92ee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a8190556040518181527f9ff241d1f1e0c30788ac08c45391c423cc5ef3e67f66a46b95a9a8f394759f3690602001611483565b6006546001600160a01b03163314611f935760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161132a565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b3060009081526003602052604081208054839190839061200d908490613125565b90915550506001600160a01b038316600081815260036020526040908190208054850190555130907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610f1f9086815260200190565b6001600160a01b0380821660009081526009602052604080822054928516825290205460ff9182169116808015612099575081155b1561214e57600043846040516020016120ce92919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b60408051601f1981840301815291815281516020928301206000818152601390935291205490915060ff1615612130576040517fdbfc980f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000908152601360205260409020805460ff1916600117905561220a565b801580156121595750815b1561220a576000438560405160200161218e92919091825260601b6bffffffffffffffffffffffff1916602082015260340190565b60408051601f1981840301815291815281516020928301206000818152601390935291205490915060ff16156121f0576040517fdbfc980f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000908152601360205260409020805460ff191660011790555b50505050565b6001600160a01b0383166000908152600460209081526040808320338452909152812054600019811461226c576122478382613125565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b03851660009081526003602052604081208054859290612294908490613125565b90915550506001600160a01b03808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122ef9087815260200190565b60405180910390a3506001949350505050565b606461231d60326d14bddab3e51a57cff87a500000006130b2565b61232791906130c9565b612331908261309f565b6010543060009081526003602052604090205461234e919061309f565b10156123575750565b600060046123668360036130b2565b61237091906130c9565b9050600061237e8284613125565b905061238a8230612687565b60006123988261dead61282b565b6007549091506000906123b3906001600160a01b0316612997565b6040805186815260208101869052908101849052606081018290529091507f598c0e945de578e5da9796301f9b516503483732932c44cbd6cca187431cfd9d9060800160405180910390a15050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516124379190613168565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156124ee57600080fd5b505af1158015612502573d6000803e3d6000fd5b5050505050611e34838383612aa8565b6116aa8147612bd4565b3360009081526003602052604081208054839190839061253d908490613125565b90915550506001600160a01b038316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610f1f9086815260200190565b6000807f00000000000000000000000055497d6fe4cb2beec4e1e4cd76aff2157349f0686001600160a01b0316630902f1ac6040518163ffffffff1660e01b81526004016040805180830381865afa1580156125f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126189190613225565b6dffffffffffffffffffffffffffff91821694911692509050565b60008061264085856130b2565b61264c906103e86130b2565b9050600061265a8685613125565b612666906103e56130b2565b905061267281836130c9565b61267d90600161309f565b9695505050505050565b600061269283612c2f565b90506126be7f00000000000000000000000055497d6fe4cb2beec4e1e4cd76aff2157349f06884611fec565b5060408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000009092526001600160a01b037f00000000000000000000000055497d6fe4cb2beec4e1e4cd76aff2157349f068169163022c0d9f91612757919085907f0000000000000000000000000c9c2a4f74f74c1f4b1e7a57c3845679f87342f3906024810161324f565b600060405180830381600087803b15801561277157600080fd5b505af1158015612785573d6000803e3d6000fd5b50506040516323b872dd60e01b81526001600160a01b037f0000000000000000000000000c9c2a4f74f74c1f4b1e7a57c3845679f87342f381166004830152851660248201526044810184905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292506323b872dd91506064015b600060405180830381600087803b15801561280e57600080fd5b505af1158015612822573d6000803e3d6000fd5b50505050505050565b600061283683612d1a565b90506128627f00000000000000000000000055497d6fe4cb2beec4e1e4cd76aff2157349f06884611fec565b506040516323b872dd60e01b81523060048201526001600160a01b037f00000000000000000000000055497d6fe4cb2beec4e1e4cd76aff2157349f0681660248201526044810182905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906323b872dd90606401600060405180830381600087803b1580156128e557600080fd5b505af11580156128f9573d6000803e3d6000fd5b50506040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301527f00000000000000000000000055497d6fe4cb2beec4e1e4cd76aff2157349f068169250636a6278429150602401600060405180830381600087803b15801561297957600080fd5b505af115801561298d573d6000803e3d6000fd5b5050505092915050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906370a0823190602401602060405180830381865afa158015612a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a26919061327d565b6040516323b872dd60e01b81523060048201526001600160a01b03841660248201526044810182905290915073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906323b872dd90606401600060405180830381600087803b158015612a8b57600080fd5b505af1158015612a9f573d6000803e3d6000fd5b50505050919050565b612ad27f00000000000000000000000055497d6fe4cb2beec4e1e4cd76aff2157349f06884611fec565b506040516323b872dd60e01b81523060048201526001600160a01b037f00000000000000000000000055497d6fe4cb2beec4e1e4cd76aff2157349f0681660248201526044810183905273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2906323b872dd90606401600060405180830381600087803b158015612b5557600080fd5b505af1158015612b69573d6000803e3d6000fd5b50506040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f00000000000000000000000055497d6fe4cb2beec4e1e4cd76aff2157349f068169250636a62784291506024016127f4565b600080600080600085875af1905080611e345760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c454400000000000000000000000000604482015260640161132a565b60008060007f00000000000000000000000055497d6fe4cb2beec4e1e4cd76aff2157349f0686001600160a01b0316630902f1ac6040518163ffffffff1660e01b81526004016040805180830381865afa158015612c91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb59190613225565b6dffffffffffffffffffffffffffff91821693501690506000612cda856103e56130b2565b90506000612ce883836130b2565b9050600082612cf9866103e86130b2565b612d03919061309f565b9050612d0f81836130c9565b979650505050505050565b60008060007f00000000000000000000000055497d6fe4cb2beec4e1e4cd76aff2157349f0686001600160a01b0316630902f1ac6040518163ffffffff1660e01b81526004016040805180830381865afa158015612d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da09190613225565b6dffffffffffffffffffffffffffff918216935016905081612dc282866130b2565b6110cf91906130c9565b6000815180845260005b81811015612df257602081850181015186830182015201612dd6565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611a4c6020830184612dcc565b80356001600160a01b0381168114612e3c57600080fd5b919050565b60008060408385031215612e5457600080fd5b612e5d83612e25565b946020939093013593505050565b634e487b7160e01b600052602160045260246000fd5b6020810160048310612ea357634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215612ebb57600080fd5b611a4c82612e25565b600080600060608486031215612ed957600080fd5b612ee284612e25565b9250612ef060208501612e25565b9150604084013590509250925092565b80358015158114612e3c57600080fd5b60008060408385031215612f2357600080fd5b612f2c83612e25565b9150612f3a60208401612f00565b90509250929050565b600060208284031215612f5557600080fd5b5035919050565b600080600080600080600060e0888a031215612f7757600080fd5b612f8088612e25565b9650612f8e60208901612e25565b95506040880135945060608801359350608088013560ff81168114612fb257600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600060208284031215612fe157600080fd5b611a4c82612f00565b60008060208385031215612ffd57600080fd5b823567ffffffffffffffff8082111561301557600080fd5b818501915085601f83011261302957600080fd5b81358181111561303857600080fd5b8660208260051b850101111561304d57600080fd5b60209290920196919550909350505050565b6000806040838503121561307257600080fd5b61307b83612e25565b9150612f3a60208401612e25565b634e487b7160e01b600052601160045260246000fd5b80820180821115610f2b57610f2b613089565b8082028115828204841417610f2b57610f2b613089565b6000826130e657634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806130ff57607f821691505b60208210810361311f57634e487b7160e01b600052602260045260246000fd5b50919050565b81810381811115610f2b57610f2b613089565b634e487b7160e01b600052603260045260246000fd5b6000600019820361316157613161613089565b5060010190565b600080835481600182811c91508083168061318457607f831692505b602080841082036131a357634e487b7160e01b86526022600452602486fd5b8180156131b757600181146131cc576131f9565b60ff19861689528415158502890196506131f9565b60008a81526020902060005b868110156131f15781548b8201529085019083016131d8565b505084890196505b509498975050505050505050565b80516dffffffffffffffffffffffffffff81168114612e3c57600080fd5b6000806040838503121561323857600080fd5b61324183613207565b9150612f3a60208401613207565b8481528360208201526001600160a01b038316604082015260806060820152600061267d6080830184612dcc565b60006020828403121561328f57600080fd5b505191905056fea26469706673582212207e0197f1ab3b4c7adb1242682b87f3d0763827eeccfd21fed6d9c486d4ce09ae64736f6c63430008120033

Deployed Bytecode Sourcemap

393:18796:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5998:17;:15;:17::i;:::-;393:18796;;;;;14303:747;;;;;;;;;;;;;:::i;1031:18:0:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2461:211;;;;;;;;;;-1:-1:-1;2461:211:0;;;;;:::i;:::-;;:::i;:::-;;;1351:14:4;;1344:22;1326:41;;1314:2;1299:18;2461:211:0;1186:187:4;3279:32:3;;;;;;;;;;-1:-1:-1;3279:32:3;;;;;;;;;;;;;;;:::i;2546:43::-;;;;;;;;;;;;;;;;;;;2120:25:4;;;2108:2;2093:18;2546:43:3;1974:177:4;3419:41:3;;;;;;;;;;-1:-1:-1;3419:41:3;;;;;;;;;;;1304:26:0;;;;;;;;;;;;;;;;2391:46:3;;;;;;;;;;-1:-1:-1;2391:46:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;7018:1021;;;;;;;;;;-1:-1:-1;7018:1021:3;;;;;:::i;:::-;;:::i;8898:329::-;;;;;;;;;;-1:-1:-1;8898:329:3;;;;;:::i;:::-;;:::i;740:42::-;;;;;;;;;;;;780:2;740:42;;1083:31:0;;;;;;;;;;;;;;;;;;3276:4:4;3264:17;;;3246:36;;3234:2;3219:18;1083:31:0;3104:184:4;5327:177:0;;;;;;;;;;;;;:::i;1013:40:3:-;;;;;;;;;;;;1051:2;1013:40;;2667:25;;;;;;;;;;-1:-1:-1;2667:25:3;;;;-1:-1:-1;;;;;2667:25:3;;;;;;-1:-1:-1;;;;;3639:55:4;;;3621:74;;3609:2;3594:18;2667:25:3;3475:226:4;8298:306:3;;;;;;;;;;-1:-1:-1;8298:306:3;;;;;:::i;:::-;;:::i;15139:113::-;;;;;;;;;;;;;:::i;15382:111::-;;;;;;;;;;-1:-1:-1;15466:20:3;;15451:12;:35;15382:111;;12739:616;;;;;;;;;;;;;:::i;1337:44:0:-;;;;;;;;;;-1:-1:-1;1337:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;1240:57:3;;;;;;;;;;;;1288:9;1240:57;;2140:72;;;;;;;;;;-1:-1:-1;2140:72:3;;;;-1:-1:-1;;;;;2140:72:3;;;3108:31;;;;;;;;;;;;;;;;11106:302;;;;;;;;;;-1:-1:-1;11106:302:3;;;;;:::i;:::-;;:::i;1751:41:0:-;;;;;;;;;;-1:-1:-1;1751:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;1386:60:3;;;;;;;;;;;;1435:11;1386:60;;13648:544;;;;;;;;;;-1:-1:-1;13648:544:3;;;;;:::i;:::-;;:::i;1116:51::-;;;;;;;;;;;;1158:9;1116:51;;690:20:2;;;;;;;;;;-1:-1:-1;690:20:2;;;;-1:-1:-1;;;;;690:20:2;;;11911:231:3;;;;;;;;;;;;;:::i;1056:20:0:-;;;;;;;;;;;;;:::i;866:44:3:-;;;;;;;;;;;;908:2;866:44;;9393:258;;;;;;;;;;-1:-1:-1;9393:258:3;;;;;:::i;:::-;;:::i;12246:252::-;;;;;;;;;;;;;:::i;1586:29:1:-;;;;;;;;;;;;;;;6063:910:3;;;;;;;;;;-1:-1:-1;6063:910:3;;;;;:::i;:::-;;:::i;3002:48::-;;;;;;;;;;-1:-1:-1;3002:48:3;;;;;:::i;:::-;;;;;;;;;;;;;;2886:45;;;;;;;;;;-1:-1:-1;2886:45:3;;;;;:::i;:::-;;;;;;;;;;;;;;15816:890;;;:::i;1689:40::-;;;;;;;;;;;;1728:1;1689:40;;3838:1483:0;;;;;;;;;;-1:-1:-1;3838:1483:0;;;;;:::i;:::-;;:::i;3204:27:3:-;;;;;;;;;;;;;;;;10545:361;;;;;;;;;;-1:-1:-1;10545:361:3;;;;;:::i;:::-;;:::i;11577:214::-;;;;;;;;;;-1:-1:-1;11577:214:3;;;;;:::i;:::-;;:::i;1388:64:0:-;;;;;;;;;;-1:-1:-1;1388:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;16959:380:3;;;;;;;;;;;;;:::i;1535:57::-;;;;;;;;;;;;1584:8;1535:57;;9866:457;;;;;;;;;;-1:-1:-1;9866:457:3;;;;;:::i;:::-;;:::i;2774:48::-;;;;;;;;;;-1:-1:-1;2774:48:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;1312:161:2;;;;;;;;;;-1:-1:-1;1312:161:2;;;;;:::i;:::-;;:::i;2283:46:3:-;;;;;;;;;;-1:-1:-1;2283:46:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;15816:890;15886:10;6743:21:1;;6791:8;;;15906:70:3;;15953:12;;;;;;;;;;;;;;15906:70;16018:31;16002:12;;;;:47;;;;;;;;:::i;:::-;;:89;;;;-1:-1:-1;;;;;;16066:25:3;;;;;;:16;:25;;;;;;;;16065:26;16002:89;15985:175;;;16123:26;;;;;;;;;;;;;;15985:175;16202:31;16186:12;;;;:47;;;;;;;;:::i;:::-;;;:107;;;;-1:-1:-1;16265:28:3;16249:12;;;;:44;;;;;;;;:::i;:::-;;;16186:107;16169:182;;;16325:15;;;;;;;;;;;;;;16169:182;-1:-1:-1;;;;;16361:19:3;;;;;;:10;:19;;;;;:32;;16384:9;;16361:19;:32;;16384:9;;16361:32;:::i;:::-;;;;;;;;16423:9;16403:16;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;16447:16:3;;1158:9;-1:-1:-1;16443:89:3;;;16504:17;;;;;;;;;;;;;;16443:89;-1:-1:-1;;;;;16545:19:3;;;;;;:10;:19;;;;;;1288:9;-1:-1:-1;16541:106:3;;;16611:25;;;;;;;;;;;;;;16541:106;16680:7;-1:-1:-1;;;;;16662:37:3;;16689:9;16662:37;;;;2120:25:4;;2108:2;2093:18;;1974:177;16662:37:3;;;;;;;;15858:848;15816:890::o;14303:747::-;14364:10;6743:21:1;;6791:8;;;14385:70:3;;14432:12;;;;;;;;;;;;;;14385:70;14484:22;14468:12;;;;:38;;;;;;;;:::i;:::-;;14464:97;;14529:21;;;;;;;;;;;;;;14464:97;-1:-1:-1;;;;;14574:19:3;;;;;;:10;:19;;;;;;:24;;14570:80;;14621:18;;;;;;;;;;;;;;14570:80;-1:-1:-1;;;;;14663:22:3;;;;;;:13;:22;;;;;;:27;14659:81;;14713:16;;;;;;;;;;;;;;14659:81;14827:16;;-1:-1:-1;;;;;14792:19:3;;14750:20;14792:19;;;:10;:19;;;;;;14750:20;;14827:16;1889:3;1858:27;780:2;1775:25;1858:27;:::i;:::-;1857:35;;;;:::i;:::-;14774:37;;;;:::i;:::-;14773:70;;;;:::i;:::-;-1:-1:-1;;;;;14853:22:3;;;;;;:13;:22;;;;;:37;;;14900:12;:28;;14750:93;;-1:-1:-1;14750:93:3;;14900:12;;14853:22;14900:28;;14750:93;;14900:28;:::i;:::-;;;;-1:-1:-1;14939:51:3;;-1:-1:-1;14968:7:3;14977:12;14939:28;:51::i;:::-;;15021:7;-1:-1:-1;;;;;15006:37:3;;15030:12;15006:37;;;;2120:25:4;;2108:2;2093:18;;1974:177;15006:37:3;;;;;;;;14336:714;;14303:747::o;1031:18:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2461:211::-;2561:10;2535:4;2551:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;2551:30:0;;;;;;;;;;:39;;;2606:37;2535:4;;2551:30;;2606:37;;;;2584:6;2120:25:4;;2108:2;2093:18;;1974:177;2606:37:0;;;;;;;;-1:-1:-1;2661:4:0;2461:211;;;;;:::o;7018:1021:3:-;7145:4;7165:6;7175:1;7165:11;7161:63;;7199:14;;;;;;;;;;;;;;7161:63;-1:-1:-1;;;;;7237:16:3;;7233:77;;7276:23;;;;;;;;;;;;;;7233:77;-1:-1:-1;;;;;7337:20:3;;;;;;:14;:20;;;;;;;;7336:21;:56;;;;-1:-1:-1;;;;;;7374:18:3;;;;;;:14;:18;;;;;;;;7373:19;7336:56;:99;;;;-1:-1:-1;7424:10:3;7409:26;;;;:14;:26;;;;;;;;7408:27;7336:99;7319:661;;;7480:20;;7464:12;:36;7460:101;;7527:19;;;;;;;;;;;;;;7460:101;7578:22;;;;;;;7574:92;;;7620:31;7642:4;7648:2;7620:21;:31::i;:::-;7680:11;7720:3;7695:21;1728:1;7695:6;:21;:::i;:::-;7694:29;;;;:::i;:::-;7680:43;;7737:44;7756:4;7770;7777:3;7737:18;:44::i;:::-;-1:-1:-1;;;;;;7869:18:3;;;;;;:14;:18;;;;;;7823:13;;;;;7869:18;;7865:105;;;7907:48;7934:20;:18;:20::i;:::-;7907:26;:48::i;:::-;7446:534;7319:661;7996:36;8015:4;8021:2;8025:6;7996:18;:36::i;:::-;7989:43;7018:1021;-1:-1:-1;;;;7018:1021:3:o;8898:329::-;5285:10;;-1:-1:-1;;;;;5285:10:3;5271;:24;5267:76;;5318:14;;-1:-1:-1;;;5318:14:3;;;;;;;;;;;5267:76;-1:-1:-1;;;;;9019:23:3;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:39;::::1;;:23;::::0;;::::1;:39;;::::0;9015:96:::1;;9081:19;;-1:-1:-1::0;;;9081:19:3::1;;;;;;;;;;;9015:96;-1:-1:-1::0;;;;;9120:23:3;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:38;;-1:-1:-1;;9120:38:3::1;::::0;::::1;;::::0;;::::1;::::0;;;9173:47;;9120:38;;:23;9173:47:::1;::::0;::::1;8898:329:::0;;:::o;5327:177:0:-;5384:7;5427:16;5410:13;:33;:87;;5473:24;:22;:24::i;:::-;5403:94;;5327:177;:::o;5410:87::-;-1:-1:-1;5446:24:0;;5327:177::o;8298:306:3:-;5285:10;;-1:-1:-1;;;;;5285:10:3;5271;:24;5267:76;;5318:14;;-1:-1:-1;;;5318:14:3;;;;;;;;;;;5267:76;-1:-1:-1;;;;;8416:23:3;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:34;::::1;;:23;::::0;;::::1;:34;;::::0;8412:91:::1;;8473:19;;-1:-1:-1::0;;;8473:19:3::1;;;;;;;;;;;8412:91;-1:-1:-1::0;;;;;8512:23:3;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:33;;-1:-1:-1;;8512:33:3::1;::::0;::::1;;::::0;;::::1;::::0;;;8560:37;;8512:33;;:23;8560:37:::1;::::0;::::1;8298:306:::0;;:::o;15139:113::-;15233:12;;15189:7;;1889:3;1858:27;780:2;1775:25;1858:27;:::i;:::-;1857:35;;;;:::i;:::-;15215:30;;;;:::i;12739:616::-;778:5:2;;-1:-1:-1;;;;;778:5:2;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:2;;7207:2:4;756:44:2;;;7189:21:4;7246:2;7226:18;;;7219:30;-1:-1:-1;;;7265:18:4;;;7258:42;7317:18;;756:44:2;;;;;;;;;12815:28:3::1;12799:12;::::0;::::1;;:44;::::0;::::1;;;;;;:::i;:::-;;12795:96;;12866:14;;-1:-1:-1::0;;;12866:14:3::1;;;;;;;;;;;12795:96;12904:16;;12924:1;12904:21:::0;12900:75:::1;;12948:16;;;;;;;;;;;;;;12900:75;12985:12;:37:::0;;-1:-1:-1;;12985:37:3::1;13000:22;12985:37;::::0;;-1:-1:-1;1889:3:3::1;1858:27;780:2;1775:25;1858:27;:::i;:::-;1857:35;;;;:::i;:::-;1985:3;1952:29;908:2;1775:25;1952:29;:::i;:::-;1951:37;;;;:::i;:::-;13066:16;;:36;;;;:::i;:::-;13065:68;;;;:::i;:::-;13033:100:::0;-1:-1:-1;13143:123:3::1;1985:3;1952:29;908:2;1775:25;1952:29;:::i;:::-;1951:37;;;;:::i;:::-;13211:21;13246:10;13143:23;:123::i;:::-;13277:21;13287:10;13277:9;:21::i;:::-;13314:34;13331:16;;13314:34;;;;2120:25:4::0;;2108:2;2093:18;;1974:177;13314:34:3::1;;;;;;;;12785:570;12739:616::o:0;11106:302::-;5285:10;;-1:-1:-1;;;;;5285:10:3;5271;:24;5267:76;;5318:14;;-1:-1:-1;;;5318:14:3;;;;;;;;;;;5267:76;-1:-1:-1;;;;;11194:29:3;::::1;::::0;;:64:::1;;-1:-1:-1::0;11227:12:3::1;::::0;-1:-1:-1;;;;;11227:31:3;;::::1;:12:::0;::::1;:31;11194:64;11190:121;;;11281:19;;-1:-1:-1::0;;;11281:19:3::1;;;;;;;;;;;11190:121;11320:12;:30:::0;;-1:-1:-1;;11320:30:3::1;-1:-1:-1::0;;;;;11320:30:3;::::1;::::0;;::::1;::::0;;;11365:36:::1;::::0;::::1;::::0;-1:-1:-1;;11365:36:3::1;11106:302:::0;:::o;13648:544::-;778:5:2;;-1:-1:-1;;;;;778:5:2;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:2;;7207:2:4;756:44:2;;;7189:21:4;7246:2;7226:18;;;7219:30;-1:-1:-1;;;7265:18:4;;;7258:42;7317:18;;756:44:2;7005:336:4;756:44:2;-1:-1:-1;;13725:20:3::1;;:41;13721:98;;13789:19;;;;;;;;;;;;;;13721:98;13832:16:::0;;;:35:::1;;;13866:1;13852:11;:15;13832:35;13828:92;;;13890:19;;;;;;;;;;;;;;13828:92;13949:22;13933:12;::::0;::::1;;:38;::::0;::::1;;;;;;:::i;:::-;;13929:97;;13994:21;;;;;;;;;;;;;;13929:97;14058:26;14073:11:::0;14058:12:::1;:26;:::i;:::-;14035:20;:49:::0;14099:16:::1;::::0;::::1;::::0;;;::::1;14156:29;14182:1;14156:17;:29::i;:::-;13648:544:::0;:::o;11911:231::-;778:5:2;;-1:-1:-1;;;;;778:5:2;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:2;;7207:2:4;756:44:2;;;7189:21:4;7246:2;7226:18;;;7219:30;-1:-1:-1;;;7265:18:4;;;7258:42;7317:18;;756:44:2;7005:336:4;756:44:2;11983:19:3::1;11967:12;::::0;::::1;;:35;::::0;::::1;;;;;;:::i;:::-;;11963:87;;12025:14;;-1:-1:-1::0;;;12025:14:3::1;;;;;;;;;;;11963:87;12059:12;:46:::0;;-1:-1:-1;;12059:46:3::1;12074:31;12059:46;::::0;;12120:15:::1;::::0;::::1;::::0;-1:-1:-1;;12120:15:3::1;11911:231::o:0;1056:20:0:-;;;;;;;:::i;9393:258:3:-;5285:10;;-1:-1:-1;;;;;5285:10:3;5271;:24;5267:76;;5318:14;;-1:-1:-1;;;5318:14:3;;;;;;;;;;;5267:76;9499:10:::1;::::0;-1:-1:-1;;;;;9499:10:3;;::::1;9482:27:::0;;::::1;::::0;9478:84:::1;;9532:19;;-1:-1:-1::0;;;9532:19:3::1;;;;;;;;;;;9478:84;9571:10;:26:::0;;-1:-1:-1;;9571:26:3::1;-1:-1:-1::0;;;;;9571:26:3;::::1;::::0;;::::1;::::0;;;9612:32:::1;::::0;::::1;::::0;-1:-1:-1;;9612:32:3::1;9393:258:::0;:::o;12246:252::-;778:5:2;;-1:-1:-1;;;;;778:5:2;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:2;;7207:2:4;756:44:2;;;7189:21:4;7246:2;7226:18;;;7219:30;-1:-1:-1;;;7265:18:4;;;7258:42;7317:18;;756:44:2;7005:336:4;756:44:2;12324:31:3::1;12308:12;::::0;::::1;;:47;::::0;::::1;;;;;;:::i;:::-;;12304:99;;12378:14;;-1:-1:-1::0;;;12378:14:3::1;;;;;;;;;;;12304:99;12412:12;:43:::0;;-1:-1:-1;;12412:43:3::1;12427:28;12412:43;::::0;;12470:21:::1;::::0;::::1;::::0;-1:-1:-1;;12470:21:3::1;12246:252::o:0;6063:910::-;6164:4;6184:6;6194:1;6184:11;6180:63;;6218:14;;;;;;;;;;;;;;6180:63;-1:-1:-1;;;;;6256:16:3;;6252:77;;6295:23;;;;;;;;;;;;;;6252:77;6358:10;6343:26;;;;:14;:26;;;;;;;;6342:27;:50;;;;-1:-1:-1;;;;;;6374:18:3;;;;;;:14;:18;;;;;;;;6373:19;6342:50;6338:586;;;6428:20;;6412:12;:36;6408:101;;6475:19;;;;;;;;;;;;;;6408:101;6526:22;;;;;;;6522:98;;;6568:37;6590:10;6602:2;6568:21;:37::i;:::-;6634:11;6674:3;6649:21;1728:1;6649:6;:21;:::i;:::-;6648:29;;;;:::i;:::-;6634:43;;6691:34;6714:4;6721:3;6691:14;:34::i;:::-;-1:-1:-1;;;;;;6813:18:3;;;;;;:14;:18;;;;;;6767:13;;;;;6813:18;;6809:105;;;6851:48;6878:20;:18;:20::i;6851:48::-;6394:530;6338:586;6940:26;6955:2;6959:6;6940:14;:26::i;:::-;6933:33;6063:910;-1:-1:-1;;;6063:910:3:o;3838:1483:0:-;4057:15;4045:8;:27;;4037:63;;;;-1:-1:-1;;;4037:63:0;;7548:2:4;4037:63:0;;;7530:21:4;7587:2;7567:18;;;7560:30;7626:25;7606:18;;;7599:53;7669:18;;4037:63:0;7346:347:4;4037:63:0;4265:24;4292:805;4428:18;:16;:18::i;:::-;-1:-1:-1;;;;;4873:13:0;;;;;;;:6;:13;;;;;;;;;:15;;;;;;;;4511:449;;4555:165;4511:449;;;7985:25:4;8087:18;;;8080:43;;;;8159:15;;;8139:18;;;8132:43;8191:18;;;8184:34;;;8234:19;;;8227:35;;;;8278:19;;;;8271:35;;;4511:449:0;;;;;;;;;;7957:19:4;;;4511:449:0;;;4472:514;;;;;;;;8587:66:4;4350:658:0;;;8575:79:4;8670:11;;;8663:27;;;;8706:12;;;8699:28;;;;8743:12;;4350:658:0;;;-1:-1:-1;;4350:658:0;;;;;;;;;4319:707;;4350:658;4319:707;;;;4292:805;;;;;;;;;8993:25:4;9066:4;9054:17;;9034:18;;;9027:45;9088:18;;;9081:34;;;9131:18;;;9124:34;;;8965:19;;4292:805:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4292:805:0;;-1:-1:-1;;4292:805:0;;;-1:-1:-1;;;;;;;5120:30:0;;;;;;:59;;;5174:5;-1:-1:-1;;;;;5154:25:0;:16;-1:-1:-1;;;;;5154:25:0;;5120:59;5112:86;;;;-1:-1:-1;;;5112:86:0;;9371:2:4;5112:86:0;;;9353:21:4;9410:2;9390:18;;;9383:30;9449:16;9429:18;;;9422:44;9483:18;;5112:86:0;9169:338:4;5112:86:0;-1:-1:-1;;;;;5213:27:0;;;;;;;:9;:27;;;;;;;;:36;;;;;;;;;;;;;:44;;;5283:31;2120:25:4;;;5213:36:0;;5283:31;;;;;2093:18:4;5283:31:0;;;;;;;3838:1483;;;;;;;:::o;10545:361:3:-;5285:10;;-1:-1:-1;;;;;5285:10:3;5271;:24;5267:76;;5318:14;;-1:-1:-1;;;5318:14:3;;;;;;;;;;;5267:76;10693:22:::1;::::0;::::1;::::0;::::1;;;10664:51;;::::0;::::1;;::::0;10660:108:::1;;10738:19;;-1:-1:-1::0;;;10738:19:3::1;;;;;;;;;;;10660:108;10777:22;:50:::0;;;::::1;;::::0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;10842:57:::1;::::0;::::1;::::0;-1:-1:-1;;10842:57:3::1;10545:361:::0;:::o;11577:214::-;778:5:2;;-1:-1:-1;;;;;778:5:2;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:2;;7207:2:4;756:44:2;;;7189:21:4;7246:2;7226:18;;;7219:30;-1:-1:-1;;;7265:18:4;;;7258:42;7317:18;;756:44:2;7005:336:4;756:44:2;11683:9:3::1;11678:107;11698:19:::0;;::::1;11678:107;;;11770:4;11738:16;:29;11755:8;;11764:1;11755:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11738:29:3::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;11738:29:3;:36;;-1:-1:-1;;11738:36:3::1;::::0;::::1;;::::0;;;::::1;::::0;;11719:3:::1;::::0;::::1;:::i;:::-;;;11678:107;;;;11577:214:::0;;:::o;16959:380::-;17010:7;17030:17;17049:16;17069:13;:11;:13::i;:::-;17029:53;;-1:-1:-1;17029:53:3;-1:-1:-1;17092:18:3;17133:3;17114:15;17029:53;17128:1;17114:15;:::i;:::-;17113:23;;;;:::i;:::-;17092:44;;17165:167;17217:10;17198:16;;:29;:61;;17243:16;;17198:61;;;17230:10;17198:61;17277:12;17307:11;17165:15;:167::i;:::-;17146:186;;;;;16959:380;:::o;9866:457::-;5285:10;;-1:-1:-1;;;;;5285:10:3;5271;:24;5267:76;;5318:14;;-1:-1:-1;;;5318:14:3;;;;;;;;;;;5267:76;1435:11:::1;9989:19;:44;:104;;;;1584:8;10049:19;:44;9989:104;:159;;;;10132:16;;10109:19;:39;9989:159;9972:241;;;10180:22;;;;;;;;;;;;;;9972:241;10222:16;:38:::0;;;10275:41:::1;::::0;2120:25:4;;;10275:41:3::1;::::0;2108:2:4;2093:18;10275:41:3::1;1974:177:4::0;1312:161:2;778:5;;-1:-1:-1;;;;;778:5:2;764:10;:19;756:44;;;;-1:-1:-1;;;756:44:2;;7207:2:4;756:44:2;;;7189:21:4;7246:2;7226:18;;;7219:30;-1:-1:-1;;;7265:18:4;;;7258:42;7317:18;;756:44:2;7005:336:4;756:44:2;1392:5:::1;:16:::0;;-1:-1:-1;;1392:16:2::1;-1:-1:-1::0;;;;;1392:16:2;::::1;::::0;;::::1;::::0;;;1424:42:::1;::::0;1445:10:::1;::::0;1424:42:::1;::::0;-1:-1:-1;;1424:42:2::1;1312:161:::0;:::o;6886:415:1:-;7026:4;6992;7008:24;;;:9;:24;;;;;:34;;7036:6;;7008:24;6992:4;;7008:34;;7036:6;;7008:34;:::i;:::-;;;;-1:-1:-1;;;;;;;7188:13:1;;;;;;:9;:13;;;;;;;:23;;;;;;7237:35;7254:4;;7237:35;;;;7205:6;2120:25:4;;2108:2;2093:18;;1974:177;18535:652:3;-1:-1:-1;;;;;18625:18:3;;;18611:11;18625:18;;;:14;:18;;;;;;;18669:20;;;;;;;;18625:18;;;;;18669:20;;18703:19;;;;;18716:6;18715:7;18703:19;18699:482;;;18738:11;18779:12;18793:2;18762:34;;;;;;;;10058:19:4;;;10115:2;10111:15;-1:-1:-1;;10107:88:4;10102:2;10093:12;;10086:110;10221:2;10212:12;;9901:329;18762:34:3;;;;-1:-1:-1;;18762:34:3;;;;;;;;;18752:45;;18762:34;18752:45;;;;18815:14;;;;:9;:14;;;;;;18752:45;;-1:-1:-1;18815:14:3;;18811:80;;;18856:20;;;;;;;;;;;;;;18811:80;18904:14;;;;:9;:14;;;;;:21;;-1:-1:-1;;18904:21:3;18921:4;18904:21;;;18699:482;;;18947:8;18946:9;:19;;;;;18959:6;18946:19;18942:239;;;18981:11;19022:12;19036:4;19005:36;;;;;;;;10058:19:4;;;10115:2;10111:15;-1:-1:-1;;10107:88:4;10102:2;10093:12;;10086:110;10221:2;10212:12;;9901:329;19005:36:3;;;;-1:-1:-1;;19005:36:3;;;;;;;;;18995:47;;19005:36;18995:47;;;;19060:14;;;;:9;:14;;;;;;18995:47;;-1:-1:-1;19060:14:3;;19056:80;;;19101:20;;;;;;;;;;;;;;19056:80;19149:14;;;;:9;:14;;;;;:21;;-1:-1:-1;;19149:21:3;19166:4;19149:21;;;18942:239;18601:586;;18535:652;;:::o;3057:592:0:-;-1:-1:-1;;;;;3209:15:0;;3175:4;3209:15;;;:9;:15;;;;;;;;3225:10;3209:27;;;;;;;;-1:-1:-1;;3287:28:0;;3283:80;;3347:16;3357:6;3347:7;:16;:::i;:::-;-1:-1:-1;;;;;3317:15:0;;;;;;:9;:15;;;;;;;;3333:10;3317:27;;;;;;;:46;3283:80;-1:-1:-1;;;;;3374:15:0;;;;;;:9;:15;;;;;:25;;3393:6;;3374:15;:25;;3393:6;;3374:25;:::i;:::-;;;;-1:-1:-1;;;;;;;3545:13:0;;;;;;;:9;:13;;;;;;;:23;;;;;;3594:26;3545:13;;3594:26;;;;;;;3562:6;2120:25:4;;2108:2;2093:18;;1974:177;3594:26:0;;;;;;;;-1:-1:-1;3638:4:0;;3057:592;-1:-1:-1;;;;3057:592:0:o;17482:791:3:-;1889:3;1858:27;780:2;1775:25;1858:27;:::i;:::-;1857:35;;;;:::i;:::-;17629:29;;:11;:29;:::i;:::-;17602:12;;17593:4;17575:24;;;;:9;:24;;;;;;:39;;17602:12;17575:39;:::i;:::-;:83;17558:142;;;17482:791;:::o;17558:142::-;17710:20;17753:1;17734:15;:11;17748:1;17734:15;:::i;:::-;17733:21;;;;:::i;:::-;17710:44;-1:-1:-1;17764:30:3;17797:26;17710:44;17797:11;:26;:::i;:::-;17764:59;;17834:41;17847:12;17869:4;17834:12;:41::i;:::-;17886:34;17923:88;17950:22;17994:6;17923:13;:88::i;:::-;18062:12;;17886:125;;-1:-1:-1;18021:27:3;;18051:24;;-1:-1:-1;;;;;18062:12:3;18051:10;:24::i;:::-;18091:175;;;10466:25:4;;;10522:2;10507:18;;10500:34;;;10550:18;;;10543:34;;;10608:2;10593:18;;10586:34;;;18021:54:3;;-1:-1:-1;18091:175:3;;10453:3:4;10438:19;18091:175:3;;;;;;;17548:725;;;;17482:791;:::o;5510:446:0:-;5575:7;5672:95;5805:4;5789:22;;;;;;:::i;:::-;;;;;;;;;;5640:295;;;12272:25:4;;;;12313:18;;12306:34;;;;5833:14:0;12356:18:4;;;12349:34;5869:13:0;12399:18:4;;;12392:34;5912:4:0;12442:19:4;;;12435:84;12244:19;;5640:295:0;;;;;;;;;;;;5613:336;;;;;;5594:355;;5510:446;:::o;3840:232:1:-;1403:42;-1:-1:-1;;;;;3968:19:1;;3995:9;3968:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4017:48;4038:11;4051:9;4062:2;4017:20;:48::i;4413:100::-;4463:43;4480:2;4484:21;4463:16;:43::i;2678:373:0:-;2774:10;2748:4;2764:21;;;:9;:21;;;;;:31;;2789:6;;2764:21;2748:4;;2764:31;;2789:6;;2764:31;:::i;:::-;;;;-1:-1:-1;;;;;;;2941:13:0;;;;;;:9;:13;;;;;;;:23;;;;;;2990:32;2999:10;;2990:32;;;;2958:6;2120:25:4;;2108:2;2093:18;;1974:177;5849:192:1;5919:17;5938:16;6015:4;-1:-1:-1;;;;;6000:32:1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5970:64;;;;;;;;-1:-1:-1;5849:192:1;-1:-1:-1;5849:192:1:o;5478:327::-;5609:16;;5654:24;5669:9;5654:12;:24;:::i;:::-;:31;;5681:4;5654:31;:::i;:::-;5637:48;-1:-1:-1;5695:16:1;5715:23;5729:9;5715:11;:23;:::i;:::-;5714:31;;5742:3;5714:31;:::i;:::-;5695:50;-1:-1:-1;5770:23:1;5695:50;5770:9;:23;:::i;:::-;5769:29;;5797:1;5769:29;:::i;:::-;5755:43;5478:327;-1:-1:-1;;;;;;5478:327:1:o;2099:395::-;2170:15;2188:27;2203:11;2188:14;:27::i;:::-;2170:45;;2225:47;2254:4;2260:11;2225:28;:47::i;:::-;-1:-1:-1;2409:12:1;;;2380:1;2409:12;;;;;;;;;;2354:68;;;;-1:-1:-1;;;;;2369:4:1;2354:25;;;;:68;;2380:1;2383:10;;2395:12;;2354:68;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2432:55:1;;-1:-1:-1;;;2432:55:1;;-1:-1:-1;;;;;2458:12:1;13986:15:4;;2432:55:1;;;13968:34:4;14038:15;;14018:18;;;14011:43;14070:18;;;14063:34;;;1403:42:1;;-1:-1:-1;2432:25:1;;-1:-1:-1;13880:18:4;;2432:55:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2160:334;2099:395;;:::o;2717:328::-;2810:15;2850:24;2862:11;2850;:24::i;:::-;2837:37;;2884:47;2913:4;2919:11;2884:28;:47::i;:::-;-1:-1:-1;2941:58:1;;-1:-1:-1;;;2941:58:1;;2975:4;2941:58;;;13968:34:4;-1:-1:-1;;;;;2982:4:1;14038:15:4;14018:18;;;14011:43;14070:18;;;14063:34;;;1403:42:1;;2941:25;;13880:18:4;;2941:58:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3009:29:1;;;;;-1:-1:-1;;;;;3639:55:4;;;3009:29:1;;;3621:74:4;3024:4:1;3009:25;;-1:-1:-1;3009:25:1;;-1:-1:-1;3594:18:4;;3009:29:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2717:328;;;;:::o;4143:200::-;4233:37;;;;;4264:4;4233:37;;;3621:74:4;4193:15:1;;1403:42;;4233:22;;3594:18:4;;4233:37:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4280:56;;-1:-1:-1;;;4280:56:1;;4314:4;4280:56;;;13968:34:4;-1:-1:-1;;;;;14038:15:4;;14018:18;;;14011:43;14070:18;;;14063:34;;;4220:50:1;;-1:-1:-1;1403:42:1;;4280:25;;13880:18:4;;4280:56:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4143:200;;;:::o;3300:287::-;3426:47;3455:4;3461:11;3426:28;:47::i;:::-;-1:-1:-1;3483:58:1;;-1:-1:-1;;;3483:58:1;;3517:4;3483:58;;;13968:34:4;-1:-1:-1;;;;;3524:4:1;14038:15:4;14018:18;;;14011:43;14070:18;;;14063:34;;;1403:42:1;;3483:25;;13880:18:4;;3483:58:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3551:29:1;;;;;-1:-1:-1;;;;;3639:55:4;;;3551:29:1;;;3621:74:4;3566:4:1;3551:25;;-1:-1:-1;3551:25:1;;-1:-1:-1;3594:18:4;;3551:29:1;3475:226:4;6110:383:1;6183:12;6425:1;6422;6419;6416;6408:6;6404:2;6397:5;6392:35;6381:46;;6455:7;6447:39;;;;-1:-1:-1;;;6447:39:1;;14499:2:4;6447:39:1;;;14481:21:4;14538:2;14518:18;;;14511:30;14577:21;14557:18;;;14550:49;14616:18;;6447:39:1;14297:343:4;4955:427:1;5033:15;5061:17;5080:16;5115:4;-1:-1:-1;;;;;5100:45:1;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5060:87;;;;;-1:-1:-1;5060:87:1;;-1:-1:-1;5157:23:1;5183:16;:10;5196:3;5183:16;:::i;:::-;5157:42;-1:-1:-1;5209:14:1;5226:32;5247:11;5157:42;5226:32;:::i;:::-;5209:49;-1:-1:-1;5268:16:1;5311:18;5288:19;:12;5303:4;5288:19;:::i;:::-;5287:42;;;;:::i;:::-;5268:61;-1:-1:-1;5352:23:1;5268:61;5352:9;:23;:::i;:::-;5339:36;4955:427;-1:-1:-1;;;;;;;4955:427:1:o;4602:258::-;4678:14;4705:17;4724:15;4758:4;-1:-1:-1;;;;;4743:45:1;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4704:86;;;;;-1:-1:-1;4704:86:1;;-1:-1:-1;4704:86:1;4813:24;4704:86;4813:11;:24;:::i;:::-;4812:41;;;;:::i;14:482:4:-;56:3;94:5;88:12;121:6;116:3;109:19;146:1;156:162;170:6;167:1;164:13;156:162;;;232:4;288:13;;;284:22;;278:29;260:11;;;256:20;;249:59;185:12;156:162;;;160:3;363:1;356:4;347:6;342:3;338:16;334:27;327:38;485:4;-1:-1:-1;;410:2:4;402:6;398:15;394:88;389:3;385:98;381:109;374:116;;;14:482;;;;:::o;501:220::-;650:2;639:9;632:21;613:4;670:45;711:2;700:9;696:18;688:6;670:45;:::i;726:196::-;794:20;;-1:-1:-1;;;;;843:54:4;;833:65;;823:93;;912:1;909;902:12;823:93;726:196;;;:::o;927:254::-;995:6;1003;1056:2;1044:9;1035:7;1031:23;1027:32;1024:52;;;1072:1;1069;1062:12;1024:52;1095:29;1114:9;1095:29;:::i;:::-;1085:39;1171:2;1156:18;;;;1143:32;;-1:-1:-1;;;927:254:4:o;1378:184::-;-1:-1:-1;;;1427:1:4;1420:88;1527:4;1524:1;1517:15;1551:4;1548:1;1541:15;1567:402;1716:2;1701:18;;1749:1;1738:13;;1728:201;;-1:-1:-1;;;1782:1:4;1775:88;1886:4;1883:1;1876:15;1914:4;1911:1;1904:15;1728:201;1938:25;;;1567:402;:::o;2156:186::-;2215:6;2268:2;2256:9;2247:7;2243:23;2239:32;2236:52;;;2284:1;2281;2274:12;2236:52;2307:29;2326:9;2307:29;:::i;2347:328::-;2424:6;2432;2440;2493:2;2481:9;2472:7;2468:23;2464:32;2461:52;;;2509:1;2506;2499:12;2461:52;2532:29;2551:9;2532:29;:::i;:::-;2522:39;;2580:38;2614:2;2603:9;2599:18;2580:38;:::i;:::-;2570:48;;2665:2;2654:9;2650:18;2637:32;2627:42;;2347:328;;;;;:::o;2680:160::-;2745:20;;2801:13;;2794:21;2784:32;;2774:60;;2830:1;2827;2820:12;2845:254;2910:6;2918;2971:2;2959:9;2950:7;2946:23;2942:32;2939:52;;;2987:1;2984;2977:12;2939:52;3010:29;3029:9;3010:29;:::i;:::-;3000:39;;3058:35;3089:2;3078:9;3074:18;3058:35;:::i;:::-;3048:45;;2845:254;;;;;:::o;3706:180::-;3765:6;3818:2;3806:9;3797:7;3793:23;3789:32;3786:52;;;3834:1;3831;3824:12;3786:52;-1:-1:-1;3857:23:4;;3706:180;-1:-1:-1;3706:180:4:o;3891:693::-;4002:6;4010;4018;4026;4034;4042;4050;4103:3;4091:9;4082:7;4078:23;4074:33;4071:53;;;4120:1;4117;4110:12;4071:53;4143:29;4162:9;4143:29;:::i;:::-;4133:39;;4191:38;4225:2;4214:9;4210:18;4191:38;:::i;:::-;4181:48;;4276:2;4265:9;4261:18;4248:32;4238:42;;4327:2;4316:9;4312:18;4299:32;4289:42;;4381:3;4370:9;4366:19;4353:33;4426:4;4419:5;4415:16;4408:5;4405:27;4395:55;;4446:1;4443;4436:12;4395:55;3891:693;;;;-1:-1:-1;3891:693:4;;;;4469:5;4521:3;4506:19;;4493:33;;-1:-1:-1;4573:3:4;4558:19;;;4545:33;;3891:693;-1:-1:-1;;3891:693:4:o;4589:180::-;4645:6;4698:2;4686:9;4677:7;4673:23;4669:32;4666:52;;;4714:1;4711;4704:12;4666:52;4737:26;4753:9;4737:26;:::i;4774:615::-;4860:6;4868;4921:2;4909:9;4900:7;4896:23;4892:32;4889:52;;;4937:1;4934;4927:12;4889:52;4977:9;4964:23;5006:18;5047:2;5039:6;5036:14;5033:34;;;5063:1;5060;5053:12;5033:34;5101:6;5090:9;5086:22;5076:32;;5146:7;5139:4;5135:2;5131:13;5127:27;5117:55;;5168:1;5165;5158:12;5117:55;5208:2;5195:16;5234:2;5226:6;5223:14;5220:34;;;5250:1;5247;5240:12;5220:34;5303:7;5298:2;5288:6;5285:1;5281:14;5277:2;5273:23;5269:32;5266:45;5263:65;;;5324:1;5321;5314:12;5263:65;5355:2;5347:11;;;;;5377:6;;-1:-1:-1;4774:615:4;;-1:-1:-1;;;;4774:615:4:o;5394:260::-;5462:6;5470;5523:2;5511:9;5502:7;5498:23;5494:32;5491:52;;;5539:1;5536;5529:12;5491:52;5562:29;5581:9;5562:29;:::i;:::-;5552:39;;5610:38;5644:2;5633:9;5629:18;5610:38;:::i;5659:184::-;-1:-1:-1;;;5708:1:4;5701:88;5808:4;5805:1;5798:15;5832:4;5829:1;5822:15;5848:125;5913:9;;;5934:10;;;5931:36;;;5947:18;;:::i;5978:168::-;6051:9;;;6082;;6099:15;;;6093:22;;6079:37;6069:71;;6120:18;;:::i;6151:274::-;6191:1;6217;6207:189;;-1:-1:-1;;;6249:1:4;6242:88;6353:4;6350:1;6343:15;6381:4;6378:1;6371:15;6207:189;-1:-1:-1;6410:9:4;;6151:274::o;6430:437::-;6509:1;6505:12;;;;6552;;;6573:61;;6627:4;6619:6;6615:17;6605:27;;6573:61;6680:2;6672:6;6669:14;6649:18;6646:38;6643:218;;-1:-1:-1;;;6714:1:4;6707:88;6818:4;6815:1;6808:15;6846:4;6843:1;6836:15;6643:218;;6430:437;;;:::o;6872:128::-;6939:9;;;6960:11;;;6957:37;;;6974:18;;:::i;9512:184::-;-1:-1:-1;;;9561:1:4;9554:88;9661:4;9658:1;9651:15;9685:4;9682:1;9675:15;9701:195;9740:3;-1:-1:-1;;9764:5:4;9761:77;9758:103;;9841:18;;:::i;:::-;-1:-1:-1;9888:1:4;9877:13;;9701:195::o;10760:1248::-;10890:3;10919:1;10952:6;10946:13;10982:3;11004:1;11032:9;11028:2;11024:18;11014:28;;11092:2;11081:9;11077:18;11114;11104:61;;11158:4;11150:6;11146:17;11136:27;;11104:61;11184:2;11232;11224:6;11221:14;11201:18;11198:38;11195:222;;-1:-1:-1;;;11266:3:4;11259:90;11372:4;11369:1;11362:15;11402:4;11397:3;11390:17;11195:222;11433:18;11460:191;;;;11665:1;11660:323;;;;11426:557;;11460:191;-1:-1:-1;;11497:9:4;11493:82;11488:3;11481:95;11631:6;11624:14;11617:22;11609:6;11605:35;11600:3;11596:45;11589:52;;11460:191;;11660:323;10707:1;10700:14;;;10744:4;10731:18;;11758:1;11772:165;11786:6;11783:1;11780:13;11772:165;;;11864:14;;11851:11;;;11844:35;11907:16;;;;11801:10;;11772:165;;;11776:3;;11966:6;11961:3;11957:16;11950:23;;11426:557;-1:-1:-1;11999:3:4;;10760:1248;-1:-1:-1;;;;;;;;10760:1248:4:o;12530:188::-;12609:13;;12662:30;12651:42;;12641:53;;12631:81;;12708:1;12705;12698:12;12723:293;12802:6;12810;12863:2;12851:9;12842:7;12838:23;12834:32;12831:52;;;12879:1;12876;12869:12;12831:52;12902:40;12932:9;12902:40;:::i;:::-;12892:50;;12961:49;13006:2;12995:9;12991:18;12961:49;:::i;13210:490::-;13449:6;13438:9;13431:25;13492:6;13487:2;13476:9;13472:18;13465:34;-1:-1:-1;;;;;13539:6:4;13535:55;13530:2;13519:9;13515:18;13508:83;13627:3;13622:2;13611:9;13607:18;13600:31;13412:4;13648:46;13689:3;13678:9;13674:19;13666:6;13648:46;:::i;14108:184::-;14178:6;14231:2;14219:9;14210:7;14206:23;14202:32;14199:52;;;14247:1;14244;14237:12;14199:52;-1:-1:-1;14270:16:4;;14108:184;-1:-1:-1;14108:184:4:o

Swarm Source

ipfs://4d994052626b05c12cd5910e44b736ec0b01e2ef2456ec32610203f99a1e11c7
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.