ETH Price: $3,909.97 (-0.85%)

Token

ERC-20: MagaDonalds (McMaga)
 

Overview

Max Total Supply

777,000,000 McMaga

Holders

160

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
25,438.1348047922144023 McMaga

Value
$0.00
0x7c4f6c09b3889df1242e4f4b2036c5ee64da7e9d
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:
MagaDonalds

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-07-17
*/

/*

    Welcome to MAGADonalds

    Can I take your order please? Today's special is the McMaga burger. Would you like to supersize your order?

    $McMaga is here to feed the nation, not just the village.

    Join our exclusive diner whilst stocks last!

    Https://t.me/MagaDonalds
    Https://MagaDonalds.org
    https://x.com/McMagaBurger?t=Jn6jILQBgsZoNamRrHtD2g&s=09

*/

pragma solidity 0.8.26;

// SPDX-License-Identifier: MIT

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

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

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

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

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

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

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

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

interface IERC20Metadata is IERC20{
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
    }

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

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

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

library SafeERC20 {
    using Address for address;

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

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

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }

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

interface ILpPair {
    function sync() external;
}

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
}

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

contract MagaDonalds is ERC20, Ownable {

    mapping (address => bool) public exemptFromFees;
    mapping (address => bool) public exemptFromLimits;

    bool public tradingAllowed;

    mapping (address => bool) public isAMMPair;

    address public operationsAddress;
    address public devAddress;

    Taxes public buyTax;
    Taxes public sellTax;

    TokensForTax public tokensForTax;

    mapping(address => uint256) private _holderLastTransferBlock;

    bool public limited = true;

    uint256 public swapTokensAtAmt;
    uint256 public lastSwapBackBlock;

    address public immutable lpPair;
    IDexRouter public immutable dexRouter;
    address public immutable WETH;

    TxLimits public txLimits;

    uint64 public constant FEE_DIVISOR = 10000;

    uint256 public launchBlock;
    bool public dynamicTaxOn;

    bool public transferDelayEnabled = true;

    // structs

    struct TxLimits {
        uint128 transactionLimit;
        uint128 walletLimit;
    }

    struct Taxes {
        uint64 operationsTax;
        uint64 devTax;
        uint64 liquidityTax;
        uint64 totalTax;
    }

    struct TokensForTax {
        uint80 tokensForOperations;
        uint80 tokensForLiquidity;
        uint80 tokensForDev;
        bool gasSaver;
    }

    // events

    event UpdatedTransactionLimit(uint newMax);
    event UpdatedWalletLimit(uint newMax);
    event SetExemptFromFees(address _address, bool _isExempt);
    event SetExemptFromLimits(address _address, bool _isExempt);
    event RemovedLimits();
    event UpdatedBuyTax(uint newAmt);
    event UpdatedSellTax(uint newAmt);

    // constructor

    constructor()
        ERC20("MagaDonalds", "McMaga")
    {   
        address newOwner = 0x41621d1648555596683BEfacDabd3bA4cE0c65Ce;
        _mint(newOwner, 777_000_000 * 1e18);

        address _v2Router;

        dynamicTaxOn = true;

        // @dev assumes WETH pair
        if(block.chainid == 1){
            _v2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else if(block.chainid == 5){
            _v2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else if(block.chainid == 97){
            _v2Router = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1;
        } else if(block.chainid == 42161){
            _v2Router = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506;
        } else if(block.chainid == 8453){
            _v2Router = 0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24;
         } else {
            revert("Chain not configured");
        }

        dexRouter = IDexRouter(_v2Router);

        txLimits.transactionLimit = uint128(totalSupply() * 10 / 1000);
        txLimits.walletLimit = uint128(totalSupply() * 10 / 1000);
        swapTokensAtAmt = totalSupply() * 25 / 100000;

        operationsAddress = 0x1d8A59ad82c88E219685C1A1fbaF211DF4776462;
        devAddress = 0x666514BC2ccf36d69Bca3A869276130Cf76a0294;

        buyTax.operationsTax = 667; // 1% = 100
        buyTax.liquidityTax = 667;
        buyTax.devTax = 666;
        buyTax.totalTax = buyTax.operationsTax + buyTax.liquidityTax + buyTax.devTax;

        sellTax.operationsTax = 667;
        sellTax.liquidityTax = 667;
        sellTax.devTax = 666;
        sellTax.totalTax = sellTax.operationsTax + sellTax.liquidityTax + sellTax.devTax;

        tokensForTax.gasSaver = true;

        WETH = dexRouter.WETH();
        lpPair = IDexFactory(dexRouter.factory()).createPair(address(this), WETH);

        isAMMPair[lpPair] = true;

        exemptFromLimits[lpPair] = true;
        exemptFromLimits[newOwner] = true;
        exemptFromLimits[address(this)] = true;

        exemptFromFees[newOwner] = true;
        exemptFromFees[address(this)] = true;
        exemptFromFees[address(dexRouter)] = true;
 
        _approve(address(this), address(dexRouter), type(uint256).max);
        _approve(address(newOwner), address(dexRouter), totalSupply());

        transferOwnership(newOwner);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        
        if(!exemptFromFees[from] && !exemptFromFees[to]){
            require(tradingAllowed, "Trading not active");
            amount -= handleTax(from, to, amount);
            checkLimits(from, to, amount);
        }

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

    function checkLimits(address from, address to, uint256 amount) internal {
        if(limited){
            bool exFromLimitsTo = exemptFromLimits[to];
            uint256 balanceOfTo = balanceOf(to);
            TxLimits memory _txLimits = txLimits;
            // buy
            if (isAMMPair[from] && !exFromLimitsTo) {
                require(amount <= _txLimits.transactionLimit, "Max Txn");
                require(amount + balanceOfTo <= _txLimits.walletLimit, "Max Wallet");
            } 
            // sell
            else if (isAMMPair[to] && !exemptFromLimits[from]) {
                require(amount <= _txLimits.transactionLimit, "Max Txn");
            }
            else if(!exFromLimitsTo) {
                require(amount + balanceOfTo <= _txLimits.walletLimit, "Max Wallet");
            }

            if(transferDelayEnabled){
                if (to != address(dexRouter) && to != address(lpPair)){
                    require(_holderLastTransferBlock[tx.origin] < block.number, "Transfer Delay");
                    _holderLastTransferBlock[to] = block.number;
                    _holderLastTransferBlock[tx.origin] = block.number;
                    if(from == address(lpPair)){
                        require(tx.origin == to, "no buying to external wallets yet");
                    }
                }
            }
        }
    }

    function handleTax(address from, address to, uint256 amount) internal returns (uint256){

        if(balanceOf(address(this)) >= swapTokensAtAmt && isAMMPair[to] && lastSwapBackBlock + 2 <= block.number) {
            convertTaxes();
        }

        if(dynamicTaxOn){
            setInternalTaxes();
        }
        
        uint128 tax = 0;

        Taxes memory taxes;

        if (isAMMPair[to]){
            taxes = sellTax;
        } else if(isAMMPair[from]){
            taxes = buyTax;
        }

        if(taxes.totalTax > 0){
            TokensForTax memory tokensForTaxUpdate = tokensForTax;
            tax = uint128(amount * taxes.totalTax / FEE_DIVISOR);
            tokensForTaxUpdate.tokensForLiquidity += uint80(tax * taxes.liquidityTax / taxes.totalTax / 1e9);
            tokensForTaxUpdate.tokensForOperations += uint80(tax * taxes.operationsTax / taxes.totalTax / 1e9);
            tokensForTaxUpdate.tokensForDev += uint80(tax * taxes.devTax / taxes.totalTax / 1e9);
            tokensForTax = tokensForTaxUpdate;
            super._transfer(from, address(this), tax);
        }
        
        return tax;
    }

    function swapTokensForETH(uint256 tokenAmt) private {

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;

        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmt,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function convertTaxes() private {

        uint256 contractBalance = balanceOf(address(this));
        TokensForTax memory tokensForTaxMem = tokensForTax;
        uint256 totalTokensToSwap = tokensForTaxMem.tokensForLiquidity + tokensForTaxMem.tokensForOperations + tokensForTaxMem.tokensForDev;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmt * 20){
            contractBalance = swapTokensAtAmt * 20;
        }

        if(tokensForTaxMem.tokensForLiquidity > 0){
            uint256 liquidityTokens = contractBalance * tokensForTaxMem.tokensForLiquidity / totalTokensToSwap;
            super._transfer(address(this), lpPair, liquidityTokens);
            try ILpPair(lpPair).sync(){} catch {}
            contractBalance -= liquidityTokens;
            totalTokensToSwap -= tokensForTaxMem.tokensForLiquidity;
        }

        if(contractBalance > 0){

            swapTokensForETH(contractBalance);
            
            uint256 ethBalance = address(this).balance;

            bool success;

            if(tokensForTaxMem.tokensForDev > 0){
                (success,) = devAddress.call{value: ethBalance * tokensForTaxMem.tokensForDev / totalTokensToSwap}("");  
            }

            ethBalance = address(this).balance;

            if(ethBalance > 0){
                (success,) = operationsAddress.call{value: ethBalance}("");  
            }
        }

        tokensForTaxMem.tokensForLiquidity = 0;
        tokensForTaxMem.tokensForOperations = 0;
        tokensForTaxMem.tokensForDev = 0;

        tokensForTax = tokensForTaxMem;
        lastSwapBackBlock = block.number;
    }

    // owner functions
    function setExemptFromFee(address _address, bool _isExempt) external onlyOwner {
        require(_address != address(0), "Zero Address");
        require(_address != address(this), "Cannot unexempt contract");
        exemptFromFees[_address] = _isExempt;
        emit SetExemptFromFees(_address, _isExempt);
    }

    function setExemptFromLimit(address _address, bool _isExempt) external onlyOwner {
        require(_address != address(0), "Zero Address");
        if(!_isExempt){
            require(_address != lpPair, "Cannot remove pair");
        }
        exemptFromLimits[_address] = _isExempt;
        emit SetExemptFromLimits(_address, _isExempt);
    }

    function updateTransactionLimit(uint128 newNumInTokens) external onlyOwner {
        require(newNumInTokens >= (totalSupply() * 1 / 1000)/(10**decimals()), "Too low");
        txLimits.transactionLimit = uint128(newNumInTokens * (10**decimals()));
        emit UpdatedTransactionLimit(txLimits.transactionLimit);
    }

    function updateWalletLimit(uint128 newNumInTokens) external onlyOwner {
        require(newNumInTokens >= (totalSupply() * 1 / 1000)/(10**decimals()), "Too low");
        txLimits.walletLimit = uint128(newNumInTokens * (10**decimals()));
        emit UpdatedWalletLimit(txLimits.walletLimit);
    }

    function updateSwapTokensAmt(uint256 newAmount) external onlyOwner {
        require(newAmount >= (totalSupply() * 1) / 100000, "Swap amount cannot be lower than 0.001% total supply.");
        require(newAmount <= (totalSupply() * 5) / 1000, "Swap amount cannot be higher than 0.5% total supply.");
        swapTokensAtAmt = newAmount;
    }

    function updateBuyTax(uint64 _operationsTax, uint64 _liquidityTax, uint64 _devTax) external onlyOwner {
        Taxes memory taxes;
        taxes.operationsTax = _operationsTax;
        taxes.liquidityTax = _liquidityTax;
        taxes.devTax = _devTax;
        taxes.totalTax = _operationsTax + _liquidityTax + _devTax;
        require(taxes.totalTax  <= 500, "Keep tax below 5%");
        emit UpdatedBuyTax(taxes.totalTax);
        buyTax = taxes;
    }

    function updateSellTax(uint64 _operationsTax, uint64 _liquidityTax, uint64 _devTax) external onlyOwner {
        Taxes memory taxes;
        taxes.operationsTax = _operationsTax;
        taxes.liquidityTax = _liquidityTax;
        taxes.devTax = _devTax;
        taxes.totalTax = _operationsTax + _liquidityTax + _devTax;
        require(taxes.totalTax  <= 500, "Keep tax below 5%");
        emit UpdatedSellTax(taxes.totalTax);
        sellTax = taxes;
    }

    function renounceDevTax() external {
        require(msg.sender == devAddress, "Not dev");
        
        Taxes memory buyTaxes = buyTax;
        buyTaxes.operationsTax += buyTaxes.devTax;
        buyTaxes.devTax = 0;
        buyTax = buyTaxes;

        Taxes memory sellTaxes = sellTax;
        sellTaxes.operationsTax += sellTaxes.devTax;
        sellTaxes.devTax = 0;
        sellTax = sellTaxes;
    }

    function enableTrading() external onlyOwner {
        require(!tradingAllowed, "Trading already enabled");
        tradingAllowed = true;
        launchBlock = block.number;
        lastSwapBackBlock = block.number;
    }

    function removeLimits() external onlyOwner {
        limited = false;
        TxLimits memory _txLimits;
        uint256 supply = totalSupply();
        _txLimits.transactionLimit = uint128(supply);
        _txLimits.walletLimit = uint128(supply);
        txLimits = _txLimits;
        emit RemovedLimits();
    }

    function removeTransferDelay() external onlyOwner {
        require(transferDelayEnabled, "Already disabled!");
        transferDelayEnabled = false;
    }

    function airdropToWallets(address[] calldata wallets, uint256[] calldata amountsInWei) external onlyOwner {
        require(wallets.length == amountsInWei.length, "arrays length mismatch");
        for(uint256 i = 0; i < wallets.length; i++){
            super._transfer(msg.sender, wallets[i], amountsInWei[i]);
        }
    }

    function rescueTokens(address _token, address _to) external onlyOwner {
        require(_token != address(0), "_token address cannot be 0");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        SafeERC20.safeTransfer(IERC20(_token),_to, _contractBalance);
    }

    function updateOperationsAddress(address _address) external onlyOwner {
        require(_address != address(0), "zero address");
        operationsAddress = _address;
    }

    function updateDevAddress(address _address) external onlyOwner {
        require(_address != address(0), "zero address");
        devAddress = _address;
    }

    function removeDynamicTax() external onlyOwner {
        require(dynamicTaxOn, "Already off");
        dynamicTaxOn = false;
    }

    receive() payable external {}

    function setInternalTaxes() internal {
        Taxes memory newBuyTax = buyTax;
        Taxes memory newSellTax = sellTax;
        TxLimits memory _txLimits = txLimits;

        uint256 currentBlock = block.number;
        uint256 blocksSinceLaunch = currentBlock - launchBlock;
        uint256 decay = blocksSinceLaunch / 4;

        if(decay >= 17){
            dynamicTaxOn = false;
            newBuyTax.totalTax = 300;
            newSellTax.totalTax = 300;
            limited = false;
            uint256 supply = totalSupply();
            _txLimits.transactionLimit = uint128(supply);
            _txLimits.walletLimit = uint128(supply);
            txLimits = _txLimits;
            emit RemovedLimits();
        } else if (decay > 0) {
            if(transferDelayEnabled){
                transferDelayEnabled = false; // remove early to prevent issues with Uniswap Universal Router
            }
            newBuyTax.totalTax = uint64(2000 - (decay * 100));
            newSellTax.totalTax = uint64(2000 - (decay * 100));
            _txLimits.transactionLimit = uint128(totalSupply() * decay / 1000);
            _txLimits.walletLimit = uint128(totalSupply() * decay / 1000);
        } 

        if(buyTax.totalTax != newBuyTax.totalTax){
            newBuyTax.operationsTax = newBuyTax.totalTax / 3;
            newBuyTax.liquidityTax = newBuyTax.operationsTax;
            newBuyTax.devTax = newBuyTax.totalTax - newBuyTax.operationsTax - newBuyTax.liquidityTax;
            buyTax = newBuyTax;
        }
        if(sellTax.totalTax != newSellTax.totalTax){
            newSellTax.operationsTax = newSellTax.totalTax / 3;
            newSellTax.liquidityTax = newBuyTax.operationsTax;
            newSellTax.devTax = newSellTax.totalTax - newSellTax.operationsTax - newSellTax.liquidityTax;
            sellTax = newSellTax;
        }

        if(_txLimits.transactionLimit != txLimits.transactionLimit){
            txLimits = _txLimits;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"RemovedLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"SetExemptFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"SetExemptFromLimits","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedBuyTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmt","type":"uint256"}],"name":"UpdatedSellTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"UpdatedTransactionLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"UpdatedWalletLimit","type":"event"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amountsInWei","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint64","name":"operationsTax","type":"uint64"},{"internalType":"uint64","name":"devTax","type":"uint64"},{"internalType":"uint64","name":"liquidityTax","type":"uint64"},{"internalType":"uint64","name":"totalTax","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicTaxOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAMMPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapBackBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeDynamicTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeTransferDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceDevTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint64","name":"operationsTax","type":"uint64"},{"internalType":"uint64","name":"devTax","type":"uint64"},{"internalType":"uint64","name":"liquidityTax","type":"uint64"},{"internalType":"uint64","name":"totalTax","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"setExemptFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isExempt","type":"bool"}],"name":"setExemptFromLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTax","outputs":[{"internalType":"uint80","name":"tokensForOperations","type":"uint80"},{"internalType":"uint80","name":"tokensForLiquidity","type":"uint80"},{"internalType":"uint80","name":"tokensForDev","type":"uint80"},{"internalType":"bool","name":"gasSaver","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"txLimits","outputs":[{"internalType":"uint128","name":"transactionLimit","type":"uint128"},{"internalType":"uint128","name":"walletLimit","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_operationsTax","type":"uint64"},{"internalType":"uint64","name":"_liquidityTax","type":"uint64"},{"internalType":"uint64","name":"_devTax","type":"uint64"}],"name":"updateBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateOperationsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_operationsTax","type":"uint64"},{"internalType":"uint64","name":"_liquidityTax","type":"uint64"},{"internalType":"uint64","name":"_devTax","type":"uint64"}],"name":"updateSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newNumInTokens","type":"uint128"}],"name":"updateTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newNumInTokens","type":"uint128"}],"name":"updateWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040526010805460ff191660011790556015805461ff00191661010017905534801561002b575f80fd5b506040518060400160405280600b81526020016a4d616761446f6e616c647360a81b815250604051806040016040528060068152602001654d634d61676160d01b815250816003908161007e91906109c3565b50600461008b82826109c3565b5050505f61009d61063a60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250905f905f8051602061442e833981519152908290a3507341621d1648555596683befacdabd3ba4ce0c65ce610102816b0282b82666abfd3da900000061063e565b6015805460ff191660019081179091555f904690036101365750737a250d5630b4cf539739df2c5dacb4c659f2488d610211565b466005036101595750737a250d5630b4cf539739df2c5dacb4c659f2488d610211565b4660610361017c575073d99d1c33f9fc3444f8101754abc46c52416550d1610211565b4661a4b1036101a05750731b02da8cb0d097eb8d57a175b88c7d8b47997506610211565b46612105036101c45750734752ba5dbc23f44d87826276bf6fd6b1c372ad24610211565b60405162461bcd60e51b815260206004820152601460248201527f436861696e206e6f7420636f6e6669677572656400000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b03811660a0526103e861022a60025490565b61023590600a610a91565b61023f9190610aae565b601380546001600160801b0319166001600160801b03929092169190911790556103e861026b60025490565b61027690600a610a91565b6102809190610aae565b601380546001600160801b03928316600160801b029216919091179055620186a06102aa60025490565b6102b5906019610a91565b6102bf9190610aae565b601155600a8054731d8a59ad82c88e219685c1a1fbaf211df47764626001600160a01b031991821617909155600b805473666514bc2ccf36d69bca3a869276130cf76a02949216919091179055600c80546001600160c01b03191671029b000000000000029a000000000000029b17908190556001600160401b0368010000000000000000820481169161035e91600160801b9091041661029b610acd565b6103689190610acd565b600c80546001600160c01b0316600160c01b6001600160401b0393841602179055600d80546001600160c01b03191671029b000000000000029a000000000000029b17908190556801000000000000000081048216916103d291600160801b90041661029b610acd565b6103dc9190610acd565b600d80546001600160401b0392909216600160c01b026001600160c01b03909216919091179055600e805460ff60f01b1916600160f01b17905560a051604080516315ab88c960e31b815290516001600160a01b039092169163ad5c4648916004808201926020929091908290030181865afa15801561045e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104829190610aec565b6001600160a01b031660c0816001600160a01b03168152505060a0516001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fd9190610aec565b60c0516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303815f875af115801561054b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061056f9190610aec565b6001600160a01b0390811660808190525f9081526009602090815260408083208054600160ff199182168117909255600784528285208054821683179055878616808652838620805483168417905530808752848720805484168517905590865260069094528285208054821683179055838552828520805482168317905560a0519586168552919093208054909116909217909155610610915f19610701565b61062a8260a0516106256106fb60201b60201c565b610701565b61063382610824565b5050610b2c565b3390565b6001600160a01b0382166106945760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610208565b8060025f8282546106a59190610b19565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60025490565b6001600160a01b0383166107635760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610208565b6001600160a01b0382166107c45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610208565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b0316331461087e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610208565b6001600160a01b0381166108e35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610208565b6005546040516001600160a01b038084169216905f8051602061442e833981519152905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061095357607f821691505b60208210810361097157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156109be57805f5260205f20601f840160051c8101602085101561099c5750805b601f840160051c820191505b818110156109bb575f81556001016109a8565b50505b505050565b81516001600160401b038111156109dc576109dc61092b565b6109f0816109ea845461093f565b84610977565b6020601f821160018114610a22575f8315610a0b5750848201515b5f19600385901b1c1916600184901b1784556109bb565b5f84815260208120601f198516915b82811015610a515787850151825560209485019460019092019101610a31565b5084821015610a6e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610aa857610aa8610a7d565b92915050565b5f82610ac857634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160401b038181168382160190811115610aa857610aa8610a7d565b5f60208284031215610afc575f80fd5b81516001600160a01b0381168114610b12575f80fd5b9392505050565b80820180821115610aa857610aa8610a7d565b60805160a05160c0516138a0610b8e5f395f818161081a015261302d01525f818161030801528181612688015261308401525f81816104c4015281816119ba015281816126c501528181612773015281816129d401526129fb01526138a05ff3fe6080604052600436106102c2575f3560e01c8063850337621161016f578063b0249cc6116100d8578063d00efb2f11610092578063ea6debd01161006d578063ea6debd01461096c578063f270fde41461098b578063f2fde38b146109d5578063f8686f07146109f4575f80fd5b8063d00efb2f14610919578063dd62ed3e1461092e578063ea4cfe121461094d575f80fd5b8063b0249cc61461083c578063bedafd011461086a578063c78d0fa014610889578063c876d0b91461089e578063cc1776d3146108bc578063ccad03e1146108fa575f80fd5b806395d89b411161012957806395d89b41146107765780639e7261af1461078a5780639e93ad8e1461079e578063a457c2d7146107cb578063a9059cbb146107ea578063ad5c464814610809575f80fd5b806385033762146106c0578063860a32ec146106df5780638a8c523c146106f85780638becc57d1461070c5780638d3e6e401461072b5780638da5cb5b14610759575f80fd5b80633ad10ef61161022b5780635a90a49e116101e557806370a08231116101c057806370a0823114610650578063715018a614610684578063751039fc1461069857806375808631146106ac575f80fd5b80635a90a49e1461058f57806366ebd39a146105bd5780636d7adcad146105dc575f80fd5b80633ad10ef61461047f578063432e95a51461049e578063452ed4f1146104b35780634f7041a5146104e657806353371be0146105575780635431c94e14610570575f80fd5b806323b872dd1161027c57806323b872dd146103cf578063286965a7146103ee578063313ce5671461040d578063362919a71461042857806336e18e19146104415780633950935114610460575f80fd5b806306fdde03146102cd5780630758d924146102f7578063095ea7b31461034257806318160ddd14610371578063210459181461038f5780632307b441146103b0575f80fd5b366102c957005b5f80fd5b3480156102d8575f80fd5b506102e1610a08565b6040516102ee919061325c565b60405180910390f35b348015610302575f80fd5b5061032a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102ee565b34801561034d575f80fd5b5061036161035c3660046132ac565b610a98565b60405190151581526020016102ee565b34801561037c575f80fd5b506002545b6040519081526020016102ee565b34801561039a575f80fd5b506103ae6103a93660046132d4565b610ab1565b005b3480156103bb575f80fd5b506103ae6103ca366004613332565b610c05565b3480156103da575f80fd5b506103616103e936600461339c565b610cd9565b3480156103f9575f80fd5b506103ae6104083660046133ec565b610cfc565b348015610418575f80fd5b50604051601281526020016102ee565b348015610433575f80fd5b506015546103619060ff1681565b34801561044c575f80fd5b506103ae61045b36600461342c565b610e73565b34801561046b575f80fd5b5061036161047a3660046132ac565b610f8b565b34801561048a575f80fd5b50600b5461032a906001600160a01b031681565b3480156104a9575f80fd5b5061038160125481565b3480156104be575f80fd5b5061032a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104f1575f80fd5b50600c54610524906001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b604080516001600160401b03958616815293851660208501529184169183019190915290911660608201526080016102ee565b348015610562575f80fd5b506008546103619060ff1681565b34801561057b575f80fd5b506103ae61058a366004613459565b610fac565b34801561059a575f80fd5b506103616105a936600461348a565b60066020525f908152604090205460ff1681565b3480156105c8575f80fd5b506103ae6105d736600461342c565b6110a6565b3480156105e7575f80fd5b50600e5461061b906001600160501b0380821691600160501b8104821691600160a01b82041690600160f01b900460ff1684565b6040516102ee94939291906001600160501b039485168152928416602084015292166040820152901515606082015260800190565b34801561065b575f80fd5b5061038161066a36600461348a565b6001600160a01b03165f9081526020819052604090205490565b34801561068f575f80fd5b506103ae6111ba565b3480156106a3575f80fd5b506103ae61122d565b3480156106b7575f80fd5b506103ae6112cc565b3480156106cb575f80fd5b506103ae6106da36600461348a565b611471565b3480156106ea575f80fd5b506010546103619060ff1681565b348015610703575f80fd5b506103ae611502565b348015610717575f80fd5b506103ae6107263660046133ec565b611597565b348015610736575f80fd5b5061036161074536600461348a565b60076020525f908152604090205460ff1681565b348015610764575f80fd5b506005546001600160a01b031661032a565b348015610781575f80fd5b506102e161170e565b348015610795575f80fd5b506103ae61171d565b3480156107a9575f80fd5b506107b361271081565b6040516001600160401b0390911681526020016102ee565b3480156107d6575f80fd5b506103616107e53660046132ac565b611793565b3480156107f5575f80fd5b506103616108043660046132ac565b61180d565b348015610814575f80fd5b5061032a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610847575f80fd5b5061036161085636600461348a565b60096020525f908152604090205460ff1681565b348015610875575f80fd5b506103ae6108843660046134b3565b61181a565b348015610894575f80fd5b5061038160115481565b3480156108a9575f80fd5b5060155461036190610100900460ff1681565b3480156108c7575f80fd5b50600d54610524906001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b348015610905575f80fd5b506103ae6109143660046134b3565b611944565b348015610924575f80fd5b5061038160145481565b348015610939575f80fd5b50610381610948366004613459565b611a89565b348015610958575f80fd5b50600a5461032a906001600160a01b031681565b348015610977575f80fd5b506103ae61098636600461348a565b611ab3565b348015610996575f80fd5b506013546109b5906001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016102ee565b3480156109e0575f80fd5b506103ae6109ef36600461348a565b611b44565b3480156109ff575f80fd5b506103ae611c2e565b606060038054610a17906134e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a43906134e8565b8015610a8e5780601f10610a6557610100808354040283529160200191610a8e565b820191905f5260205f20905b815481529060010190602001808311610a7157829003601f168201915b5050505050905090565b5f33610aa5818585611cb0565b60019150505b92915050565b6005546001600160a01b03163314610ae45760405162461bcd60e51b8152600401610adb90613520565b60405180910390fd5b620186a0610af160025490565b610afc906001613569565b610b069190613594565b811015610b735760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610adb565b6103e8610b7f60025490565b610b8a906005613569565b610b949190613594565b811115610c005760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610adb565b601155565b6005546001600160a01b03163314610c2f5760405162461bcd60e51b8152600401610adb90613520565b828114610c775760405162461bcd60e51b81526020600482015260166024820152750c2e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b6044820152606401610adb565b5f5b83811015610cd257610cca33868684818110610c9757610c976135a7565b9050602002016020810190610cac919061348a565b858585818110610cbe57610cbe6135a7565b90506020020135611dd3565b600101610c79565b5050505050565b5f33610ce6858285611f76565b610cf1858585611fee565b506001949350505050565b6005546001600160a01b03163314610d265760405162461bcd60e51b8152600401610adb90613520565b604080516080810182525f60608201526001600160401b03858116825284811692820192909252908216602082015281610d6084866135bb565b610d6a91906135bb565b6001600160401b0316606082018190526101f41015610dbf5760405162461bcd60e51b81526020600482015260116024820152704b656570207461782062656c6f7720352560781b6044820152606401610adb565b60608101516040516001600160401b0390911681527fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c979060200160405180910390a18051600d8054602084015160408501516060909501516001600160401b03908116600160c01b026001600160c01b03968216600160801b02969096166001600160801b03928216600160401b026001600160801b03199094169190951617919091171691909117919091179055505050565b6005546001600160a01b03163314610e9d5760405162461bcd60e51b8152600401610adb90613520565b610ea96012600a6136bd565b6103e8610eb560025490565b610ec0906001613569565b610eca9190613594565b610ed49190613594565b816001600160801b03161015610f165760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610adb565b610f226012600a6136bd565b610f35906001600160801b038316613569565b601380546001600160801b0319166001600160801b039290921691821790556040519081527f6710da7d4acedae09cb83751ae24c150719ef67dcbc1e02049f171d13c6b44e6906020015b60405180910390a150565b5f33610aa5818585610f9d8383611a89565b610fa791906136cb565b611cb0565b6005546001600160a01b03163314610fd65760405162461bcd60e51b8152600401610adb90613520565b6001600160a01b03821661102c5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610adb565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611070573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109491906136de565b90506110a18383836120a7565b505050565b6005546001600160a01b031633146110d05760405162461bcd60e51b8152600401610adb90613520565b6110dc6012600a6136bd565b6103e86110e860025490565b6110f3906001613569565b6110fd9190613594565b6111079190613594565b816001600160801b031610156111495760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610adb565b6111556012600a6136bd565b611168906001600160801b038316613569565b601380546001600160801b03908116600160801b93821684021791829055604051929091041681527fde064515fae8f8bb6d8ff19d2c6ba704322def7494147d8a971266430ade078890602001610f80565b6005546001600160a01b031633146111e45760405162461bcd60e51b8152600401610adb90613520565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146112575760405162461bcd60e51b8152600401610adb90613520565b6010805460ff19169055604080518082019091525f80825260208201525f61127e60025490565b6001600160801b03811680845260208401819052600160801b8102176013556040519091507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a15050565b600b546001600160a01b031633146113105760405162461bcd60e51b81526020600482015260076024820152662737ba103232bb60c91b6044820152606401610adb565b60408051608081018252600c546001600160401b03808216808452600160401b8304821660208501819052600160801b8404831695850195909552600160c01b90920416606083015290919082906113699083906135bb565b6001600160401b039081169091525f6020848101919091528351600c80546040808801516060808a01519588166001600160c01b031990941693909317600160801b9188168202176001600160c01b0316600160c01b9588168602179093558051608081018252600d54808816808352600160401b820489169783018890529481048816928201929092529390049094169382019390935292509082906114119083906135bb565b6001600160401b039081169091525f60208401528251600d805460408601516060909601519284166001600160c01b031990911617600160801b95841695909502949094176001600160c01b0316600160c01b9190921602179091555050565b6005546001600160a01b0316331461149b5760405162461bcd60e51b8152600401610adb90613520565b6001600160a01b0381166114e05760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610adb565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461152c5760405162461bcd60e51b8152600401610adb90613520565b60085460ff161561157f5760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c65640000000000000000006044820152606401610adb565b6008805460ff19166001179055436014819055601255565b6005546001600160a01b031633146115c15760405162461bcd60e51b8152600401610adb90613520565b604080516080810182525f60608201526001600160401b038581168252848116928201929092529082166020820152816115fb84866135bb565b61160591906135bb565b6001600160401b0316606082018190526101f4101561165a5760405162461bcd60e51b81526020600482015260116024820152704b656570207461782062656c6f7720352560781b6044820152606401610adb565b60608101516040516001600160401b0390911681527f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece05089060200160405180910390a18051600c8054602084015160408501516060909501516001600160401b03908116600160c01b026001600160c01b03968216600160801b02969096166001600160801b03928216600160401b026001600160801b03199094169190951617919091171691909117919091179055505050565b606060048054610a17906134e8565b6005546001600160a01b031633146117475760405162461bcd60e51b8152600401610adb90613520565b60155460ff166117875760405162461bcd60e51b815260206004820152600b60248201526a20b63932b0b23c9037b33360a91b6044820152606401610adb565b6015805460ff19169055565b5f33816117a08286611a89565b9050838110156118005760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610adb565b610cf18286868403611cb0565b5f33610aa5818585611fee565b6005546001600160a01b031633146118445760405162461bcd60e51b8152600401610adb90613520565b6001600160a01b0382166118895760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610adb565b306001600160a01b038316036118e15760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420756e6578656d707420636f6e747261637400000000000000006044820152606401610adb565b6001600160a01b0382165f81815260066020908152604091829020805460ff19168515159081179091558251938452908301527f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d91015b60405180910390a15050565b6005546001600160a01b0316331461196e5760405162461bcd60e51b8152600401610adb90613520565b6001600160a01b0382166119b35760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610adb565b80611a2e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611a2e5760405162461bcd60e51b815260206004820152601260248201527121b0b73737ba103932b6b7bb32903830b4b960711b6044820152606401610adb565b6001600160a01b0382165f81815260076020908152604091829020805460ff19168515159081179091558251938452908301527f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce9101611938565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6005546001600160a01b03163314611add5760405162461bcd60e51b8152600401610adb90613520565b6001600160a01b038116611b225760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610adb565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611b6e5760405162461bcd60e51b8152600401610adb90613520565b6001600160a01b038116611bd35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610adb565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611c585760405162461bcd60e51b8152600401610adb90613520565b601554610100900460ff16611ca35760405162461bcd60e51b8152602060048201526011602482015270416c72656164792064697361626c65642160781b6044820152606401610adb565b6015805461ff0019169055565b6001600160a01b038316611d125760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610adb565b6001600160a01b038216611d735760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610adb565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611e375760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610adb565b6001600160a01b038216611e995760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610adb565b6001600160a01b0383165f9081526020819052604090205481811015611f105760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610adb565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b5f611f818484611a89565b90505f198114611fe85781811015611fdb5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610adb565b611fe88484848403611cb0565b50505050565b6001600160a01b0383165f9081526006602052604090205460ff1615801561202e57506001600160a01b0382165f9081526006602052604090205460ff16155b1561209c5760085460ff1661207a5760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606401610adb565b6120858383836120f9565b61208f90826136f5565b905061209c838383612483565b6110a1838383611dd3565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110a1908490612806565b601154305f9081526020819052604081205490911115801561213257506001600160a01b0383165f9081526009602052604090205460ff165b801561214c575043601254600261214991906136cb565b11155b15612159576121596128d7565b60155460ff161561216c5761216c612bc6565b604080516080810182525f8082526020808301829052828401829052606083018290526001600160a01b0387168252600990529182205460ff16156121f8575060408051608081018252600d546001600160401b038082168352600160401b820481166020840152600160801b8204811693830193909352600160c01b90049091166060820152612261565b6001600160a01b0386165f9081526009602052604090205460ff1615612261575060408051608081018252600c546001600160401b038082168352600160401b820481166020840152600160801b8204811693830193909352600160c01b900490911660608201525b60608101516001600160401b0316156124715760408051608081018252600e546001600160501b038082168352600160501b820481166020840152600160a01b82041692820192909252600160f01b90910460ff161515606080830191909152820151612710906122db906001600160401b031687613569565b6122e59190613594565b9250633b9aca0082606001516001600160401b031683604001516001600160401b0316856123139190613708565b61231d9190613731565b6123279190613731565b81602001818151612338919061375e565b6001600160501b031690525060608201518251633b9aca00916001600160401b0390811691612368911686613708565b6123729190613731565b61237c9190613731565b8151829061238b90839061375e565b6001600160501b031690525060608201516020830151633b9aca00916001600160401b03908116916123be911686613708565b6123c89190613731565b6123d29190613731565b816040018181516123e3919061375e565b6001600160501b039081169091528251600e80546020860151604087015160608801511515600160f01b0260ff60f01b19918716600160a01b02919091166affffffffffffffffffffff60a01b19928716600160501b026001600160a01b031990941695909616949094179190911716929092171790555061246f87306001600160801b038616611dd3565b505b506001600160801b0316949350505050565b60105460ff16156110a1576001600160a01b038281165f9081526007602090815260408083205483835281842054825180840184526013546001600160801b038082168352600160801b90910416818601529589168552600990935292205460ff9283169391921680156124f5575082155b156125965780516001600160801b031684111561253e5760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610adb565b60208101516001600160801b031661255683866136cb565b11156125915760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610adb565b612676565b6001600160a01b0385165f9081526009602052604090205460ff1680156125d557506001600160a01b0386165f9081526007602052604090205460ff16155b1561261e5780516001600160801b03168411156125915760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610adb565b826126765760208101516001600160801b031661263b83866136cb565b11156126765760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610adb565b601554610100900460ff16156127fe577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316141580156126fa57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b156127fe57325f908152600f6020526040902054431161274d5760405162461bcd60e51b815260206004820152600e60248201526d5472616e736665722044656c617960901b6044820152606401610adb565b6001600160a01b038086165f908152600f602052604080822043908190553283529120557f00000000000000000000000000000000000000000000000000000000000000008116908716036127fe57326001600160a01b038616146127fe5760405162461bcd60e51b815260206004820152602160248201527f6e6f20627579696e6720746f2065787465726e616c2077616c6c6574732079656044820152601d60fa1b6064820152608401610adb565b505050505050565b5f61285a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612fc29092919063ffffffff16565b8051909150156110a15780806020019051810190612878919061377d565b6110a15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610adb565b305f9081526020819052604081205460408051608081018252600e546001600160501b03808216808452600160501b8304821660208501819052600160a01b8404909216948401859052600160f01b90920460ff161515606084015293945090925f92916129449161375e565b61294e919061375e565b6001600160501b03169050821580612964575080155b1561296e57505050565b60115461297c906014613569565b83111561299457601154612991906014613569565b92505b60208201516001600160501b031615612a8c575f8183602001516001600160501b0316856129c29190613569565b6129cc9190613594565b90506129f9307f000000000000000000000000000000000000000000000000000000000000000083611dd3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a51575f80fd5b505af1925050508015612a62575060015b50612a6d81856136f5565b935082602001516001600160501b031682612a8891906136f5565b9150505b8215612b8a57612a9b83612fd8565b604082015147905f906001600160501b031615612b2957600b5460408501516001600160a01b03909116908490612adb906001600160501b031685613569565b612ae59190613594565b6040515f81818185875af1925050503d805f8114612b1e576040519150601f19603f3d011682016040523d82523d5f602084013e612b23565b606091505b50909150505b4791508115612b8757600a546040516001600160a01b039091169083905f81818185875af1925050503d805f8114612b7c576040519150601f19603f3d011682016040523d82523d5f602084013e612b81565b606091505b50909150505b50505b505f602082018190528082526040820152600e80546060909201511515600160f01b026001600160f81b03199092169190911790555043601255565b6040805160808082018352600c546001600160401b038082168452600160401b8083048216602080870191909152600160801b808504841687890152600160c01b94859004841660608089019190915288519687018952600d5480861688529384048516878401528184048516878a0152949092049092169284019290925284518086019095526013546001600160801b038082168752929004909116908401526014549192909143905f90612c7c90836136f5565b90505f612c8a600483613594565b905060118110612d12576015805460ff1990811690915561012c60608089018290528701526010805490911690555f612cc260025490565b6001600160801b03811680875260208701819052600160801b8102176013556040519091507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a150612dda565b8015612dda57601554610100900460ff1615612d34576015805461ff00191690555b612d3f816064613569565b612d4b906107d06136f5565b6001600160401b03166060870152612d64816064613569565b612d70906107d06136f5565b6001600160401b031660608601526103e881612d8b60025490565b612d959190613569565b612d9f9190613594565b6001600160801b031684526103e881612db760025490565b612dc19190613569565b612dcb9190613594565b6001600160801b031660208501525b6060860151600c54600160c01b90046001600160401b03908116911614612eac5760038660600151612e0c9190613798565b6001600160401b0316808752604087018190526060870151612e2f9082906137c5565b612e3991906137c5565b6001600160401b03908116602088018190528751600c805460408b015160608c01518616600160c01b026001600160c01b03918716600160801b02919091166001600160801b03600160401b9096026001600160801b031990931694909616939093171792909216929092179190911790555b6060850151600d54600160c01b90046001600160401b03908116911614612f855760038560600151612ede9190613798565b6001600160401b0390811680875287519091166040870181905260608701519091612f08916137c5565b612f1291906137c5565b6001600160401b03908116602087018190528651600d805460408a015160608b01518616600160c01b026001600160c01b03918716600160801b02919091166001600160801b03600160401b9096026001600160801b031990931694909616939093171792909216929092179190911790555b60135484516001600160801b039081169116146127fe57835160208501516001600160801b03908116600160801b02911617601355505050505050565b6060612fd084845f856130ec565b949350505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061300b5761300b6135a7565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061305f5761305f6135a7565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac947906130c39085905f908690309042906004016137e4565b5f604051808303815f87803b1580156130da575f80fd5b505af11580156127fe573d5f803e3d5ffd5b60608247101561314d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610adb565b5f80866001600160a01b031685876040516131689190613854565b5f6040518083038185875af1925050503d805f81146131a2576040519150601f19603f3d011682016040523d82523d5f602084013e6131a7565b606091505b50915091506131b8878383876131c3565b979650505050505050565b606083156132315782515f0361322a576001600160a01b0385163b61322a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610adb565b5081612fd0565b612fd083838151156132465781518083602001fd5b8060405162461bcd60e51b8152600401610adb91905b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146132a7575f80fd5b919050565b5f80604083850312156132bd575f80fd5b6132c683613291565b946020939093013593505050565b5f602082840312156132e4575f80fd5b5035919050565b5f8083601f8401126132fb575f80fd5b5081356001600160401b03811115613311575f80fd5b6020830191508360208260051b850101111561332b575f80fd5b9250929050565b5f805f8060408587031215613345575f80fd5b84356001600160401b0381111561335a575f80fd5b613366878288016132eb565b90955093505060208501356001600160401b03811115613384575f80fd5b613390878288016132eb565b95989497509550505050565b5f805f606084860312156133ae575f80fd5b6133b784613291565b92506133c560208501613291565b929592945050506040919091013590565b80356001600160401b03811681146132a7575f80fd5b5f805f606084860312156133fe575f80fd5b613407846133d6565b9250613415602085016133d6565b9150613423604085016133d6565b90509250925092565b5f6020828403121561343c575f80fd5b81356001600160801b0381168114613452575f80fd5b9392505050565b5f806040838503121561346a575f80fd5b61347383613291565b915061348160208401613291565b90509250929050565b5f6020828403121561349a575f80fd5b61345282613291565b80151581146134b0575f80fd5b50565b5f80604083850312156134c4575f80fd5b6134cd83613291565b915060208301356134dd816134a3565b809150509250929050565b600181811c908216806134fc57607f821691505b60208210810361351a57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610aab57610aab613555565b634e487b7160e01b5f52601260045260245ffd5b5f826135a2576135a2613580565b500490565b634e487b7160e01b5f52603260045260245ffd5b6001600160401b038181168382160190811115610aab57610aab613555565b6001815b6001841115613615578085048111156135f9576135f9613555565b600184161561360757908102905b60019390931c9280026135de565b935093915050565b5f8261362b57506001610aab565b8161363757505f610aab565b816001811461364d576002811461365757613673565b6001915050610aab565b60ff84111561366857613668613555565b50506001821b610aab565b5060208310610133831016604e8410600b8410161715613696575081810a610aab565b6136a25f1984846135da565b805f19048211156136b5576136b5613555565b029392505050565b5f61345260ff84168361361d565b80820180821115610aab57610aab613555565b5f602082840312156136ee575f80fd5b5051919050565b81810381811115610aab57610aab613555565b6001600160801b03818116838216029081169081811461372a5761372a613555565b5092915050565b5f6001600160801b0383168061374957613749613580565b806001600160801b0384160491505092915050565b6001600160501b038181168382160190811115610aab57610aab613555565b5f6020828403121561378d575f80fd5b8151613452816134a3565b5f6001600160401b038316806137b0576137b0613580565b806001600160401b0384160491505092915050565b6001600160401b038281168282160390811115610aab57610aab613555565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156138345783516001600160a01b031683526020938401939092019160010161380d565b50506001600160a01b039590951660608401525050608001529392505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220b143bc5deb12546f302c849d9ad162183c653f32b79a30b1470dc0c0f4ff909c64736f6c634300081a00338be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0

Deployed Bytecode

0x6080604052600436106102c2575f3560e01c8063850337621161016f578063b0249cc6116100d8578063d00efb2f11610092578063ea6debd01161006d578063ea6debd01461096c578063f270fde41461098b578063f2fde38b146109d5578063f8686f07146109f4575f80fd5b8063d00efb2f14610919578063dd62ed3e1461092e578063ea4cfe121461094d575f80fd5b8063b0249cc61461083c578063bedafd011461086a578063c78d0fa014610889578063c876d0b91461089e578063cc1776d3146108bc578063ccad03e1146108fa575f80fd5b806395d89b411161012957806395d89b41146107765780639e7261af1461078a5780639e93ad8e1461079e578063a457c2d7146107cb578063a9059cbb146107ea578063ad5c464814610809575f80fd5b806385033762146106c0578063860a32ec146106df5780638a8c523c146106f85780638becc57d1461070c5780638d3e6e401461072b5780638da5cb5b14610759575f80fd5b80633ad10ef61161022b5780635a90a49e116101e557806370a08231116101c057806370a0823114610650578063715018a614610684578063751039fc1461069857806375808631146106ac575f80fd5b80635a90a49e1461058f57806366ebd39a146105bd5780636d7adcad146105dc575f80fd5b80633ad10ef61461047f578063432e95a51461049e578063452ed4f1146104b35780634f7041a5146104e657806353371be0146105575780635431c94e14610570575f80fd5b806323b872dd1161027c57806323b872dd146103cf578063286965a7146103ee578063313ce5671461040d578063362919a71461042857806336e18e19146104415780633950935114610460575f80fd5b806306fdde03146102cd5780630758d924146102f7578063095ea7b31461034257806318160ddd14610371578063210459181461038f5780632307b441146103b0575f80fd5b366102c957005b5f80fd5b3480156102d8575f80fd5b506102e1610a08565b6040516102ee919061325c565b60405180910390f35b348015610302575f80fd5b5061032a7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016102ee565b34801561034d575f80fd5b5061036161035c3660046132ac565b610a98565b60405190151581526020016102ee565b34801561037c575f80fd5b506002545b6040519081526020016102ee565b34801561039a575f80fd5b506103ae6103a93660046132d4565b610ab1565b005b3480156103bb575f80fd5b506103ae6103ca366004613332565b610c05565b3480156103da575f80fd5b506103616103e936600461339c565b610cd9565b3480156103f9575f80fd5b506103ae6104083660046133ec565b610cfc565b348015610418575f80fd5b50604051601281526020016102ee565b348015610433575f80fd5b506015546103619060ff1681565b34801561044c575f80fd5b506103ae61045b36600461342c565b610e73565b34801561046b575f80fd5b5061036161047a3660046132ac565b610f8b565b34801561048a575f80fd5b50600b5461032a906001600160a01b031681565b3480156104a9575f80fd5b5061038160125481565b3480156104be575f80fd5b5061032a7f000000000000000000000000e4572f32443a61b2fc11d46e83404fbaa518539981565b3480156104f1575f80fd5b50600c54610524906001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b604080516001600160401b03958616815293851660208501529184169183019190915290911660608201526080016102ee565b348015610562575f80fd5b506008546103619060ff1681565b34801561057b575f80fd5b506103ae61058a366004613459565b610fac565b34801561059a575f80fd5b506103616105a936600461348a565b60066020525f908152604090205460ff1681565b3480156105c8575f80fd5b506103ae6105d736600461342c565b6110a6565b3480156105e7575f80fd5b50600e5461061b906001600160501b0380821691600160501b8104821691600160a01b82041690600160f01b900460ff1684565b6040516102ee94939291906001600160501b039485168152928416602084015292166040820152901515606082015260800190565b34801561065b575f80fd5b5061038161066a36600461348a565b6001600160a01b03165f9081526020819052604090205490565b34801561068f575f80fd5b506103ae6111ba565b3480156106a3575f80fd5b506103ae61122d565b3480156106b7575f80fd5b506103ae6112cc565b3480156106cb575f80fd5b506103ae6106da36600461348a565b611471565b3480156106ea575f80fd5b506010546103619060ff1681565b348015610703575f80fd5b506103ae611502565b348015610717575f80fd5b506103ae6107263660046133ec565b611597565b348015610736575f80fd5b5061036161074536600461348a565b60076020525f908152604090205460ff1681565b348015610764575f80fd5b506005546001600160a01b031661032a565b348015610781575f80fd5b506102e161170e565b348015610795575f80fd5b506103ae61171d565b3480156107a9575f80fd5b506107b361271081565b6040516001600160401b0390911681526020016102ee565b3480156107d6575f80fd5b506103616107e53660046132ac565b611793565b3480156107f5575f80fd5b506103616108043660046132ac565b61180d565b348015610814575f80fd5b5061032a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b348015610847575f80fd5b5061036161085636600461348a565b60096020525f908152604090205460ff1681565b348015610875575f80fd5b506103ae6108843660046134b3565b61181a565b348015610894575f80fd5b5061038160115481565b3480156108a9575f80fd5b5060155461036190610100900460ff1681565b3480156108c7575f80fd5b50600d54610524906001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b348015610905575f80fd5b506103ae6109143660046134b3565b611944565b348015610924575f80fd5b5061038160145481565b348015610939575f80fd5b50610381610948366004613459565b611a89565b348015610958575f80fd5b50600a5461032a906001600160a01b031681565b348015610977575f80fd5b506103ae61098636600461348a565b611ab3565b348015610996575f80fd5b506013546109b5906001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016102ee565b3480156109e0575f80fd5b506103ae6109ef36600461348a565b611b44565b3480156109ff575f80fd5b506103ae611c2e565b606060038054610a17906134e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a43906134e8565b8015610a8e5780601f10610a6557610100808354040283529160200191610a8e565b820191905f5260205f20905b815481529060010190602001808311610a7157829003601f168201915b5050505050905090565b5f33610aa5818585611cb0565b60019150505b92915050565b6005546001600160a01b03163314610ae45760405162461bcd60e51b8152600401610adb90613520565b60405180910390fd5b620186a0610af160025490565b610afc906001613569565b610b069190613594565b811015610b735760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610adb565b6103e8610b7f60025490565b610b8a906005613569565b610b949190613594565b811115610c005760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610adb565b601155565b6005546001600160a01b03163314610c2f5760405162461bcd60e51b8152600401610adb90613520565b828114610c775760405162461bcd60e51b81526020600482015260166024820152750c2e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b6044820152606401610adb565b5f5b83811015610cd257610cca33868684818110610c9757610c976135a7565b9050602002016020810190610cac919061348a565b858585818110610cbe57610cbe6135a7565b90506020020135611dd3565b600101610c79565b5050505050565b5f33610ce6858285611f76565b610cf1858585611fee565b506001949350505050565b6005546001600160a01b03163314610d265760405162461bcd60e51b8152600401610adb90613520565b604080516080810182525f60608201526001600160401b03858116825284811692820192909252908216602082015281610d6084866135bb565b610d6a91906135bb565b6001600160401b0316606082018190526101f41015610dbf5760405162461bcd60e51b81526020600482015260116024820152704b656570207461782062656c6f7720352560781b6044820152606401610adb565b60608101516040516001600160401b0390911681527fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c979060200160405180910390a18051600d8054602084015160408501516060909501516001600160401b03908116600160c01b026001600160c01b03968216600160801b02969096166001600160801b03928216600160401b026001600160801b03199094169190951617919091171691909117919091179055505050565b6005546001600160a01b03163314610e9d5760405162461bcd60e51b8152600401610adb90613520565b610ea96012600a6136bd565b6103e8610eb560025490565b610ec0906001613569565b610eca9190613594565b610ed49190613594565b816001600160801b03161015610f165760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610adb565b610f226012600a6136bd565b610f35906001600160801b038316613569565b601380546001600160801b0319166001600160801b039290921691821790556040519081527f6710da7d4acedae09cb83751ae24c150719ef67dcbc1e02049f171d13c6b44e6906020015b60405180910390a150565b5f33610aa5818585610f9d8383611a89565b610fa791906136cb565b611cb0565b6005546001600160a01b03163314610fd65760405162461bcd60e51b8152600401610adb90613520565b6001600160a01b03821661102c5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610adb565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611070573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109491906136de565b90506110a18383836120a7565b505050565b6005546001600160a01b031633146110d05760405162461bcd60e51b8152600401610adb90613520565b6110dc6012600a6136bd565b6103e86110e860025490565b6110f3906001613569565b6110fd9190613594565b6111079190613594565b816001600160801b031610156111495760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610adb565b6111556012600a6136bd565b611168906001600160801b038316613569565b601380546001600160801b03908116600160801b93821684021791829055604051929091041681527fde064515fae8f8bb6d8ff19d2c6ba704322def7494147d8a971266430ade078890602001610f80565b6005546001600160a01b031633146111e45760405162461bcd60e51b8152600401610adb90613520565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146112575760405162461bcd60e51b8152600401610adb90613520565b6010805460ff19169055604080518082019091525f80825260208201525f61127e60025490565b6001600160801b03811680845260208401819052600160801b8102176013556040519091507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a15050565b600b546001600160a01b031633146113105760405162461bcd60e51b81526020600482015260076024820152662737ba103232bb60c91b6044820152606401610adb565b60408051608081018252600c546001600160401b03808216808452600160401b8304821660208501819052600160801b8404831695850195909552600160c01b90920416606083015290919082906113699083906135bb565b6001600160401b039081169091525f6020848101919091528351600c80546040808801516060808a01519588166001600160c01b031990941693909317600160801b9188168202176001600160c01b0316600160c01b9588168602179093558051608081018252600d54808816808352600160401b820489169783018890529481048816928201929092529390049094169382019390935292509082906114119083906135bb565b6001600160401b039081169091525f60208401528251600d805460408601516060909601519284166001600160c01b031990911617600160801b95841695909502949094176001600160c01b0316600160c01b9190921602179091555050565b6005546001600160a01b0316331461149b5760405162461bcd60e51b8152600401610adb90613520565b6001600160a01b0381166114e05760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610adb565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461152c5760405162461bcd60e51b8152600401610adb90613520565b60085460ff161561157f5760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c65640000000000000000006044820152606401610adb565b6008805460ff19166001179055436014819055601255565b6005546001600160a01b031633146115c15760405162461bcd60e51b8152600401610adb90613520565b604080516080810182525f60608201526001600160401b038581168252848116928201929092529082166020820152816115fb84866135bb565b61160591906135bb565b6001600160401b0316606082018190526101f4101561165a5760405162461bcd60e51b81526020600482015260116024820152704b656570207461782062656c6f7720352560781b6044820152606401610adb565b60608101516040516001600160401b0390911681527f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece05089060200160405180910390a18051600c8054602084015160408501516060909501516001600160401b03908116600160c01b026001600160c01b03968216600160801b02969096166001600160801b03928216600160401b026001600160801b03199094169190951617919091171691909117919091179055505050565b606060048054610a17906134e8565b6005546001600160a01b031633146117475760405162461bcd60e51b8152600401610adb90613520565b60155460ff166117875760405162461bcd60e51b815260206004820152600b60248201526a20b63932b0b23c9037b33360a91b6044820152606401610adb565b6015805460ff19169055565b5f33816117a08286611a89565b9050838110156118005760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610adb565b610cf18286868403611cb0565b5f33610aa5818585611fee565b6005546001600160a01b031633146118445760405162461bcd60e51b8152600401610adb90613520565b6001600160a01b0382166118895760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610adb565b306001600160a01b038316036118e15760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420756e6578656d707420636f6e747261637400000000000000006044820152606401610adb565b6001600160a01b0382165f81815260066020908152604091829020805460ff19168515159081179091558251938452908301527f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d91015b60405180910390a15050565b6005546001600160a01b0316331461196e5760405162461bcd60e51b8152600401610adb90613520565b6001600160a01b0382166119b35760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610adb565b80611a2e577f000000000000000000000000e4572f32443a61b2fc11d46e83404fbaa51853996001600160a01b0316826001600160a01b031603611a2e5760405162461bcd60e51b815260206004820152601260248201527121b0b73737ba103932b6b7bb32903830b4b960711b6044820152606401610adb565b6001600160a01b0382165f81815260076020908152604091829020805460ff19168515159081179091558251938452908301527f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce9101611938565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6005546001600160a01b03163314611add5760405162461bcd60e51b8152600401610adb90613520565b6001600160a01b038116611b225760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b6044820152606401610adb565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611b6e5760405162461bcd60e51b8152600401610adb90613520565b6001600160a01b038116611bd35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610adb565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611c585760405162461bcd60e51b8152600401610adb90613520565b601554610100900460ff16611ca35760405162461bcd60e51b8152602060048201526011602482015270416c72656164792064697361626c65642160781b6044820152606401610adb565b6015805461ff0019169055565b6001600160a01b038316611d125760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610adb565b6001600160a01b038216611d735760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610adb565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611e375760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610adb565b6001600160a01b038216611e995760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610adb565b6001600160a01b0383165f9081526020819052604090205481811015611f105760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610adb565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b5f611f818484611a89565b90505f198114611fe85781811015611fdb5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610adb565b611fe88484848403611cb0565b50505050565b6001600160a01b0383165f9081526006602052604090205460ff1615801561202e57506001600160a01b0382165f9081526006602052604090205460ff16155b1561209c5760085460ff1661207a5760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606401610adb565b6120858383836120f9565b61208f90826136f5565b905061209c838383612483565b6110a1838383611dd3565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526110a1908490612806565b601154305f9081526020819052604081205490911115801561213257506001600160a01b0383165f9081526009602052604090205460ff165b801561214c575043601254600261214991906136cb565b11155b15612159576121596128d7565b60155460ff161561216c5761216c612bc6565b604080516080810182525f8082526020808301829052828401829052606083018290526001600160a01b0387168252600990529182205460ff16156121f8575060408051608081018252600d546001600160401b038082168352600160401b820481166020840152600160801b8204811693830193909352600160c01b90049091166060820152612261565b6001600160a01b0386165f9081526009602052604090205460ff1615612261575060408051608081018252600c546001600160401b038082168352600160401b820481166020840152600160801b8204811693830193909352600160c01b900490911660608201525b60608101516001600160401b0316156124715760408051608081018252600e546001600160501b038082168352600160501b820481166020840152600160a01b82041692820192909252600160f01b90910460ff161515606080830191909152820151612710906122db906001600160401b031687613569565b6122e59190613594565b9250633b9aca0082606001516001600160401b031683604001516001600160401b0316856123139190613708565b61231d9190613731565b6123279190613731565b81602001818151612338919061375e565b6001600160501b031690525060608201518251633b9aca00916001600160401b0390811691612368911686613708565b6123729190613731565b61237c9190613731565b8151829061238b90839061375e565b6001600160501b031690525060608201516020830151633b9aca00916001600160401b03908116916123be911686613708565b6123c89190613731565b6123d29190613731565b816040018181516123e3919061375e565b6001600160501b039081169091528251600e80546020860151604087015160608801511515600160f01b0260ff60f01b19918716600160a01b02919091166affffffffffffffffffffff60a01b19928716600160501b026001600160a01b031990941695909616949094179190911716929092171790555061246f87306001600160801b038616611dd3565b505b506001600160801b0316949350505050565b60105460ff16156110a1576001600160a01b038281165f9081526007602090815260408083205483835281842054825180840184526013546001600160801b038082168352600160801b90910416818601529589168552600990935292205460ff9283169391921680156124f5575082155b156125965780516001600160801b031684111561253e5760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610adb565b60208101516001600160801b031661255683866136cb565b11156125915760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610adb565b612676565b6001600160a01b0385165f9081526009602052604090205460ff1680156125d557506001600160a01b0386165f9081526007602052604090205460ff16155b1561261e5780516001600160801b03168411156125915760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610adb565b826126765760208101516001600160801b031661263b83866136cb565b11156126765760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610adb565b601554610100900460ff16156127fe577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316856001600160a01b0316141580156126fa57507f000000000000000000000000e4572f32443a61b2fc11d46e83404fbaa51853996001600160a01b0316856001600160a01b031614155b156127fe57325f908152600f6020526040902054431161274d5760405162461bcd60e51b815260206004820152600e60248201526d5472616e736665722044656c617960901b6044820152606401610adb565b6001600160a01b038086165f908152600f602052604080822043908190553283529120557f000000000000000000000000e4572f32443a61b2fc11d46e83404fbaa51853998116908716036127fe57326001600160a01b038616146127fe5760405162461bcd60e51b815260206004820152602160248201527f6e6f20627579696e6720746f2065787465726e616c2077616c6c6574732079656044820152601d60fa1b6064820152608401610adb565b505050505050565b5f61285a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612fc29092919063ffffffff16565b8051909150156110a15780806020019051810190612878919061377d565b6110a15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610adb565b305f9081526020819052604081205460408051608081018252600e546001600160501b03808216808452600160501b8304821660208501819052600160a01b8404909216948401859052600160f01b90920460ff161515606084015293945090925f92916129449161375e565b61294e919061375e565b6001600160501b03169050821580612964575080155b1561296e57505050565b60115461297c906014613569565b83111561299457601154612991906014613569565b92505b60208201516001600160501b031615612a8c575f8183602001516001600160501b0316856129c29190613569565b6129cc9190613594565b90506129f9307f000000000000000000000000e4572f32443a61b2fc11d46e83404fbaa518539983611dd3565b7f000000000000000000000000e4572f32443a61b2fc11d46e83404fbaa51853996001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612a51575f80fd5b505af1925050508015612a62575060015b50612a6d81856136f5565b935082602001516001600160501b031682612a8891906136f5565b9150505b8215612b8a57612a9b83612fd8565b604082015147905f906001600160501b031615612b2957600b5460408501516001600160a01b03909116908490612adb906001600160501b031685613569565b612ae59190613594565b6040515f81818185875af1925050503d805f8114612b1e576040519150601f19603f3d011682016040523d82523d5f602084013e612b23565b606091505b50909150505b4791508115612b8757600a546040516001600160a01b039091169083905f81818185875af1925050503d805f8114612b7c576040519150601f19603f3d011682016040523d82523d5f602084013e612b81565b606091505b50909150505b50505b505f602082018190528082526040820152600e80546060909201511515600160f01b026001600160f81b03199092169190911790555043601255565b6040805160808082018352600c546001600160401b038082168452600160401b8083048216602080870191909152600160801b808504841687890152600160c01b94859004841660608089019190915288519687018952600d5480861688529384048516878401528184048516878a0152949092049092169284019290925284518086019095526013546001600160801b038082168752929004909116908401526014549192909143905f90612c7c90836136f5565b90505f612c8a600483613594565b905060118110612d12576015805460ff1990811690915561012c60608089018290528701526010805490911690555f612cc260025490565b6001600160801b03811680875260208701819052600160801b8102176013556040519091507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a150612dda565b8015612dda57601554610100900460ff1615612d34576015805461ff00191690555b612d3f816064613569565b612d4b906107d06136f5565b6001600160401b03166060870152612d64816064613569565b612d70906107d06136f5565b6001600160401b031660608601526103e881612d8b60025490565b612d959190613569565b612d9f9190613594565b6001600160801b031684526103e881612db760025490565b612dc19190613569565b612dcb9190613594565b6001600160801b031660208501525b6060860151600c54600160c01b90046001600160401b03908116911614612eac5760038660600151612e0c9190613798565b6001600160401b0316808752604087018190526060870151612e2f9082906137c5565b612e3991906137c5565b6001600160401b03908116602088018190528751600c805460408b015160608c01518616600160c01b026001600160c01b03918716600160801b02919091166001600160801b03600160401b9096026001600160801b031990931694909616939093171792909216929092179190911790555b6060850151600d54600160c01b90046001600160401b03908116911614612f855760038560600151612ede9190613798565b6001600160401b0390811680875287519091166040870181905260608701519091612f08916137c5565b612f1291906137c5565b6001600160401b03908116602087018190528651600d805460408a015160608b01518616600160c01b026001600160c01b03918716600160801b02919091166001600160801b03600160401b9096026001600160801b031990931694909616939093171792909216929092179190911790555b60135484516001600160801b039081169116146127fe57835160208501516001600160801b03908116600160801b02911617601355505050505050565b6060612fd084845f856130ec565b949350505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061300b5761300b6135a7565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061305f5761305f6135a7565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac947906130c39085905f908690309042906004016137e4565b5f604051808303815f87803b1580156130da575f80fd5b505af11580156127fe573d5f803e3d5ffd5b60608247101561314d5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610adb565b5f80866001600160a01b031685876040516131689190613854565b5f6040518083038185875af1925050503d805f81146131a2576040519150601f19603f3d011682016040523d82523d5f602084013e6131a7565b606091505b50915091506131b8878383876131c3565b979650505050505050565b606083156132315782515f0361322a576001600160a01b0385163b61322a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610adb565b5081612fd0565b612fd083838151156132465781518083602001fd5b8060405162461bcd60e51b8152600401610adb91905b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b03811681146132a7575f80fd5b919050565b5f80604083850312156132bd575f80fd5b6132c683613291565b946020939093013593505050565b5f602082840312156132e4575f80fd5b5035919050565b5f8083601f8401126132fb575f80fd5b5081356001600160401b03811115613311575f80fd5b6020830191508360208260051b850101111561332b575f80fd5b9250929050565b5f805f8060408587031215613345575f80fd5b84356001600160401b0381111561335a575f80fd5b613366878288016132eb565b90955093505060208501356001600160401b03811115613384575f80fd5b613390878288016132eb565b95989497509550505050565b5f805f606084860312156133ae575f80fd5b6133b784613291565b92506133c560208501613291565b929592945050506040919091013590565b80356001600160401b03811681146132a7575f80fd5b5f805f606084860312156133fe575f80fd5b613407846133d6565b9250613415602085016133d6565b9150613423604085016133d6565b90509250925092565b5f6020828403121561343c575f80fd5b81356001600160801b0381168114613452575f80fd5b9392505050565b5f806040838503121561346a575f80fd5b61347383613291565b915061348160208401613291565b90509250929050565b5f6020828403121561349a575f80fd5b61345282613291565b80151581146134b0575f80fd5b50565b5f80604083850312156134c4575f80fd5b6134cd83613291565b915060208301356134dd816134a3565b809150509250929050565b600181811c908216806134fc57607f821691505b60208210810361351a57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610aab57610aab613555565b634e487b7160e01b5f52601260045260245ffd5b5f826135a2576135a2613580565b500490565b634e487b7160e01b5f52603260045260245ffd5b6001600160401b038181168382160190811115610aab57610aab613555565b6001815b6001841115613615578085048111156135f9576135f9613555565b600184161561360757908102905b60019390931c9280026135de565b935093915050565b5f8261362b57506001610aab565b8161363757505f610aab565b816001811461364d576002811461365757613673565b6001915050610aab565b60ff84111561366857613668613555565b50506001821b610aab565b5060208310610133831016604e8410600b8410161715613696575081810a610aab565b6136a25f1984846135da565b805f19048211156136b5576136b5613555565b029392505050565b5f61345260ff84168361361d565b80820180821115610aab57610aab613555565b5f602082840312156136ee575f80fd5b5051919050565b81810381811115610aab57610aab613555565b6001600160801b03818116838216029081169081811461372a5761372a613555565b5092915050565b5f6001600160801b0383168061374957613749613580565b806001600160801b0384160491505092915050565b6001600160501b038181168382160190811115610aab57610aab613555565b5f6020828403121561378d575f80fd5b8151613452816134a3565b5f6001600160401b038316806137b0576137b0613580565b806001600160401b0384160491505092915050565b6001600160401b038281168282160390811115610aab57610aab613555565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156138345783516001600160a01b031683526020938401939092019160010161380d565b50506001600160a01b039590951660608401525050608001529392505050565b5f82518060208501845e5f92019182525091905056fea2646970667358221220b143bc5deb12546f302c849d9ad162183c653f32b79a30b1470dc0c0f4ff909c64736f6c634300081a0033

Deployed Bytecode Sourcemap

21878:16185:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4586:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22513:37;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;620:32:1;;;602:51;;590:2;575:18;22513:37:0;437:222:1;6946:201:0;;;;;;;;;;-1:-1:-1;6946:201:0;;;;;:::i;:::-;;:::i;:::-;;;1312:14:1;;1305:22;1287:41;;1275:2;1260:18;6946:201:0;1147:187:1;5715:108:0;;;;;;;;;;-1:-1:-1;5803:12:0;;5715:108;;;1485:25:1;;;1473:2;1458:18;5715:108:0;1339:177:1;32410:346:0;;;;;;;;;;-1:-1:-1;32410:346:0;;;;;:::i;:::-;;:::i;:::-;;34869:333;;;;;;;;;;-1:-1:-1;34869:333:0;;;;;:::i;:::-;;:::i;7727:261::-;;;;;;;;;;-1:-1:-1;7727:261:0;;;;;:::i;:::-;;:::i;33237:468::-;;;;;;;;;;-1:-1:-1;33237:468:0;;;;;:::i;:::-;;:::i;5557:93::-;;;;;;;;;;-1:-1:-1;5557:93:0;;5640:2;3927:36:1;;3915:2;3900:18;5557:93:0;3785:184:1;22712:24:0;;;;;;;;;;-1:-1:-1;22712:24:0;;;;;;;;31770:322;;;;;;;;;;-1:-1:-1;31770:322:0;;;;;:::i;:::-;;:::i;8397:238::-;;;;;;;;;;-1:-1:-1;8397:238:0;;;;;:::i;:::-;;:::i;22163:25::-;;;;;;;;;;-1:-1:-1;22163:25:0;;;;-1:-1:-1;;;;;22163:25:0;;;22434:32;;;;;;;;;;;;;;;;22475:31;;;;;;;;;;;;;;;22197:19;;;;;;;;;;-1:-1:-1;22197:19:0;;;;-1:-1:-1;;;;;22197:19:0;;;;-1:-1:-1;;;22197:19:0;;;;;-1:-1:-1;;;22197:19:0;;;;;-1:-1:-1;;;22197:19:0;;;;;;;;;-1:-1:-1;;;;;4729:31:1;;;4711:50;;4797:31;;;4792:2;4777:18;;4770:59;4865:31;;;4845:18;;;4838:59;;;;4933:31;;;4928:2;4913:18;;4906:59;4698:3;4683:19;22197::0;4488:483:1;22038:26:0;;;;;;;;;;-1:-1:-1;22038:26:0;;;;;;;;35210:296;;;;;;;;;;-1:-1:-1;35210:296:0;;;;;:::i;:::-;;:::i;21926:47::-;;;;;;;;;;-1:-1:-1;21926:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;32100:302;;;;;;;;;;-1:-1:-1;32100:302:0;;;;;:::i;:::-;;:::i;22252:32::-;;;;;;;;;;-1:-1:-1;22252:32:0;;;;-1:-1:-1;;;;;22252:32:0;;;;-1:-1:-1;;;22252:32:0;;;;;-1:-1:-1;;;22252:32:0;;;;-1:-1:-1;;;22252:32:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;5669:35:1;;;5651:54;;5741:35;;;5736:2;5721:18;;5714:63;5813:35;;5808:2;5793:18;;5786:63;5892:14;;5885:22;5880:2;5865:18;;5858:50;5638:3;5623:19;;5432:482;5886:127:0;;;;;;;;;;-1:-1:-1;5886:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;5987:18:0;5960:7;5987:18;;;;;;;;;;;;5886:127;13500:150;;;;;;;;;;;;;:::i;34374:321::-;;;;;;;;;;;;;:::i;33713:419::-;;;;;;;;;;;;;:::i;35697:161::-;;;;;;;;;;-1:-1:-1;35697:161:0;;;;;:::i;:::-;;:::i;22362:26::-;;;;;;;;;;-1:-1:-1;22362:26:0;;;;;;;;34140:226;;;;;;;;;;;;;:::i;32764:465::-;;;;;;;;;;-1:-1:-1;32764:465:0;;;;;:::i;:::-;;:::i;21980:49::-;;;;;;;;;;-1:-1:-1;21980:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;13286:79;;;;;;;;;;-1:-1:-1;13351:6:0;;-1:-1:-1;;;;;13351:6:0;13286:79;;4805:104;;;;;;;;;;;;;:::i;35866:133::-;;;;;;;;;;;;;:::i;22628:42::-;;;;;;;;;;;;22665:5;22628:42;;;;;-1:-1:-1;;;;;6081:31:1;;;6063:50;;6051:2;6036:18;22628:42:0;5919:200:1;9138:436:0;;;;;;;;;;-1:-1:-1;9138:436:0;;;;;:::i;:::-;;:::i;6219:193::-;;;;;;;;;;-1:-1:-1;6219:193:0;;;;;:::i;:::-;;:::i;22557:29::-;;;;;;;;;;;;;;;22073:42;;;;;;;;;;-1:-1:-1;22073:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31083:319;;;;;;;;;;-1:-1:-1;31083:319:0;;;;;:::i;:::-;;:::i;22397:30::-;;;;;;;;;;;;;;;;22745:39;;;;;;;;;;-1:-1:-1;22745:39:0;;;;;;;;;;;22223:20;;;;;;;;;;-1:-1:-1;22223:20:0;;;;-1:-1:-1;;;;;22223:20:0;;;;-1:-1:-1;;;22223:20:0;;;;;-1:-1:-1;;;22223:20:0;;;;;-1:-1:-1;;;22223:20:0;;;;;31410:352;;;;;;;;;;-1:-1:-1;31410:352:0;;;;;:::i;:::-;;:::i;22679:26::-;;;;;;;;;;;;;;;;6475:151;;;;;;;;;;-1:-1:-1;6475:151:0;;;;;:::i;:::-;;:::i;22124:32::-;;;;;;;;;;-1:-1:-1;22124:32:0;;;;-1:-1:-1;;;;;22124:32:0;;;35514:175;;;;;;;;;;-1:-1:-1;35514:175:0;;;;;:::i;:::-;;:::i;22595:24::-;;;;;;;;;;-1:-1:-1;22595:24:0;;;;-1:-1:-1;;;;;22595:24:0;;;;-1:-1:-1;;;22595:24:0;;;;;;;;;-1:-1:-1;;;;;6759:47:1;;;6741:66;;6843:47;;;;6838:2;6823:18;;6816:75;6714:18;22595:24:0;6567:330:1;13658:244:0;;;;;;;;;;-1:-1:-1;13658:244:0;;;;;:::i;:::-;;:::i;34703:158::-;;;;;;;;;;;;;:::i;4586:100::-;4640:13;4673:5;4666:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4586:100;:::o;6946:201::-;7029:4;572:10;7085:32;572:10;7101:7;7110:6;7085:8;:32::i;:::-;7135:4;7128:11;;;6946:201;;;;;:::o;32410:346::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;;;;;;;;;32531:6:::1;32510:13;5803:12:::0;;;5715:108;32510:13:::1;:17;::::0;32526:1:::1;32510:17;:::i;:::-;32509:28;;;;:::i;:::-;32496:9;:41;;32488:107;;;::::0;-1:-1:-1;;;32488:107:0;;8412:2:1;32488:107:0::1;::::0;::::1;8394:21:1::0;8451:2;8431:18;;;8424:30;8490:34;8470:18;;;8463:62;-1:-1:-1;;;8541:18:1;;;8534:51;8602:19;;32488:107:0::1;8210:417:1::0;32488:107:0::1;32649:4;32628:13;5803:12:::0;;;5715:108;32628:13:::1;:17;::::0;32644:1:::1;32628:17;:::i;:::-;32627:26;;;;:::i;:::-;32614:9;:39;;32606:104;;;::::0;-1:-1:-1;;;32606:104:0;;8834:2:1;32606:104:0::1;::::0;::::1;8816:21:1::0;8873:2;8853:18;;;8846:30;8912:34;8892:18;;;8885:62;-1:-1:-1;;;8963:18:1;;;8956:50;9023:19;;32606:104:0::1;8632:416:1::0;32606:104:0::1;32721:15;:27:::0;32410:346::o;34869:333::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;34994:37;;::::1;34986:72;;;::::0;-1:-1:-1;;;34986:72:0;;9255:2:1;34986:72:0::1;::::0;::::1;9237:21:1::0;9294:2;9274:18;;;9267:30;-1:-1:-1;;;9313:18:1;;;9306:52;9375:18;;34986:72:0::1;9053:346:1::0;34986:72:0::1;35073:9;35069:126;35088:18:::0;;::::1;35069:126;;;35127:56;35143:10;35155:7;;35163:1;35155:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;35167:12;;35180:1;35167:15;;;;;;;:::i;:::-;;;;;;;35127;:56::i;:::-;35108:3;;35069:126;;;;34869:333:::0;;;;:::o;7727:261::-;7824:4;572:10;7882:38;7898:4;572:10;7913:6;7882:15;:38::i;:::-;7931:27;7941:4;7947:2;7951:6;7931:9;:27::i;:::-;-1:-1:-1;7976:4:0;;7727:261;-1:-1:-1;;;;7727:261:0:o;33237:468::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;33380:36:0;;::::1;::::0;;33427:34;;::::1;-1:-1:-1::0;;;33427:34:0;;;;33472:22;;::::1;-1:-1:-1::0;;;33472:22:0;;33522:30:::1;33427:34:::0;33380:36;33522:30:::1;:::i;:::-;:40;;;;:::i;:::-;-1:-1:-1::0;;;;;33505:57:0::1;:14;::::0;::::1;:57:::0;;;33600:3:::1;-1:-1:-1::0;33581:22:0::1;33573:52;;;::::0;-1:-1:-1;;;33573:52:0;;9934:2:1;33573:52:0::1;::::0;::::1;9916:21:1::0;9973:2;9953:18;;;9946:30;-1:-1:-1;;;9992:18:1;;;9985:47;10049:18;;33573:52:0::1;9732:341:1::0;33573:52:0::1;33656:14;::::0;::::1;::::0;33641:30:::1;::::0;-1:-1:-1;;;;;6081:31:1;;;6063:50;;33641:30:0::1;::::0;6051:2:1;6036:18;33641:30:0::1;;;;;;;33682:15:::0;;:7:::1;:15:::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;33682:15:0;;::::1;-1:-1:-1::0;;;33682:15:0::1;-1:-1:-1::0;;;;;33682:15:0;;::::1;-1:-1:-1::0;;;33682:15:0::1;::::0;;;;-1:-1:-1;;;;;33682:15:0;;::::1;-1:-1:-1::0;;;33682:15:0::1;-1:-1:-1::0;;;;;;33682:15:0;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;33237:468:0:o;31770:322::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;31910:14:::1;5640:2:::0;31910::::1;:14;:::i;:::-;31903:4;31883:13;5803:12:::0;;;5715:108;31883:13:::1;:17;::::0;31899:1:::1;31883:17;:::i;:::-;:24;;;;:::i;:::-;31882:43;;;;:::i;:::-;31864:14;-1:-1:-1::0;;;;;31864:61:0::1;;;31856:81;;;::::0;-1:-1:-1;;;31856:81:0;;11918:2:1;31856:81:0::1;::::0;::::1;11900:21:1::0;11957:1;11937:18;;;11930:29;-1:-1:-1;;;11975:18:1;;;11968:37;12022:18;;31856:81:0::1;11716:330:1::0;31856:81:0::1;32002:14;5640:2:::0;32002::::1;:14;:::i;:::-;31984:33;::::0;-1:-1:-1;;;;;31984:33:0;::::1;;:::i;:::-;31948:8;:70:::0;;-1:-1:-1;;;;;;31948:70:0::1;-1:-1:-1::0;;;;;31948:70:0;;;::::1;::::0;;::::1;::::0;;32034:50:::1;::::0;12197:66:1;;;32034:50:0::1;::::0;12185:2:1;12170:18;32034:50:0::1;;;;;;;;31770:322:::0;:::o;8397:238::-;8485:4;572:10;8541:64;572:10;8557:7;8594:10;8566:25;572:10;8557:7;8566:9;:25::i;:::-;:38;;;;:::i;:::-;8541:8;:64::i;35210:296::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35299:20:0;::::1;35291:59;;;::::0;-1:-1:-1;;;35291:59:0;;12606:2:1;35291:59:0::1;::::0;::::1;12588:21:1::0;12645:2;12625:18;;;12618:30;12684:28;12664:18;;;12657:56;12730:18;;35291:59:0::1;12404:350:1::0;35291:59:0::1;35388:39;::::0;-1:-1:-1;;;35388:39:0;;35421:4:::1;35388:39;::::0;::::1;602:51:1::0;35361:24:0::1;::::0;-1:-1:-1;;;;;35388:24:0;::::1;::::0;::::1;::::0;575:18:1;;35388:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35361:66;;35438:60;35468:6;35476:3;35481:16;35438:22;:60::i;:::-;35280:226;35210:296:::0;;:::o;32100:302::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;32235:14:::1;5640:2:::0;32235::::1;:14;:::i;:::-;32228:4;32208:13;5803:12:::0;;;5715:108;32208:13:::1;:17;::::0;32224:1:::1;32208:17;:::i;:::-;:24;;;;:::i;:::-;32207:43;;;;:::i;:::-;32189:14;-1:-1:-1::0;;;;;32189:61:0::1;;;32181:81;;;::::0;-1:-1:-1;;;32181:81:0;;11918:2:1;32181:81:0::1;::::0;::::1;11900:21:1::0;11957:1;11937:18;;;11930:29;-1:-1:-1;;;11975:18:1;;;11968:37;12022:18;;32181:81:0::1;11716:330:1::0;32181:81:0::1;32322:14;5640:2:::0;32322::::1;:14;:::i;:::-;32304:33;::::0;-1:-1:-1;;;;;32304:33:0;::::1;;:::i;:::-;32273:8;:65:::0;;-1:-1:-1;;;;;32273:65:0;;::::1;-1:-1:-1::0;;;32273:65:0;;::::1;::::0;::::1;;::::0;;;;32354:40:::1;::::0;32373:20;;;::::1;;12197:66:1::0;;32354:40:0::1;::::0;12185:2:1;12170:18;32354:40:0::1;12051:218:1::0;13500:150:0;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;13593:6:::1;::::0;13572:40:::1;::::0;13609:1:::1;::::0;-1:-1:-1;;;;;13593:6:0::1;::::0;13572:40:::1;::::0;13609:1;;13572:40:::1;13623:6;:19:::0;;-1:-1:-1;;;;;;13623:19:0::1;::::0;;13500:150::o;34374:321::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;34428:7:::1;:15:::0;;-1:-1:-1;;34428:15:0::1;::::0;;-1:-1:-1;;;;;;;;;34438:5:0::1;-1:-1:-1::0;;;;;;;34490:14:0::1;34507:13;5803:12:::0;;;5715:108;34507:13:::1;-1:-1:-1::0;;;;;34531:44:0;::::1;::::0;;;34586:21:::1;::::0;::::1;:39:::0;;;-1:-1:-1;;;34636:20:0;::::1;;:8;:20:::0;34672:15:::1;::::0;34490:30;;-1:-1:-1;34672:15:0::1;::::0;34531:26:::1;::::0;34672:15:::1;34417:278;;34374:321::o:0;33713:419::-;33781:10;;-1:-1:-1;;;;;33781:10:0;33767;:24;33759:44;;;;-1:-1:-1;;;33759:44:0;;13150:2:1;33759:44:0;;;13132:21:1;13189:1;13169:18;;;13162:29;-1:-1:-1;;;13207:18:1;;;13200:37;13254:18;;33759:44:0;12948:330:1;33759:44:0;33824:30;;;;;;;;33848:6;33824:30;-1:-1:-1;;;;;33824:30:0;;;;;;-1:-1:-1;;;33824:30:0;;;;;;;;;;-1:-1:-1;;;33824:30:0;;;;;;;;;;;-1:-1:-1;;;33824:30:0;;;;;;;;;;;;;33865:41;;33824:30;;33865:41;:::i;:::-;-1:-1:-1;;;;;33865:41:0;;;;;;33935:1;33917:15;;;;:19;;;;33947:17;;:6;:17;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33947:17:0;;;;;;;-1:-1:-1;;;33947:17:0;;;;;;-1:-1:-1;;;;;33947:17:0;-1:-1:-1;;;33947:17:0;;;;;;;;;33977:32;;;;;;;34002:7;33977:32;;;;;;;-1:-1:-1;;;33977:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33977:32:0;;;34020:43;;33977:32;;34020:43;:::i;:::-;-1:-1:-1;;;;;34020:43:0;;;;;;34093:1;34074:16;;;:20;34105:19;;:7;:19;;;;;;;;;;;;;;-1:-1:-1;;;;;;34105:19:0;;;;-1:-1:-1;;;34105:19:0;;;;;;;;;;;-1:-1:-1;;;;;34105:19:0;-1:-1:-1;;;34105:19:0;;;;;;;;;-1:-1:-1;;33713:419:0:o;35697:161::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35779:22:0;::::1;35771:47;;;::::0;-1:-1:-1;;;35771:47:0;;13485:2:1;35771:47:0::1;::::0;::::1;13467:21:1::0;13524:2;13504:18;;;13497:30;-1:-1:-1;;;13543:18:1;;;13536:42;13595:18;;35771:47:0::1;13283:336:1::0;35771:47:0::1;35829:10;:21:::0;;-1:-1:-1;;;;;;35829:21:0::1;-1:-1:-1::0;;;;;35829:21:0;;;::::1;::::0;;;::::1;::::0;;35697:161::o;34140:226::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;34204:14:::1;::::0;::::1;;34203:15;34195:51;;;::::0;-1:-1:-1;;;34195:51:0;;13826:2:1;34195:51:0::1;::::0;::::1;13808:21:1::0;13865:2;13845:18;;;13838:30;13904:25;13884:18;;;13877:53;13947:18;;34195:51:0::1;13624:347:1::0;34195:51:0::1;34257:14;:21:::0;;-1:-1:-1;;34257:21:0::1;34274:4;34257:21;::::0;;34303:12:::1;34289:11;:26:::0;;;34326:17:::1;:32:::0;34140:226::o;32764:465::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;32906:36:0;;::::1;::::0;;32953:34;;::::1;-1:-1:-1::0;;;32953:34:0;;;;32998:22;;::::1;-1:-1:-1::0;;;32998:22:0;;33048:30:::1;32953:34:::0;32906:36;33048:30:::1;:::i;:::-;:40;;;;:::i;:::-;-1:-1:-1::0;;;;;33031:57:0::1;:14;::::0;::::1;:57:::0;;;33126:3:::1;-1:-1:-1::0;33107:22:0::1;33099:52;;;::::0;-1:-1:-1;;;33099:52:0;;9934:2:1;33099:52:0::1;::::0;::::1;9916:21:1::0;9973:2;9953:18;;;9946:30;-1:-1:-1;;;9992:18:1;;;9985:47;10049:18;;33099:52:0::1;9732:341:1::0;33099:52:0::1;33181:14;::::0;::::1;::::0;33167:29:::1;::::0;-1:-1:-1;;;;;6081:31:1;;;6063:50;;33167:29:0::1;::::0;6051:2:1;6036:18;33167:29:0::1;;;;;;;33207:14:::0;;:6:::1;:14:::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;33207:14:0;;::::1;-1:-1:-1::0;;;33207:14:0::1;-1:-1:-1::0;;;;;33207:14:0;;::::1;-1:-1:-1::0;;;33207:14:0::1;::::0;;;;-1:-1:-1;;;;;33207:14:0;;::::1;-1:-1:-1::0;;;33207:14:0::1;-1:-1:-1::0;;;;;;33207:14:0;;;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;32764:465:0:o;4805:104::-;4861:13;4894:7;4887:14;;;;;:::i;35866:133::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;35932:12:::1;::::0;::::1;;35924:36;;;::::0;-1:-1:-1;;;35924:36:0;;14178:2:1;35924:36:0::1;::::0;::::1;14160:21:1::0;14217:2;14197:18;;;14190:30;-1:-1:-1;;;14236:18:1;;;14229:41;14287:18;;35924:36:0::1;13976:335:1::0;35924:36:0::1;35971:12;:20:::0;;-1:-1:-1;;35971:20:0::1;::::0;;35866:133::o;9138:436::-;9231:4;572:10;9231:4;9314:25;572:10;9331:7;9314:9;:25::i;:::-;9287:52;;9378:15;9358:16;:35;;9350:85;;;;-1:-1:-1;;;9350:85:0;;14518:2:1;9350:85:0;;;14500:21:1;14557:2;14537:18;;;14530:30;14596:34;14576:18;;;14569:62;-1:-1:-1;;;14647:18:1;;;14640:35;14692:19;;9350:85:0;14316:401:1;9350:85:0;9471:60;9480:5;9487:7;9515:15;9496:16;:34;9471:8;:60::i;6219:193::-;6298:4;572:10;6354:28;572:10;6371:2;6375:6;6354:9;:28::i;31083:319::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31181:22:0;::::1;31173:47;;;::::0;-1:-1:-1;;;31173:47:0;;14924:2:1;31173:47:0::1;::::0;::::1;14906:21:1::0;14963:2;14943:18;;;14936:30;-1:-1:-1;;;14982:18:1;;;14975:42;15034:18;;31173:47:0::1;14722:336:1::0;31173:47:0::1;31259:4;-1:-1:-1::0;;;;;31239:25:0;::::1;::::0;31231:62:::1;;;::::0;-1:-1:-1;;;31231:62:0;;15265:2:1;31231:62:0::1;::::0;::::1;15247:21:1::0;15304:2;15284:18;;;15277:30;15343:26;15323:18;;;15316:54;15387:18;;31231:62:0::1;15063:348:1::0;31231:62:0::1;-1:-1:-1::0;;;;;31304:24:0;::::1;;::::0;;;:14:::1;:24;::::0;;;;;;;;:36;;-1:-1:-1;;31304:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;31356:38;;15584:51:1;;;15651:18;;;15644:50;31356:38:0::1;::::0;15557:18:1;31356:38:0::1;;;;;;;;31083:319:::0;;:::o;31410:352::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31510:22:0;::::1;31502:47;;;::::0;-1:-1:-1;;;31502:47:0;;14924:2:1;31502:47:0::1;::::0;::::1;14906:21:1::0;14963:2;14943:18;;;14936:30;-1:-1:-1;;;14982:18:1;;;14975:42;15034:18;;31502:47:0::1;14722:336:1::0;31502:47:0::1;31564:9;31560:90;;31609:6;-1:-1:-1::0;;;;;31597:18:0::1;:8;-1:-1:-1::0;;;;;31597:18:0::1;::::0;31589:49:::1;;;::::0;-1:-1:-1;;;31589:49:0;;15907:2:1;31589:49:0::1;::::0;::::1;15889:21:1::0;15946:2;15926:18;;;15919:30;-1:-1:-1;;;15965:18:1;;;15958:48;16023:18;;31589:49:0::1;15705:342:1::0;31589:49:0::1;-1:-1:-1::0;;;;;31660:26:0;::::1;;::::0;;;:16:::1;:26;::::0;;;;;;;;:38;;-1:-1:-1;;31660:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;31714:40;;15584:51:1;;;15651:18;;;15644:50;31714:40:0::1;::::0;15557:18:1;31714:40:0::1;15416:284:1::0;6475:151:0;-1:-1:-1;;;;;6591:18:0;;;6564:7;6591:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6475:151::o;35514:175::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35603:22:0;::::1;35595:47;;;::::0;-1:-1:-1;;;35595:47:0;;13485:2:1;35595:47:0::1;::::0;::::1;13467:21:1::0;13524:2;13504:18;;;13497:30;-1:-1:-1;;;13543:18:1;;;13536:42;13595:18;;35595:47:0::1;13283:336:1::0;35595:47:0::1;35653:17;:28:::0;;-1:-1:-1;;;;;;35653:28:0::1;-1:-1:-1::0;;;;;35653:28:0;;;::::1;::::0;;;::::1;::::0;;35514:175::o;13658:244::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13747:22:0;::::1;13739:73;;;::::0;-1:-1:-1;;;13739:73:0;;16254:2:1;13739:73:0::1;::::0;::::1;16236:21:1::0;16293:2;16273:18;;;16266:30;16332:34;16312:18;;;16305:62;-1:-1:-1;;;16383:18:1;;;16376:36;16429:19;;13739:73:0::1;16052:402:1::0;13739:73:0::1;13849:6;::::0;13828:38:::1;::::0;-1:-1:-1;;;;;13828:38:0;;::::1;::::0;13849:6:::1;::::0;13828:38:::1;::::0;13849:6:::1;::::0;13828:38:::1;13877:6;:17:::0;;-1:-1:-1;;;;;;13877:17:0::1;-1:-1:-1::0;;;;;13877:17:0;;;::::1;::::0;;;::::1;::::0;;13658:244::o;34703:158::-;13413:6;;-1:-1:-1;;;;;13413:6:0;572:10;13413:22;13405:67;;;;-1:-1:-1;;;13405:67:0;;;;;;;:::i;:::-;34772:20:::1;::::0;::::1;::::0;::::1;;;34764:50;;;::::0;-1:-1:-1;;;34764:50:0;;16661:2:1;34764:50:0::1;::::0;::::1;16643:21:1::0;16700:2;16680:18;;;16673:30;-1:-1:-1;;;16719:18:1;;;16712:47;16776:18;;34764:50:0::1;16459:341:1::0;34764:50:0::1;34825:20;:28:::0;;-1:-1:-1;;34825:28:0::1;::::0;;34703:158::o;11899:346::-;-1:-1:-1;;;;;12001:19:0;;11993:68;;;;-1:-1:-1;;;11993:68:0;;17007:2:1;11993:68:0;;;16989:21:1;17046:2;17026:18;;;17019:30;17085:34;17065:18;;;17058:62;-1:-1:-1;;;17136:18:1;;;17129:34;17180:19;;11993:68:0;16805:400:1;11993:68:0;-1:-1:-1;;;;;12080:21:0;;12072:68;;;;-1:-1:-1;;;12072:68:0;;17412:2:1;12072:68:0;;;17394:21:1;17451:2;17431:18;;;17424:30;17490:34;17470:18;;;17463:62;-1:-1:-1;;;17541:18:1;;;17534:32;17583:19;;12072:68:0;17210:398:1;12072:68:0;-1:-1:-1;;;;;12153:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;12205:32;;1485:25:1;;;12205:32:0;;1458:18:1;12205:32:0;;;;;;;11899:346;;;:::o;10044:705::-;-1:-1:-1;;;;;10141:18:0;;10133:68;;;;-1:-1:-1;;;10133:68:0;;17815:2:1;10133:68:0;;;17797:21:1;17854:2;17834:18;;;17827:30;17893:34;17873:18;;;17866:62;-1:-1:-1;;;17944:18:1;;;17937:35;17989:19;;10133:68:0;17613:401:1;10133:68:0;-1:-1:-1;;;;;10220:16:0;;10212:64;;;;-1:-1:-1;;;10212:64:0;;18221:2:1;10212:64:0;;;18203:21:1;18260:2;18240:18;;;18233:30;18299:34;18279:18;;;18272:62;-1:-1:-1;;;18350:18:1;;;18343:33;18393:19;;10212:64:0;18019:399:1;10212:64:0;-1:-1:-1;;;;;10311:15:0;;10289:19;10311:15;;;;;;;;;;;10345:21;;;;10337:72;;;;-1:-1:-1;;;10337:72:0;;18625:2:1;10337:72:0;;;18607:21:1;18664:2;18644:18;;;18637:30;18703:34;18683:18;;;18676:62;-1:-1:-1;;;18754:18:1;;;18747:36;18800:19;;10337:72:0;18423:402:1;10337:72:0;-1:-1:-1;;;;;10445:15:0;;;:9;:15;;;;;;;;;;;10463:20;;;10445:38;;10663:13;;;;;;;;;;:23;;;;;;10715:26;;1485:25:1;;;10663:13:0;;10715:26;;1458:18:1;10715:26:0;;;;;;;10122:627;10044:705;;;:::o;12536:419::-;12637:24;12664:25;12674:5;12681:7;12664:9;:25::i;:::-;12637:52;;-1:-1:-1;;12704:16:0;:37;12700:248;;12786:6;12766:16;:26;;12758:68;;;;-1:-1:-1;;;12758:68:0;;19032:2:1;12758:68:0;;;19014:21:1;19071:2;19051:18;;;19044:30;19110:31;19090:18;;;19083:59;19159:18;;12758:68:0;18830:353:1;12758:68:0;12870:51;12879:5;12886:7;12914:6;12895:16;:25;12870:8;:51::i;:::-;12626:329;12536:419;;;:::o;25954:409::-;-1:-1:-1;;;;;26100:20:0;;;;;;:14;:20;;;;;;;;26099:21;:44;;;;-1:-1:-1;;;;;;26125:18:0;;;;;;:14;:18;;;;;;;;26124:19;26099:44;26096:216;;;26167:14;;;;26159:45;;;;-1:-1:-1;;;26159:45:0;;19390:2:1;26159:45:0;;;19372:21:1;19429:2;19409:18;;;19402:30;-1:-1:-1;;;19448:18:1;;;19441:48;19506:18;;26159:45:0;19188:342:1;26159:45:0;26229:27;26239:4;26245:2;26249:6;26229:9;:27::i;:::-;26219:37;;;;:::i;:::-;;;26271:29;26283:4;26289:2;26293:6;26271:11;:29::i;:::-;26324:31;26340:4;26345:2;26348:6;26324:15;:31::i;20072:177::-;20182:58;;;-1:-1:-1;;;;;19860:32:1;;20182:58:0;;;19842:51:1;19909:18;;;;19902:34;;;20182:58:0;;;;;;;;;;19815:18:1;;;;20182:58:0;;;;;;;;-1:-1:-1;;;;;20182:58:0;-1:-1:-1;;;20182:58:0;;;20155:86;;20175:5;;20155:19;:86::i;27770:1171::-;27901:15;;27891:4;27849:7;5987:18;;;;;;;;;;;27849:7;;-1:-1:-1;27873:43:0;:60;;;;-1:-1:-1;;;;;;27920:13:0;;;;;;:9;:13;;;;;;;;27873:60;:101;;;;;27962:12;27937:17;;27957:1;27937:21;;;;:::i;:::-;:37;;27873:101;27870:147;;;27991:14;:12;:14::i;:::-;28032:12;;;;28029:61;;;28060:18;:16;:18::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28173:13:0;;;;:9;:13;;;;;;;;28169:126;;;-1:-1:-1;28202:15:0;;;;;;;;28210:7;28202:15;-1:-1:-1;;;;;28202:15:0;;;;;-1:-1:-1;;;28202:15:0;;;;;;;;-1:-1:-1;;;28202:15:0;;;;;;;;;;;-1:-1:-1;;;28202:15:0;;;;;;;;;28169:126;;;-1:-1:-1;;;;;28238:15:0;;;;;;:9;:15;;;;;;;;28235:60;;;-1:-1:-1;28269:14:0;;;;;;;;28277:6;28269:14;-1:-1:-1;;;;;28269:14:0;;;;;-1:-1:-1;;;28269:14:0;;;;;;;;-1:-1:-1;;;28269:14:0;;;;;;;;;;;-1:-1:-1;;;28269:14:0;;;;;;;;;28235:60;28310:14;;;;-1:-1:-1;;;;;28310:18:0;;28307:596;;28344:53;;;;;;;;28385:12;28344:53;-1:-1:-1;;;;;28344:53:0;;;;;-1:-1:-1;;;28344:53:0;;;;;;;;-1:-1:-1;;;28344:53:0;;;;;;;;;;-1:-1:-1;;;28344:53:0;;;;;;;;;;;;;;;28435:14;;;22665:5;;28426:23;;-1:-1:-1;;;;;28426:23:0;:6;:23;:::i;:::-;:37;;;;:::i;:::-;28412:52;;28571:3;28554:5;:14;;;-1:-1:-1;;;;;28527:41:0;28533:5;:18;;;-1:-1:-1;;;;;28527:24:0;:3;:24;;;;:::i;:::-;:41;;;;:::i;:::-;:47;;;;:::i;:::-;28479:18;:37;;:96;;;;;;;:::i;:::-;-1:-1:-1;;;;;28479:96:0;;;-1:-1:-1;28667:14:0;;;;28645:19;;28684:3;;-1:-1:-1;;;;;28639:42:0;;;;:25;;;:3;:25;:::i;:::-;:42;;;;:::i;:::-;:48;;;;:::i;:::-;28590:98;;:18;;:98;;;;;:::i;:::-;-1:-1:-1;;;;;28590:98:0;;;-1:-1:-1;28766:14:0;;;;28751:12;;;;28783:3;;-1:-1:-1;;;;;28745:35:0;;;;:18;;;:3;:18;:::i;:::-;:35;;;;:::i;:::-;:41;;;;:::i;:::-;28703:18;:31;;:84;;;;;;;:::i;:::-;-1:-1:-1;;;;;28703:84:0;;;;;;28802:33;;:12;:33;;;;;;;;;;;;;;;;-1:-1:-1;;;28802:33:0;-1:-1:-1;;;;28802:33:0;;;-1:-1:-1;;;28802:33:0;;;;;-1:-1:-1;;;;28802:33:0;;;-1:-1:-1;;;28802:33:0;-1:-1:-1;;;;;;28802:33:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28850:41:0;28866:4;28880;-1:-1:-1;;;;;28850:41:0;;:15;:41::i;:::-;28329:574;28307:596;-1:-1:-1;;;;;;28923:10:0;;27770:1171;-1:-1:-1;;;;27770:1171:0:o;26371:1391::-;26457:7;;;;26454:1301;;;-1:-1:-1;;;;;26502:20:0;;;26480:19;26502:20;;;:16;:20;;;;;;;;;5987:18;;;;;;;26587:36;;;;;;;26615:8;26587:36;-1:-1:-1;;;;;26587:36:0;;;;;-1:-1:-1;;;26587:36:0;;;;;;;;26662:15;;;;;:9;:15;;;;;;26502:20;;;;;5987:18;;26662:15;:34;;;;;26682:14;26681:15;26662:34;26658:538;;;26735:26;;-1:-1:-1;;;;;26725:36:0;;;;26717:56;;;;-1:-1:-1;;;26717:56:0;;20911:2:1;26717:56:0;;;20893:21:1;20950:1;20930:18;;;20923:29;-1:-1:-1;;;20968:18:1;;;20961:37;21015:18;;26717:56:0;20709:330:1;26717:56:0;26824:21;;;;-1:-1:-1;;;;;26800:45:0;:20;26809:11;26800:6;:20;:::i;:::-;:45;;26792:68;;;;-1:-1:-1;;;26792:68:0;;21246:2:1;26792:68:0;;;21228:21:1;21285:2;21265:18;;;21258:30;-1:-1:-1;;;21304:18:1;;;21297:40;21354:18;;26792:68:0;21044:334:1;26792:68:0;26658:538;;;-1:-1:-1;;;;;26921:13:0;;;;;;:9;:13;;;;;;;;:40;;;;-1:-1:-1;;;;;;26939:22:0;;;;;;:16;:22;;;;;;;;26938:23;26921:40;26917:279;;;27000:26;;-1:-1:-1;;;;;26990:36:0;;;;26982:56;;;;-1:-1:-1;;;26982:56:0;;20911:2:1;26982:56:0;;;20893:21:1;20950:1;20930:18;;;20923:29;-1:-1:-1;;;20968:18:1;;;20961:37;21015:18;;26982:56:0;20709:330:1;26917:279:0;27077:14;27073:123;;27144:21;;;;-1:-1:-1;;;;;27120:45:0;:20;27129:11;27120:6;:20;:::i;:::-;:45;;27112:68;;;;-1:-1:-1;;;27112:68:0;;21246:2:1;27112:68:0;;;21228:21:1;21285:2;21265:18;;;21258:30;-1:-1:-1;;;21304:18:1;;;21297:40;21354:18;;27112:68:0;21044:334:1;27112:68:0;27215:20;;;;;;;27212:532;;;27273:9;-1:-1:-1;;;;;27259:24:0;:2;-1:-1:-1;;;;;27259:24:0;;;:49;;;;;27301:6;-1:-1:-1;;;;;27287:21:0;:2;-1:-1:-1;;;;;27287:21:0;;;27259:49;27255:474;;;27365:9;27340:35;;;;:24;:35;;;;;;27378:12;-1:-1:-1;27332:77:0;;;;-1:-1:-1;;;27332:77:0;;21585:2:1;27332:77:0;;;21567:21:1;21624:2;21604:18;;;21597:30;-1:-1:-1;;;21643:18:1;;;21636:44;21697:18;;27332:77:0;21383:338:1;27332:77:0;-1:-1:-1;;;;;27432:28:0;;;;;;;:24;:28;;;;;;27463:12;27432:43;;;;27523:9;27498:35;;;;:50;27590:6;27574:23;;;;;;27571:139;;27633:9;-1:-1:-1;;;;;27633:15:0;;;27625:61;;;;-1:-1:-1;;;27625:61:0;;21928:2:1;27625:61:0;;;21910:21:1;21967:2;21947:18;;;21940:30;22006:34;21986:18;;;21979:62;-1:-1:-1;;;22057:18:1;;;22050:31;22098:19;;27625:61:0;21726:397:1;27625:61:0;26465:1290;;;26371:1391;;;:::o;20470:333::-;20551:23;20577:69;20605:4;20577:69;;;;;;;;;;;;;;;;;20585:5;-1:-1:-1;;;;;20577:27:0;;;:69;;;;;:::i;:::-;20661:17;;20551:95;;-1:-1:-1;20661:21:0;20657:139;;20718:10;20707:30;;;;;;;;;;;;:::i;:::-;20699:85;;;;-1:-1:-1;;;20699:85:0;;22580:2:1;20699:85:0;;;22562:21:1;22619:2;22599:18;;;22592:30;22658:34;22638:18;;;22631:62;-1:-1:-1;;;22709:18:1;;;22702:40;22759:19;;20699:85:0;22378:406:1;29329:1722:0;29418:4;29374:23;5987:18;;;;;;;;;;;29435:50;;;;;;;;29473:12;29435:50;-1:-1:-1;;;;;29435:50:0;;;;;;-1:-1:-1;;;29435:50:0;;;;;;;;;;-1:-1:-1;;;29435:50:0;;;;;;;;;;;-1:-1:-1;;;29435:50:0;;;;;;;;;;;29374;;-1:-1:-1;29435:50:0;;-1:-1:-1;;29435:50:0;29524:72;;;:::i;:::-;:103;;;;:::i;:::-;-1:-1:-1;;;;;29496:131:0;;-1:-1:-1;29651:20:0;;;:46;;-1:-1:-1;29675:22:0;;29651:46;29648:60;;;29700:7;;;29329:1722::o;29648:60::-;29741:15;;:20;;29759:2;29741:20;:::i;:::-;29723:15;:38;29720:107;;;29795:15;;:20;;29813:2;29795:20;:::i;:::-;29777:38;;29720:107;29842:34;;;;-1:-1:-1;;;;;29842:38:0;;29839:407;;29896:23;29977:17;29940:15;:34;;;-1:-1:-1;;;;;29922:52:0;:15;:52;;;;:::i;:::-;:72;;;;:::i;:::-;29896:98;;30009:55;30033:4;30040:6;30048:15;30009;:55::i;:::-;30091:6;-1:-1:-1;;;;;30083:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30079:37;30130:34;30149:15;30130:34;;:::i;:::-;;;30200:15;:34;;;-1:-1:-1;;;;;30179:55:0;;;;;;:::i;:::-;;;29881:365;29839:407;30261:19;;30258:556;;30298:33;30315:15;30298:16;:33::i;:::-;30451:28;;;;30381:21;;30360:18;;-1:-1:-1;;;;;30451:32:0;;30448:175;;30516:10;;30552:28;;;;-1:-1:-1;;;;;30516:10:0;;;;30583:17;;30539:41;;-1:-1:-1;;;;;30539:41:0;:10;:41;:::i;:::-;:61;;;;:::i;:::-;30516:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30503:102:0;;-1:-1:-1;;30448:175:0;30652:21;;-1:-1:-1;30693:14:0;;30690:113;;30740:17;;:45;;-1:-1:-1;;;;;30740:17:0;;;;30770:10;;30740:45;;;;30770:10;30740:17;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30727:58:0;;-1:-1:-1;;30690:113:0;30281:533;;30258:556;-1:-1:-1;30863:1:0;30826:34;;;:38;;;30875:39;;;30925:28;;;:32;30970:12;:30;;;;;;;;;-1:-1:-1;;;30970:30:0;-1:-1:-1;;;;;;30970:30:0;;;;;;;;;-1:-1:-1;31031:12:0;31011:17;:32;29329:1722::o;36044:2016::-;36092:31;;;;;;;;;36117:6;36092:31;-1:-1:-1;;;;;36092:31:0;;;;;-1:-1:-1;;;36092:31:0;;;;;;;;;;;;;-1:-1:-1;;;36092:31:0;;;;;;;;;-1:-1:-1;;;36092:31:0;;;;;;;;;;;;;;36134:33;;;;;;;36160:7;36134:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36178:36;;;;;;;;36206:8;36178:36;-1:-1:-1;;;;;36178:36:0;;;;;;;;;;;;;;;36316:11;;36092:31;;36134:33;;36250:12;;36092:22;;36301:26;;36250:12;36301:26;:::i;:::-;36273:54;-1:-1:-1;36338:13:0;36354:21;36374:1;36273:54;36354:21;:::i;:::-;36338:37;;36400:2;36391:5;:11;36388:883;;36418:12;:20;;-1:-1:-1;;36418:20:0;;;;;;36474:3;36453:18;;;;:24;;;36492:19;;:25;36532:7;:15;;;;;;;36433:5;36579:13;5803:12;;;5715:108;36579:13;-1:-1:-1;;;;;36607:44:0;;;;;36666:21;;;:39;;;-1:-1:-1;;;36720:20:0;;;:8;:20;36760:15;;36562:30;;-1:-1:-1;36760:15:0;;36607:26;;36760:15;36403:384;36388:883;;;36797:9;;36793:478;;36826:20;;;;;;;36823:151;;;36866:20;:28;;-1:-1:-1;;36866:28:0;;;36823:151;37024:11;:5;37032:3;37024:11;:::i;:::-;37016:20;;:4;:20;:::i;:::-;-1:-1:-1;;;;;36988:49:0;:18;;;:49;37089:11;:5;37097:3;37089:11;:::i;:::-;37081:20;;:4;:20;:::i;:::-;-1:-1:-1;;;;;37052:50:0;:19;;;:50;37178:4;37170:5;37154:13;5803:12;;;5715:108;37154:13;:21;;;;:::i;:::-;:28;;;;:::i;:::-;-1:-1:-1;;;;;37117:66:0;;;37254:4;37246:5;37230:13;5803:12;;;5715:108;37230:13;:21;;;;:::i;:::-;:28;;;;:::i;:::-;-1:-1:-1;;;;;37198:61:0;:21;;;:61;36793:478;37306:18;;;;37287:6;:15;-1:-1:-1;;;37287:15:0;;-1:-1:-1;;;;;37287:15:0;;;:37;;;37284:315;;37387:1;37366:9;:18;;;:22;;;;:::i;:::-;-1:-1:-1;;;;;37340:48:0;;;;37403:22;;;:48;;;37485:18;;;;:44;;37340:48;;37485:44;:::i;:::-;:69;;;;:::i;:::-;-1:-1:-1;;;;;37466:88:0;;;:16;;;:88;;;37569:18;;:6;:18;;;;;;;;;;;;-1:-1:-1;;;37569:18:0;-1:-1:-1;;;;;37569:18:0;;;-1:-1:-1;;;37569:18:0;;;;;-1:-1:-1;;;;;;;;37569:18:0;;;-1:-1:-1;;;;;;37569:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;37284:315;37632:19;;;;37612:7;:16;-1:-1:-1;;;37612:16:0;;-1:-1:-1;;;;;37612:16:0;;;:39;;;37609:326;;37716:1;37694:10;:19;;;:23;;;;:::i;:::-;-1:-1:-1;;;;;37667:50:0;;;;;;37758:23;;37732:49;;;:23;;;:49;;;37816:19;;;;37732:49;;37816:46;;;:::i;:::-;:72;;;;:::i;:::-;-1:-1:-1;;;;;37796:92:0;;;:17;;;:92;;;37903:20;;:7;:20;;;;;;;;;;;;-1:-1:-1;;;37903:20:0;-1:-1:-1;;;;;37903:20:0;;;-1:-1:-1;;;37903:20:0;;;;;-1:-1:-1;;;;;;;;37903:20:0;;;-1:-1:-1;;;;;;37903:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;37609:326;37980:8;:25;37950:26;;-1:-1:-1;;;;;37950:55:0;;;37980:25;;37950:55;37947:106;;38021:20;;;;;;-1:-1:-1;;;;;38021:20:0;;;-1:-1:-1;;;38021:20:0;;;;:8;:20;36081:1979;;;;;;36044:2016::o;14575:229::-;14712:12;14744:52;14766:6;14774:4;14780:1;14783:12;14744:21;:52::i;:::-;14737:59;14575:229;-1:-1:-1;;;;14575:229:0:o;28949:372::-;29038:16;;;29052:1;29038:16;;;;;;;;29014:21;;29038:16;;;;;;;;;;-1:-1:-1;29038:16:0;29014:40;;29083:4;29065;29070:1;29065:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;29065:23:0;;;-1:-1:-1;;;;;29065:23:0;;;;;29109:4;29099;29104:1;29099:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;29099:14:0;;;:7;;;;;;;;;:14;29126:187;;-1:-1:-1;;;29126:187:0;;:9;:60;;;;;;:187;;29201:8;;29224:1;;29240:4;;29267;;29287:15;;29126:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15695:455;15865:12;15923:5;15898:21;:30;;15890:81;;;;-1:-1:-1;;;15890:81:0;;24695:2:1;15890:81:0;;;24677:21:1;24734:2;24714:18;;;24707:30;24773:34;24753:18;;;24746:62;-1:-1:-1;;;24824:18:1;;;24817:36;24870:19;;15890:81:0;24493:402:1;15890:81:0;15983:12;15997:23;16024:6;-1:-1:-1;;;;;16024:11:0;16043:5;16050:4;16024:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15982:73;;;;16073:69;16100:6;16108:7;16117:10;16129:12;16073:26;:69::i;:::-;16066:76;15695:455;-1:-1:-1;;;;;;;15695:455:0:o;18268:644::-;18453:12;18482:7;18478:427;;;18510:10;:17;18531:1;18510:22;18506:290;;-1:-1:-1;;;;;14016:19:0;;;18720:60;;;;-1:-1:-1;;;18720:60:0;;25408:2:1;18720:60:0;;;25390:21:1;25447:2;25427:18;;;25420:30;25486:31;25466:18;;;25459:59;25535:18;;18720:60:0;25206:353:1;18720:60:0;-1:-1:-1;18817:10:0;18810:17;;18478:427;18860:33;18868:10;18880:12;19615:17;;:21;19611:388;;19847:10;19841:17;19904:15;19891:10;19887:2;19883:19;19876:44;19611:388;19974:12;19967:20;;-1:-1:-1;;;19967:20:0;;;;;;;14:418:1;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;297:6;292:2;284:6;280:15;275:2;264:9;260:18;254:50;353:1;348:2;339:6;328:9;324:22;320:31;313:42;423:2;416;412:7;407:2;399:6;395:15;391:29;380:9;376:45;372:54;364:62;;;14:418;;;;:::o;664:173::-;732:20;;-1:-1:-1;;;;;781:31:1;;771:42;;761:70;;827:1;824;817:12;761:70;664:173;;;:::o;842:300::-;910:6;918;971:2;959:9;950:7;946:23;942:32;939:52;;;987:1;984;977:12;939:52;1010:29;1029:9;1010:29;:::i;:::-;1000:39;1108:2;1093:18;;;;1080:32;;-1:-1:-1;;;842:300:1:o;1521:226::-;1580:6;1633:2;1621:9;1612:7;1608:23;1604:32;1601:52;;;1649:1;1646;1639:12;1601:52;-1:-1:-1;1694:23:1;;1521:226;-1:-1:-1;1521:226:1:o;1752:367::-;1815:8;1825:6;1879:3;1872:4;1864:6;1860:17;1856:27;1846:55;;1897:1;1894;1887:12;1846:55;-1:-1:-1;1920:20:1;;-1:-1:-1;;;;;1952:30:1;;1949:50;;;1995:1;1992;1985:12;1949:50;2032:4;2024:6;2020:17;2008:29;;2092:3;2085:4;2075:6;2072:1;2068:14;2060:6;2056:27;2052:38;2049:47;2046:67;;;2109:1;2106;2099:12;2046:67;1752:367;;;;;:::o;2124:768::-;2246:6;2254;2262;2270;2323:2;2311:9;2302:7;2298:23;2294:32;2291:52;;;2339:1;2336;2329:12;2291:52;2379:9;2366:23;-1:-1:-1;;;;;2404:6:1;2401:30;2398:50;;;2444:1;2441;2434:12;2398:50;2483:70;2545:7;2536:6;2525:9;2521:22;2483:70;:::i;:::-;2572:8;;-1:-1:-1;2457:96:1;-1:-1:-1;;2660:2:1;2645:18;;2632:32;-1:-1:-1;;;;;2676:32:1;;2673:52;;;2721:1;2718;2711:12;2673:52;2760:72;2824:7;2813:8;2802:9;2798:24;2760:72;:::i;:::-;2124:768;;;;-1:-1:-1;2851:8:1;-1:-1:-1;;;;2124:768:1:o;2897:374::-;2974:6;2982;2990;3043:2;3031:9;3022:7;3018:23;3014:32;3011:52;;;3059:1;3056;3049:12;3011:52;3082:29;3101:9;3082:29;:::i;:::-;3072:39;;3130:38;3164:2;3153:9;3149:18;3130:38;:::i;:::-;2897:374;;3120:48;;-1:-1:-1;;;3237:2:1;3222:18;;;;3209:32;;2897:374::o;3276:171::-;3343:20;;-1:-1:-1;;;;;3392:30:1;;3382:41;;3372:69;;3437:1;3434;3427:12;3452:328;3526:6;3534;3542;3595:2;3583:9;3574:7;3570:23;3566:32;3563:52;;;3611:1;3608;3601:12;3563:52;3634:28;3652:9;3634:28;:::i;:::-;3624:38;;3681:37;3714:2;3703:9;3699:18;3681:37;:::i;:::-;3671:47;;3737:37;3770:2;3759:9;3755:18;3737:37;:::i;:::-;3727:47;;3452:328;;;;;:::o;3974:301::-;4033:6;4086:2;4074:9;4065:7;4061:23;4057:32;4054:52;;;4102:1;4099;4092:12;4054:52;4141:9;4128:23;-1:-1:-1;;;;;4184:5:1;4180:46;4173:5;4170:57;4160:85;;4241:1;4238;4231:12;4160:85;4264:5;3974:301;-1:-1:-1;;;3974:301:1:o;4976:260::-;5044:6;5052;5105:2;5093:9;5084:7;5080:23;5076:32;5073:52;;;5121:1;5118;5111:12;5073:52;5144:29;5163:9;5144:29;:::i;:::-;5134:39;;5192:38;5226:2;5215:9;5211:18;5192:38;:::i;:::-;5182:48;;4976:260;;;;;:::o;5241:186::-;5300:6;5353:2;5341:9;5332:7;5328:23;5324:32;5321:52;;;5369:1;5366;5359:12;5321:52;5392:29;5411:9;5392:29;:::i;6124:118::-;6210:5;6203:13;6196:21;6189:5;6186:32;6176:60;;6232:1;6229;6222:12;6176:60;6124:118;:::o;6247:315::-;6312:6;6320;6373:2;6361:9;6352:7;6348:23;6344:32;6341:52;;;6389:1;6386;6379:12;6341:52;6412:29;6431:9;6412:29;:::i;:::-;6402:39;;6491:2;6480:9;6476:18;6463:32;6504:28;6526:5;6504:28;:::i;:::-;6551:5;6541:15;;;6247:315;;;;;:::o;6902:380::-;6981:1;6977:12;;;;7024;;;7045:61;;7099:4;7091:6;7087:17;7077:27;;7045:61;7152:2;7144:6;7141:14;7121:18;7118:38;7115:161;;7198:10;7193:3;7189:20;7186:1;7179:31;7233:4;7230:1;7223:15;7261:4;7258:1;7251:15;7115:161;;6902:380;;;:::o;7287:356::-;7489:2;7471:21;;;7508:18;;;7501:30;7567:34;7562:2;7547:18;;7540:62;7634:2;7619:18;;7287:356::o;7648:127::-;7709:10;7704:3;7700:20;7697:1;7690:31;7740:4;7737:1;7730:15;7764:4;7761:1;7754:15;7780:168;7853:9;;;7884;;7901:15;;;7895:22;;7881:37;7871:71;;7922:18;;:::i;7953:127::-;8014:10;8009:3;8005:20;8002:1;7995:31;8045:4;8042:1;8035:15;8069:4;8066:1;8059:15;8085:120;8125:1;8151;8141:35;;8156:18;;:::i;:::-;-1:-1:-1;8190:9:1;;8085:120::o;9404:127::-;9465:10;9460:3;9456:20;9453:1;9446:31;9496:4;9493:1;9486:15;9520:4;9517:1;9510:15;9536:191;-1:-1:-1;;;;;9604:26:1;;;9632;;;9600:59;;9671:27;;9668:53;;;9701:18;;:::i;10284:375::-;10372:1;10390:5;10404:249;10425:1;10415:8;10412:15;10404:249;;;10475:4;10470:3;10466:14;10460:4;10457:24;10454:50;;;10484:18;;:::i;:::-;10534:1;10524:8;10520:16;10517:49;;;10548:16;;;;10517:49;10631:1;10627:16;;;;;10587:15;;10404:249;;;10284:375;;;;;;:::o;10664:902::-;10713:5;10743:8;10733:80;;-1:-1:-1;10784:1:1;10798:5;;10733:80;10832:4;10822:76;;-1:-1:-1;10869:1:1;10883:5;;10822:76;10914:4;10932:1;10927:59;;;;11000:1;10995:174;;;;10907:262;;10927:59;10957:1;10948:10;;10971:5;;;10995:174;11032:3;11022:8;11019:17;11016:43;;;11039:18;;:::i;:::-;-1:-1:-1;;11095:1:1;11081:16;;11154:5;;10907:262;;11253:2;11243:8;11240:16;11234:3;11228:4;11225:13;11221:36;11215:2;11205:8;11202:16;11197:2;11191:4;11188:12;11184:35;11181:77;11178:203;;;-1:-1:-1;11290:19:1;;;11366:5;;11178:203;11413:42;-1:-1:-1;;11438:8:1;11432:4;11413:42;:::i;:::-;11491:6;11487:1;11483:6;11479:19;11470:7;11467:32;11464:58;;;11502:18;;:::i;:::-;11540:20;;10664:902;-1:-1:-1;;;10664:902:1:o;11571:140::-;11629:5;11658:47;11699:4;11689:8;11685:19;11679:4;11658:47;:::i;12274:125::-;12339:9;;;12360:10;;;12357:36;;;12373:18;;:::i;12759:184::-;12829:6;12882:2;12870:9;12861:7;12857:23;12853:32;12850:52;;;12898:1;12895;12888:12;12850:52;-1:-1:-1;12921:16:1;;12759:184;-1:-1:-1;12759:184:1:o;19535:128::-;19602:9;;;19623:11;;;19620:37;;;19637:18;;:::i;19947:317::-;-1:-1:-1;;;;;20032:42:1;;;20076;;;20028:91;20139:52;;;;20210:24;;;20200:58;;20238:18;;:::i;:::-;20200:58;19947:317;;;;:::o;20269:227::-;20309:1;-1:-1:-1;;;;;20340:1:1;20336:42;20397:3;20387:37;;20404:18;;:::i;:::-;20486:3;-1:-1:-1;;;;;20446:1:1;20442:42;20438:52;20433:57;;;20269:227;;;;:::o;20501:203::-;-1:-1:-1;;;;;20569:30:1;;;20601;;;20565:67;;20644:31;;20641:57;;;20678:18;;:::i;22128:245::-;22195:6;22248:2;22236:9;22227:7;22223:23;22219:32;22216:52;;;22264:1;22261;22254:12;22216:52;22296:9;22290:16;22315:28;22337:5;22315:28;:::i;22999:194::-;23038:1;-1:-1:-1;;;;;23069:1:1;23065:26;23110:3;23100:37;;23117:18;;:::i;:::-;23183:3;-1:-1:-1;;;;;23159:1:1;23155:26;23151:36;23146:41;;;22999:194;;;;:::o;23198:::-;-1:-1:-1;;;;;23296:26:1;;;23268;;;23264:59;;23335:28;;23332:54;;;23366:18;;:::i;23529:959::-;23791:4;23839:3;23828:9;23824:19;23870:6;23859:9;23852:25;23913:6;23908:2;23897:9;23893:18;23886:34;23956:3;23951:2;23940:9;23936:18;23929:31;23980:6;24015;24009:13;24046:6;24038;24031:22;24084:3;24073:9;24069:19;24062:26;;24123:2;24115:6;24111:15;24097:29;;24144:1;24154:195;24168:6;24165:1;24162:13;24154:195;;;24233:13;;-1:-1:-1;;;;;24229:39:1;24217:52;;24298:2;24324:15;;;;24289:12;;;;24265:1;24183:9;24154:195;;;-1:-1:-1;;;;;;;24405:32:1;;;;24400:2;24385:18;;24378:60;-1:-1:-1;;24469:3:1;24454:19;24447:35;24366:3;23529:959;-1:-1:-1;;;23529:959:1:o;24900:301::-;25029:3;25067:6;25061:13;25113:6;25106:4;25098:6;25094:17;25089:3;25083:37;25175:1;25139:16;;25164:13;;;-1:-1:-1;25139:16:1;24900:301;-1:-1:-1;24900:301:1:o

Swarm Source

ipfs://b143bc5deb12546f302c849d9ad162183c653f32b79a30b1470dc0c0f4ff909c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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