ETH Price: $3,298.95 (-0.94%)

Token

Nova AI (NOVA)
 

Overview

Max Total Supply

100,000,000 NOVA

Holders

311

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
56,000 NOVA

Value
$0.00
0xC1B15D024ae0eE67558F017D163966Ad2720241c
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:
Nova

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-05-24
*/

/*  Nova - Launch your project into orbit with Nova AI
    Website: https://nova.engineer/
    Twitter: https://x.com/NovaOnETH
    Telegram: https://t.me/NovaEngineer
    Docs: https://docs.nova.engineer/
*/

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

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

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

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


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

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.9.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: NovaToken.sol

pragma solidity ^0.8.21;






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

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address private taxWallet;

    uint256 public convertAtAmount;
    uint256 public maxSwapAmount;

    bool public stageLaunch = true;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    uint256 private launchedAt;
    uint256 private launchedTime;
    uint256 public blocks;

    uint256 public buyTotalFees;
    uint256 public sellTotalFees;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(uint256 => uint256) private blockSwaps;

    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event TaxWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity);

    constructor() ERC20("Nova AI", "NOVA") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 totalSupply = 100_000_000 * 1e18;

        maxSwapAmount = 250_000 * 1e18;
        convertAtAmount = 250_000 * 1e18;

        taxWallet = msg.sender;

        _mint(address(this), totalSupply); 

        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
    }

    receive() external payable {}

    function openTrading() external payable onlyOwner {
        _approve(address(this), address(uniswapV2Router), totalSupply());
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this),balanceOf(address(this)),0,0,owner(),block.timestamp);
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max);

        tradingActive = true;
        swapEnabled = true;
        launchedAt = block.number;
        launchedTime = block.timestamp;

        // Set initial high fees
        buyTotalFees = 20;
        sellTotalFees = 40;

    }


    function removeLimits() external onlyOwner {
        limitsInEffect = false;
    }

    function updateConvertAtAmount(uint256 newAmount) external {

        require(_msgSender() == taxWallet);
        convertAtAmount = newAmount * (10 ** 18);

    }

    function updateMaxSwap(uint256 newAmount) external {
        require(_msgSender() == taxWallet);
        maxSwapAmount = newAmount * (10 ** 18);

    }


    function whitelistContract(address _whitelist, bool isWL) public onlyOwner {
        _isExcludedMaxTransactionAmount[_whitelist] = isWL;

        _isExcludedFromFees[_whitelist] = isWL;
    }

    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function maxWallet() public view returns(uint256) {
        if (stageLaunch) {
            return totalSupply();
        }

        uint256 elapsedBlocks = block.number - launchedAt;

        if (elapsedBlocks <= 60) {
            uint256 incrementalMaxWallet = (elapsedBlocks * 25 * totalSupply()) / (60 * 10000);
            return incrementalMaxWallet;
        } else {
            return (25 * totalSupply()) / 10000;
        }
    }

    
    function setStage() external onlyOwner {
        stageLaunch = false;
    }

    function manualswap(uint256 amount) external {
        require(_msgSender() == taxWallet);
        require(amount <= balanceOf(address(this)) && amount > 0, "Wrong amount");
        swapTokensForEth(amount);
    }

    function emptyETH() external {
        address(taxWallet).call{value: address(this).balance}("");
    }

    function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner {
        require(pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateFees(uint256 _swapFee) external onlyOwner {
        require(_swapFee < buyTotalFees, "Cannot Raise Buy Taxes");
        require(_swapFee < sellTotalFees, "Cannot Raise Sell Taxes");

        buyTotalFees = _swapFee;
        sellTotalFees = _swapFee;

    }

    function updateBuyFees(uint256 _swapFee) external onlyOwner {
        require(_swapFee < buyTotalFees, "Cannot Raise Buy Taxes");
        buyTotalFees = _swapFee;
    }

    function updateSellFees(uint256 _swapFee) external onlyOwner {
        require(_swapFee < sellTotalFees, "Cannot Raise Sell Tax");
        sellTotalFees = _swapFee;
    }

    function updateTaxWallet(address newtaxWallet) external onlyOwner {
        emit TaxWalletUpdated(newtaxWallet, taxWallet);
        taxWallet = newtaxWallet;
    }

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

    if (amount == 0) {
        super._transfer(from, to, 0);
        return;
    }

    if (limitsInEffect) {
        if (from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !swapping) {
            if (!tradingActive) {
                require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active.");
            }

            // When buying
            if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                require(amount + balanceOf(to) <= maxWallet(), "Max wallet exceeded");
            }

            // When selling or transferring
            if (!_isExcludedMaxTransactionAmount[to]) {
                require(amount + balanceOf(to) <= maxWallet(), "Max wallet exceeded");
            }
        }
    }

    uint256 contractTokenBalance = balanceOf(address(this));

    bool canSwap = contractTokenBalance >= convertAtAmount;

    if (
        canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from]
            && !_isExcludedFromFees[to]
    ) {
        // Limit swaps
        if (blockSwaps[block.number] < 3) {
            swapping = true;

            swapBack();

            swapping = false;

            blockSwaps[block.number] = blockSwaps[block.number] + 1;
        }
    }

    bool takeFee = !swapping;

    // If any account belongs to _isExcludedFromFee account, then remove the fee
    if (_isExcludedFromFees[from] || _isExcludedFromFees[to] || stageLaunch) {
        takeFee = false;
    }

    uint256 fees = 0;

    // Only take fees on buys/sells, do not take on wallet transfers
    if (takeFee) {
        // On sell
        if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
            fees = amount.mul(sellTotalFees).div(100);
        }
        // On buy
        else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
            fees = amount.mul(buyTotalFees).div(100);
        }

        if (fees > 0) {
            super._transfer(from, address(this), fees);
        }

        amount = amount.sub(fees);
    }

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

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        bool success;

        if (contractBalance == 0) {
            return;
        }

        if (contractBalance > maxSwapAmount) {
            contractBalance = maxSwapAmount;
        }

        // Halve the amount of liquidity tokens

        uint256 amountToSwapForETH = contractBalance;

        swapTokensForEth(amountToSwapForETH);

        uint256 totalETH = address(this).balance;

        (success,) = address(taxWallet).call{value: totalETH}("");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"TaxWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convertAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"emptyETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","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":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"manualswap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stageLaunch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateConvertAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateMaxSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newtaxWallet","type":"address"}],"name":"updateTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_whitelist","type":"address"},{"internalType":"bool","name":"isWL","type":"bool"}],"name":"whitelistContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600160095f6101000a81548160ff0219169083151502179055506001600960016101000a81548160ff0219169083151502179055505f600960026101000a81548160ff0219169083151502179055505f600960036101000a81548160ff021916908315150217905550348015610078575f80fd5b506040518060400160405280600781526020017f4e6f7661204149000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4e4f56410000000000000000000000000000000000000000000000000000000081525081600390816100f49190610b0a565b5080600490816101049190610b0a565b50505061012361011861043860201b60201c565b61043f60201b60201c565b5f737a250d5630b4cf539739df2c5dacb4c659f2488d905061014c81600161050260201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ed9190610c37565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610252573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102769190610c37565b6040518363ffffffff1660e01b8152600401610293929190610c71565b6020604051808303815f875af11580156102af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102d39190610c37565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505061031960a051600161050260201b60201c565b61032c60a051600161056860201b60201c565b5f6a52b7d2dcc80cd2e400000090506934f086f3b33b684000006008819055506934f086f3b33b684000006007819055503360065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103ad308261060660201b60201c565b6103cb6103be61076060201b60201c565b600161078860201b60201c565b6103dc30600161078860201b60201c565b6103ef61dead600161078860201b60201c565b61040d61040061076060201b60201c565b600161050260201b60201c565b61041e30600161050260201b60201c565b61043161dead600161050260201b60201c565b5050610e33565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61051061083c60201b60201c565b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066b90610cf2565b60405180910390fd5b6106855f83836108c660201b60201c565b8060025f8282546106969190610d3d565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107439190610d7f565b60405180910390a361075c5f83836108cb60201b60201c565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61079661083c60201b60201c565b80600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516108309190610db2565b60405180910390a25050565b61084a61043860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1661086e61076060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146108c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bb90610e15565b60405180910390fd5b565b505050565b505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061094b57607f821691505b60208210810361095e5761095d610907565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026109c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610985565b6109ca8683610985565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f610a0e610a09610a04846109e2565b6109eb565b6109e2565b9050919050565b5f819050919050565b610a27836109f4565b610a3b610a3382610a15565b848454610991565b825550505050565b5f90565b610a4f610a43565b610a5a818484610a1e565b505050565b5b81811015610a7d57610a725f82610a47565b600181019050610a60565b5050565b601f821115610ac257610a9381610964565b610a9c84610976565b81016020851015610aab578190505b610abf610ab785610976565b830182610a5f565b50505b505050565b5f82821c905092915050565b5f610ae25f1984600802610ac7565b1980831691505092915050565b5f610afa8383610ad3565b9150826002028217905092915050565b610b13826108d0565b67ffffffffffffffff811115610b2c57610b2b6108da565b5b610b368254610934565b610b41828285610a81565b5f60209050601f831160018114610b72575f8415610b60578287015190505b610b6a8582610aef565b865550610bd1565b601f198416610b8086610964565b5f5b82811015610ba757848901518255600182019150602085019450602081019050610b82565b86831015610bc45784890151610bc0601f891682610ad3565b8355505b6001600288020188555050505b505050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610c0682610bdd565b9050919050565b610c1681610bfc565b8114610c20575f80fd5b50565b5f81519050610c3181610c0d565b92915050565b5f60208284031215610c4c57610c4b610bd9565b5b5f610c5984828501610c23565b91505092915050565b610c6b81610bfc565b82525050565b5f604082019050610c845f830185610c62565b610c916020830184610c62565b9392505050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f610cdc601f83610c98565b9150610ce782610ca8565b602082019050919050565b5f6020820190508181035f830152610d0981610cd0565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610d47826109e2565b9150610d52836109e2565b9250828201905080821115610d6a57610d69610d10565b5b92915050565b610d79816109e2565b82525050565b5f602082019050610d925f830184610d70565b92915050565b5f8115159050919050565b610dac81610d98565b82525050565b5f602082019050610dc55f830184610da3565b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f610dff602083610c98565b9150610e0a82610dcb565b602082019050919050565b5f6020820190508181035f830152610e2c81610df3565b9050919050565b60805160a051613b6f610e8c5f395f8181610bb3015281816110b2015261148b01525f8181610b14015281816113a6015281816113d4015281816114c70152818161252401528181612603015261262a0152613b6f5ff3fe60806040526004361061026a575f3560e01c806378dacee111610143578063bbc0c742116100b5578063d85ba06311610079578063d85ba063146108bf578063dd62ed3e146108e9578063e93f638414610925578063eba4c3331461094d578063f2fde38b14610975578063f8b45b051461099d57610271565b8063bbc0c7421461080f578063c024666814610839578063c9567bf914610861578063cce987d41461086b578063d6bbaf801461089557610271565b80639a7a23d6116101075780639a7a23d6146106f55780639e0061601461071d578063a457c2d714610733578063a672990c1461076f578063a9059cbb14610797578063b62496f5146107d357610271565b806378dacee114610627578063881dce601461064f5780638da5cb5b1461067757806395d89b41146106a1578063967ff23e146106cb57610271565b80634a62bb65116101dc57806370a08231116101a057806370a0823114610547578063715018a61461058357806371fc46881461059957806374c9f603146105c1578063751039fc146105e95780637571336a146105ff57610271565b80634a62bb6514610489578063640c913a146104b357806368218bac146104c95780636a486a8e146104f35780636ddd17131461051d57610271565b806318160ddd1161022e57806318160ddd1461036957806323b872dd1461039357806327c8f835146103cf578063313ce567146103f9578063395093511461042357806349bd5a5e1461045f57610271565b806306fdde0314610275578063095ea7b31461029f57806310d5de53146102db578063150074a3146103175780631694505e1461033f57610271565b3661027157005b5f80fd5b348015610280575f80fd5b506102896109c7565b6040516102969190612b4a565b60405180910390f35b3480156102aa575f80fd5b506102c560048036038101906102c09190612bfb565b610a57565b6040516102d29190612c53565b60405180910390f35b3480156102e6575f80fd5b5061030160048036038101906102fc9190612c6c565b610a79565b60405161030e9190612c53565b60405180910390f35b348015610322575f80fd5b5061033d60048036038101906103389190612c97565b610a96565b005b34801561034a575f80fd5b50610353610b12565b6040516103609190612d1d565b60405180910390f35b348015610374575f80fd5b5061037d610b36565b60405161038a9190612d45565b60405180910390f35b34801561039e575f80fd5b506103b960048036038101906103b49190612d5e565b610b3f565b6040516103c69190612c53565b60405180910390f35b3480156103da575f80fd5b506103e3610b6d565b6040516103f09190612dbd565b60405180910390f35b348015610404575f80fd5b5061040d610b73565b60405161041a9190612df1565b60405180910390f35b34801561042e575f80fd5b5061044960048036038101906104449190612bfb565b610b7b565b6040516104569190612c53565b60405180910390f35b34801561046a575f80fd5b50610473610bb1565b6040516104809190612dbd565b60405180910390f35b348015610494575f80fd5b5061049d610bd5565b6040516104aa9190612c53565b60405180910390f35b3480156104be575f80fd5b506104c7610be8565b005b3480156104d4575f80fd5b506104dd610c71565b6040516104ea9190612d45565b60405180910390f35b3480156104fe575f80fd5b50610507610c77565b6040516105149190612d45565b60405180910390f35b348015610528575f80fd5b50610531610c7d565b60405161053e9190612c53565b60405180910390f35b348015610552575f80fd5b5061056d60048036038101906105689190612c6c565b610c90565b60405161057a9190612d45565b60405180910390f35b34801561058e575f80fd5b50610597610cd5565b005b3480156105a4575f80fd5b506105bf60048036038101906105ba9190612c97565b610ce8565b005b3480156105cc575f80fd5b506105e760048036038101906105e29190612c6c565b610d3e565b005b3480156105f4575f80fd5b506105fd610e04565b005b34801561060a575f80fd5b5061062560048036038101906106209190612e34565b610e28565b005b348015610632575f80fd5b5061064d60048036038101906106489190612c97565b610e88565b005b34801561065a575f80fd5b5061067560048036038101906106709190612c97565b610f29565b005b348015610682575f80fd5b5061068b610fea565b6040516106989190612dbd565b60405180910390f35b3480156106ac575f80fd5b506106b5611012565b6040516106c29190612b4a565b60405180910390f35b3480156106d6575f80fd5b506106df6110a2565b6040516106ec9190612d45565b60405180910390f35b348015610700575f80fd5b5061071b60048036038101906107169190612e34565b6110a8565b005b348015610728575f80fd5b5061073161114c565b005b34801561073e575f80fd5b5061075960048036038101906107549190612bfb565b61116f565b6040516107669190612c53565b60405180910390f35b34801561077a575f80fd5b5061079560048036038101906107909190612e34565b6111e4565b005b3480156107a2575f80fd5b506107bd60048036038101906107b89190612bfb565b611298565b6040516107ca9190612c53565b60405180910390f35b3480156107de575f80fd5b506107f960048036038101906107f49190612c6c565b6112ba565b6040516108069190612c53565b60405180910390f35b34801561081a575f80fd5b506108236112d7565b6040516108309190612c53565b60405180910390f35b348015610844575f80fd5b5061085f600480360381019061085a9190612e34565b6112ea565b005b610869611398565b005b348015610876575f80fd5b5061087f6115bb565b60405161088c9190612d45565b60405180910390f35b3480156108a0575f80fd5b506108a96115c1565b6040516108b69190612c53565b60405180910390f35b3480156108ca575f80fd5b506108d36115d3565b6040516108e09190612d45565b60405180910390f35b3480156108f4575f80fd5b5061090f600480360381019061090a9190612e72565b6115d9565b60405161091c9190612d45565b60405180910390f35b348015610930575f80fd5b5061094b60048036038101906109469190612c97565b61165b565b005b348015610958575f80fd5b50610973600480360381019061096e9190612c97565b6116d7565b005b348015610980575f80fd5b5061099b60048036038101906109969190612c6c565b61172d565b005b3480156109a8575f80fd5b506109b16117af565b6040516109be9190612d45565b60405180910390f35b6060600380546109d690612edd565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0290612edd565b8015610a4d5780601f10610a2457610100808354040283529160200191610a4d565b820191905f5260205f20905b815481529060010190602001808311610a3057829003601f168201915b5050505050905090565b5f80610a6161184e565b9050610a6e818585611855565b600191505092915050565b6010602052805f5260405f205f915054906101000a900460ff1681565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610ad661184e565b73ffffffffffffffffffffffffffffffffffffffff1614610af5575f80fd5b670de0b6b3a764000081610b099190612f3a565b60088190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600254905090565b5f80610b4961184e565b9050610b56858285611a18565b610b61858585611aa3565b60019150509392505050565b61dead81565b5f6012905090565b5f80610b8561184e565b9050610ba6818585610b9785896115d9565b610ba19190612f7b565b611855565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600960019054906101000a900460ff1681565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610c2d90612fdb565b5f6040518083038185875af1925050503d805f8114610c67576040519150601f19603f3d011682016040523d82523d5f602084013e610c6c565b606091505b505050565b60075481565b600e5481565b600960039054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610cdd612346565b610ce65f6123c4565b565b610cf0612346565b600d548110610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90613039565b60405180910390fd5b80600d8190555050565b610d46612346565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f849a2ad8ad386f1e9897e9e0a62d16771c675e4740986a16fb31bd8e1dde9c9760405160405180910390a38060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e0c612346565b5f600960016101000a81548160ff021916908315150217905550565b610e30612346565b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b610e90612346565b600d548110610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb90613039565b60405180910390fd5b600e548110610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f906130a1565b60405180910390fd5b80600d8190555080600e8190555050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f6961184e565b73ffffffffffffffffffffffffffffffffffffffff1614610f88575f80fd5b610f9130610c90565b8111158015610f9f57505f81115b610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590613109565b60405180910390fd5b610fe781612487565b50565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461102190612edd565b80601f016020809104026020016040519081016040528092919081815260200182805461104d90612edd565b80156110985780601f1061106f57610100808354040283529160200191611098565b820191905f5260205f20905b81548152906001019060200180831161107b57829003601f168201915b5050505050905090565b600c5481565b6110b0612346565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361113e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113590613197565b60405180910390fd5b61114882826126ba565b5050565b611154612346565b5f60095f6101000a81548160ff021916908315150217905550565b5f8061117961184e565b90505f61118682866115d9565b9050838110156111cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c290613225565b60405180910390fd5b6111d88286868403611855565b60019250505092915050565b6111ec612346565b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f806112a261184e565b90506112af818585611aa3565b600191505092915050565b6011602052805f5260405f205f915054906101000a900460ff1681565b600960029054906101000a900460ff1681565b6112f2612346565b80600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405161138c9190612c53565b60405180910390a25050565b6113a0612346565b6113d2307f00000000000000000000000000000000000000000000000000000000000000006113cd610b36565b611855565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d719473061141930610c90565b5f80611423610fea565b426040518863ffffffff1660e01b81526004016114459695949392919061327c565b60606040518083038185885af1158015611461573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061148691906132ef565b5050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161152492919061333f565b6020604051808303815f875af1158015611540573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611564919061337a565b506001600960026101000a81548160ff0219169083151502179055506001600960036101000a81548160ff02191690831515021790555043600a8190555042600b819055506014600d819055506028600e81905550565b60085481565b60095f9054906101000a900460ff1681565b600d5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661169b61184e565b73ffffffffffffffffffffffffffffffffffffffff16146116ba575f80fd5b670de0b6b3a7640000816116ce9190612f3a565b60078190555050565b6116df612346565b600e548110611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a906133ef565b60405180910390fd5b80600e8190555050565b611735612346565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a9061347d565b60405180910390fd5b6117ac816123c4565b50565b5f60095f9054906101000a900460ff16156117d3576117cc610b36565b905061184b565b5f600a54436117e2919061349b565b9050603c8111611826575f620927c06117f9610b36565b6019846118069190612f3a565b6118109190612f3a565b61181a91906134fb565b9050809250505061184b565b612710611831610b36565b601961183d9190612f3a565b61184791906134fb565b9150505b90565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ba9061359b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192890613629565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611a0b9190612d45565b60405180910390a3505050565b5f611a2384846115d9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611a9d5781811015611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8690613691565b60405180910390fd5b611a9c8484848403611855565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b089061371f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b76906137ad565b60405180910390fd5b5f8103611b9657611b9183835f612758565b612341565b600960019054906101000a900460ff1615611f4e57611bb3610fea565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611c215750611bf1610fea565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611c5957505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611c93575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611cac5750600560149054906101000a900460ff16155b15611f4d57600960029054906101000a900460ff16611da057600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611d605750600f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b611d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9690613815565b60405180910390fd5b5b60115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015611e3d575060105f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611ea057611e4a6117af565b611e5383610c90565b82611e5e9190612f7b565b1115611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e969061387d565b60405180910390fd5b5b60105f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611f4c57611ef66117af565b611eff83610c90565b82611f0a9190612f7b565b1115611f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f429061387d565b60405180910390fd5b5b5b5b5f611f5830610c90565b90505f6007548210159050808015611f7c5750600960039054906101000a900460ff165b8015611f955750600560149054906101000a900460ff16155b8015611fe8575060115f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561203b5750600f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561208e5750600f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561211f57600360125f4381526020019081526020015f2054101561211e576001600560146101000a81548160ff0219169083151502179055506120d06129c4565b5f600560146101000a81548160ff021916908315150217905550600160125f4381526020019081526020015f20546121089190612f7b565b60125f4381526020019081526020015f20819055505b5b5f600560149054906101000a900460ff16159050600f5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806121ce5750600f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b806121e4575060095f9054906101000a900460ff165b156121ed575f90505b5f81156123315760115f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561224b57505f600e54115b1561227f57612278606461226a600e5488612a9190919063ffffffff16565b612aa690919063ffffffff16565b9050612307565b60115f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156122d657505f600d54115b156123065761230360646122f5600d5488612a9190919063ffffffff16565b612aa690919063ffffffff16565b90505b5b5f81111561231b5761231a873083612758565b5b61232e8186612abb90919063ffffffff16565b94505b61233c878787612758565b505050505b505050565b61234e61184e565b73ffffffffffffffffffffffffffffffffffffffff1661236c610fea565b73ffffffffffffffffffffffffffffffffffffffff16146123c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b9906138e5565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f600267ffffffffffffffff8111156124a3576124a2613903565b5b6040519080825280602002602001820160405280156124d15781602001602082028036833780820191505090505b50905030815f815181106124e8576124e7613930565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561258b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125af9190613971565b816001815181106125c3576125c2613930565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612628307f000000000000000000000000000000000000000000000000000000000000000084611855565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612689959493929190613a53565b5f604051808303815f87803b1580156126a0575f80fd5b505af11580156126b2573d5f803e3d5ffd5b505050505050565b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bd9061371f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282b906137ad565b60405180910390fd5b61283f838383612ad0565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156128c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b990613b1b565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129ab9190612d45565b60405180910390a36129be848484612ad5565b50505050565b5f6129ce30610c90565b90505f8082036129df575050612a8f565b6008548211156129ef5760085491505b5f8290506129fc81612487565b5f47905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051612a4590612fdb565b5f6040518083038185875af1925050503d805f8114612a7f576040519150601f19603f3d011682016040523d82523d5f602084013e612a84565b606091505b505080935050505050505b565b5f8183612a9e9190612f3a565b905092915050565b5f8183612ab391906134fb565b905092915050565b5f8183612ac8919061349b565b905092915050565b505050565b505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612b1c82612ada565b612b268185612ae4565b9350612b36818560208601612af4565b612b3f81612b02565b840191505092915050565b5f6020820190508181035f830152612b628184612b12565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612b9782612b6e565b9050919050565b612ba781612b8d565b8114612bb1575f80fd5b50565b5f81359050612bc281612b9e565b92915050565b5f819050919050565b612bda81612bc8565b8114612be4575f80fd5b50565b5f81359050612bf581612bd1565b92915050565b5f8060408385031215612c1157612c10612b6a565b5b5f612c1e85828601612bb4565b9250506020612c2f85828601612be7565b9150509250929050565b5f8115159050919050565b612c4d81612c39565b82525050565b5f602082019050612c665f830184612c44565b92915050565b5f60208284031215612c8157612c80612b6a565b5b5f612c8e84828501612bb4565b91505092915050565b5f60208284031215612cac57612cab612b6a565b5b5f612cb984828501612be7565b91505092915050565b5f819050919050565b5f612ce5612ce0612cdb84612b6e565b612cc2565b612b6e565b9050919050565b5f612cf682612ccb565b9050919050565b5f612d0782612cec565b9050919050565b612d1781612cfd565b82525050565b5f602082019050612d305f830184612d0e565b92915050565b612d3f81612bc8565b82525050565b5f602082019050612d585f830184612d36565b92915050565b5f805f60608486031215612d7557612d74612b6a565b5b5f612d8286828701612bb4565b9350506020612d9386828701612bb4565b9250506040612da486828701612be7565b9150509250925092565b612db781612b8d565b82525050565b5f602082019050612dd05f830184612dae565b92915050565b5f60ff82169050919050565b612deb81612dd6565b82525050565b5f602082019050612e045f830184612de2565b92915050565b612e1381612c39565b8114612e1d575f80fd5b50565b5f81359050612e2e81612e0a565b92915050565b5f8060408385031215612e4a57612e49612b6a565b5b5f612e5785828601612bb4565b9250506020612e6885828601612e20565b9150509250929050565b5f8060408385031215612e8857612e87612b6a565b5b5f612e9585828601612bb4565b9250506020612ea685828601612bb4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612ef457607f821691505b602082108103612f0757612f06612eb0565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612f4482612bc8565b9150612f4f83612bc8565b9250828202612f5d81612bc8565b91508282048414831517612f7457612f73612f0d565b5b5092915050565b5f612f8582612bc8565b9150612f9083612bc8565b9250828201905080821115612fa857612fa7612f0d565b5b92915050565b5f81905092915050565b50565b5f612fc65f83612fae565b9150612fd182612fb8565b5f82019050919050565b5f612fe582612fbb565b9150819050919050565b7f43616e6e6f7420526169736520427579205461786573000000000000000000005f82015250565b5f613023601683612ae4565b915061302e82612fef565b602082019050919050565b5f6020820190508181035f83015261305081613017565b9050919050565b7f43616e6e6f742052616973652053656c6c2054617865730000000000000000005f82015250565b5f61308b601783612ae4565b915061309682613057565b602082019050919050565b5f6020820190508181035f8301526130b88161307f565b9050919050565b7f57726f6e6720616d6f756e7400000000000000000000000000000000000000005f82015250565b5f6130f3600c83612ae4565b91506130fe826130bf565b602082019050919050565b5f6020820190508181035f830152613120816130e7565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d205f8201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b5f613181603983612ae4565b915061318c82613127565b604082019050919050565b5f6020820190508181035f8301526131ae81613175565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f61320f602583612ae4565b915061321a826131b5565b604082019050919050565b5f6020820190508181035f83015261323c81613203565b9050919050565b5f819050919050565b5f61326661326161325c84613243565b612cc2565b612bc8565b9050919050565b6132768161324c565b82525050565b5f60c08201905061328f5f830189612dae565b61329c6020830188612d36565b6132a9604083018761326d565b6132b6606083018661326d565b6132c36080830185612dae565b6132d060a0830184612d36565b979650505050505050565b5f815190506132e981612bd1565b92915050565b5f805f6060848603121561330657613305612b6a565b5b5f613313868287016132db565b9350506020613324868287016132db565b9250506040613335868287016132db565b9150509250925092565b5f6040820190506133525f830185612dae565b61335f6020830184612d36565b9392505050565b5f8151905061337481612e0a565b92915050565b5f6020828403121561338f5761338e612b6a565b5b5f61339c84828501613366565b91505092915050565b7f43616e6e6f742052616973652053656c6c2054617800000000000000000000005f82015250565b5f6133d9601583612ae4565b91506133e4826133a5565b602082019050919050565b5f6020820190508181035f830152613406816133cd565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613467602683612ae4565b91506134728261340d565b604082019050919050565b5f6020820190508181035f8301526134948161345b565b9050919050565b5f6134a582612bc8565b91506134b083612bc8565b92508282039050818111156134c8576134c7612f0d565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61350582612bc8565b915061351083612bc8565b9250826135205761351f6134ce565b5b828204905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f613585602483612ae4565b91506135908261352b565b604082019050919050565b5f6020820190508181035f8301526135b281613579565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613613602283612ae4565b915061361e826135b9565b604082019050919050565b5f6020820190508181035f83015261364081613607565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f61367b601d83612ae4565b915061368682613647565b602082019050919050565b5f6020820190508181035f8301526136a88161366f565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613709602583612ae4565b9150613714826136af565b604082019050919050565b5f6020820190508181035f830152613736816136fd565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f613797602383612ae4565b91506137a28261373d565b604082019050919050565b5f6020820190508181035f8301526137c48161378b565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f6137ff601683612ae4565b915061380a826137cb565b602082019050919050565b5f6020820190508181035f83015261382c816137f3565b9050919050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f613867601383612ae4565b915061387282613833565b602082019050919050565b5f6020820190508181035f8301526138948161385b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6138cf602083612ae4565b91506138da8261389b565b602082019050919050565b5f6020820190508181035f8301526138fc816138c3565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8151905061396b81612b9e565b92915050565b5f6020828403121561398657613985612b6a565b5b5f6139938482850161395d565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6139ce81612b8d565b82525050565b5f6139df83836139c5565b60208301905092915050565b5f602082019050919050565b5f613a018261399c565b613a0b81856139a6565b9350613a16836139b6565b805f5b83811015613a46578151613a2d88826139d4565b9750613a38836139eb565b925050600181019050613a19565b5085935050505092915050565b5f60a082019050613a665f830188612d36565b613a73602083018761326d565b8181036040830152613a8581866139f7565b9050613a946060830185612dae565b613aa16080830184612d36565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f613b05602683612ae4565b9150613b1082613aab565b604082019050919050565b5f6020820190508181035f830152613b3281613af9565b905091905056fea2646970667358221220477099a904e798330e3778a118f4fc9b8ff7c3b6eb64243bdb3cda36441c4f5864736f6c63430008190033

Deployed Bytecode

0x60806040526004361061026a575f3560e01c806378dacee111610143578063bbc0c742116100b5578063d85ba06311610079578063d85ba063146108bf578063dd62ed3e146108e9578063e93f638414610925578063eba4c3331461094d578063f2fde38b14610975578063f8b45b051461099d57610271565b8063bbc0c7421461080f578063c024666814610839578063c9567bf914610861578063cce987d41461086b578063d6bbaf801461089557610271565b80639a7a23d6116101075780639a7a23d6146106f55780639e0061601461071d578063a457c2d714610733578063a672990c1461076f578063a9059cbb14610797578063b62496f5146107d357610271565b806378dacee114610627578063881dce601461064f5780638da5cb5b1461067757806395d89b41146106a1578063967ff23e146106cb57610271565b80634a62bb65116101dc57806370a08231116101a057806370a0823114610547578063715018a61461058357806371fc46881461059957806374c9f603146105c1578063751039fc146105e95780637571336a146105ff57610271565b80634a62bb6514610489578063640c913a146104b357806368218bac146104c95780636a486a8e146104f35780636ddd17131461051d57610271565b806318160ddd1161022e57806318160ddd1461036957806323b872dd1461039357806327c8f835146103cf578063313ce567146103f9578063395093511461042357806349bd5a5e1461045f57610271565b806306fdde0314610275578063095ea7b31461029f57806310d5de53146102db578063150074a3146103175780631694505e1461033f57610271565b3661027157005b5f80fd5b348015610280575f80fd5b506102896109c7565b6040516102969190612b4a565b60405180910390f35b3480156102aa575f80fd5b506102c560048036038101906102c09190612bfb565b610a57565b6040516102d29190612c53565b60405180910390f35b3480156102e6575f80fd5b5061030160048036038101906102fc9190612c6c565b610a79565b60405161030e9190612c53565b60405180910390f35b348015610322575f80fd5b5061033d60048036038101906103389190612c97565b610a96565b005b34801561034a575f80fd5b50610353610b12565b6040516103609190612d1d565b60405180910390f35b348015610374575f80fd5b5061037d610b36565b60405161038a9190612d45565b60405180910390f35b34801561039e575f80fd5b506103b960048036038101906103b49190612d5e565b610b3f565b6040516103c69190612c53565b60405180910390f35b3480156103da575f80fd5b506103e3610b6d565b6040516103f09190612dbd565b60405180910390f35b348015610404575f80fd5b5061040d610b73565b60405161041a9190612df1565b60405180910390f35b34801561042e575f80fd5b5061044960048036038101906104449190612bfb565b610b7b565b6040516104569190612c53565b60405180910390f35b34801561046a575f80fd5b50610473610bb1565b6040516104809190612dbd565b60405180910390f35b348015610494575f80fd5b5061049d610bd5565b6040516104aa9190612c53565b60405180910390f35b3480156104be575f80fd5b506104c7610be8565b005b3480156104d4575f80fd5b506104dd610c71565b6040516104ea9190612d45565b60405180910390f35b3480156104fe575f80fd5b50610507610c77565b6040516105149190612d45565b60405180910390f35b348015610528575f80fd5b50610531610c7d565b60405161053e9190612c53565b60405180910390f35b348015610552575f80fd5b5061056d60048036038101906105689190612c6c565b610c90565b60405161057a9190612d45565b60405180910390f35b34801561058e575f80fd5b50610597610cd5565b005b3480156105a4575f80fd5b506105bf60048036038101906105ba9190612c97565b610ce8565b005b3480156105cc575f80fd5b506105e760048036038101906105e29190612c6c565b610d3e565b005b3480156105f4575f80fd5b506105fd610e04565b005b34801561060a575f80fd5b5061062560048036038101906106209190612e34565b610e28565b005b348015610632575f80fd5b5061064d60048036038101906106489190612c97565b610e88565b005b34801561065a575f80fd5b5061067560048036038101906106709190612c97565b610f29565b005b348015610682575f80fd5b5061068b610fea565b6040516106989190612dbd565b60405180910390f35b3480156106ac575f80fd5b506106b5611012565b6040516106c29190612b4a565b60405180910390f35b3480156106d6575f80fd5b506106df6110a2565b6040516106ec9190612d45565b60405180910390f35b348015610700575f80fd5b5061071b60048036038101906107169190612e34565b6110a8565b005b348015610728575f80fd5b5061073161114c565b005b34801561073e575f80fd5b5061075960048036038101906107549190612bfb565b61116f565b6040516107669190612c53565b60405180910390f35b34801561077a575f80fd5b5061079560048036038101906107909190612e34565b6111e4565b005b3480156107a2575f80fd5b506107bd60048036038101906107b89190612bfb565b611298565b6040516107ca9190612c53565b60405180910390f35b3480156107de575f80fd5b506107f960048036038101906107f49190612c6c565b6112ba565b6040516108069190612c53565b60405180910390f35b34801561081a575f80fd5b506108236112d7565b6040516108309190612c53565b60405180910390f35b348015610844575f80fd5b5061085f600480360381019061085a9190612e34565b6112ea565b005b610869611398565b005b348015610876575f80fd5b5061087f6115bb565b60405161088c9190612d45565b60405180910390f35b3480156108a0575f80fd5b506108a96115c1565b6040516108b69190612c53565b60405180910390f35b3480156108ca575f80fd5b506108d36115d3565b6040516108e09190612d45565b60405180910390f35b3480156108f4575f80fd5b5061090f600480360381019061090a9190612e72565b6115d9565b60405161091c9190612d45565b60405180910390f35b348015610930575f80fd5b5061094b60048036038101906109469190612c97565b61165b565b005b348015610958575f80fd5b50610973600480360381019061096e9190612c97565b6116d7565b005b348015610980575f80fd5b5061099b60048036038101906109969190612c6c565b61172d565b005b3480156109a8575f80fd5b506109b16117af565b6040516109be9190612d45565b60405180910390f35b6060600380546109d690612edd565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0290612edd565b8015610a4d5780601f10610a2457610100808354040283529160200191610a4d565b820191905f5260205f20905b815481529060010190602001808311610a3057829003601f168201915b5050505050905090565b5f80610a6161184e565b9050610a6e818585611855565b600191505092915050565b6010602052805f5260405f205f915054906101000a900460ff1681565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610ad661184e565b73ffffffffffffffffffffffffffffffffffffffff1614610af5575f80fd5b670de0b6b3a764000081610b099190612f3a565b60088190555050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b5f600254905090565b5f80610b4961184e565b9050610b56858285611a18565b610b61858585611aa3565b60019150509392505050565b61dead81565b5f6012905090565b5f80610b8561184e565b9050610ba6818585610b9785896115d9565b610ba19190612f7b565b611855565b600191505092915050565b7f0000000000000000000000004798754ae6886a103176c907feb3187881b6220e81565b600960019054906101000a900460ff1681565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610c2d90612fdb565b5f6040518083038185875af1925050503d805f8114610c67576040519150601f19603f3d011682016040523d82523d5f602084013e610c6c565b606091505b505050565b60075481565b600e5481565b600960039054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610cdd612346565b610ce65f6123c4565b565b610cf0612346565b600d548110610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b90613039565b60405180910390fd5b80600d8190555050565b610d46612346565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f849a2ad8ad386f1e9897e9e0a62d16771c675e4740986a16fb31bd8e1dde9c9760405160405180910390a38060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610e0c612346565b5f600960016101000a81548160ff021916908315150217905550565b610e30612346565b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b610e90612346565b600d548110610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb90613039565b60405180910390fd5b600e548110610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f906130a1565b60405180910390fd5b80600d8190555080600e8190555050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610f6961184e565b73ffffffffffffffffffffffffffffffffffffffff1614610f88575f80fd5b610f9130610c90565b8111158015610f9f57505f81115b610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590613109565b60405180910390fd5b610fe781612487565b50565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461102190612edd565b80601f016020809104026020016040519081016040528092919081815260200182805461104d90612edd565b80156110985780601f1061106f57610100808354040283529160200191611098565b820191905f5260205f20905b81548152906001019060200180831161107b57829003601f168201915b5050505050905090565b600c5481565b6110b0612346565b7f0000000000000000000000004798754ae6886a103176c907feb3187881b6220e73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361113e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113590613197565b60405180910390fd5b61114882826126ba565b5050565b611154612346565b5f60095f6101000a81548160ff021916908315150217905550565b5f8061117961184e565b90505f61118682866115d9565b9050838110156111cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c290613225565b60405180910390fd5b6111d88286868403611855565b60019250505092915050565b6111ec612346565b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555080600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f806112a261184e565b90506112af818585611aa3565b600191505092915050565b6011602052805f5260405f205f915054906101000a900460ff1681565b600960029054906101000a900460ff1681565b6112f2612346565b80600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405161138c9190612c53565b60405180910390a25050565b6113a0612346565b6113d2307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6113cd610b36565b611855565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d719473061141930610c90565b5f80611423610fea565b426040518863ffffffff1660e01b81526004016114459695949392919061327c565b60606040518083038185885af1158015611461573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061148691906132ef565b5050507f0000000000000000000000004798754ae6886a103176c907feb3187881b6220e73ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161152492919061333f565b6020604051808303815f875af1158015611540573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611564919061337a565b506001600960026101000a81548160ff0219169083151502179055506001600960036101000a81548160ff02191690831515021790555043600a8190555042600b819055506014600d819055506028600e81905550565b60085481565b60095f9054906101000a900460ff1681565b600d5481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661169b61184e565b73ffffffffffffffffffffffffffffffffffffffff16146116ba575f80fd5b670de0b6b3a7640000816116ce9190612f3a565b60078190555050565b6116df612346565b600e548110611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a906133ef565b60405180910390fd5b80600e8190555050565b611735612346565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a9061347d565b60405180910390fd5b6117ac816123c4565b50565b5f60095f9054906101000a900460ff16156117d3576117cc610b36565b905061184b565b5f600a54436117e2919061349b565b9050603c8111611826575f620927c06117f9610b36565b6019846118069190612f3a565b6118109190612f3a565b61181a91906134fb565b9050809250505061184b565b612710611831610b36565b601961183d9190612f3a565b61184791906134fb565b9150505b90565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ba9061359b565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192890613629565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611a0b9190612d45565b60405180910390a3505050565b5f611a2384846115d9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611a9d5781811015611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8690613691565b60405180910390fd5b611a9c8484848403611855565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b089061371f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b76906137ad565b60405180910390fd5b5f8103611b9657611b9183835f612758565b612341565b600960019054906101000a900460ff1615611f4e57611bb3610fea565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611c215750611bf1610fea565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611c5957505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611c93575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015611cac5750600560149054906101000a900460ff16155b15611f4d57600960029054906101000a900460ff16611da057600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680611d605750600f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b611d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9690613815565b60405180910390fd5b5b60115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015611e3d575060105f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15611ea057611e4a6117af565b611e5383610c90565b82611e5e9190612f7b565b1115611e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e969061387d565b60405180910390fd5b5b60105f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16611f4c57611ef66117af565b611eff83610c90565b82611f0a9190612f7b565b1115611f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f429061387d565b60405180910390fd5b5b5b5b5f611f5830610c90565b90505f6007548210159050808015611f7c5750600960039054906101000a900460ff165b8015611f955750600560149054906101000a900460ff16155b8015611fe8575060115f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561203b5750600f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801561208e5750600f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561211f57600360125f4381526020019081526020015f2054101561211e576001600560146101000a81548160ff0219169083151502179055506120d06129c4565b5f600560146101000a81548160ff021916908315150217905550600160125f4381526020019081526020015f20546121089190612f7b565b60125f4381526020019081526020015f20819055505b5b5f600560149054906101000a900460ff16159050600f5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806121ce5750600f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b806121e4575060095f9054906101000a900460ff165b156121ed575f90505b5f81156123315760115f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561224b57505f600e54115b1561227f57612278606461226a600e5488612a9190919063ffffffff16565b612aa690919063ffffffff16565b9050612307565b60115f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680156122d657505f600d54115b156123065761230360646122f5600d5488612a9190919063ffffffff16565b612aa690919063ffffffff16565b90505b5b5f81111561231b5761231a873083612758565b5b61232e8186612abb90919063ffffffff16565b94505b61233c878787612758565b505050505b505050565b61234e61184e565b73ffffffffffffffffffffffffffffffffffffffff1661236c610fea565b73ffffffffffffffffffffffffffffffffffffffff16146123c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b9906138e5565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f600267ffffffffffffffff8111156124a3576124a2613903565b5b6040519080825280602002602001820160405280156124d15781602001602082028036833780820191505090505b50905030815f815181106124e8576124e7613930565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561258b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125af9190613971565b816001815181106125c3576125c2613930565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050612628307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611855565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b8152600401612689959493929190613a53565b5f604051808303815f87803b1580156126a0575f80fd5b505af11580156126b2573d5f803e3d5ffd5b505050505050565b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bd9061371f565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282b906137ad565b60405180910390fd5b61283f838383612ad0565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156128c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b990613b1b565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516129ab9190612d45565b60405180910390a36129be848484612ad5565b50505050565b5f6129ce30610c90565b90505f8082036129df575050612a8f565b6008548211156129ef5760085491505b5f8290506129fc81612487565b5f47905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681604051612a4590612fdb565b5f6040518083038185875af1925050503d805f8114612a7f576040519150601f19603f3d011682016040523d82523d5f602084013e612a84565b606091505b505080935050505050505b565b5f8183612a9e9190612f3a565b905092915050565b5f8183612ab391906134fb565b905092915050565b5f8183612ac8919061349b565b905092915050565b505050565b505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612b1c82612ada565b612b268185612ae4565b9350612b36818560208601612af4565b612b3f81612b02565b840191505092915050565b5f6020820190508181035f830152612b628184612b12565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612b9782612b6e565b9050919050565b612ba781612b8d565b8114612bb1575f80fd5b50565b5f81359050612bc281612b9e565b92915050565b5f819050919050565b612bda81612bc8565b8114612be4575f80fd5b50565b5f81359050612bf581612bd1565b92915050565b5f8060408385031215612c1157612c10612b6a565b5b5f612c1e85828601612bb4565b9250506020612c2f85828601612be7565b9150509250929050565b5f8115159050919050565b612c4d81612c39565b82525050565b5f602082019050612c665f830184612c44565b92915050565b5f60208284031215612c8157612c80612b6a565b5b5f612c8e84828501612bb4565b91505092915050565b5f60208284031215612cac57612cab612b6a565b5b5f612cb984828501612be7565b91505092915050565b5f819050919050565b5f612ce5612ce0612cdb84612b6e565b612cc2565b612b6e565b9050919050565b5f612cf682612ccb565b9050919050565b5f612d0782612cec565b9050919050565b612d1781612cfd565b82525050565b5f602082019050612d305f830184612d0e565b92915050565b612d3f81612bc8565b82525050565b5f602082019050612d585f830184612d36565b92915050565b5f805f60608486031215612d7557612d74612b6a565b5b5f612d8286828701612bb4565b9350506020612d9386828701612bb4565b9250506040612da486828701612be7565b9150509250925092565b612db781612b8d565b82525050565b5f602082019050612dd05f830184612dae565b92915050565b5f60ff82169050919050565b612deb81612dd6565b82525050565b5f602082019050612e045f830184612de2565b92915050565b612e1381612c39565b8114612e1d575f80fd5b50565b5f81359050612e2e81612e0a565b92915050565b5f8060408385031215612e4a57612e49612b6a565b5b5f612e5785828601612bb4565b9250506020612e6885828601612e20565b9150509250929050565b5f8060408385031215612e8857612e87612b6a565b5b5f612e9585828601612bb4565b9250506020612ea685828601612bb4565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612ef457607f821691505b602082108103612f0757612f06612eb0565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612f4482612bc8565b9150612f4f83612bc8565b9250828202612f5d81612bc8565b91508282048414831517612f7457612f73612f0d565b5b5092915050565b5f612f8582612bc8565b9150612f9083612bc8565b9250828201905080821115612fa857612fa7612f0d565b5b92915050565b5f81905092915050565b50565b5f612fc65f83612fae565b9150612fd182612fb8565b5f82019050919050565b5f612fe582612fbb565b9150819050919050565b7f43616e6e6f7420526169736520427579205461786573000000000000000000005f82015250565b5f613023601683612ae4565b915061302e82612fef565b602082019050919050565b5f6020820190508181035f83015261305081613017565b9050919050565b7f43616e6e6f742052616973652053656c6c2054617865730000000000000000005f82015250565b5f61308b601783612ae4565b915061309682613057565b602082019050919050565b5f6020820190508181035f8301526130b88161307f565b9050919050565b7f57726f6e6720616d6f756e7400000000000000000000000000000000000000005f82015250565b5f6130f3600c83612ae4565b91506130fe826130bf565b602082019050919050565b5f6020820190508181035f830152613120816130e7565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d205f8201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b5f613181603983612ae4565b915061318c82613127565b604082019050919050565b5f6020820190508181035f8301526131ae81613175565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f61320f602583612ae4565b915061321a826131b5565b604082019050919050565b5f6020820190508181035f83015261323c81613203565b9050919050565b5f819050919050565b5f61326661326161325c84613243565b612cc2565b612bc8565b9050919050565b6132768161324c565b82525050565b5f60c08201905061328f5f830189612dae565b61329c6020830188612d36565b6132a9604083018761326d565b6132b6606083018661326d565b6132c36080830185612dae565b6132d060a0830184612d36565b979650505050505050565b5f815190506132e981612bd1565b92915050565b5f805f6060848603121561330657613305612b6a565b5b5f613313868287016132db565b9350506020613324868287016132db565b9250506040613335868287016132db565b9150509250925092565b5f6040820190506133525f830185612dae565b61335f6020830184612d36565b9392505050565b5f8151905061337481612e0a565b92915050565b5f6020828403121561338f5761338e612b6a565b5b5f61339c84828501613366565b91505092915050565b7f43616e6e6f742052616973652053656c6c2054617800000000000000000000005f82015250565b5f6133d9601583612ae4565b91506133e4826133a5565b602082019050919050565b5f6020820190508181035f830152613406816133cd565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f613467602683612ae4565b91506134728261340d565b604082019050919050565b5f6020820190508181035f8301526134948161345b565b9050919050565b5f6134a582612bc8565b91506134b083612bc8565b92508282039050818111156134c8576134c7612f0d565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61350582612bc8565b915061351083612bc8565b9250826135205761351f6134ce565b5b828204905092915050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f613585602483612ae4565b91506135908261352b565b604082019050919050565b5f6020820190508181035f8301526135b281613579565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f613613602283612ae4565b915061361e826135b9565b604082019050919050565b5f6020820190508181035f83015261364081613607565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f61367b601d83612ae4565b915061368682613647565b602082019050919050565b5f6020820190508181035f8301526136a88161366f565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f613709602583612ae4565b9150613714826136af565b604082019050919050565b5f6020820190508181035f830152613736816136fd565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f613797602383612ae4565b91506137a28261373d565b604082019050919050565b5f6020820190508181035f8301526137c48161378b565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f6137ff601683612ae4565b915061380a826137cb565b602082019050919050565b5f6020820190508181035f83015261382c816137f3565b9050919050565b7f4d61782077616c6c6574206578636565646564000000000000000000000000005f82015250565b5f613867601383612ae4565b915061387282613833565b602082019050919050565b5f6020820190508181035f8301526138948161385b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6138cf602083612ae4565b91506138da8261389b565b602082019050919050565b5f6020820190508181035f8301526138fc816138c3565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f8151905061396b81612b9e565b92915050565b5f6020828403121561398657613985612b6a565b5b5f6139938482850161395d565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6139ce81612b8d565b82525050565b5f6139df83836139c5565b60208301905092915050565b5f602082019050919050565b5f613a018261399c565b613a0b81856139a6565b9350613a16836139b6565b805f5b83811015613a46578151613a2d88826139d4565b9750613a38836139eb565b925050600181019050613a19565b5085935050505092915050565b5f60a082019050613a665f830188612d36565b613a73602083018761326d565b8181036040830152613a8581866139f7565b9050613a946060830185612dae565b613aa16080830184612d36565b9695505050505050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f613b05602683612ae4565b9150613b1082613aab565b604082019050919050565b5f6020820190508181035f830152613b3281613af9565b905091905056fea2646970667358221220477099a904e798330e3778a118f4fc9b8ff7c3b6eb64243bdb3cda36441c4f5864736f6c63430008190033

Deployed Bytecode Sourcemap

33586:9859:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22334:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24685:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34350:63;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36940:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33660:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23454:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25466:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33763:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23296:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26170:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33718:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34002:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38424:105;;;;;;;;;;;;;:::i;:::-;;33889:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34254:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34082:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23625:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15759:103;;;;;;;;;;;;;:::i;:::-;;39271:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39631:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36673:84;;;;;;;;;;;;;:::i;:::-;;37308:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38985:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38199:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15111:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22553:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34190:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38537:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38114:77;;;;;;;;;;;;;:::i;:::-;;26911:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37105:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23958:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34420:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34042:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37460:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36074:589;;;:::i;:::-;;33926:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33963:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34220:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24214:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36765:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39450:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16017:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37650:450;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22334:100;22388:13;22421:5;22414:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22334:100;:::o;24685:201::-;24768:4;24785:13;24801:12;:10;:12::i;:::-;24785:28;;24824:32;24833:5;24840:7;24849:6;24824:8;:32::i;:::-;24874:4;24867:11;;;24685:201;;;;:::o;34350:63::-;;;;;;;;;;;;;;;;;;;;;;:::o;36940:155::-;37026:9;;;;;;;;;;;37010:25;;:12;:10;:12::i;:::-;:25;;;37002:34;;;;;;37076:8;37063:9;:22;;;;:::i;:::-;37047:13;:38;;;;36940:155;:::o;33660:51::-;;;:::o;23454:108::-;23515:7;23542:12;;23535:19;;23454:108;:::o;25466:295::-;25597:4;25614:15;25632:12;:10;:12::i;:::-;25614:30;;25655:38;25671:4;25677:7;25686:6;25655:15;:38::i;:::-;25704:27;25714:4;25720:2;25724:6;25704:9;:27::i;:::-;25749:4;25742:11;;;25466:295;;;;;:::o;33763:53::-;33809:6;33763:53;:::o;23296:93::-;23354:5;23379:2;23372:9;;23296:93;:::o;26170:238::-;26258:4;26275:13;26291:12;:10;:12::i;:::-;26275:28;;26314:64;26323:5;26330:7;26367:10;26339:25;26349:5;26356:7;26339:9;:25::i;:::-;:38;;;;:::i;:::-;26314:8;:64::i;:::-;26396:4;26389:11;;;26170:238;;;;:::o;33718:38::-;;;:::o;34002:33::-;;;;;;;;;;;;;:::o;38424:105::-;38472:9;;;;;;;;;;;38464:23;;38495:21;38464:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38424:105::o;33889:30::-;;;;:::o;34254:28::-;;;;:::o;34082:31::-;;;;;;;;;;;;;:::o;23625:127::-;23699:7;23726:9;:18;23736:7;23726:18;;;;;;;;;;;;;;;;23719:25;;23625:127;;;:::o;15759:103::-;14997:13;:11;:13::i;:::-;15824:30:::1;15851:1;15824:18;:30::i;:::-;15759:103::o:0;39271:171::-;14997:13;:11;:13::i;:::-;39361:12:::1;;39350:8;:23;39342:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39426:8;39411:12;:23;;;;39271:171:::0;:::o;39631:166::-;14997:13;:11;:13::i;:::-;39744:9:::1;;;;;;;;;;;39713:41;;39730:12;39713:41;;;;;;;;;;;;39777:12;39765:9;;:24;;;;;;;;;;;;;;;;;;39631:166:::0;:::o;36673:84::-;14997:13;:11;:13::i;:::-;36744:5:::1;36727:14;;:22;;;;;;;;;;;;;;;;;;36673:84::o:0;37308:144::-;14997:13;:11;:13::i;:::-;37440:4:::1;37398:31;:39;37430:6;37398:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;37308:144:::0;;:::o;38985:278::-;14997:13;:11;:13::i;:::-;39072:12:::1;;39061:8;:23;39053:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39141:13;;39130:8;:24;39122:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;39210:8;39195:12;:23;;;;39245:8;39229:13;:24;;;;38985:278:::0;:::o;38199:217::-;38279:9;;;;;;;;;;;38263:25;;:12;:10;:12::i;:::-;:25;;;38255:34;;;;;;38318:24;38336:4;38318:9;:24::i;:::-;38308:6;:34;;:48;;;;;38355:1;38346:6;:10;38308:48;38300:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38384:24;38401:6;38384:16;:24::i;:::-;38199:217;:::o;15111:87::-;15157:7;15184:6;;;;;;;;;;;15177:13;;15111:87;:::o;22553:104::-;22609:13;22642:7;22635:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22553:104;:::o;34190:21::-;;;;:::o;38537:244::-;14997:13;:11;:13::i;:::-;38644::::1;38636:21;;:4;:21;;::::0;38628:91:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38732:41;38761:4;38767:5;38732:28;:41::i;:::-;38537:244:::0;;:::o;38114:77::-;14997:13;:11;:13::i;:::-;38178:5:::1;38164:11;;:19;;;;;;;;;;;;;;;;;;38114:77::o:0;26911:436::-;27004:4;27021:13;27037:12;:10;:12::i;:::-;27021:28;;27060:24;27087:25;27097:5;27104:7;27087:9;:25::i;:::-;27060:52;;27151:15;27131:16;:35;;27123:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;27244:60;27253:5;27260:7;27288:15;27269:16;:34;27244:8;:60::i;:::-;27335:4;27328:11;;;;26911:436;;;;:::o;37105:195::-;14997:13;:11;:13::i;:::-;37237:4:::1;37191:31;:43;37223:10;37191:43;;;;;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;37288:4;37254:19;:31;37274:10;37254:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;37105:195:::0;;:::o;23958:193::-;24037:4;24054:13;24070:12;:10;:12::i;:::-;24054:28;;24093;24103:5;24110:2;24114:6;24093:9;:28::i;:::-;24139:4;24132:11;;;23958:193;;;;:::o;34420:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;34042:33::-;;;;;;;;;;;;;:::o;37460:182::-;14997:13;:11;:13::i;:::-;37576:8:::1;37545:19;:28;37565:7;37545:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;37616:7;37600:34;;;37625:8;37600:34;;;;;;:::i;:::-;;;;;;;;37460:182:::0;;:::o;36074:589::-;14997:13;:11;:13::i;:::-;36135:64:::1;36152:4;36167:15;36185:13;:11;:13::i;:::-;36135:8;:64::i;:::-;36210:15;:31;;;36249:21;36280:4;36286:24;36304:4;36286:9;:24::i;:::-;36311:1;36313::::0;36315:7:::1;:5;:7::i;:::-;36323:15;36210:129;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;36357:13;36350:29;;;36388:15;36406:14;36350:71;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36450:4;36434:13;;:20;;;;;;;;;;;;;;;;;;36479:4;36465:11;;:18;;;;;;;;;;;;;;;;;;36507:12;36494:10;:25;;;;36545:15;36530:12;:30;;;;36622:2;36607:12;:17;;;;36651:2;36635:13;:18;;;;36074:589::o:0;33926:28::-;;;;:::o;33963:30::-;;;;;;;;;;;;;:::o;34220:27::-;;;;:::o;24214:151::-;24303:7;24330:11;:18;24342:5;24330:18;;;;;;;;;;;;;;;:27;24349:7;24330:27;;;;;;;;;;;;;;;;24323:34;;24214:151;;;;:::o;36765:167::-;36861:9;;;;;;;;;;;36845:25;;:12;:10;:12::i;:::-;:25;;;36837:34;;;;;;36913:8;36900:9;:22;;;;:::i;:::-;36882:15;:40;;;;36765:167;:::o;39450:173::-;14997:13;:11;:13::i;:::-;39541::::1;;39530:8;:24;39522:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39607:8;39591:13;:24;;;;39450:173:::0;:::o;16017:201::-;14997:13;:11;:13::i;:::-;16126:1:::1;16106:22;;:8;:22;;::::0;16098:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;16182:28;16201:8;16182:18;:28::i;:::-;16017:201:::0;:::o;37650:450::-;37691:7;37715:11;;;;;;;;;;;37711:64;;;37750:13;:11;:13::i;:::-;37743:20;;;;37711:64;37787:21;37826:10;;37811:12;:25;;;;:::i;:::-;37787:49;;37870:2;37853:13;:19;37849:244;;37889:28;37960:10;37942:13;:11;:13::i;:::-;37937:2;37921:13;:18;;;;:::i;:::-;:34;;;;:::i;:::-;37920:51;;;;:::i;:::-;37889:82;;37993:20;37986:27;;;;;;37849:244;38076:5;38059:13;:11;:13::i;:::-;38054:2;:18;;;;:::i;:::-;38053:28;;;;:::i;:::-;38046:35;;;37650:450;;:::o;13662:98::-;13715:7;13742:10;13735:17;;13662:98;:::o;30938:380::-;31091:1;31074:19;;:5;:19;;;31066:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31172:1;31153:21;;:7;:21;;;31145:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31256:6;31226:11;:18;31238:5;31226:18;;;;;;;;;;;;;;;:27;31245:7;31226:27;;;;;;;;;;;;;;;:36;;;;31294:7;31278:32;;31287:5;31278:32;;;31303:6;31278:32;;;;;;:::i;:::-;;;;;;;;30938:380;;;:::o;31609:453::-;31744:24;31771:25;31781:5;31788:7;31771:9;:25::i;:::-;31744:52;;31831:17;31811:16;:37;31807:248;;31893:6;31873:16;:26;;31865:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31977:51;31986:5;31993:7;32021:6;32002:16;:25;31977:8;:51::i;:::-;31807:248;31733:329;31609:453;;;:::o;39805:2454::-;39915:1;39899:18;;:4;:18;;;39891:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39988:1;39974:16;;:2;:16;;;39966:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;40053:1;40043:6;:11;40039:81;;40067:28;40083:4;40089:2;40093:1;40067:15;:28::i;:::-;40106:7;;40039:81;40132:14;;;;;;;;;;;40128:734;;;40171:7;:5;:7::i;:::-;40163:15;;:4;:15;;;;:32;;;;;40188:7;:5;:7::i;:::-;40182:13;;:2;:13;;;;40163:32;:52;;;;;40213:1;40199:16;;:2;:16;;;;40163:52;:77;;;;;40233:6;40219:21;;:2;:21;;;;40163:77;:90;;;;;40245:8;;;;;;;;;;;40244:9;40163:90;40159:696;;;40275:13;;;;;;;;;;;40270:142;;40317:19;:25;40337:4;40317:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;40346:19;:23;40366:2;40346:23;;;;;;;;;;;;;;;;;;;;;;;;;40317:52;40309:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40270:142;40460:25;:31;40486:4;40460:31;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;40496:31;:35;40528:2;40496:35;;;;;;;;;;;;;;;;;;;;;;;;;40495:36;40460:71;40456:181;;;40586:11;:9;:11::i;:::-;40569:13;40579:2;40569:9;:13::i;:::-;40560:6;:22;;;;:::i;:::-;:37;;40552:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40456:181;40703:31;:35;40735:2;40703:35;;;;;;;;;;;;;;;;;;;;;;;;;40698:146;;40793:11;:9;:11::i;:::-;40776:13;40786:2;40776:9;:13::i;:::-;40767:6;:22;;;;:::i;:::-;:37;;40759:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40698:146;40159:696;40128:734;40870:28;40901:24;40919:4;40901:9;:24::i;:::-;40870:55;;40934:12;40973:15;;40949:20;:39;;40934:54;;41011:7;:22;;;;;41022:11;;;;;;;;;;;41011:22;:35;;;;;41038:8;;;;;;;;;;;41037:9;41011:35;:71;;;;;41051:25;:31;41077:4;41051:31;;;;;;;;;;;;;;;;;;;;;;;;;41050:32;41011:71;:101;;;;;41087:19;:25;41107:4;41087:25;;;;;;;;;;;;;;;;;;;;;;;;;41086:26;41011:101;:142;;;;;41130:19;:23;41150:2;41130:23;;;;;;;;;;;;;;;;;;;;;;;;;41129:24;41011:142;40997:414;;;41227:1;41200:10;:24;41211:12;41200:24;;;;;;;;;;;;:28;41196:208;;;41256:4;41245:8;;:15;;;;;;;;;;;;;;;;;;41277:10;:8;:10::i;:::-;41315:5;41304:8;;:16;;;;;;;;;;;;;;;;;;41391:1;41364:10;:24;41375:12;41364:24;;;;;;;;;;;;:28;;;;:::i;:::-;41337:10;:24;41348:12;41337:24;;;;;;;;;;;:55;;;;41196:208;40997:414;41419:12;41435:8;;;;;;;;;;;41434:9;41419:24;;41538:19;:25;41558:4;41538:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;41567:19;:23;41587:2;41567:23;;;;;;;;;;;;;;;;;;;;;;;;;41538:52;:67;;;;41594:11;;;;;;;;;;;41538:67;41534:107;;;41628:5;41618:15;;41534:107;41649:12;41748:7;41744:466;;;41792:25;:29;41818:2;41792:29;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;;41841:1;41825:13;;:17;41792:50;41788:282;;;41866:34;41896:3;41866:25;41877:13;;41866:6;:10;;:25;;;;:::i;:::-;:29;;:34;;;;:::i;:::-;41859:41;;41788:282;;;41950:25;:31;41976:4;41950:31;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;;42000:1;41985:12;;:16;41950:51;41946:124;;;42025:33;42054:3;42025:24;42036:12;;42025:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;42018:40;;41946:124;41788:282;42093:1;42086:4;:8;42082:83;;;42111:42;42127:4;42141;42148;42111:15;:42::i;:::-;42082:83;42186:16;42197:4;42186:6;:10;;:16;;;;:::i;:::-;42177:25;;41744:466;42218:33;42234:4;42240:2;42244:6;42218:15;:33::i;:::-;39884:2375;;;;39805:2454;;;;:::o;15276:132::-;15351:12;:10;:12::i;:::-;15340:23;;:7;:5;:7::i;:::-;:23;;;15332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15276:132::o;16378:191::-;16452:16;16471:6;;;;;;;;;;;16452:25;;16497:8;16488:6;;:17;;;;;;;;;;;;;;;;;;16552:8;16521:40;;16542:8;16521:40;;;;;;;;;;;;16441:128;16378:191;:::o;42267:589::-;42393:21;42431:1;42417:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42393:40;;42462:4;42444;42449:1;42444:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;42488:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42478:4;42483:1;42478:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;42523:62;42540:4;42555:15;42573:11;42523:8;:62::i;:::-;42624:15;:66;;;42705:11;42731:1;42775:4;42802;42822:15;42624:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42322:534;42267:589;:::o;38789:188::-;38906:5;38872:25;:31;38898:4;38872:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;38963:5;38929:40;;38957:4;38929:40;;;;;;;;;;;;38789:188;;:::o;27817:840::-;27964:1;27948:18;;:4;:18;;;27940:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28041:1;28027:16;;:2;:16;;;28019:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;28096:38;28117:4;28123:2;28127:6;28096:20;:38::i;:::-;28147:19;28169:9;:15;28179:4;28169:15;;;;;;;;;;;;;;;;28147:37;;28218:6;28203:11;:21;;28195:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;28335:6;28321:11;:20;28303:9;:15;28313:4;28303:15;;;;;;;;;;;;;;;:38;;;;28538:6;28521:9;:13;28531:2;28521:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;28588:2;28573:26;;28582:4;28573:26;;;28592:6;28573:26;;;;;;:::i;:::-;;;;;;;;28612:37;28632:4;28638:2;28642:6;28612:19;:37::i;:::-;27929:728;27817:840;;;:::o;42864:578::-;42903:23;42929:24;42947:4;42929:9;:24::i;:::-;42903:50;;42964:12;43012:1;42993:15;:20;42989:59;;43030:7;;;;42989:59;43082:13;;43064:15;:31;43060:95;;;43130:13;;43112:31;;43060:95;43218:26;43247:15;43218:44;;43275:36;43292:18;43275:16;:36::i;:::-;43324:16;43343:21;43324:40;;43398:9;;;;;;;;;;;43390:23;;43421:8;43390:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43377:57;;;;;42892:550;;;;42864:578;:::o;9658:98::-;9716:7;9747:1;9743;:5;;;;:::i;:::-;9736:12;;9658:98;;;;:::o;10057:::-;10115:7;10146:1;10142;:5;;;;:::i;:::-;10135:12;;10057:98;;;;:::o;9301:::-;9359:7;9390:1;9386;:5;;;;:::i;:::-;9379:12;;9301:98;;;;:::o;32662:125::-;;;;:::o;33391: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:139::-;376:6;371:3;366;360:23;417:1;408:6;403:3;399:16;392:27;287:139;;;:::o;432:102::-;473:6;524:2;520:7;515:2;508:5;504:14;500:28;490:38;;432:102;;;:::o;540:377::-;628:3;656:39;689:5;656:39;:::i;:::-;711:71;775:6;770:3;711:71;:::i;:::-;704:78;;791:65;849:6;844:3;837:4;830:5;826:16;791:65;:::i;:::-;881:29;903:6;881:29;:::i;:::-;876:3;872:39;865:46;;632:285;540:377;;;;:::o;923:313::-;1036:4;1074:2;1063:9;1059:18;1051:26;;1123:9;1117:4;1113:20;1109:1;1098:9;1094:17;1087:47;1151:78;1224:4;1215:6;1151:78;:::i;:::-;1143:86;;923:313;;;;:::o;1323:117::-;1432:1;1429;1422:12;1569:126;1606:7;1646:42;1639:5;1635:54;1624:65;;1569:126;;;:::o;1701:96::-;1738:7;1767:24;1785:5;1767:24;:::i;:::-;1756:35;;1701:96;;;:::o;1803:122::-;1876:24;1894:5;1876:24;:::i;:::-;1869:5;1866:35;1856:63;;1915:1;1912;1905:12;1856:63;1803:122;:::o;1931:139::-;1977:5;2015:6;2002:20;1993:29;;2031:33;2058:5;2031:33;:::i;:::-;1931:139;;;;:::o;2076:77::-;2113:7;2142:5;2131:16;;2076:77;;;:::o;2159:122::-;2232:24;2250:5;2232:24;:::i;:::-;2225:5;2222:35;2212:63;;2271:1;2268;2261:12;2212:63;2159:122;:::o;2287:139::-;2333:5;2371:6;2358:20;2349:29;;2387:33;2414:5;2387:33;:::i;:::-;2287:139;;;;:::o;2432:474::-;2500:6;2508;2557:2;2545:9;2536:7;2532:23;2528:32;2525:119;;;2563:79;;:::i;:::-;2525:119;2683:1;2708:53;2753:7;2744:6;2733:9;2729:22;2708:53;:::i;:::-;2698:63;;2654:117;2810:2;2836:53;2881:7;2872:6;2861:9;2857:22;2836:53;:::i;:::-;2826:63;;2781:118;2432:474;;;;;:::o;2912:90::-;2946:7;2989:5;2982:13;2975:21;2964:32;;2912:90;;;:::o;3008:109::-;3089:21;3104:5;3089:21;:::i;:::-;3084:3;3077:34;3008:109;;:::o;3123:210::-;3210:4;3248:2;3237:9;3233:18;3225:26;;3261:65;3323:1;3312:9;3308:17;3299:6;3261:65;:::i;:::-;3123:210;;;;:::o;3339:329::-;3398:6;3447:2;3435:9;3426:7;3422:23;3418:32;3415:119;;;3453:79;;:::i;:::-;3415:119;3573:1;3598:53;3643:7;3634:6;3623:9;3619:22;3598:53;:::i;:::-;3588:63;;3544:117;3339:329;;;;:::o;3674:::-;3733:6;3782:2;3770:9;3761:7;3757:23;3753:32;3750:119;;;3788:79;;:::i;:::-;3750:119;3908:1;3933:53;3978:7;3969:6;3958:9;3954:22;3933:53;:::i;:::-;3923:63;;3879:117;3674:329;;;;:::o;4009:60::-;4037:3;4058:5;4051:12;;4009:60;;;:::o;4075:142::-;4125:9;4158:53;4176:34;4185:24;4203:5;4185:24;:::i;:::-;4176:34;:::i;:::-;4158:53;:::i;:::-;4145:66;;4075:142;;;:::o;4223:126::-;4273:9;4306:37;4337:5;4306:37;:::i;:::-;4293:50;;4223:126;;;:::o;4355:152::-;4431:9;4464:37;4495:5;4464:37;:::i;:::-;4451:50;;4355:152;;;:::o;4513:183::-;4626:63;4683:5;4626:63;:::i;:::-;4621:3;4614:76;4513:183;;:::o;4702:274::-;4821:4;4859:2;4848:9;4844:18;4836:26;;4872:97;4966:1;4955:9;4951:17;4942:6;4872:97;:::i;:::-;4702:274;;;;:::o;4982:118::-;5069:24;5087:5;5069:24;:::i;:::-;5064:3;5057:37;4982:118;;:::o;5106:222::-;5199:4;5237:2;5226:9;5222:18;5214:26;;5250:71;5318:1;5307:9;5303:17;5294:6;5250:71;:::i;:::-;5106:222;;;;:::o;5334:619::-;5411:6;5419;5427;5476:2;5464:9;5455:7;5451:23;5447:32;5444:119;;;5482:79;;:::i;:::-;5444:119;5602:1;5627:53;5672:7;5663:6;5652:9;5648:22;5627:53;:::i;:::-;5617:63;;5573:117;5729:2;5755:53;5800:7;5791:6;5780:9;5776:22;5755:53;:::i;:::-;5745:63;;5700:118;5857:2;5883:53;5928:7;5919:6;5908:9;5904:22;5883:53;:::i;:::-;5873:63;;5828:118;5334:619;;;;;:::o;5959:118::-;6046:24;6064:5;6046:24;:::i;:::-;6041:3;6034:37;5959:118;;:::o;6083:222::-;6176:4;6214:2;6203:9;6199:18;6191:26;;6227:71;6295:1;6284:9;6280:17;6271:6;6227:71;:::i;:::-;6083:222;;;;:::o;6311:86::-;6346:7;6386:4;6379:5;6375:16;6364:27;;6311:86;;;:::o;6403:112::-;6486:22;6502:5;6486:22;:::i;:::-;6481:3;6474:35;6403:112;;:::o;6521:214::-;6610:4;6648:2;6637:9;6633:18;6625:26;;6661:67;6725:1;6714:9;6710:17;6701:6;6661:67;:::i;:::-;6521:214;;;;:::o;6741:116::-;6811:21;6826:5;6811:21;:::i;:::-;6804:5;6801:32;6791:60;;6847:1;6844;6837:12;6791:60;6741:116;:::o;6863:133::-;6906:5;6944:6;6931:20;6922:29;;6960:30;6984:5;6960:30;:::i;:::-;6863:133;;;;:::o;7002:468::-;7067:6;7075;7124:2;7112:9;7103:7;7099:23;7095:32;7092:119;;;7130:79;;:::i;:::-;7092:119;7250:1;7275:53;7320:7;7311:6;7300:9;7296:22;7275:53;:::i;:::-;7265:63;;7221:117;7377:2;7403:50;7445:7;7436:6;7425:9;7421:22;7403:50;:::i;:::-;7393:60;;7348:115;7002:468;;;;;:::o;7476:474::-;7544:6;7552;7601:2;7589:9;7580:7;7576:23;7572:32;7569:119;;;7607:79;;:::i;:::-;7569:119;7727:1;7752:53;7797:7;7788:6;7777:9;7773:22;7752:53;:::i;:::-;7742:63;;7698:117;7854:2;7880:53;7925:7;7916:6;7905:9;7901:22;7880:53;:::i;:::-;7870:63;;7825:118;7476:474;;;;;:::o;7956:180::-;8004:77;8001:1;7994:88;8101:4;8098:1;8091:15;8125:4;8122:1;8115:15;8142:320;8186:6;8223:1;8217:4;8213:12;8203:22;;8270:1;8264:4;8260:12;8291:18;8281:81;;8347:4;8339:6;8335:17;8325:27;;8281:81;8409:2;8401:6;8398:14;8378:18;8375:38;8372:84;;8428:18;;:::i;:::-;8372:84;8193:269;8142:320;;;:::o;8468:180::-;8516:77;8513:1;8506:88;8613:4;8610:1;8603:15;8637:4;8634:1;8627:15;8654:410;8694:7;8717:20;8735:1;8717:20;:::i;:::-;8712:25;;8751:20;8769:1;8751:20;:::i;:::-;8746:25;;8806:1;8803;8799:9;8828:30;8846:11;8828:30;:::i;:::-;8817:41;;9007:1;8998:7;8994:15;8991:1;8988:22;8968:1;8961:9;8941:83;8918:139;;9037:18;;:::i;:::-;8918:139;8702:362;8654:410;;;;:::o;9070:191::-;9110:3;9129:20;9147:1;9129:20;:::i;:::-;9124:25;;9163:20;9181:1;9163:20;:::i;:::-;9158:25;;9206:1;9203;9199:9;9192:16;;9227:3;9224:1;9221:10;9218:36;;;9234:18;;:::i;:::-;9218:36;9070:191;;;;:::o;9267:147::-;9368:11;9405:3;9390:18;;9267:147;;;;:::o;9420:114::-;;:::o;9540:398::-;9699:3;9720:83;9801:1;9796:3;9720:83;:::i;:::-;9713:90;;9812:93;9901:3;9812:93;:::i;:::-;9930:1;9925:3;9921:11;9914:18;;9540:398;;;:::o;9944:379::-;10128:3;10150:147;10293:3;10150:147;:::i;:::-;10143:154;;10314:3;10307:10;;9944:379;;;:::o;10329:172::-;10469:24;10465:1;10457:6;10453:14;10446:48;10329:172;:::o;10507:366::-;10649:3;10670:67;10734:2;10729:3;10670:67;:::i;:::-;10663:74;;10746:93;10835:3;10746:93;:::i;:::-;10864:2;10859:3;10855:12;10848:19;;10507:366;;;:::o;10879:419::-;11045:4;11083:2;11072:9;11068:18;11060:26;;11132:9;11126:4;11122:20;11118:1;11107:9;11103:17;11096:47;11160:131;11286:4;11160:131;:::i;:::-;11152:139;;10879:419;;;:::o;11304:173::-;11444:25;11440:1;11432:6;11428:14;11421:49;11304:173;:::o;11483:366::-;11625:3;11646:67;11710:2;11705:3;11646:67;:::i;:::-;11639:74;;11722:93;11811:3;11722:93;:::i;:::-;11840:2;11835:3;11831:12;11824:19;;11483:366;;;:::o;11855:419::-;12021:4;12059:2;12048:9;12044:18;12036:26;;12108:9;12102:4;12098:20;12094:1;12083:9;12079:17;12072:47;12136:131;12262:4;12136:131;:::i;:::-;12128:139;;11855:419;;;:::o;12280:162::-;12420:14;12416:1;12408:6;12404:14;12397:38;12280:162;:::o;12448:366::-;12590:3;12611:67;12675:2;12670:3;12611:67;:::i;:::-;12604:74;;12687:93;12776:3;12687:93;:::i;:::-;12805:2;12800:3;12796:12;12789:19;;12448:366;;;:::o;12820:419::-;12986:4;13024:2;13013:9;13009:18;13001:26;;13073:9;13067:4;13063:20;13059:1;13048:9;13044:17;13037:47;13101:131;13227:4;13101:131;:::i;:::-;13093:139;;12820:419;;;:::o;13245:244::-;13385:34;13381:1;13373:6;13369:14;13362:58;13454:27;13449:2;13441:6;13437:15;13430:52;13245:244;:::o;13495:366::-;13637:3;13658:67;13722:2;13717:3;13658:67;:::i;:::-;13651:74;;13734:93;13823:3;13734:93;:::i;:::-;13852:2;13847:3;13843:12;13836:19;;13495:366;;;:::o;13867:419::-;14033:4;14071:2;14060:9;14056:18;14048:26;;14120:9;14114:4;14110:20;14106:1;14095:9;14091:17;14084:47;14148:131;14274:4;14148:131;:::i;:::-;14140:139;;13867:419;;;:::o;14292:224::-;14432:34;14428:1;14420:6;14416:14;14409:58;14501:7;14496:2;14488:6;14484:15;14477:32;14292:224;:::o;14522:366::-;14664:3;14685:67;14749:2;14744:3;14685:67;:::i;:::-;14678:74;;14761:93;14850:3;14761:93;:::i;:::-;14879:2;14874:3;14870:12;14863:19;;14522:366;;;:::o;14894:419::-;15060:4;15098:2;15087:9;15083:18;15075:26;;15147:9;15141:4;15137:20;15133:1;15122:9;15118:17;15111:47;15175:131;15301:4;15175:131;:::i;:::-;15167:139;;14894:419;;;:::o;15319:85::-;15364:7;15393:5;15382:16;;15319:85;;;:::o;15410:158::-;15468:9;15501:61;15519:42;15528:32;15554:5;15528:32;:::i;:::-;15519:42;:::i;:::-;15501:61;:::i;:::-;15488:74;;15410:158;;;:::o;15574:147::-;15669:45;15708:5;15669:45;:::i;:::-;15664:3;15657:58;15574:147;;:::o;15727:807::-;15976:4;16014:3;16003:9;15999:19;15991:27;;16028:71;16096:1;16085:9;16081:17;16072:6;16028:71;:::i;:::-;16109:72;16177:2;16166:9;16162:18;16153:6;16109:72;:::i;:::-;16191:80;16267:2;16256:9;16252:18;16243:6;16191:80;:::i;:::-;16281;16357:2;16346:9;16342:18;16333:6;16281:80;:::i;:::-;16371:73;16439:3;16428:9;16424:19;16415:6;16371:73;:::i;:::-;16454;16522:3;16511:9;16507:19;16498:6;16454:73;:::i;:::-;15727:807;;;;;;;;;:::o;16540:143::-;16597:5;16628:6;16622:13;16613:22;;16644:33;16671:5;16644:33;:::i;:::-;16540:143;;;;:::o;16689:663::-;16777:6;16785;16793;16842:2;16830:9;16821:7;16817:23;16813:32;16810:119;;;16848:79;;:::i;:::-;16810:119;16968:1;16993:64;17049:7;17040:6;17029:9;17025:22;16993:64;:::i;:::-;16983:74;;16939:128;17106:2;17132:64;17188:7;17179:6;17168:9;17164:22;17132:64;:::i;:::-;17122:74;;17077:129;17245:2;17271:64;17327:7;17318:6;17307:9;17303:22;17271:64;:::i;:::-;17261:74;;17216:129;16689:663;;;;;:::o;17358:332::-;17479:4;17517:2;17506:9;17502:18;17494:26;;17530:71;17598:1;17587:9;17583:17;17574:6;17530:71;:::i;:::-;17611:72;17679:2;17668:9;17664:18;17655:6;17611:72;:::i;:::-;17358:332;;;;;:::o;17696:137::-;17750:5;17781:6;17775:13;17766:22;;17797:30;17821:5;17797:30;:::i;:::-;17696:137;;;;:::o;17839:345::-;17906:6;17955:2;17943:9;17934:7;17930:23;17926:32;17923:119;;;17961:79;;:::i;:::-;17923:119;18081:1;18106:61;18159:7;18150:6;18139:9;18135:22;18106:61;:::i;:::-;18096:71;;18052:125;17839:345;;;;:::o;18190:171::-;18330:23;18326:1;18318:6;18314:14;18307:47;18190:171;:::o;18367:366::-;18509:3;18530:67;18594:2;18589:3;18530:67;:::i;:::-;18523:74;;18606:93;18695:3;18606:93;:::i;:::-;18724:2;18719:3;18715:12;18708:19;;18367:366;;;:::o;18739:419::-;18905:4;18943:2;18932:9;18928:18;18920:26;;18992:9;18986:4;18982:20;18978:1;18967:9;18963:17;18956:47;19020:131;19146:4;19020:131;:::i;:::-;19012:139;;18739:419;;;:::o;19164:225::-;19304:34;19300:1;19292:6;19288:14;19281:58;19373:8;19368:2;19360:6;19356:15;19349:33;19164:225;:::o;19395:366::-;19537:3;19558:67;19622:2;19617:3;19558:67;:::i;:::-;19551:74;;19634:93;19723:3;19634:93;:::i;:::-;19752:2;19747:3;19743:12;19736:19;;19395:366;;;:::o;19767:419::-;19933:4;19971:2;19960:9;19956:18;19948:26;;20020:9;20014:4;20010:20;20006:1;19995:9;19991:17;19984:47;20048:131;20174:4;20048:131;:::i;:::-;20040:139;;19767:419;;;:::o;20192:194::-;20232:4;20252:20;20270:1;20252:20;:::i;:::-;20247:25;;20286:20;20304:1;20286:20;:::i;:::-;20281:25;;20330:1;20327;20323:9;20315:17;;20354:1;20348:4;20345:11;20342:37;;;20359:18;;:::i;:::-;20342:37;20192:194;;;;:::o;20392:180::-;20440:77;20437:1;20430:88;20537:4;20534:1;20527:15;20561:4;20558:1;20551:15;20578:185;20618:1;20635:20;20653:1;20635:20;:::i;:::-;20630:25;;20669:20;20687:1;20669:20;:::i;:::-;20664:25;;20708:1;20698:35;;20713:18;;:::i;:::-;20698:35;20755:1;20752;20748:9;20743:14;;20578:185;;;;:::o;20769:223::-;20909:34;20905:1;20897:6;20893:14;20886:58;20978:6;20973:2;20965:6;20961:15;20954:31;20769:223;:::o;20998:366::-;21140:3;21161:67;21225:2;21220:3;21161:67;:::i;:::-;21154:74;;21237:93;21326:3;21237:93;:::i;:::-;21355:2;21350:3;21346:12;21339:19;;20998:366;;;:::o;21370:419::-;21536:4;21574:2;21563:9;21559:18;21551:26;;21623:9;21617:4;21613:20;21609:1;21598:9;21594:17;21587:47;21651:131;21777:4;21651:131;:::i;:::-;21643:139;;21370:419;;;:::o;21795:221::-;21935:34;21931:1;21923:6;21919:14;21912:58;22004:4;21999:2;21991:6;21987:15;21980:29;21795:221;:::o;22022:366::-;22164:3;22185:67;22249:2;22244:3;22185:67;:::i;:::-;22178:74;;22261:93;22350:3;22261:93;:::i;:::-;22379:2;22374:3;22370:12;22363:19;;22022:366;;;:::o;22394:419::-;22560:4;22598:2;22587:9;22583:18;22575:26;;22647:9;22641:4;22637:20;22633:1;22622:9;22618:17;22611:47;22675:131;22801:4;22675:131;:::i;:::-;22667:139;;22394:419;;;:::o;22819:179::-;22959:31;22955:1;22947:6;22943:14;22936:55;22819:179;:::o;23004:366::-;23146:3;23167:67;23231:2;23226:3;23167:67;:::i;:::-;23160:74;;23243:93;23332:3;23243:93;:::i;:::-;23361:2;23356:3;23352:12;23345:19;;23004:366;;;:::o;23376:419::-;23542:4;23580:2;23569:9;23565:18;23557:26;;23629:9;23623:4;23619:20;23615:1;23604:9;23600:17;23593:47;23657:131;23783:4;23657:131;:::i;:::-;23649:139;;23376:419;;;:::o;23801:224::-;23941:34;23937:1;23929:6;23925:14;23918:58;24010:7;24005:2;23997:6;23993:15;23986:32;23801:224;:::o;24031:366::-;24173:3;24194:67;24258:2;24253:3;24194:67;:::i;:::-;24187:74;;24270:93;24359:3;24270:93;:::i;:::-;24388:2;24383:3;24379:12;24372:19;;24031:366;;;:::o;24403:419::-;24569:4;24607:2;24596:9;24592:18;24584:26;;24656:9;24650:4;24646:20;24642:1;24631:9;24627:17;24620:47;24684:131;24810:4;24684:131;:::i;:::-;24676:139;;24403:419;;;:::o;24828:222::-;24968:34;24964:1;24956:6;24952:14;24945:58;25037:5;25032:2;25024:6;25020:15;25013:30;24828:222;:::o;25056:366::-;25198:3;25219:67;25283:2;25278:3;25219:67;:::i;:::-;25212:74;;25295:93;25384:3;25295:93;:::i;:::-;25413:2;25408:3;25404:12;25397:19;;25056:366;;;:::o;25428:419::-;25594:4;25632:2;25621:9;25617:18;25609:26;;25681:9;25675:4;25671:20;25667:1;25656:9;25652:17;25645:47;25709:131;25835:4;25709:131;:::i;:::-;25701:139;;25428:419;;;:::o;25853:172::-;25993:24;25989:1;25981:6;25977:14;25970:48;25853:172;:::o;26031:366::-;26173:3;26194:67;26258:2;26253:3;26194:67;:::i;:::-;26187:74;;26270:93;26359:3;26270:93;:::i;:::-;26388:2;26383:3;26379:12;26372:19;;26031:366;;;:::o;26403:419::-;26569:4;26607:2;26596:9;26592:18;26584:26;;26656:9;26650:4;26646:20;26642:1;26631:9;26627:17;26620:47;26684:131;26810:4;26684:131;:::i;:::-;26676:139;;26403:419;;;:::o;26828:169::-;26968:21;26964:1;26956:6;26952:14;26945:45;26828:169;:::o;27003:366::-;27145:3;27166:67;27230:2;27225:3;27166:67;:::i;:::-;27159:74;;27242:93;27331:3;27242:93;:::i;:::-;27360:2;27355:3;27351:12;27344:19;;27003:366;;;:::o;27375:419::-;27541:4;27579:2;27568:9;27564:18;27556:26;;27628:9;27622:4;27618:20;27614:1;27603:9;27599:17;27592:47;27656:131;27782:4;27656:131;:::i;:::-;27648:139;;27375:419;;;:::o;27800:182::-;27940:34;27936:1;27928:6;27924:14;27917:58;27800:182;:::o;27988:366::-;28130:3;28151:67;28215:2;28210:3;28151:67;:::i;:::-;28144:74;;28227:93;28316:3;28227:93;:::i;:::-;28345:2;28340:3;28336:12;28329:19;;27988:366;;;:::o;28360:419::-;28526:4;28564:2;28553:9;28549:18;28541:26;;28613:9;28607:4;28603:20;28599:1;28588:9;28584:17;28577:47;28641:131;28767:4;28641:131;:::i;:::-;28633:139;;28360:419;;;:::o;28785:180::-;28833:77;28830:1;28823:88;28930:4;28927:1;28920:15;28954:4;28951:1;28944:15;28971:180;29019:77;29016:1;29009:88;29116:4;29113:1;29106:15;29140:4;29137:1;29130:15;29157:143;29214:5;29245:6;29239:13;29230:22;;29261:33;29288:5;29261:33;:::i;:::-;29157:143;;;;:::o;29306:351::-;29376:6;29425:2;29413:9;29404:7;29400:23;29396:32;29393:119;;;29431:79;;:::i;:::-;29393:119;29551:1;29576:64;29632:7;29623:6;29612:9;29608:22;29576:64;:::i;:::-;29566:74;;29522:128;29306:351;;;;:::o;29663:114::-;29730:6;29764:5;29758:12;29748:22;;29663:114;;;:::o;29783:184::-;29882:11;29916:6;29911:3;29904:19;29956:4;29951:3;29947:14;29932:29;;29783:184;;;;:::o;29973:132::-;30040:4;30063:3;30055:11;;30093:4;30088:3;30084:14;30076:22;;29973:132;;;:::o;30111:108::-;30188:24;30206:5;30188:24;:::i;:::-;30183:3;30176:37;30111:108;;:::o;30225:179::-;30294:10;30315:46;30357:3;30349:6;30315:46;:::i;:::-;30393:4;30388:3;30384:14;30370:28;;30225:179;;;;:::o;30410:113::-;30480:4;30512;30507:3;30503:14;30495:22;;30410:113;;;:::o;30559:732::-;30678:3;30707:54;30755:5;30707:54;:::i;:::-;30777:86;30856:6;30851:3;30777:86;:::i;:::-;30770:93;;30887:56;30937:5;30887:56;:::i;:::-;30966:7;30997:1;30982:284;31007:6;31004:1;31001:13;30982:284;;;31083:6;31077:13;31110:63;31169:3;31154:13;31110:63;:::i;:::-;31103:70;;31196:60;31249:6;31196:60;:::i;:::-;31186:70;;31042:224;31029:1;31026;31022:9;31017:14;;30982:284;;;30986:14;31282:3;31275:10;;30683:608;;;30559:732;;;;:::o;31297:831::-;31560:4;31598:3;31587:9;31583:19;31575:27;;31612:71;31680:1;31669:9;31665:17;31656:6;31612:71;:::i;:::-;31693:80;31769:2;31758:9;31754:18;31745:6;31693:80;:::i;:::-;31820:9;31814:4;31810:20;31805:2;31794:9;31790:18;31783:48;31848:108;31951:4;31942:6;31848:108;:::i;:::-;31840:116;;31966:72;32034:2;32023:9;32019:18;32010:6;31966:72;:::i;:::-;32048:73;32116:3;32105:9;32101:19;32092:6;32048:73;:::i;:::-;31297:831;;;;;;;;:::o;32134:225::-;32274:34;32270:1;32262:6;32258:14;32251:58;32343:8;32338:2;32330:6;32326:15;32319:33;32134:225;:::o;32365:366::-;32507:3;32528:67;32592:2;32587:3;32528:67;:::i;:::-;32521:74;;32604:93;32693:3;32604:93;:::i;:::-;32722:2;32717:3;32713:12;32706:19;;32365:366;;;:::o;32737:419::-;32903:4;32941:2;32930:9;32926:18;32918:26;;32990:9;32984:4;32980:20;32976:1;32965:9;32961:17;32954:47;33018:131;33144:4;33018:131;:::i;:::-;33010:139;;32737:419;;;:::o

Swarm Source

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