ETH Price: $1,851.25 (-13.73%)
 

Overview

Max Total Supply

1,000,000,000,000 SHIBADEX

Holders

24

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
SHIBADEX

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2023-08-15
*/

/**
 
 Telegram: https://t.me/Shiba_DEX
 Twitter: https://twitter.com/Shiba_DEX
 Website: https://shibadex.app/

 IOS AND ANDROID APP LIVE NOW!
*/

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
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}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * 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 value {ERC20} uses, unless this function is
     * 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");

        _beforeTokenTransfer(from, to, amount);

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

        _afterTokenTransfer(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");

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

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

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

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

        _afterTokenTransfer(account, address(0), 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);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: SHIBADEX.sol

//SPDX-License-Identifier: MIT




pragma solidity 0.8.19;

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

interface DexRouter {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

contract SHIBADEX is ERC20, Ownable {
    struct Tax {
        uint256 marketingTax;
    }

    uint256 private constant _totalSupply = 1_000_000_000_000 * 1e18;

    //Router
    DexRouter public immutable uniswapRouter;
    address public immutable pairAddress;

    //Taxes
    Tax public buyTaxes = Tax(18);
    Tax public sellTaxes = Tax(22);
    Tax public transferTaxes = Tax(0);


    //Whitelisting from taxes/maxwallet/txlimit/etc
    mapping(address => bool) private whitelisted;
    uint256 public maxWalletPercentage = 2;

    //Swapping
    uint256 public swapTokensAtAmount = _totalSupply / 10000; //after 0.001% of total supply, swap them
    bool public swapAndLiquifyEnabled = true;
    bool public isSwapping = false;
    bool public tradingEnabled = true;
    uint256 public startTradingBlock;

    //Wallets
    address public DevelopmentWallet = 0x986441F8FD190BaBF8d7c7c6c9d93C78aBe08571;

    //Events
    event DevelopmentWalletChanged(address indexed _trWallet);
    event BuyFeesUpdated(uint256 indexed _trFee);
    event SellFeesUpdated(uint256 indexed _trFee);
    event TransferFeesUpdated(uint256 indexed _trFee);
    event SwapThresholdUpdated(uint256 indexed _newThreshold);
    event InternalSwapStatusUpdated(bool indexed _status);
    event Whitelist(address indexed _target, bool indexed _status);

    constructor() ERC20("Shibadex", "SHIBADEX") {

        uniswapRouter = DexRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // main  
        pairAddress = DexFactory(uniswapRouter.factory()).createPair(
            address(this),
            uniswapRouter.WETH()
        );
        whitelisted[msg.sender] = true;
        whitelisted[address(uniswapRouter)] = true;
        whitelisted[address(this)] = true;       
        _mint(msg.sender, _totalSupply);

    }

    function setDevelopmentWallet(address _newDevelopment) external onlyOwner {
        require(
            _newDevelopment != address(0),
            "can not set Development to dead wallet"
        );
        DevelopmentWallet = _newDevelopment;
        emit DevelopmentWalletChanged(_newDevelopment);
    }
    function enableTrading() external onlyOwner {
        require(!tradingEnabled, "Trading is already enabled");
        tradingEnabled = true;
        startTradingBlock = block.number;
    }

    function setBuyTaxes(uint256 _marketingTax) external onlyOwner {
        buyTaxes.marketingTax = _marketingTax;
        require(_marketingTax <= 20, "Can not set buy fees higher than 20%");
        emit BuyFeesUpdated(_marketingTax);
    }

    function setSellTaxes(uint256 _marketingTax) external onlyOwner {
        sellTaxes.marketingTax = _marketingTax;
        require(_marketingTax <= 20, "Can not set buy fees higher than 20%");
        emit SellFeesUpdated(_marketingTax);
    }

    function setMaxWalletPercentage(uint256 _percentage) external onlyOwner {
    require(_percentage > 1, "Percentage must be greater than 1%");
    require(_percentage <= 100, "Percentage must be less than or equal to 100");
    maxWalletPercentage = _percentage;
}

    function setSwapTokensAtAmount(uint256 _newAmount) external onlyOwner {
        require(
            _newAmount > 0 && _newAmount <= (_totalSupply * 5) / 1000,
            "Minimum swap amount must be greater than 0 and less than 0.5% of total supply!"
        );
        swapTokensAtAmount = _newAmount;
        emit SwapThresholdUpdated(swapTokensAtAmount);
    }

    function toggleSwapping() external onlyOwner {
        swapAndLiquifyEnabled = (swapAndLiquifyEnabled) ? false : true;
    }

    function setWhitelistStatus(
        address _wallet,
        bool _status
    ) external onlyOwner {
        whitelisted[_wallet] = _status;
        emit Whitelist(_wallet, _status);
    }

    function checkWhitelist(address _wallet) external view returns (bool) {
        return whitelisted[_wallet];
    }

    // this function is reponsible for managing tax, if _from or _to is whitelisted, we simply return _amount and skip all the limitations
    function _takeTax(
        address _from,
        address _to,
        uint256 _amount
    ) internal returns (uint256) {
        if (whitelisted[_from] || whitelisted[_to]) {
            return _amount;
        }
        uint256 totalTax = transferTaxes.marketingTax;

        if (_to == pairAddress) {
            totalTax = sellTaxes.marketingTax;
        } else if (_from == pairAddress) {
            totalTax = buyTaxes.marketingTax;
        }

        uint256 tax = 0;
        if (totalTax > 0) {
            tax = (_amount * totalTax) / 100;
            super._transfer(_from, address(this), tax);
        }
        return (_amount - tax);
    }

function _transfer(
    address _from,
    address _to,
    uint256 _amount
) internal virtual override {
    require(_from != address(0), "transfer from address zero");
    require(_to != address(0), "transfer to address zero");
    require(_amount > 0, "Transfer amount must be greater than zero");
    uint256 toTransfer = _takeTax(_from, _to, _amount);

    bool canSwap = balanceOf(address(this)) >= swapTokensAtAmount;
    if (
        !whitelisted[_from] &&
        !whitelisted[_to]
    ) {
        require(tradingEnabled, "Trading not active");

        // Check if the receiver's balance exceeds the maximum wallet percentage
        if (_to != pairAddress && balanceOf(_to) + toTransfer > (_totalSupply * maxWalletPercentage) / 100) {
            revert("Wallet balance exceeds maximum percentage");
        }

        if (
            pairAddress == _to &&
            swapAndLiquifyEnabled &&
            canSwap &&
            !isSwapping
        ) {
            internalSwap();
        }
    }
    super._transfer(_from, _to, toTransfer);
}

    function internalSwap() internal {
        isSwapping = true;
        uint256 taxAmount = balanceOf(address(this)); 
        if (taxAmount == 0) {
            return;
        }
        swapToETH(balanceOf(address(this)));
       (bool success, ) = DevelopmentWallet.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
        isSwapping = false;
    }

    function swapToETH(uint256 _amount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();
        _approve(address(this), address(uniswapRouter), _amount);
        uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            _amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function withdrawStuckETH() external onlyOwner {
        (bool success, ) = address(msg.sender).call{
            value: address(this).balance
        }("");
        require(success, "transferring ETH failed");
    }

    function withdrawStuckTokens(address BEP20_token) external onlyOwner {
        bool success = IERC20(BEP20_token).transfer(
            msg.sender,
            IERC20(BEP20_token).balanceOf(address(this))
        );
        require(success, "transferring tokens failed!");
        require(BEP20_token != address(this), "Owner cannot claim native tokens"); 
           }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

API
[{"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":"uint256","name":"_trFee","type":"uint256"}],"name":"BuyFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_trWallet","type":"address"}],"name":"DevelopmentWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_status","type":"bool"}],"name":"InternalSwapStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_trFee","type":"uint256"}],"name":"SellFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_newThreshold","type":"uint256"}],"name":"SwapThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_trFee","type":"uint256"}],"name":"TransferFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_target","type":"address"},{"indexed":true,"internalType":"bool","name":"_status","type":"bool"}],"name":"Whitelist","type":"event"},{"inputs":[],"name":"DevelopmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxes","outputs":[{"internalType":"uint256","name":"marketingTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"checkWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isSwapping","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTaxes","outputs":[{"internalType":"uint256","name":"marketingTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingTax","type":"uint256"}],"name":"setBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newDevelopment","type":"address"}],"name":"setDevelopmentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"setMaxWalletPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketingTax","type":"uint256"}],"name":"setSellTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTradingBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","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":"toggleSwapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferTaxes","outputs":[{"internalType":"uint256","name":"marketingTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract DexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"BEP20_token","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526040518060200160405280601281525060066000820151816000015550506040518060200160405280601681525060076000820151816000015550506040518060200160405280600081525060086000820151816000015550506002600a556127106c0c9f2c9cd04674edea40000000620000809190620007a9565b600b556001600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff0219169083151502179055506001600c60026101000a81548160ff02191690831515021790555073986441f8fd190babf8d7c7c6c9d93c78abe08571600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200013657600080fd5b506040518060400160405280600881526020017f53686962616465780000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f53484942414445580000000000000000000000000000000000000000000000008152508160039081620001b4919062000a51565b508060049081620001c6919062000a51565b505050620001e9620001dd620004fc60201b60201c565b6200050460201b60201c565b737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200027f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a5919062000ba2565b73ffffffffffffffffffffffffffffffffffffffff1663c9c653963060805173ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200030f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000335919062000ba2565b6040518363ffffffff1660e01b81526004016200035492919062000be5565b6020604051808303816000875af115801562000374573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039a919062000ba2565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016009600060805173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600960003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004f6336c0c9f2c9cd04674edea40000000620005ca60201b60201c565b62000cfe565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200063c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006339062000c73565b60405180910390fd5b62000650600083836200073760201b60201c565b806002600082825462000664919062000c95565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000717919062000ce1565b60405180910390a362000733600083836200073c60201b60201c565b5050565b505050565b505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620007b68262000741565b9150620007c38362000741565b925082620007d657620007d56200074b565b5b828204905092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200086357607f821691505b6020821081036200087957620008786200081b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008e37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620008a4565b620008ef8683620008a4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620009326200092c620009268462000741565b62000907565b62000741565b9050919050565b6000819050919050565b6200094e8362000911565b620009666200095d8262000939565b848454620008b1565b825550505050565b600090565b6200097d6200096e565b6200098a81848462000943565b505050565b5b81811015620009b257620009a660008262000973565b60018101905062000990565b5050565b601f82111562000a0157620009cb816200087f565b620009d68462000894565b81016020851015620009e6578190505b620009fe620009f58562000894565b8301826200098f565b50505b505050565b600082821c905092915050565b600062000a266000198460080262000a06565b1980831691505092915050565b600062000a41838362000a13565b9150826002028217905092915050565b62000a5c82620007e1565b67ffffffffffffffff81111562000a785762000a77620007ec565b5b62000a8482546200084a565b62000a91828285620009b6565b600060209050601f83116001811462000ac9576000841562000ab4578287015190505b62000ac0858262000a33565b86555062000b30565b601f19841662000ad9866200087f565b60005b8281101562000b035784890151825560018201915060208501945060208101905062000adc565b8683101562000b23578489015162000b1f601f89168262000a13565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000b6a8262000b3d565b9050919050565b62000b7c8162000b5d565b811462000b8857600080fd5b50565b60008151905062000b9c8162000b71565b92915050565b60006020828403121562000bbb5762000bba62000b38565b5b600062000bcb8482850162000b8b565b91505092915050565b62000bdf8162000b5d565b82525050565b600060408201905062000bfc600083018562000bd4565b62000c0b602083018462000bd4565b9392505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000c5b601f8362000c12565b915062000c688262000c23565b602082019050919050565b6000602082019050818103600083015262000c8e8162000c4c565b9050919050565b600062000ca28262000741565b915062000caf8362000741565b925082820190508082111562000cca5762000cc96200077a565b5b92915050565b62000cdb8162000741565b82525050565b600060208201905062000cf8600083018462000cd0565b92915050565b60805160a05161391162000d5560003960008181611002015281816119f001528181611adb01528181611cee0152611d4e015260008181610cfe0152818161223b0152818161231c015261234301526139116000f3fe60806040526004361061021e5760003560e01c806376be96f311610123578063a9059cbb116100ab578063e2f456051161006f578063e2f45605146107e4578063ef586f711461080f578063f2fde38b14610826578063f5648a4f1461084f578063f66895a31461086657610225565b8063a9059cbb146106ed578063afa4f3b21461072a578063b886311514610753578063cb9637281461077e578063dd62ed3e146107a757610225565b80638da5cb5b116100f25780638da5cb5b1461060657806395d89b4114610631578063a3ca847d1461065c578063a457c2d714610685578063a8b08982146106c257610225565b806376be96f3146105705780637a845ece1461059b578063864701a5146105c45780638a8c523c146105ef57610225565b806339509351116101a6578063599ca39711610175578063599ca3971461049d57806370a08231146104c8578063715018a61461050557806372ac24861461051c578063735de9f71461054557610225565b806339509351146103df5780634a74bb021461041c5780634ada218b146104475780635331803c1461047257610225565b806318160ddd116101ed57806318160ddd146102e45780631950c2181461030f57806323b872dd1461034c57806324c0f81714610389578063313ce567146103b457610225565b806306fdde031461022a5780630940bbc714610255578063095ea7b31461027e5780630c424284146102bb57610225565b3661022557005b600080fd5b34801561023657600080fd5b5061023f610891565b60405161024c9190612473565b60405180910390f35b34801561026157600080fd5b5061027c600480360381019061027791906124d0565b610923565b005b34801561028a57600080fd5b506102a560048036038101906102a0919061255b565b6109a9565b6040516102b291906125b6565b60405180910390f35b3480156102c757600080fd5b506102e260048036038101906102dd91906125fd565b6109cc565b005b3480156102f057600080fd5b506102f9610a75565b604051610306919061264c565b60405180910390f35b34801561031b57600080fd5b5061033660048036038101906103319190612667565b610a7f565b60405161034391906125b6565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e9190612694565b610ad5565b60405161038091906125b6565b60405180910390f35b34801561039557600080fd5b5061039e610b04565b6040516103ab91906126f6565b60405180910390f35b3480156103c057600080fd5b506103c9610b2a565b6040516103d6919061272d565b60405180910390f35b3480156103eb57600080fd5b506104066004803603810190610401919061255b565b610b33565b60405161041391906125b6565b60405180910390f35b34801561042857600080fd5b50610431610b6a565b60405161043e91906125b6565b60405180910390f35b34801561045357600080fd5b5061045c610b7d565b60405161046991906125b6565b60405180910390f35b34801561047e57600080fd5b50610487610b90565b604051610494919061264c565b60405180910390f35b3480156104a957600080fd5b506104b2610b9c565b6040516104bf919061264c565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea9190612667565b610ba2565b6040516104fc919061264c565b60405180910390f35b34801561051157600080fd5b5061051a610bea565b005b34801561052857600080fd5b50610543600480360381019061053e9190612667565b610bfe565b005b34801561055157600080fd5b5061055a610cfc565b60405161056791906127a7565b60405180910390f35b34801561057c57600080fd5b50610585610d20565b604051610592919061264c565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd91906124d0565b610d26565b005b3480156105d057600080fd5b506105d9610dbf565b6040516105e6919061264c565b60405180910390f35b3480156105fb57600080fd5b50610604610dcb565b005b34801561061257600080fd5b5061061b610e47565b60405161062891906126f6565b60405180910390f35b34801561063d57600080fd5b50610646610e71565b6040516106539190612473565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e91906124d0565b610f03565b005b34801561069157600080fd5b506106ac60048036038101906106a7919061255b565b610f89565b6040516106b991906125b6565b60405180910390f35b3480156106ce57600080fd5b506106d7611000565b6040516106e491906126f6565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f919061255b565b611024565b60405161072191906125b6565b60405180910390f35b34801561073657600080fd5b50610751600480360381019061074c91906124d0565b611047565b005b34801561075f57600080fd5b506107686110fd565b60405161077591906125b6565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190612667565b611110565b005b3480156107b357600080fd5b506107ce60048036038101906107c991906127c2565b6112c5565b6040516107db919061264c565b60405180910390f35b3480156107f057600080fd5b506107f961134c565b604051610806919061264c565b60405180910390f35b34801561081b57600080fd5b50610824611352565b005b34801561083257600080fd5b5061084d60048036038101906108489190612667565b611393565b005b34801561085b57600080fd5b50610864611416565b005b34801561087257600080fd5b5061087b6114cd565b604051610888919061264c565b60405180910390f35b6060600380546108a090612831565b80601f01602080910402602001604051908101604052809291908181526020018280546108cc90612831565b80156109195780601f106108ee57610100808354040283529160200191610919565b820191906000526020600020905b8154815290600101906020018083116108fc57829003601f168201915b5050505050905090565b61092b6114d9565b806007600001819055506014811115610979576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610970906128d4565b60405180910390fd5b807f16df2c25b3392f376a685a3826b941b25140108d95899d6b1bd983feafbc1c5560405160405180910390a250565b6000806109b4611557565b90506109c181858561155f565b600191505092915050565b6109d46114d9565b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167f5a25e09a5dba33161281055e015f1279b6b10204d8f90dd56a8ce2b82322d43d60405160405180910390a35050565b6000600254905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600080610ae0611557565b9050610aed858285611728565b610af88585856117b4565b60019150509392505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006012905090565b600080610b3e611557565b9050610b5f818585610b5085896112c5565b610b5a9190612923565b61155f565b600191505092915050565b600c60009054906101000a900460ff1681565b600c60029054906101000a900460ff1681565b60088060000154905081565b600a5481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bf26114d9565b610bfc6000611b6c565b565b610c066114d9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c906129c9565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f2e184dc34ab031d763441c588bd08760997797e8550c76fd439a20571233cc2060405160405180910390a250565b7f000000000000000000000000000000000000000000000000000000000000000081565b600d5481565b610d2e6114d9565b60018111610d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6890612a5b565b60405180910390fd5b6064811115610db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac90612aed565b60405180910390fd5b80600a8190555050565b60068060000154905081565b610dd36114d9565b600c60029054906101000a900460ff1615610e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1a90612b59565b60405180910390fd5b6001600c60026101000a81548160ff02191690831515021790555043600d81905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e8090612831565b80601f0160208091040260200160405190810160405280929190818152602001828054610eac90612831565b8015610ef95780601f10610ece57610100808354040283529160200191610ef9565b820191906000526020600020905b815481529060010190602001808311610edc57829003601f168201915b5050505050905090565b610f0b6114d9565b806006600001819055506014811115610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f50906128d4565b60405180910390fd5b807f491005465ab6f82fd10f4b13a1b1e5ca452bc4856b019f63775e33a6b1ad2feb60405160405180910390a250565b600080610f94611557565b90506000610fa282866112c5565b905083811015610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde90612beb565b60405180910390fd5b610ff4828686840361155f565b60019250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008061102f611557565b905061103c8185856117b4565b600191505092915050565b61104f6114d9565b60008111801561108557506103e860056c0c9f2c9cd04674edea400000006110779190612c0b565b6110819190612c7c565b8111155b6110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb90612d45565b60405180910390fd5b80600b81905550600b547f18ff2fc8464635e4f668567019152095047e34d7a2ab4b97661ba4dc7fd0647660405160405180910390a250565b600c60019054906101000a900460ff1681565b6111186114d9565b60008173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161117091906126f6565b602060405180830381865afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b19190612d7a565b6040518363ffffffff1660e01b81526004016111ce929190612da7565b6020604051808303816000875af11580156111ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112119190612de5565b905080611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a90612e5e565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b890612eca565b60405180910390fd5b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600b5481565b61135a6114d9565b600c60009054906101000a900460ff16611375576001611378565b60005b600c60006101000a81548160ff021916908315150217905550565b61139b6114d9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140190612f5c565b60405180910390fd5b61141381611b6c565b50565b61141e6114d9565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161144490612fad565b60006040518083038185875af1925050503d8060008114611481576040519150601f19603f3d011682016040523d82523d6000602084013e611486565b606091505b50509050806114ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c19061300e565b60405180910390fd5b50565b60078060000154905081565b6114e1611557565b73ffffffffffffffffffffffffffffffffffffffff166114ff610e47565b73ffffffffffffffffffffffffffffffffffffffff1614611555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154c9061307a565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c59061310c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361163d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116349061319e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161171b919061264c565b60405180910390a3505050565b600061173484846112c5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117ae57818110156117a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117979061320a565b60405180910390fd5b6117ad848484840361155f565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181a90613276565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611892576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611889906132e2565b60405180910390fd5b600081116118d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cc90613374565b60405180910390fd5b60006118e2848484611c32565b90506000600b546118f230610ba2565b10159050600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561199a5750600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611b5a57600c60029054906101000a900460ff166119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e5906133e0565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015611a8257506064600a546c0c9f2c9cd04674edea40000000611a629190612c0b565b611a6c9190612c7c565b82611a7686610ba2565b611a809190612923565b115b15611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab990613472565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16148015611b295750600c60009054906101000a900460ff165b8015611b325750805b8015611b4b5750600c60019054906101000a900460ff16155b15611b5957611b58611df1565b5b5b611b65858584611f26565b5050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611cd55750600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611ce257819050611dea565b600060086000015490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611d4c576007600001549050611da9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611da85760066000015490505b5b600080821115611dd95760648285611dc19190612c0b565b611dcb9190612c7c565b9050611dd8863083611f26565b5b8084611de59190613492565b925050505b9392505050565b6001600c60016101000a81548160ff0219169083151502179055506000611e1730610ba2565b905060008103611e275750611f24565b611e38611e3330610ba2565b61219c565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611e8090612fad565b60006040518083038185875af1925050503d8060008114611ebd576040519150601f19603f3d011682016040523d82523d6000602084013e611ec2565b606091505b5050905080611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd90613512565b60405180910390fd5b6000600c60016101000a81548160ff02191690831515021790555050505b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c906135a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb90613636565b60405180910390fd5b61200f8383836123d9565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c906136c8565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612183919061264c565b60405180910390a36121968484846123de565b50505050565b6000600267ffffffffffffffff8111156121b9576121b86136e8565b5b6040519080825280602002602001820160405280156121e75781602001602082028036833780820191505090505b50905030816000815181106121ff576121fe613717565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c8919061375b565b816001815181106122dc576122db613717565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612341307f00000000000000000000000000000000000000000000000000000000000000008461155f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016123a3959493929190613881565b600060405180830381600087803b1580156123bd57600080fd5b505af11580156123d1573d6000803e3d6000fd5b505050505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561241d578082015181840152602081019050612402565b60008484015250505050565b6000601f19601f8301169050919050565b6000612445826123e3565b61244f81856123ee565b935061245f8185602086016123ff565b61246881612429565b840191505092915050565b6000602082019050818103600083015261248d818461243a565b905092915050565b600080fd5b6000819050919050565b6124ad8161249a565b81146124b857600080fd5b50565b6000813590506124ca816124a4565b92915050565b6000602082840312156124e6576124e5612495565b5b60006124f4848285016124bb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612528826124fd565b9050919050565b6125388161251d565b811461254357600080fd5b50565b6000813590506125558161252f565b92915050565b6000806040838503121561257257612571612495565b5b600061258085828601612546565b9250506020612591858286016124bb565b9150509250929050565b60008115159050919050565b6125b08161259b565b82525050565b60006020820190506125cb60008301846125a7565b92915050565b6125da8161259b565b81146125e557600080fd5b50565b6000813590506125f7816125d1565b92915050565b6000806040838503121561261457612613612495565b5b600061262285828601612546565b9250506020612633858286016125e8565b9150509250929050565b6126468161249a565b82525050565b6000602082019050612661600083018461263d565b92915050565b60006020828403121561267d5761267c612495565b5b600061268b84828501612546565b91505092915050565b6000806000606084860312156126ad576126ac612495565b5b60006126bb86828701612546565b93505060206126cc86828701612546565b92505060406126dd868287016124bb565b9150509250925092565b6126f08161251d565b82525050565b600060208201905061270b60008301846126e7565b92915050565b600060ff82169050919050565b61272781612711565b82525050565b6000602082019050612742600083018461271e565b92915050565b6000819050919050565b600061276d612768612763846124fd565b612748565b6124fd565b9050919050565b600061277f82612752565b9050919050565b600061279182612774565b9050919050565b6127a181612786565b82525050565b60006020820190506127bc6000830184612798565b92915050565b600080604083850312156127d9576127d8612495565b5b60006127e785828601612546565b92505060206127f885828601612546565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061284957607f821691505b60208210810361285c5761285b612802565b5b50919050565b7f43616e206e6f742073657420627579206665657320686967686572207468616e60008201527f2032302500000000000000000000000000000000000000000000000000000000602082015250565b60006128be6024836123ee565b91506128c982612862565b604082019050919050565b600060208201905081810360008301526128ed816128b1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061292e8261249a565b91506129398361249a565b9250828201905080821115612951576129506128f4565b5b92915050565b7f63616e206e6f742073657420446576656c6f706d656e7420746f20646561642060008201527f77616c6c65740000000000000000000000000000000000000000000000000000602082015250565b60006129b36026836123ee565b91506129be82612957565b604082019050919050565b600060208201905081810360008301526129e2816129a6565b9050919050565b7f50657263656e74616765206d7573742062652067726561746572207468616e2060008201527f3125000000000000000000000000000000000000000000000000000000000000602082015250565b6000612a456022836123ee565b9150612a50826129e9565b604082019050919050565b60006020820190508181036000830152612a7481612a38565b9050919050565b7f50657263656e74616765206d757374206265206c657373207468616e206f722060008201527f657175616c20746f203130300000000000000000000000000000000000000000602082015250565b6000612ad7602c836123ee565b9150612ae282612a7b565b604082019050919050565b60006020820190508181036000830152612b0681612aca565b9050919050565b7f54726164696e6720697320616c726561647920656e61626c6564000000000000600082015250565b6000612b43601a836123ee565b9150612b4e82612b0d565b602082019050919050565b60006020820190508181036000830152612b7281612b36565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612bd56025836123ee565b9150612be082612b79565b604082019050919050565b60006020820190508181036000830152612c0481612bc8565b9050919050565b6000612c168261249a565b9150612c218361249a565b9250828202612c2f8161249a565b91508282048414831517612c4657612c456128f4565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c878261249a565b9150612c928361249a565b925082612ca257612ca1612c4d565b5b828204905092915050565b7f4d696e696d756d207377617020616d6f756e74206d757374206265206772656160008201527f746572207468616e203020616e64206c657373207468616e20302e3525206f6660208201527f20746f74616c20737570706c7921000000000000000000000000000000000000604082015250565b6000612d2f604e836123ee565b9150612d3a82612cad565b606082019050919050565b60006020820190508181036000830152612d5e81612d22565b9050919050565b600081519050612d74816124a4565b92915050565b600060208284031215612d9057612d8f612495565b5b6000612d9e84828501612d65565b91505092915050565b6000604082019050612dbc60008301856126e7565b612dc9602083018461263d565b9392505050565b600081519050612ddf816125d1565b92915050565b600060208284031215612dfb57612dfa612495565b5b6000612e0984828501612dd0565b91505092915050565b7f7472616e7366657272696e6720746f6b656e73206661696c6564210000000000600082015250565b6000612e48601b836123ee565b9150612e5382612e12565b602082019050919050565b60006020820190508181036000830152612e7781612e3b565b9050919050565b7f4f776e65722063616e6e6f7420636c61696d206e617469766520746f6b656e73600082015250565b6000612eb46020836123ee565b9150612ebf82612e7e565b602082019050919050565b60006020820190508181036000830152612ee381612ea7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612f466026836123ee565b9150612f5182612eea565b604082019050919050565b60006020820190508181036000830152612f7581612f39565b9050919050565b600081905092915050565b50565b6000612f97600083612f7c565b9150612fa282612f87565b600082019050919050565b6000612fb882612f8a565b9150819050919050565b7f7472616e7366657272696e6720455448206661696c6564000000000000000000600082015250565b6000612ff86017836123ee565b915061300382612fc2565b602082019050919050565b6000602082019050818103600083015261302781612feb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006130646020836123ee565b915061306f8261302e565b602082019050919050565b6000602082019050818103600083015261309381613057565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006130f66024836123ee565b91506131018261309a565b604082019050919050565b60006020820190508181036000830152613125816130e9565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006131886022836123ee565b91506131938261312c565b604082019050919050565b600060208201905081810360008301526131b78161317b565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006131f4601d836123ee565b91506131ff826131be565b602082019050919050565b60006020820190508181036000830152613223816131e7565b9050919050565b7f7472616e736665722066726f6d2061646472657373207a65726f000000000000600082015250565b6000613260601a836123ee565b915061326b8261322a565b602082019050919050565b6000602082019050818103600083015261328f81613253565b9050919050565b7f7472616e7366657220746f2061646472657373207a65726f0000000000000000600082015250565b60006132cc6018836123ee565b91506132d782613296565b602082019050919050565b600060208201905081810360008301526132fb816132bf565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b600061335e6029836123ee565b915061336982613302565b604082019050919050565b6000602082019050818103600083015261338d81613351565b9050919050565b7f54726164696e67206e6f74206163746976650000000000000000000000000000600082015250565b60006133ca6012836123ee565b91506133d582613394565b602082019050919050565b600060208201905081810360008301526133f9816133bd565b9050919050565b7f57616c6c65742062616c616e63652065786365656473206d6178696d756d207060008201527f657263656e746167650000000000000000000000000000000000000000000000602082015250565b600061345c6029836123ee565b915061346782613400565b604082019050919050565b6000602082019050818103600083015261348b8161344f565b9050919050565b600061349d8261249a565b91506134a88361249a565b92508282039050818111156134c0576134bf6128f4565b5b92915050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006134fc6010836123ee565b9150613507826134c6565b602082019050919050565b6000602082019050818103600083015261352b816134ef565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061358e6025836123ee565b915061359982613532565b604082019050919050565b600060208201905081810360008301526135bd81613581565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006136206023836123ee565b915061362b826135c4565b604082019050919050565b6000602082019050818103600083015261364f81613613565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006136b26026836123ee565b91506136bd82613656565b604082019050919050565b600060208201905081810360008301526136e1816136a5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506137558161252f565b92915050565b60006020828403121561377157613770612495565b5b600061377f84828501613746565b91505092915050565b6000819050919050565b60006137ad6137a86137a384613788565b612748565b61249a565b9050919050565b6137bd81613792565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137f88161251d565b82525050565b600061380a83836137ef565b60208301905092915050565b6000602082019050919050565b600061382e826137c3565b61383881856137ce565b9350613843836137df565b8060005b8381101561387457815161385b88826137fe565b975061386683613816565b925050600181019050613847565b5085935050505092915050565b600060a082019050613896600083018861263d565b6138a360208301876137b4565b81810360408301526138b58186613823565b90506138c460608301856126e7565b6138d1608083018461263d565b969550505050505056fea2646970667358221220c6eba9638126142b77d8d444b6be5238ea8becbea3380edf4f4e72b480724da064736f6c63430008130033

Deployed Bytecode

0x60806040526004361061021e5760003560e01c806376be96f311610123578063a9059cbb116100ab578063e2f456051161006f578063e2f45605146107e4578063ef586f711461080f578063f2fde38b14610826578063f5648a4f1461084f578063f66895a31461086657610225565b8063a9059cbb146106ed578063afa4f3b21461072a578063b886311514610753578063cb9637281461077e578063dd62ed3e146107a757610225565b80638da5cb5b116100f25780638da5cb5b1461060657806395d89b4114610631578063a3ca847d1461065c578063a457c2d714610685578063a8b08982146106c257610225565b806376be96f3146105705780637a845ece1461059b578063864701a5146105c45780638a8c523c146105ef57610225565b806339509351116101a6578063599ca39711610175578063599ca3971461049d57806370a08231146104c8578063715018a61461050557806372ac24861461051c578063735de9f71461054557610225565b806339509351146103df5780634a74bb021461041c5780634ada218b146104475780635331803c1461047257610225565b806318160ddd116101ed57806318160ddd146102e45780631950c2181461030f57806323b872dd1461034c57806324c0f81714610389578063313ce567146103b457610225565b806306fdde031461022a5780630940bbc714610255578063095ea7b31461027e5780630c424284146102bb57610225565b3661022557005b600080fd5b34801561023657600080fd5b5061023f610891565b60405161024c9190612473565b60405180910390f35b34801561026157600080fd5b5061027c600480360381019061027791906124d0565b610923565b005b34801561028a57600080fd5b506102a560048036038101906102a0919061255b565b6109a9565b6040516102b291906125b6565b60405180910390f35b3480156102c757600080fd5b506102e260048036038101906102dd91906125fd565b6109cc565b005b3480156102f057600080fd5b506102f9610a75565b604051610306919061264c565b60405180910390f35b34801561031b57600080fd5b5061033660048036038101906103319190612667565b610a7f565b60405161034391906125b6565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e9190612694565b610ad5565b60405161038091906125b6565b60405180910390f35b34801561039557600080fd5b5061039e610b04565b6040516103ab91906126f6565b60405180910390f35b3480156103c057600080fd5b506103c9610b2a565b6040516103d6919061272d565b60405180910390f35b3480156103eb57600080fd5b506104066004803603810190610401919061255b565b610b33565b60405161041391906125b6565b60405180910390f35b34801561042857600080fd5b50610431610b6a565b60405161043e91906125b6565b60405180910390f35b34801561045357600080fd5b5061045c610b7d565b60405161046991906125b6565b60405180910390f35b34801561047e57600080fd5b50610487610b90565b604051610494919061264c565b60405180910390f35b3480156104a957600080fd5b506104b2610b9c565b6040516104bf919061264c565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea9190612667565b610ba2565b6040516104fc919061264c565b60405180910390f35b34801561051157600080fd5b5061051a610bea565b005b34801561052857600080fd5b50610543600480360381019061053e9190612667565b610bfe565b005b34801561055157600080fd5b5061055a610cfc565b60405161056791906127a7565b60405180910390f35b34801561057c57600080fd5b50610585610d20565b604051610592919061264c565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd91906124d0565b610d26565b005b3480156105d057600080fd5b506105d9610dbf565b6040516105e6919061264c565b60405180910390f35b3480156105fb57600080fd5b50610604610dcb565b005b34801561061257600080fd5b5061061b610e47565b60405161062891906126f6565b60405180910390f35b34801561063d57600080fd5b50610646610e71565b6040516106539190612473565b60405180910390f35b34801561066857600080fd5b50610683600480360381019061067e91906124d0565b610f03565b005b34801561069157600080fd5b506106ac60048036038101906106a7919061255b565b610f89565b6040516106b991906125b6565b60405180910390f35b3480156106ce57600080fd5b506106d7611000565b6040516106e491906126f6565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f919061255b565b611024565b60405161072191906125b6565b60405180910390f35b34801561073657600080fd5b50610751600480360381019061074c91906124d0565b611047565b005b34801561075f57600080fd5b506107686110fd565b60405161077591906125b6565b60405180910390f35b34801561078a57600080fd5b506107a560048036038101906107a09190612667565b611110565b005b3480156107b357600080fd5b506107ce60048036038101906107c991906127c2565b6112c5565b6040516107db919061264c565b60405180910390f35b3480156107f057600080fd5b506107f961134c565b604051610806919061264c565b60405180910390f35b34801561081b57600080fd5b50610824611352565b005b34801561083257600080fd5b5061084d60048036038101906108489190612667565b611393565b005b34801561085b57600080fd5b50610864611416565b005b34801561087257600080fd5b5061087b6114cd565b604051610888919061264c565b60405180910390f35b6060600380546108a090612831565b80601f01602080910402602001604051908101604052809291908181526020018280546108cc90612831565b80156109195780601f106108ee57610100808354040283529160200191610919565b820191906000526020600020905b8154815290600101906020018083116108fc57829003601f168201915b5050505050905090565b61092b6114d9565b806007600001819055506014811115610979576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610970906128d4565b60405180910390fd5b807f16df2c25b3392f376a685a3826b941b25140108d95899d6b1bd983feafbc1c5560405160405180910390a250565b6000806109b4611557565b90506109c181858561155f565b600191505092915050565b6109d46114d9565b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167f5a25e09a5dba33161281055e015f1279b6b10204d8f90dd56a8ce2b82322d43d60405160405180910390a35050565b6000600254905090565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600080610ae0611557565b9050610aed858285611728565b610af88585856117b4565b60019150509392505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006012905090565b600080610b3e611557565b9050610b5f818585610b5085896112c5565b610b5a9190612923565b61155f565b600191505092915050565b600c60009054906101000a900460ff1681565b600c60029054906101000a900460ff1681565b60088060000154905081565b600a5481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bf26114d9565b610bfc6000611b6c565b565b610c066114d9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c906129c9565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f2e184dc34ab031d763441c588bd08760997797e8550c76fd439a20571233cc2060405160405180910390a250565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b600d5481565b610d2e6114d9565b60018111610d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6890612a5b565b60405180910390fd5b6064811115610db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac90612aed565b60405180910390fd5b80600a8190555050565b60068060000154905081565b610dd36114d9565b600c60029054906101000a900460ff1615610e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1a90612b59565b60405180910390fd5b6001600c60026101000a81548160ff02191690831515021790555043600d81905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e8090612831565b80601f0160208091040260200160405190810160405280929190818152602001828054610eac90612831565b8015610ef95780601f10610ece57610100808354040283529160200191610ef9565b820191906000526020600020905b815481529060010190602001808311610edc57829003601f168201915b5050505050905090565b610f0b6114d9565b806006600001819055506014811115610f59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f50906128d4565b60405180910390fd5b807f491005465ab6f82fd10f4b13a1b1e5ca452bc4856b019f63775e33a6b1ad2feb60405160405180910390a250565b600080610f94611557565b90506000610fa282866112c5565b905083811015610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde90612beb565b60405180910390fd5b610ff4828686840361155f565b60019250505092915050565b7f0000000000000000000000000d96b7dd27d76849c97afeed3a2f7350efa33a9481565b60008061102f611557565b905061103c8185856117b4565b600191505092915050565b61104f6114d9565b60008111801561108557506103e860056c0c9f2c9cd04674edea400000006110779190612c0b565b6110819190612c7c565b8111155b6110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb90612d45565b60405180910390fd5b80600b81905550600b547f18ff2fc8464635e4f668567019152095047e34d7a2ab4b97661ba4dc7fd0647660405160405180910390a250565b600c60019054906101000a900460ff1681565b6111186114d9565b60008173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161117091906126f6565b602060405180830381865afa15801561118d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b19190612d7a565b6040518363ffffffff1660e01b81526004016111ce929190612da7565b6020604051808303816000875af11580156111ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112119190612de5565b905080611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a90612e5e565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b890612eca565b60405180910390fd5b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600b5481565b61135a6114d9565b600c60009054906101000a900460ff16611375576001611378565b60005b600c60006101000a81548160ff021916908315150217905550565b61139b6114d9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140190612f5c565b60405180910390fd5b61141381611b6c565b50565b61141e6114d9565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161144490612fad565b60006040518083038185875af1925050503d8060008114611481576040519150601f19603f3d011682016040523d82523d6000602084013e611486565b606091505b50509050806114ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c19061300e565b60405180910390fd5b50565b60078060000154905081565b6114e1611557565b73ffffffffffffffffffffffffffffffffffffffff166114ff610e47565b73ffffffffffffffffffffffffffffffffffffffff1614611555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154c9061307a565b60405180910390fd5b565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c59061310c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361163d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116349061319e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161171b919061264c565b60405180910390a3505050565b600061173484846112c5565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117ae57818110156117a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117979061320a565b60405180910390fd5b6117ad848484840361155f565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181a90613276565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611892576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611889906132e2565b60405180910390fd5b600081116118d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cc90613374565b60405180910390fd5b60006118e2848484611c32565b90506000600b546118f230610ba2565b10159050600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561199a5750600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611b5a57600c60029054906101000a900460ff166119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e5906133e0565b60405180910390fd5b7f0000000000000000000000000d96b7dd27d76849c97afeed3a2f7350efa33a9473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614158015611a8257506064600a546c0c9f2c9cd04674edea40000000611a629190612c0b565b611a6c9190612c7c565b82611a7686610ba2565b611a809190612923565b115b15611ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab990613472565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000000d96b7dd27d76849c97afeed3a2f7350efa33a9473ffffffffffffffffffffffffffffffffffffffff16148015611b295750600c60009054906101000a900460ff165b8015611b325750805b8015611b4b5750600c60019054906101000a900460ff16155b15611b5957611b58611df1565b5b5b611b65858584611f26565b5050505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611cd55750600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15611ce257819050611dea565b600060086000015490507f0000000000000000000000000d96b7dd27d76849c97afeed3a2f7350efa33a9473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611d4c576007600001549050611da9565b7f0000000000000000000000000d96b7dd27d76849c97afeed3a2f7350efa33a9473ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611da85760066000015490505b5b600080821115611dd95760648285611dc19190612c0b565b611dcb9190612c7c565b9050611dd8863083611f26565b5b8084611de59190613492565b925050505b9392505050565b6001600c60016101000a81548160ff0219169083151502179055506000611e1730610ba2565b905060008103611e275750611f24565b611e38611e3330610ba2565b61219c565b6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611e8090612fad565b60006040518083038185875af1925050503d8060008114611ebd576040519150601f19603f3d011682016040523d82523d6000602084013e611ec2565b606091505b5050905080611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd90613512565b60405180910390fd5b6000600c60016101000a81548160ff02191690831515021790555050505b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8c906135a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb90613636565b60405180910390fd5b61200f8383836123d9565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c906136c8565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612183919061264c565b60405180910390a36121968484846123de565b50505050565b6000600267ffffffffffffffff8111156121b9576121b86136e8565b5b6040519080825280602002602001820160405280156121e75781602001602082028036833780820191505090505b50905030816000815181106121ff576121fe613717565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c8919061375b565b816001815181106122dc576122db613717565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612341307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461155f565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016123a3959493929190613881565b600060405180830381600087803b1580156123bd57600080fd5b505af11580156123d1573d6000803e3d6000fd5b505050505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561241d578082015181840152602081019050612402565b60008484015250505050565b6000601f19601f8301169050919050565b6000612445826123e3565b61244f81856123ee565b935061245f8185602086016123ff565b61246881612429565b840191505092915050565b6000602082019050818103600083015261248d818461243a565b905092915050565b600080fd5b6000819050919050565b6124ad8161249a565b81146124b857600080fd5b50565b6000813590506124ca816124a4565b92915050565b6000602082840312156124e6576124e5612495565b5b60006124f4848285016124bb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612528826124fd565b9050919050565b6125388161251d565b811461254357600080fd5b50565b6000813590506125558161252f565b92915050565b6000806040838503121561257257612571612495565b5b600061258085828601612546565b9250506020612591858286016124bb565b9150509250929050565b60008115159050919050565b6125b08161259b565b82525050565b60006020820190506125cb60008301846125a7565b92915050565b6125da8161259b565b81146125e557600080fd5b50565b6000813590506125f7816125d1565b92915050565b6000806040838503121561261457612613612495565b5b600061262285828601612546565b9250506020612633858286016125e8565b9150509250929050565b6126468161249a565b82525050565b6000602082019050612661600083018461263d565b92915050565b60006020828403121561267d5761267c612495565b5b600061268b84828501612546565b91505092915050565b6000806000606084860312156126ad576126ac612495565b5b60006126bb86828701612546565b93505060206126cc86828701612546565b92505060406126dd868287016124bb565b9150509250925092565b6126f08161251d565b82525050565b600060208201905061270b60008301846126e7565b92915050565b600060ff82169050919050565b61272781612711565b82525050565b6000602082019050612742600083018461271e565b92915050565b6000819050919050565b600061276d612768612763846124fd565b612748565b6124fd565b9050919050565b600061277f82612752565b9050919050565b600061279182612774565b9050919050565b6127a181612786565b82525050565b60006020820190506127bc6000830184612798565b92915050565b600080604083850312156127d9576127d8612495565b5b60006127e785828601612546565b92505060206127f885828601612546565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061284957607f821691505b60208210810361285c5761285b612802565b5b50919050565b7f43616e206e6f742073657420627579206665657320686967686572207468616e60008201527f2032302500000000000000000000000000000000000000000000000000000000602082015250565b60006128be6024836123ee565b91506128c982612862565b604082019050919050565b600060208201905081810360008301526128ed816128b1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061292e8261249a565b91506129398361249a565b9250828201905080821115612951576129506128f4565b5b92915050565b7f63616e206e6f742073657420446576656c6f706d656e7420746f20646561642060008201527f77616c6c65740000000000000000000000000000000000000000000000000000602082015250565b60006129b36026836123ee565b91506129be82612957565b604082019050919050565b600060208201905081810360008301526129e2816129a6565b9050919050565b7f50657263656e74616765206d7573742062652067726561746572207468616e2060008201527f3125000000000000000000000000000000000000000000000000000000000000602082015250565b6000612a456022836123ee565b9150612a50826129e9565b604082019050919050565b60006020820190508181036000830152612a7481612a38565b9050919050565b7f50657263656e74616765206d757374206265206c657373207468616e206f722060008201527f657175616c20746f203130300000000000000000000000000000000000000000602082015250565b6000612ad7602c836123ee565b9150612ae282612a7b565b604082019050919050565b60006020820190508181036000830152612b0681612aca565b9050919050565b7f54726164696e6720697320616c726561647920656e61626c6564000000000000600082015250565b6000612b43601a836123ee565b9150612b4e82612b0d565b602082019050919050565b60006020820190508181036000830152612b7281612b36565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612bd56025836123ee565b9150612be082612b79565b604082019050919050565b60006020820190508181036000830152612c0481612bc8565b9050919050565b6000612c168261249a565b9150612c218361249a565b9250828202612c2f8161249a565b91508282048414831517612c4657612c456128f4565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612c878261249a565b9150612c928361249a565b925082612ca257612ca1612c4d565b5b828204905092915050565b7f4d696e696d756d207377617020616d6f756e74206d757374206265206772656160008201527f746572207468616e203020616e64206c657373207468616e20302e3525206f6660208201527f20746f74616c20737570706c7921000000000000000000000000000000000000604082015250565b6000612d2f604e836123ee565b9150612d3a82612cad565b606082019050919050565b60006020820190508181036000830152612d5e81612d22565b9050919050565b600081519050612d74816124a4565b92915050565b600060208284031215612d9057612d8f612495565b5b6000612d9e84828501612d65565b91505092915050565b6000604082019050612dbc60008301856126e7565b612dc9602083018461263d565b9392505050565b600081519050612ddf816125d1565b92915050565b600060208284031215612dfb57612dfa612495565b5b6000612e0984828501612dd0565b91505092915050565b7f7472616e7366657272696e6720746f6b656e73206661696c6564210000000000600082015250565b6000612e48601b836123ee565b9150612e5382612e12565b602082019050919050565b60006020820190508181036000830152612e7781612e3b565b9050919050565b7f4f776e65722063616e6e6f7420636c61696d206e617469766520746f6b656e73600082015250565b6000612eb46020836123ee565b9150612ebf82612e7e565b602082019050919050565b60006020820190508181036000830152612ee381612ea7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612f466026836123ee565b9150612f5182612eea565b604082019050919050565b60006020820190508181036000830152612f7581612f39565b9050919050565b600081905092915050565b50565b6000612f97600083612f7c565b9150612fa282612f87565b600082019050919050565b6000612fb882612f8a565b9150819050919050565b7f7472616e7366657272696e6720455448206661696c6564000000000000000000600082015250565b6000612ff86017836123ee565b915061300382612fc2565b602082019050919050565b6000602082019050818103600083015261302781612feb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006130646020836123ee565b915061306f8261302e565b602082019050919050565b6000602082019050818103600083015261309381613057565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006130f66024836123ee565b91506131018261309a565b604082019050919050565b60006020820190508181036000830152613125816130e9565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006131886022836123ee565b91506131938261312c565b604082019050919050565b600060208201905081810360008301526131b78161317b565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006131f4601d836123ee565b91506131ff826131be565b602082019050919050565b60006020820190508181036000830152613223816131e7565b9050919050565b7f7472616e736665722066726f6d2061646472657373207a65726f000000000000600082015250565b6000613260601a836123ee565b915061326b8261322a565b602082019050919050565b6000602082019050818103600083015261328f81613253565b9050919050565b7f7472616e7366657220746f2061646472657373207a65726f0000000000000000600082015250565b60006132cc6018836123ee565b91506132d782613296565b602082019050919050565b600060208201905081810360008301526132fb816132bf565b9050919050565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b600061335e6029836123ee565b915061336982613302565b604082019050919050565b6000602082019050818103600083015261338d81613351565b9050919050565b7f54726164696e67206e6f74206163746976650000000000000000000000000000600082015250565b60006133ca6012836123ee565b91506133d582613394565b602082019050919050565b600060208201905081810360008301526133f9816133bd565b9050919050565b7f57616c6c65742062616c616e63652065786365656473206d6178696d756d207060008201527f657263656e746167650000000000000000000000000000000000000000000000602082015250565b600061345c6029836123ee565b915061346782613400565b604082019050919050565b6000602082019050818103600083015261348b8161344f565b9050919050565b600061349d8261249a565b91506134a88361249a565b92508282039050818111156134c0576134bf6128f4565b5b92915050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006134fc6010836123ee565b9150613507826134c6565b602082019050919050565b6000602082019050818103600083015261352b816134ef565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061358e6025836123ee565b915061359982613532565b604082019050919050565b600060208201905081810360008301526135bd81613581565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006136206023836123ee565b915061362b826135c4565b604082019050919050565b6000602082019050818103600083015261364f81613613565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006136b26026836123ee565b91506136bd82613656565b604082019050919050565b600060208201905081810360008301526136e1816136a5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815190506137558161252f565b92915050565b60006020828403121561377157613770612495565b5b600061377f84828501613746565b91505092915050565b6000819050919050565b60006137ad6137a86137a384613788565b612748565b61249a565b9050919050565b6137bd81613792565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137f88161251d565b82525050565b600061380a83836137ef565b60208301905092915050565b6000602082019050919050565b600061382e826137c3565b61383881856137ce565b9350613843836137df565b8060005b8381101561387457815161385b88826137fe565b975061386683613816565b925050600181019050613847565b5085935050505092915050565b600060a082019050613896600083018861263d565b6138a360208301876137b4565b81810360408301526138b58186613823565b90506138c460608301856126e7565b6138d1608083018461263d565b969550505050505056fea2646970667358221220c6eba9638126142b77d8d444b6be5238ea8becbea3380edf4f4e72b480724da064736f6c63430008130033

Deployed Bytecode Sourcemap

28663:7423:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16549:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31299:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18900:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32342:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17669:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32545:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19681:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29525:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17511:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20385:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29345:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29429:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29029;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29177:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17840:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9974:103;;;;;;;;;;;;;:::i;:::-;;30529:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28851:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29469:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31553:267;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28956:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30848:192;;;;;;;;;;;;;:::i;:::-;;9326:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16768:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31048:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21126:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28898:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18173:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31828:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29392:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35670:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18429:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29240:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32208:126;;;;;;;;;;;;;:::i;:::-;;10232:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35441:221;;;;;;;;;;;;;:::i;:::-;;28992:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16549:100;16603:13;16636:5;16629:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16549:100;:::o;31299:246::-;9212:13;:11;:13::i;:::-;31399::::1;31374:9;:22;;:38;;;;31448:2;31431:13;:19;;31423:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31523:13;31507:30;;;;;;;;;;31299:246:::0;:::o;18900:201::-;18983:4;19000:13;19016:12;:10;:12::i;:::-;19000:28;;19039:32;19048:5;19055:7;19064:6;19039:8;:32::i;:::-;19089:4;19082:11;;;18900:201;;;;:::o;32342:195::-;9212:13;:11;:13::i;:::-;32479:7:::1;32456:11;:20;32468:7;32456:20;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;32521:7;32502:27;;32512:7;32502:27;;;;;;;;;;;;32342:195:::0;;:::o;17669:108::-;17730:7;17757:12;;17750:19;;17669:108;:::o;32545:116::-;32609:4;32633:11;:20;32645:7;32633:20;;;;;;;;;;;;;;;;;;;;;;;;;32626:27;;32545:116;;;:::o;19681:295::-;19812:4;19829:15;19847:12;:10;:12::i;:::-;19829:30;;19870:38;19886:4;19892:7;19901:6;19870:15;:38::i;:::-;19919:27;19929:4;19935:2;19939:6;19919:9;:27::i;:::-;19964:4;19957:11;;;19681:295;;;;;:::o;29525:77::-;;;;;;;;;;;;;:::o;17511:93::-;17569:5;17594:2;17587:9;;17511:93;:::o;20385:238::-;20473:4;20490:13;20506:12;:10;:12::i;:::-;20490:28;;20529:64;20538:5;20545:7;20582:10;20554:25;20564:5;20571:7;20554:9;:25::i;:::-;:38;;;;:::i;:::-;20529:8;:64::i;:::-;20611:4;20604:11;;;20385:238;;;;:::o;29345:40::-;;;;;;;;;;;;;:::o;29429:33::-;;;;;;;;;;;;;:::o;29029:::-;;;;;;;;;:::o;29177:38::-;;;;:::o;17840:127::-;17914:7;17941:9;:18;17951:7;17941:18;;;;;;;;;;;;;;;;17934:25;;17840:127;;;:::o;9974:103::-;9212:13;:11;:13::i;:::-;10039:30:::1;10066:1;10039:18;:30::i;:::-;9974:103::o:0;30529:313::-;9212:13;:11;:13::i;:::-;30663:1:::1;30636:29;;:15;:29;;::::0;30614:117:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;30762:15;30742:17;;:35;;;;;;;;;;;;;;;;;;30818:15;30793:41;;;;;;;;;;;;30529:313:::0;:::o;28851:40::-;;;:::o;29469:32::-;;;;:::o;31553:267::-;9212:13;:11;:13::i;:::-;31654:1:::1;31640:11;:15;31632:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;31724:3;31709:11;:18;;31701:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;31805:11;31783:19;:33;;;;31553:267:::0;:::o;28956:29::-;;;;;;;;;:::o;30848:192::-;9212:13;:11;:13::i;:::-;30912:14:::1;;;;;;;;;;;30911:15;30903:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;30985:4;30968:14;;:21;;;;;;;;;;;;;;;;;;31020:12;31000:17;:32;;;;30848:192::o:0;9326:87::-;9372:7;9399:6;;;;;;;;;;;9392:13;;9326:87;:::o;16768:104::-;16824:13;16857:7;16850:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16768:104;:::o;31048:243::-;9212:13;:11;:13::i;:::-;31146::::1;31122:8;:21;;:37;;;;31195:2;31178:13;:19;;31170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31269:13;31254:29;;;;;;;;;;31048:243:::0;:::o;21126:436::-;21219:4;21236:13;21252:12;:10;:12::i;:::-;21236:28;;21275:24;21302:25;21312:5;21319:7;21302:9;:25::i;:::-;21275:52;;21366:15;21346:16;:35;;21338:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;21459:60;21468:5;21475:7;21503:15;21484:16;:34;21459:8;:60::i;:::-;21550:4;21543:11;;;;21126:436;;;;:::o;28898:36::-;;;:::o;18173:193::-;18252:4;18269:13;18285:12;:10;:12::i;:::-;18269:28;;18308;18318:5;18325:2;18329:6;18308:9;:28::i;:::-;18354:4;18347:11;;;18173:193;;;;:::o;31828:372::-;9212:13;:11;:13::i;:::-;31944:1:::1;31931:10;:14;:57;;;;;31984:4;31979:1;28804:24;31964:16;;;;:::i;:::-;31963:25;;;;:::i;:::-;31949:10;:39;;31931:57;31909:185;;;;;;;;;;;;:::i;:::-;;;;;;;;;32126:10;32105:18;:31;;;;32173:18;;32152:40;;;;;;;;;;31828:372:::0;:::o;29392:30::-;;;;;;;;;;;;;:::o;35670:376::-;9212:13;:11;:13::i;:::-;35750:12:::1;35772:11;35765:28;;;35808:10;35840:11;35833:29;;;35871:4;35833:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35765:123;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35750:138;;35907:7;35899:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;35988:4;35965:28;;:11;:28;;::::0;35957:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;35739:307;35670:376:::0;:::o;18429:151::-;18518:7;18545:11;:18;18557:5;18545:18;;;;;;;;;;;;;;;:27;18564:7;18545:27;;;;;;;;;;;;;;;;18538:34;;18429:151;;;;:::o;29240:56::-;;;;:::o;32208:126::-;9212:13;:11;:13::i;:::-;32289:21:::1;;;;;;;;;;;32288:38;;32322:4;32288:38;;;32314:5;32288:38;32264:21;;:62;;;;;;;;;;;;;;;;;;32208:126::o:0;10232:201::-;9212:13;:11;:13::i;:::-;10341:1:::1;10321:22;;:8;:22;;::::0;10313:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10397:28;10416:8;10397:18;:28::i;:::-;10232:201:::0;:::o;35441:221::-;9212:13;:11;:13::i;:::-;35500:12:::1;35526:10;35518:24;;35564:21;35518:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35499:101;;;35619:7;35611:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;35488:174;35441:221::o:0;28992:30::-;;;;;;;;;:::o;9491:132::-;9566:12;:10;:12::i;:::-;9555:23;;:7;:5;:7::i;:::-;:23;;;9547:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9491:132::o;7877:98::-;7930:7;7957:10;7950:17;;7877:98;:::o;25153:380::-;25306:1;25289:19;;:5;:19;;;25281:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25387:1;25368:21;;:7;:21;;;25360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25471:6;25441:11;:18;25453:5;25441:18;;;;;;;;;;;;;;;:27;25460:7;25441:27;;;;;;;;;;;;;;;:36;;;;25509:7;25493:32;;25502:5;25493:32;;;25518:6;25493:32;;;;;;:::i;:::-;;;;;;;;25153:380;;;:::o;25824:453::-;25959:24;25986:25;25996:5;26003:7;25986:9;:25::i;:::-;25959:52;;26046:17;26026:16;:37;26022:248;;26108:6;26088:16;:26;;26080:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26192:51;26201:5;26208:7;26236:6;26217:16;:25;26192:8;:51::i;:::-;26022:248;25948:329;25824:453;;;:::o;33488:1087::-;33628:1;33611:19;;:5;:19;;;33603:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33691:1;33676:17;;:3;:17;;;33668:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;33747:1;33737:7;:11;33729:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33801:18;33822:29;33831:5;33838:3;33843:7;33822:8;:29::i;:::-;33801:50;;33860:12;33903:18;;33875:24;33893:4;33875:9;:24::i;:::-;:46;;33860:61;;33943:11;:18;33955:5;33943:18;;;;;;;;;;;;;;;;;;;;;;;;;33942:19;:49;;;;;33975:11;:16;33987:3;33975:16;;;;;;;;;;;;;;;;;;;;;;;;;33974:17;33942:49;33928:598;;;34018:14;;;;;;;;;;;34010:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;34161:11;34154:18;;:3;:18;;;;:94;;;;;34245:3;34222:19;;28804:24;34207:34;;;;:::i;:::-;34206:42;;;;:::i;:::-;34193:10;34176:14;34186:3;34176:9;:14::i;:::-;:27;;;;:::i;:::-;:72;34154:94;34150:178;;;34265:51;;;;;;;;;;:::i;:::-;;;;;;;;34150:178;34373:3;34358:18;;:11;:18;;;:56;;;;;34393:21;;;;;;;;;;;34358:56;:80;;;;;34431:7;34358:80;:108;;;;;34456:10;;;;;;;;;;;34455:11;34358:108;34340:179;;;34493:14;:12;:14::i;:::-;34340:179;33928:598;34532:39;34548:5;34555:3;34560:10;34532:15;:39::i;:::-;33596:979;;33488:1087;;;:::o;10593:191::-;10667:16;10686:6;;;;;;;;;;;10667:25;;10712:8;10703:6;;:17;;;;;;;;;;;;;;;;;;10767:8;10736:40;;10757:8;10736:40;;;;;;;;;;;;10656:128;10593:191;:::o;32809:675::-;32924:7;32948:11;:18;32960:5;32948:18;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;;32970:11;:16;32982:3;32970:16;;;;;;;;;;;;;;;;;;;;;;;;;32948:38;32944:85;;;33010:7;33003:14;;;;32944:85;33039:16;33058:13;:26;;;33039:45;;33108:11;33101:18;;:3;:18;;;33097:175;;33147:9;:22;;;33136:33;;33097:175;;;33200:11;33191:20;;:5;:20;;;33187:85;;33239:8;:21;;;33228:32;;33187:85;33097:175;33284:11;33325:1;33314:8;:12;33310:134;;;33372:3;33360:8;33350:7;:18;;;;:::i;:::-;33349:26;;;;:::i;:::-;33343:32;;33390:42;33406:5;33421:4;33428:3;33390:15;:42::i;:::-;33310:134;33472:3;33462:7;:13;;;;:::i;:::-;33454:22;;;;32809:675;;;;;;:::o;34583:395::-;34640:4;34627:10;;:17;;;;;;;;;;;;;;;;;;34655;34675:24;34693:4;34675:9;:24::i;:::-;34655:44;;34728:1;34715:9;:14;34711:53;;34746:7;;;34711:53;34774:35;34784:24;34802:4;34784:9;:24::i;:::-;34774:9;:35::i;:::-;34820:12;34838:17;;;;;;;;;;;:22;;34868:21;34838:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34819:75;;;34913:7;34905:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;34965:5;34952:10;;:18;;;;;;;;;;;;;;;;;;34616:362;;34583:395;:::o;22032:840::-;22179:1;22163:18;;:4;:18;;;22155:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22256:1;22242:16;;:2;:16;;;22234:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;22311:38;22332:4;22338:2;22342:6;22311:20;:38::i;:::-;22362:19;22384:9;:15;22394:4;22384:15;;;;;;;;;;;;;;;;22362:37;;22433:6;22418:11;:21;;22410:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;22550:6;22536:11;:20;22518:9;:15;22528:4;22518:15;;;;;;;;;;;;;;;:38;;;;22753:6;22736:9;:13;22746:2;22736:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;22803:2;22788:26;;22797:4;22788:26;;;22807:6;22788:26;;;;;;:::i;:::-;;;;;;;;22827:37;22847:4;22853:2;22857:6;22827:19;:37::i;:::-;22144:728;22032:840;;;:::o;34986:447::-;35042:21;35080:1;35066:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35042:40;;35111:4;35093;35098:1;35093:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;35137:13;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35127:4;35132:1;35127:7;;;;;;;;:::i;:::-;;;;;;;:30;;;;;;;;;;;35168:56;35185:4;35200:13;35216:7;35168:8;:56::i;:::-;35235:13;:64;;;35314:7;35336:1;35352:4;35379;35399:15;35235:190;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35031:402;34986:447;:::o;26877:125::-;;;;:::o;27606:124::-;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:77;1713:7;1742:5;1731:16;;1676:77;;;:::o;1759:122::-;1832:24;1850:5;1832:24;:::i;:::-;1825:5;1822:35;1812:63;;1871:1;1868;1861:12;1812:63;1759:122;:::o;1887:139::-;1933:5;1971:6;1958:20;1949:29;;1987:33;2014:5;1987:33;:::i;:::-;1887:139;;;;:::o;2032:329::-;2091:6;2140:2;2128:9;2119:7;2115:23;2111:32;2108:119;;;2146:79;;:::i;:::-;2108:119;2266:1;2291:53;2336:7;2327:6;2316:9;2312:22;2291:53;:::i;:::-;2281:63;;2237:117;2032:329;;;;:::o;2367:126::-;2404:7;2444:42;2437:5;2433:54;2422:65;;2367:126;;;:::o;2499:96::-;2536:7;2565:24;2583:5;2565:24;:::i;:::-;2554:35;;2499:96;;;:::o;2601:122::-;2674:24;2692:5;2674:24;:::i;:::-;2667:5;2664:35;2654:63;;2713:1;2710;2703:12;2654:63;2601:122;:::o;2729:139::-;2775:5;2813:6;2800:20;2791:29;;2829:33;2856:5;2829:33;:::i;:::-;2729:139;;;;:::o;2874:474::-;2942:6;2950;2999:2;2987:9;2978:7;2974:23;2970:32;2967:119;;;3005:79;;:::i;:::-;2967:119;3125:1;3150:53;3195:7;3186:6;3175:9;3171:22;3150:53;:::i;:::-;3140:63;;3096:117;3252:2;3278:53;3323:7;3314:6;3303:9;3299:22;3278:53;:::i;:::-;3268:63;;3223:118;2874:474;;;;;:::o;3354:90::-;3388:7;3431:5;3424:13;3417:21;3406:32;;3354:90;;;:::o;3450:109::-;3531:21;3546:5;3531:21;:::i;:::-;3526:3;3519:34;3450:109;;:::o;3565:210::-;3652:4;3690:2;3679:9;3675:18;3667:26;;3703:65;3765:1;3754:9;3750:17;3741:6;3703:65;:::i;:::-;3565:210;;;;:::o;3781:116::-;3851:21;3866:5;3851:21;:::i;:::-;3844:5;3841:32;3831:60;;3887:1;3884;3877:12;3831:60;3781:116;:::o;3903:133::-;3946:5;3984:6;3971:20;3962:29;;4000:30;4024:5;4000:30;:::i;:::-;3903:133;;;;:::o;4042:468::-;4107:6;4115;4164:2;4152:9;4143:7;4139:23;4135:32;4132:119;;;4170:79;;:::i;:::-;4132:119;4290:1;4315:53;4360:7;4351:6;4340:9;4336:22;4315:53;:::i;:::-;4305:63;;4261:117;4417:2;4443:50;4485:7;4476:6;4465:9;4461:22;4443:50;:::i;:::-;4433:60;;4388:115;4042:468;;;;;:::o;4516:118::-;4603:24;4621:5;4603:24;:::i;:::-;4598:3;4591:37;4516:118;;:::o;4640:222::-;4733:4;4771:2;4760:9;4756:18;4748:26;;4784:71;4852:1;4841:9;4837:17;4828:6;4784:71;:::i;:::-;4640:222;;;;:::o;4868:329::-;4927:6;4976:2;4964:9;4955:7;4951:23;4947:32;4944:119;;;4982:79;;:::i;:::-;4944:119;5102:1;5127:53;5172:7;5163:6;5152:9;5148:22;5127:53;:::i;:::-;5117:63;;5073:117;4868:329;;;;:::o;5203:619::-;5280:6;5288;5296;5345:2;5333:9;5324:7;5320:23;5316:32;5313:119;;;5351:79;;:::i;:::-;5313:119;5471:1;5496:53;5541:7;5532:6;5521:9;5517:22;5496:53;:::i;:::-;5486:63;;5442:117;5598:2;5624:53;5669:7;5660:6;5649:9;5645:22;5624:53;:::i;:::-;5614:63;;5569:118;5726:2;5752:53;5797:7;5788:6;5777:9;5773:22;5752:53;:::i;:::-;5742:63;;5697:118;5203:619;;;;;:::o;5828:118::-;5915:24;5933:5;5915:24;:::i;:::-;5910:3;5903:37;5828:118;;:::o;5952:222::-;6045:4;6083:2;6072:9;6068:18;6060:26;;6096:71;6164:1;6153:9;6149:17;6140:6;6096:71;:::i;:::-;5952:222;;;;:::o;6180:86::-;6215:7;6255:4;6248:5;6244:16;6233:27;;6180:86;;;:::o;6272:112::-;6355:22;6371:5;6355:22;:::i;:::-;6350:3;6343:35;6272:112;;:::o;6390:214::-;6479:4;6517:2;6506:9;6502:18;6494:26;;6530:67;6594:1;6583:9;6579:17;6570:6;6530:67;:::i;:::-;6390:214;;;;:::o;6610:60::-;6638:3;6659:5;6652:12;;6610:60;;;:::o;6676:142::-;6726:9;6759:53;6777:34;6786:24;6804:5;6786:24;:::i;:::-;6777:34;:::i;:::-;6759:53;:::i;:::-;6746:66;;6676:142;;;:::o;6824:126::-;6874:9;6907:37;6938:5;6907:37;:::i;:::-;6894:50;;6824:126;;;:::o;6956:144::-;7024:9;7057:37;7088:5;7057:37;:::i;:::-;7044:50;;6956:144;;;:::o;7106:167::-;7211:55;7260:5;7211:55;:::i;:::-;7206:3;7199:68;7106:167;;:::o;7279:258::-;7390:4;7428:2;7417:9;7413:18;7405:26;;7441:89;7527:1;7516:9;7512:17;7503:6;7441:89;:::i;:::-;7279:258;;;;:::o;7543:474::-;7611:6;7619;7668:2;7656:9;7647:7;7643:23;7639:32;7636:119;;;7674:79;;:::i;:::-;7636:119;7794:1;7819:53;7864:7;7855:6;7844:9;7840:22;7819:53;:::i;:::-;7809:63;;7765:117;7921:2;7947:53;7992:7;7983:6;7972:9;7968:22;7947:53;:::i;:::-;7937:63;;7892:118;7543:474;;;;;:::o;8023:180::-;8071:77;8068:1;8061:88;8168:4;8165:1;8158:15;8192:4;8189:1;8182:15;8209:320;8253:6;8290:1;8284:4;8280:12;8270:22;;8337:1;8331:4;8327:12;8358:18;8348:81;;8414:4;8406:6;8402:17;8392:27;;8348:81;8476:2;8468:6;8465:14;8445:18;8442:38;8439:84;;8495:18;;:::i;:::-;8439:84;8260:269;8209:320;;;:::o;8535:223::-;8675:34;8671:1;8663:6;8659:14;8652:58;8744:6;8739:2;8731:6;8727:15;8720:31;8535:223;:::o;8764:366::-;8906:3;8927:67;8991:2;8986:3;8927:67;:::i;:::-;8920:74;;9003:93;9092:3;9003:93;:::i;:::-;9121:2;9116:3;9112:12;9105:19;;8764:366;;;:::o;9136:419::-;9302:4;9340:2;9329:9;9325:18;9317:26;;9389:9;9383:4;9379:20;9375:1;9364:9;9360:17;9353:47;9417:131;9543:4;9417:131;:::i;:::-;9409:139;;9136:419;;;:::o;9561:180::-;9609:77;9606:1;9599:88;9706:4;9703:1;9696:15;9730:4;9727:1;9720:15;9747:191;9787:3;9806:20;9824:1;9806:20;:::i;:::-;9801:25;;9840:20;9858:1;9840:20;:::i;:::-;9835:25;;9883:1;9880;9876:9;9869:16;;9904:3;9901:1;9898:10;9895:36;;;9911:18;;:::i;:::-;9895:36;9747:191;;;;:::o;9944:225::-;10084:34;10080:1;10072:6;10068:14;10061:58;10153:8;10148:2;10140:6;10136:15;10129:33;9944:225;:::o;10175:366::-;10317:3;10338:67;10402:2;10397:3;10338:67;:::i;:::-;10331:74;;10414:93;10503:3;10414:93;:::i;:::-;10532:2;10527:3;10523:12;10516:19;;10175:366;;;:::o;10547:419::-;10713:4;10751:2;10740:9;10736:18;10728:26;;10800:9;10794:4;10790:20;10786:1;10775:9;10771:17;10764:47;10828:131;10954:4;10828:131;:::i;:::-;10820:139;;10547:419;;;:::o;10972:221::-;11112:34;11108:1;11100:6;11096:14;11089:58;11181:4;11176:2;11168:6;11164:15;11157:29;10972:221;:::o;11199:366::-;11341:3;11362:67;11426:2;11421:3;11362:67;:::i;:::-;11355:74;;11438:93;11527:3;11438:93;:::i;:::-;11556:2;11551:3;11547:12;11540:19;;11199:366;;;:::o;11571:419::-;11737:4;11775:2;11764:9;11760:18;11752:26;;11824:9;11818:4;11814:20;11810:1;11799:9;11795:17;11788:47;11852:131;11978:4;11852:131;:::i;:::-;11844:139;;11571:419;;;:::o;11996:231::-;12136:34;12132:1;12124:6;12120:14;12113:58;12205:14;12200:2;12192:6;12188:15;12181:39;11996:231;:::o;12233:366::-;12375:3;12396:67;12460:2;12455:3;12396:67;:::i;:::-;12389:74;;12472:93;12561:3;12472:93;:::i;:::-;12590:2;12585:3;12581:12;12574:19;;12233:366;;;:::o;12605:419::-;12771:4;12809:2;12798:9;12794:18;12786:26;;12858:9;12852:4;12848:20;12844:1;12833:9;12829:17;12822:47;12886:131;13012:4;12886:131;:::i;:::-;12878:139;;12605:419;;;:::o;13030:176::-;13170:28;13166:1;13158:6;13154:14;13147:52;13030:176;:::o;13212:366::-;13354:3;13375:67;13439:2;13434:3;13375:67;:::i;:::-;13368:74;;13451:93;13540:3;13451:93;:::i;:::-;13569:2;13564:3;13560:12;13553:19;;13212:366;;;:::o;13584:419::-;13750:4;13788:2;13777:9;13773:18;13765:26;;13837:9;13831:4;13827:20;13823:1;13812:9;13808:17;13801:47;13865:131;13991:4;13865:131;:::i;:::-;13857:139;;13584:419;;;:::o;14009:224::-;14149:34;14145:1;14137:6;14133:14;14126:58;14218:7;14213:2;14205:6;14201:15;14194:32;14009:224;:::o;14239:366::-;14381:3;14402:67;14466:2;14461:3;14402:67;:::i;:::-;14395:74;;14478:93;14567:3;14478:93;:::i;:::-;14596:2;14591:3;14587:12;14580:19;;14239:366;;;:::o;14611:419::-;14777:4;14815:2;14804:9;14800:18;14792:26;;14864:9;14858:4;14854:20;14850:1;14839:9;14835:17;14828:47;14892:131;15018:4;14892:131;:::i;:::-;14884:139;;14611:419;;;:::o;15036:410::-;15076:7;15099:20;15117:1;15099:20;:::i;:::-;15094:25;;15133:20;15151:1;15133:20;:::i;:::-;15128:25;;15188:1;15185;15181:9;15210:30;15228:11;15210:30;:::i;:::-;15199:41;;15389:1;15380:7;15376:15;15373:1;15370:22;15350:1;15343:9;15323:83;15300:139;;15419:18;;:::i;:::-;15300:139;15084:362;15036:410;;;;:::o;15452:180::-;15500:77;15497:1;15490:88;15597:4;15594:1;15587:15;15621:4;15618:1;15611:15;15638:185;15678:1;15695:20;15713:1;15695:20;:::i;:::-;15690:25;;15729:20;15747:1;15729:20;:::i;:::-;15724:25;;15768:1;15758:35;;15773:18;;:::i;:::-;15758:35;15815:1;15812;15808:9;15803:14;;15638:185;;;;:::o;15829:302::-;15969:34;15965:1;15957:6;15953:14;15946:58;16038:34;16033:2;16025:6;16021:15;16014:59;16107:16;16102:2;16094:6;16090:15;16083:41;15829:302;:::o;16137:366::-;16279:3;16300:67;16364:2;16359:3;16300:67;:::i;:::-;16293:74;;16376:93;16465:3;16376:93;:::i;:::-;16494:2;16489:3;16485:12;16478:19;;16137:366;;;:::o;16509:419::-;16675:4;16713:2;16702:9;16698:18;16690:26;;16762:9;16756:4;16752:20;16748:1;16737:9;16733:17;16726:47;16790:131;16916:4;16790:131;:::i;:::-;16782:139;;16509:419;;;:::o;16934:143::-;16991:5;17022:6;17016:13;17007:22;;17038:33;17065:5;17038:33;:::i;:::-;16934:143;;;;:::o;17083:351::-;17153:6;17202:2;17190:9;17181:7;17177:23;17173:32;17170:119;;;17208:79;;:::i;:::-;17170:119;17328:1;17353:64;17409:7;17400:6;17389:9;17385:22;17353:64;:::i;:::-;17343:74;;17299:128;17083:351;;;;:::o;17440:332::-;17561:4;17599:2;17588:9;17584:18;17576:26;;17612:71;17680:1;17669:9;17665:17;17656:6;17612:71;:::i;:::-;17693:72;17761:2;17750:9;17746:18;17737:6;17693:72;:::i;:::-;17440:332;;;;;:::o;17778:137::-;17832:5;17863:6;17857:13;17848:22;;17879:30;17903:5;17879:30;:::i;:::-;17778:137;;;;:::o;17921:345::-;17988:6;18037:2;18025:9;18016:7;18012:23;18008:32;18005:119;;;18043:79;;:::i;:::-;18005:119;18163:1;18188:61;18241:7;18232:6;18221:9;18217:22;18188:61;:::i;:::-;18178:71;;18134:125;17921:345;;;;:::o;18272:177::-;18412:29;18408:1;18400:6;18396:14;18389:53;18272:177;:::o;18455:366::-;18597:3;18618:67;18682:2;18677:3;18618:67;:::i;:::-;18611:74;;18694:93;18783:3;18694:93;:::i;:::-;18812:2;18807:3;18803:12;18796:19;;18455:366;;;:::o;18827:419::-;18993:4;19031:2;19020:9;19016:18;19008:26;;19080:9;19074:4;19070:20;19066:1;19055:9;19051:17;19044:47;19108:131;19234:4;19108:131;:::i;:::-;19100:139;;18827:419;;;:::o;19252:182::-;19392:34;19388:1;19380:6;19376:14;19369:58;19252:182;:::o;19440:366::-;19582:3;19603:67;19667:2;19662:3;19603:67;:::i;:::-;19596:74;;19679:93;19768:3;19679:93;:::i;:::-;19797:2;19792:3;19788:12;19781:19;;19440:366;;;:::o;19812:419::-;19978:4;20016:2;20005:9;20001:18;19993:26;;20065:9;20059:4;20055:20;20051:1;20040:9;20036:17;20029:47;20093:131;20219:4;20093:131;:::i;:::-;20085:139;;19812:419;;;:::o;20237:225::-;20377:34;20373:1;20365:6;20361:14;20354:58;20446:8;20441:2;20433:6;20429:15;20422:33;20237:225;:::o;20468:366::-;20610:3;20631:67;20695:2;20690:3;20631:67;:::i;:::-;20624:74;;20707:93;20796:3;20707:93;:::i;:::-;20825:2;20820:3;20816:12;20809:19;;20468:366;;;:::o;20840:419::-;21006:4;21044:2;21033:9;21029:18;21021:26;;21093:9;21087:4;21083:20;21079:1;21068:9;21064:17;21057:47;21121:131;21247:4;21121:131;:::i;:::-;21113:139;;20840:419;;;:::o;21265:147::-;21366:11;21403:3;21388:18;;21265:147;;;;:::o;21418:114::-;;:::o;21538:398::-;21697:3;21718:83;21799:1;21794:3;21718:83;:::i;:::-;21711:90;;21810:93;21899:3;21810:93;:::i;:::-;21928:1;21923:3;21919:11;21912:18;;21538:398;;;:::o;21942:379::-;22126:3;22148:147;22291:3;22148:147;:::i;:::-;22141:154;;22312:3;22305:10;;21942:379;;;:::o;22327:173::-;22467:25;22463:1;22455:6;22451:14;22444:49;22327:173;:::o;22506:366::-;22648:3;22669:67;22733:2;22728:3;22669:67;:::i;:::-;22662:74;;22745:93;22834:3;22745:93;:::i;:::-;22863:2;22858:3;22854:12;22847:19;;22506:366;;;:::o;22878:419::-;23044:4;23082:2;23071:9;23067:18;23059:26;;23131:9;23125:4;23121:20;23117:1;23106:9;23102:17;23095:47;23159:131;23285:4;23159:131;:::i;:::-;23151:139;;22878:419;;;:::o;23303:182::-;23443:34;23439:1;23431:6;23427:14;23420:58;23303:182;:::o;23491:366::-;23633:3;23654:67;23718:2;23713:3;23654:67;:::i;:::-;23647:74;;23730:93;23819:3;23730:93;:::i;:::-;23848:2;23843:3;23839:12;23832:19;;23491:366;;;:::o;23863:419::-;24029:4;24067:2;24056:9;24052:18;24044:26;;24116:9;24110:4;24106:20;24102:1;24091:9;24087:17;24080:47;24144:131;24270:4;24144:131;:::i;:::-;24136:139;;23863:419;;;:::o;24288:223::-;24428:34;24424:1;24416:6;24412:14;24405:58;24497:6;24492:2;24484:6;24480:15;24473:31;24288:223;:::o;24517:366::-;24659:3;24680:67;24744:2;24739:3;24680:67;:::i;:::-;24673:74;;24756:93;24845:3;24756:93;:::i;:::-;24874:2;24869:3;24865:12;24858:19;;24517:366;;;:::o;24889:419::-;25055:4;25093:2;25082:9;25078:18;25070:26;;25142:9;25136:4;25132:20;25128:1;25117:9;25113:17;25106:47;25170:131;25296:4;25170:131;:::i;:::-;25162:139;;24889:419;;;:::o;25314:221::-;25454:34;25450:1;25442:6;25438:14;25431:58;25523:4;25518:2;25510:6;25506:15;25499:29;25314:221;:::o;25541:366::-;25683:3;25704:67;25768:2;25763:3;25704:67;:::i;:::-;25697:74;;25780:93;25869:3;25780:93;:::i;:::-;25898:2;25893:3;25889:12;25882:19;;25541:366;;;:::o;25913:419::-;26079:4;26117:2;26106:9;26102:18;26094:26;;26166:9;26160:4;26156:20;26152:1;26141:9;26137:17;26130:47;26194:131;26320:4;26194:131;:::i;:::-;26186:139;;25913:419;;;:::o;26338:179::-;26478:31;26474:1;26466:6;26462:14;26455:55;26338:179;:::o;26523:366::-;26665:3;26686:67;26750:2;26745:3;26686:67;:::i;:::-;26679:74;;26762:93;26851:3;26762:93;:::i;:::-;26880:2;26875:3;26871:12;26864:19;;26523:366;;;:::o;26895:419::-;27061:4;27099:2;27088:9;27084:18;27076:26;;27148:9;27142:4;27138:20;27134:1;27123:9;27119:17;27112:47;27176:131;27302:4;27176:131;:::i;:::-;27168:139;;26895:419;;;:::o;27320:176::-;27460:28;27456:1;27448:6;27444:14;27437:52;27320:176;:::o;27502:366::-;27644:3;27665:67;27729:2;27724:3;27665:67;:::i;:::-;27658:74;;27741:93;27830:3;27741:93;:::i;:::-;27859:2;27854:3;27850:12;27843:19;;27502:366;;;:::o;27874:419::-;28040:4;28078:2;28067:9;28063:18;28055:26;;28127:9;28121:4;28117:20;28113:1;28102:9;28098:17;28091:47;28155:131;28281:4;28155:131;:::i;:::-;28147:139;;27874:419;;;:::o;28299:174::-;28439:26;28435:1;28427:6;28423:14;28416:50;28299:174;:::o;28479:366::-;28621:3;28642:67;28706:2;28701:3;28642:67;:::i;:::-;28635:74;;28718:93;28807:3;28718:93;:::i;:::-;28836:2;28831:3;28827:12;28820:19;;28479:366;;;:::o;28851:419::-;29017:4;29055:2;29044:9;29040:18;29032:26;;29104:9;29098:4;29094:20;29090:1;29079:9;29075:17;29068:47;29132:131;29258:4;29132:131;:::i;:::-;29124:139;;28851:419;;;:::o;29276:228::-;29416:34;29412:1;29404:6;29400:14;29393:58;29485:11;29480:2;29472:6;29468:15;29461:36;29276:228;:::o;29510:366::-;29652:3;29673:67;29737:2;29732:3;29673:67;:::i;:::-;29666:74;;29749:93;29838:3;29749:93;:::i;:::-;29867:2;29862:3;29858:12;29851:19;;29510:366;;;:::o;29882:419::-;30048:4;30086:2;30075:9;30071:18;30063:26;;30135:9;30129:4;30125:20;30121:1;30110:9;30106:17;30099:47;30163:131;30289:4;30163:131;:::i;:::-;30155:139;;29882:419;;;:::o;30307:168::-;30447:20;30443:1;30435:6;30431:14;30424:44;30307:168;:::o;30481:366::-;30623:3;30644:67;30708:2;30703:3;30644:67;:::i;:::-;30637:74;;30720:93;30809:3;30720:93;:::i;:::-;30838:2;30833:3;30829:12;30822:19;;30481:366;;;:::o;30853:419::-;31019:4;31057:2;31046:9;31042:18;31034:26;;31106:9;31100:4;31096:20;31092:1;31081:9;31077:17;31070:47;31134:131;31260:4;31134:131;:::i;:::-;31126:139;;30853:419;;;:::o;31278:228::-;31418:34;31414:1;31406:6;31402:14;31395:58;31487:11;31482:2;31474:6;31470:15;31463:36;31278:228;:::o;31512:366::-;31654:3;31675:67;31739:2;31734:3;31675:67;:::i;:::-;31668:74;;31751:93;31840:3;31751:93;:::i;:::-;31869:2;31864:3;31860:12;31853:19;;31512:366;;;:::o;31884:419::-;32050:4;32088:2;32077:9;32073:18;32065:26;;32137:9;32131:4;32127:20;32123:1;32112:9;32108:17;32101:47;32165:131;32291:4;32165:131;:::i;:::-;32157:139;;31884:419;;;:::o;32309:194::-;32349:4;32369:20;32387:1;32369:20;:::i;:::-;32364:25;;32403:20;32421:1;32403:20;:::i;:::-;32398:25;;32447:1;32444;32440:9;32432:17;;32471:1;32465:4;32462:11;32459:37;;;32476:18;;:::i;:::-;32459:37;32309:194;;;;:::o;32509:166::-;32649:18;32645:1;32637:6;32633:14;32626:42;32509:166;:::o;32681:366::-;32823:3;32844:67;32908:2;32903:3;32844:67;:::i;:::-;32837:74;;32920:93;33009:3;32920:93;:::i;:::-;33038:2;33033:3;33029:12;33022:19;;32681:366;;;:::o;33053:419::-;33219:4;33257:2;33246:9;33242:18;33234:26;;33306:9;33300:4;33296:20;33292:1;33281:9;33277:17;33270:47;33334:131;33460:4;33334:131;:::i;:::-;33326:139;;33053:419;;;:::o;33478:224::-;33618:34;33614:1;33606:6;33602:14;33595:58;33687:7;33682:2;33674:6;33670:15;33663:32;33478:224;:::o;33708:366::-;33850:3;33871:67;33935:2;33930:3;33871:67;:::i;:::-;33864:74;;33947:93;34036:3;33947:93;:::i;:::-;34065:2;34060:3;34056:12;34049:19;;33708:366;;;:::o;34080:419::-;34246:4;34284:2;34273:9;34269:18;34261:26;;34333:9;34327:4;34323:20;34319:1;34308:9;34304:17;34297:47;34361:131;34487:4;34361:131;:::i;:::-;34353:139;;34080:419;;;:::o;34505:222::-;34645:34;34641:1;34633:6;34629:14;34622:58;34714:5;34709:2;34701:6;34697:15;34690:30;34505:222;:::o;34733:366::-;34875:3;34896:67;34960:2;34955:3;34896:67;:::i;:::-;34889:74;;34972:93;35061:3;34972:93;:::i;:::-;35090:2;35085:3;35081:12;35074:19;;34733:366;;;:::o;35105:419::-;35271:4;35309:2;35298:9;35294:18;35286:26;;35358:9;35352:4;35348:20;35344:1;35333:9;35329:17;35322:47;35386:131;35512:4;35386:131;:::i;:::-;35378:139;;35105:419;;;:::o;35530:225::-;35670:34;35666:1;35658:6;35654:14;35647:58;35739:8;35734:2;35726:6;35722:15;35715:33;35530:225;:::o;35761:366::-;35903:3;35924:67;35988:2;35983:3;35924:67;:::i;:::-;35917:74;;36000:93;36089:3;36000:93;:::i;:::-;36118:2;36113:3;36109:12;36102:19;;35761:366;;;:::o;36133:419::-;36299:4;36337:2;36326:9;36322:18;36314:26;;36386:9;36380:4;36376:20;36372:1;36361:9;36357:17;36350:47;36414:131;36540:4;36414:131;:::i;:::-;36406:139;;36133:419;;;:::o;36558:180::-;36606:77;36603:1;36596:88;36703:4;36700:1;36693:15;36727:4;36724:1;36717:15;36744:180;36792:77;36789:1;36782:88;36889:4;36886:1;36879:15;36913:4;36910:1;36903:15;36930:143;36987:5;37018:6;37012:13;37003:22;;37034:33;37061:5;37034:33;:::i;:::-;36930:143;;;;:::o;37079:351::-;37149:6;37198:2;37186:9;37177:7;37173:23;37169:32;37166:119;;;37204:79;;:::i;:::-;37166:119;37324:1;37349:64;37405:7;37396:6;37385:9;37381:22;37349:64;:::i;:::-;37339:74;;37295:128;37079:351;;;;:::o;37436:85::-;37481:7;37510:5;37499:16;;37436:85;;;:::o;37527:158::-;37585:9;37618:61;37636:42;37645:32;37671:5;37645:32;:::i;:::-;37636:42;:::i;:::-;37618:61;:::i;:::-;37605:74;;37527:158;;;:::o;37691:147::-;37786:45;37825:5;37786:45;:::i;:::-;37781:3;37774:58;37691:147;;:::o;37844:114::-;37911:6;37945:5;37939:12;37929:22;;37844:114;;;:::o;37964:184::-;38063:11;38097:6;38092:3;38085:19;38137:4;38132:3;38128:14;38113:29;;37964:184;;;;:::o;38154:132::-;38221:4;38244:3;38236:11;;38274:4;38269:3;38265:14;38257:22;;38154:132;;;:::o;38292:108::-;38369:24;38387:5;38369:24;:::i;:::-;38364:3;38357:37;38292:108;;:::o;38406:179::-;38475:10;38496:46;38538:3;38530:6;38496:46;:::i;:::-;38574:4;38569:3;38565:14;38551:28;;38406:179;;;;:::o;38591:113::-;38661:4;38693;38688:3;38684:14;38676:22;;38591:113;;;:::o;38740:732::-;38859:3;38888:54;38936:5;38888:54;:::i;:::-;38958:86;39037:6;39032:3;38958:86;:::i;:::-;38951:93;;39068:56;39118:5;39068:56;:::i;:::-;39147:7;39178:1;39163:284;39188:6;39185:1;39182:13;39163:284;;;39264:6;39258:13;39291:63;39350:3;39335:13;39291:63;:::i;:::-;39284:70;;39377:60;39430:6;39377:60;:::i;:::-;39367:70;;39223:224;39210:1;39207;39203:9;39198:14;;39163:284;;;39167:14;39463:3;39456:10;;38864:608;;;38740:732;;;;:::o;39478:831::-;39741:4;39779:3;39768:9;39764:19;39756:27;;39793:71;39861:1;39850:9;39846:17;39837:6;39793:71;:::i;:::-;39874:80;39950:2;39939:9;39935:18;39926:6;39874:80;:::i;:::-;40001:9;39995:4;39991:20;39986:2;39975:9;39971:18;39964:48;40029:108;40132:4;40123:6;40029:108;:::i;:::-;40021:116;;40147:72;40215:2;40204:9;40200:18;40191:6;40147:72;:::i;:::-;40229:73;40297:3;40286:9;40282:19;40273:6;40229:73;:::i;:::-;39478:831;;;;;;;;:::o

Swarm Source

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