ETH Price: $2,873.44 (-5.83%)
Gas: 1 Gwei

Token

LIQ (LiqShares)
 

Overview

Max Total Supply

1,000,000,000 LiqShares

Holders

433

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
712,325.158347655807637782 LiqShares

Value
$0.00
0x23097b6aba22896e3c1e5e2e79d8efad0c4a011e
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:
LiqShares

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-23
*/

// SPDX-License-Identifier: MIT

/*
Stake $LIQ earn LP

LiqBot: https://t.me/LiqSharesBot
Website: https://liqshares.com/
Twitter: https://twitter.com/LIQshares_
Telegram: https://t.me/LiqShares
*/

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/[email protected]

// OpenZeppelin Contracts (last updated v4.9.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. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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/[email protected]

// OpenZeppelin Contracts (last updated v4.9.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/interfaces/[email protected]

// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol)

pragma solidity ^0.8.0;

// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]

// 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/[email protected]

// OpenZeppelin Contracts (last updated v4.9.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].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * 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}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

        _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 contracts/ILPDiv.sol

pragma solidity ^0.8.6;

interface DividendPayingTokenInterface {
    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function dividendOf(address _owner) external view returns (uint256);

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
    ///  MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
    function withdrawDividend() external;

    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function withdrawableDividendOf(address _owner)
    external
    view
    returns (uint256);

    /// @notice View the amount of dividend in wei that an address has withdrawn.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has withdrawn.
    function withdrawnDividendOf(address _owner)
    external
    view
    returns (uint256);

    /// @notice View the amount of dividend in wei that an address has earned in total.
    /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has earned in total.
    function accumulativeDividendOf(address _owner)
    external
    view
    returns (uint256);

    /// @dev This event MUST emit when ether is distributed to token holders.
    /// @param from The address which sends ether to this contract.
    /// @param weiAmount The amount of distributed ether in wei.
    event DividendsDistributed(address indexed from, uint256 weiAmount);

    /// @dev This event MUST emit when an address withdraws their dividend.
    /// @param to The address which withdraws ether from this contract.
    /// @param weiAmount The amount of withdrawn ether in wei.
    event DividendWithdrawn(address indexed to, uint256 weiAmount);
}

// File contracts/SafeMath.sol

pragma solidity ^0.8.6;

library SafeMath {
    /**
     * @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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @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 sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @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) {
        // 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 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @title SafeMathInt
 * @dev Math operations for int256 with overflow safety checks.
 */
library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

/**
 * @title SafeMathUint
 * @dev Math operations with safety checks that revert on error
 */
library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

// File contracts/LPDiv.sol

pragma solidity ^0.8.10;

interface IPair {
    function getReserves()
    external
    view
    returns (
        uint112 reserve0,
        uint112 reserve1,
        uint32 blockTimestampLast
    );

    function token0() external view returns (address);
}

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

    function getPair(address tokenA, address tokenB)
    external
    view
    returns (address pair);
}

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

    function WETH() external pure returns (address);

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

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

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

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

contract DividendPayingToken is ERC20, DividendPayingTokenInterface, Ownable {
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    address public LP_Token;

    // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
    // For more discussion about choosing the value of `magnitude`,
    //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
    uint256 internal constant magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;

    // About dividendCorrection:
    // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
    //   `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
    // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
    //   `dividendOf(_user)` should not be changed,
    //   but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
    // To keep the `dividendOf(_user)` unchanged, we add a correction term:
    //   `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
    //   where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
    //   `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
    // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    uint256 public totalDividendsDistributed;
    uint256 public totalDividendsWithdrawn;

    constructor(string memory _name, string memory _symbol)
    ERC20(_name, _symbol)
    {}

    function distributeLPDividends(uint256 amount) public onlyOwner {
        require(totalSupply() > 0);

        if (amount > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (amount).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, amount);

            totalDividendsDistributed = totalDividendsDistributed.add(amount);
        }
    }

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
    function _withdrawDividendOfUser(address payable user)
    internal
    returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            totalDividendsWithdrawn += _withdrawableDividend;
            emit DividendWithdrawn(user, _withdrawableDividend);
            bool success = IERC20(LP_Token).transfer(
                user,
                _withdrawableDividend
            );

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _withdrawableDividend
                );
                totalDividendsWithdrawn -= _withdrawableDividend;
                return 0;
            }

            return _withdrawableDividend;
        }

        return 0;
    }

    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function dividendOf(address _owner) public view override returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function withdrawableDividendOf(address _owner)
    public
    view
    override
    returns (uint256)
    {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    /// @notice View the amount of dividend in wei that an address has withdrawn.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has withdrawn.
    function withdrawnDividendOf(address _owner)
    public
    view
    override
    returns (uint256)
    {
        return withdrawnDividends[_owner];
    }

    /// @notice View the amount of dividend in wei that an address has earned in total.
    /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
    /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has earned in total.
    function accumulativeDividendOf(address _owner)
    public
    view
    override
    returns (uint256)
    {
        return
            magnifiedDividendPerShare
            .mul(balanceOf(_owner))
            .toInt256Safe()
            .add(magnifiedDividendCorrections[_owner])
            .toUint256Safe() / magnitude;
    }

    /// @dev Internal function that transfer tokens from one address to another.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param from The address to transfer from.
    /// @param to The address to transfer to.
    /// @param value The amount to be transferred.
    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        require(false);

        int256 _magCorrection = magnifiedDividendPerShare
            .mul(value)
            .toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from]
            .add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(
            _magCorrection
        );
    }

    /// @dev Internal function that mints tokens to an account.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param account The account that will receive the created tokens.
    /// @param value The amount that will be created.
    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
                    account
            ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    /// @dev Internal function that burns an amount of the token of a given account.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param account The account whose tokens will be burnt.
    /// @param value The amount that will be burnt.
    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
                    account
            ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);

        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }
}

pragma solidity ^0.8.21;

contract LiqShares is ERC20, Ownable {
    IUniswapRouter public router;
    address public pair;

    bool private swapping;
    bool public swapEnabled = true;
    bool public claimEnabled;
    bool public tradingEnabled;

    DividendTracker public dividendTracker;

    address public devWallet;

    uint256 public swapTokensAtAmount;
    uint256 public maxBuyAmount;
    uint256 public maxSellAmount;
    uint256 public maxWallet;

    struct Taxes {
        uint256 liquidity;
        uint256 dev;
    }

    Taxes public buyTaxes = Taxes(3, 2);
    Taxes public sellTaxes = Taxes(3, 2);

    uint256 public totalBuyTax = 5;
    uint256 public totalSellTax = 5;

    uint256 private _initialTax = 20;
    uint256 private _reduceTaxAt = 30;
    uint256 private _buyCount = 0;
    uint256 private _sellCount = 0;

    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public automatedMarketMakerPairs;
    mapping(address => bool) private _isExcludedFromMaxWallet;

    ///////////////
    //   Events  //
    ///////////////

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event GasForProcessingUpdated(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );
    event SendDividends(uint256 tokensSwapped, uint256 amount);
    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    constructor() ERC20("LIQ", "LiqShares") {
        dividendTracker = new DividendTracker();
        setDevWallet(_msgSender());

        IUniswapRouter _router = IUniswapRouter(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        address _pair = IFactory(_router.factory()).createPair(
            address(this),
            _router.WETH()
        );

        router = _router;
        pair = _pair;
        setSwapTokensAtAmount(3000000); //
        updateMaxWalletAmount(20000000);
        setMaxBuyAndSell(20000000, 20000000);

        _setAutomatedMarketMakerPair(_pair, true);

        dividendTracker.updateLP_Token(pair);

        dividendTracker.excludeFromDividends(address(dividendTracker), true);
        dividendTracker.excludeFromDividends(address(this), true);
        dividendTracker.excludeFromDividends(owner(), true);
        dividendTracker.excludeFromDividends(address(0xdead), true);
        dividendTracker.excludeFromDividends(address(_router), true);

        excludeFromMaxWallet(address(_pair), true);
        excludeFromMaxWallet(address(this), true);
        excludeFromMaxWallet(address(_router), true);

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

        _mint(owner(), 1000000000 * (10**18));
    }

    receive() external payable {}

    function updateDividendTracker(address newAddress) public onlyOwner {
        DividendTracker newDividendTracker = DividendTracker(
            payable(newAddress)
        );
        newDividendTracker.excludeFromDividends(
            address(newDividendTracker),
            true
        );
        newDividendTracker.excludeFromDividends(address(this), true);
        newDividendTracker.excludeFromDividends(owner(), true);
        newDividendTracker.excludeFromDividends(address(router), true);
        dividendTracker = newDividendTracker;
    }

    /// @notice Manual claim the dividends
    function claim() external {
        require(claimEnabled, "Claim not enabled");
        dividendTracker.processAccount(payable(msg.sender));
    }

    function updateMaxWalletAmount(uint256 newNum) public onlyOwner {
        require(newNum >= 10000000, "Cannot set maxWallet lower than 1%");
        maxWallet = newNum * 10**18;
    }

    function setMaxBuyAndSell(uint256 maxBuy, uint256 maxSell)
    public
    onlyOwner
    {
        require(maxBuy >= 10000000, "Cannot set maxbuy lower than 1% ");
        require(maxSell >= 5000000, "Cannot set maxsell lower than 0.5% ");
        maxBuyAmount = maxBuy * 10**18;
        maxSellAmount = maxSell * 10**18;
    }

    function setSwapTokensAtAmount(uint256 amount) public onlyOwner {
        swapTokensAtAmount = amount * 10**18;
    }

    function excludeFromMaxWallet(address account, bool excluded)
    public
    onlyOwner
    {
        _isExcludedFromMaxWallet[account] = excluded;
    }

    /// @notice Withdraw tokens sent by mistake.
    /// @param tokenAddress The address of the token to withdraw
    function rescueETH20Tokens(address tokenAddress) external onlyOwner {
        IERC20(tokenAddress).transfer(
            owner(),
            IERC20(tokenAddress).balanceOf(address(this))
        );
    }

    /// @notice Send remaining ETH to dev
    /// @dev It will send all ETH to dev
    function forceSend() external onlyOwner {
        uint256 ETHbalance = address(this).balance;
        (bool success, ) = payable(devWallet).call{value: ETHbalance}("");
        require(success);
    }

    function trackerRescueETH20Tokens(address tokenAddress) external onlyOwner {
        dividendTracker.trackerRescueETH20Tokens(msg.sender, tokenAddress);
    }

    function updateRouter(address newRouter) external onlyOwner {
        router = IUniswapRouter(newRouter);
    }

    /////////////////////////////////
    // Exclude / Include functions //
    /////////////////////////////////

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(
            _isExcludedFromFees[account] != excluded,
            "Account is already the value of 'excluded'"
        );
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    /// @dev "true" to exlcude, "false" to include
    function excludeFromDividends(address account, bool value)
    public
    onlyOwner
    {
        dividendTracker.excludeFromDividends(account, value);
    }

    function setDevWallet(address newWallet) public onlyOwner {
        devWallet = newWallet;
    }

    /// @notice Enable or disable internal swaps
    /// @dev Set "true" to enable internal swaps for liquidity, treasury and dividends
    function setSwapEnabled(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
    }

    function activateTrading() external onlyOwner {
        require(!tradingEnabled, "Trading already enabled");
        tradingEnabled = true;
    }

    function setClaimEnabled(bool state) external onlyOwner {
        claimEnabled = state;
    }

    function setLP_Token(address _lpToken) external onlyOwner {
        dividendTracker.updateLP_Token(_lpToken);
    }

    /// @dev Set new pairs created due to listing in new DEX
    function setAutomatedMarketMakerPair(address newPair, bool value)
    external
    onlyOwner
    {
        _setAutomatedMarketMakerPair(newPair, value);
    }

    function _setAutomatedMarketMakerPair(address newPair, bool value) private {
        require(
            automatedMarketMakerPairs[newPair] != value,
            "Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[newPair] = value;

        if (value) {
            dividendTracker.excludeFromDividends(newPair, true);
        }

        emit SetAutomatedMarketMakerPair(newPair, value);
    }

    //////////////////////
    // Getter Functions //
    //////////////////////

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function withdrawableDividendOf(address account)
    public
    view
    returns (uint256)
    {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function dividendTokenBalanceOf(address account)
    public
    view
    returns (uint256)
    {
        return dividendTracker.balanceOf(account);
    }

    function getAccountInfo(address account)
    external
    view
    returns (
        address,
        uint256,
        uint256,
        uint256,
        uint256
    )
    {
        return dividendTracker.getAccount(account);
    }

    ////////////////////////
    // Transfer Functions //
    ////////////////////////

    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 (
            !_isExcludedFromFees[from] && !_isExcludedFromFees[to] && !swapping
        ) {
            require(tradingEnabled, "Trading not active");
            if (automatedMarketMakerPairs[to]) {
                require(
                    amount <= maxSellAmount,
                    "You are exceeding maxSellAmount"
                );
                _sellCount++;
            } else if (automatedMarketMakerPairs[from]) {
                require(
                    amount <= maxBuyAmount,
                    "You are exceeding maxBuyAmount"
                );
                _buyCount++;
            }
            if (!_isExcludedFromMaxWallet[to]) {
                require(
                    amount + balanceOf(to) <= maxWallet,
                    "Unable to exceed Max Wallet"
                );
            }
        }

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

        uint256 contractTokenBalance = balanceOf(address(this));
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            !swapping &&
            swapEnabled &&
            automatedMarketMakerPairs[to] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            if (totalSellTax > 0) {
                swapAndLiquify(swapTokensAtAmount);
            }

            swapping = false;
        }

        bool takeFee = !swapping;

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

        if (!automatedMarketMakerPairs[to] && !automatedMarketMakerPairs[from])
            takeFee = false;

        if (takeFee) {
            uint256 feeAmt;
            if (automatedMarketMakerPairs[to]) {
                feeAmt =
                    (amount *
                        (
                            _sellCount > _reduceTaxAt
                                ? totalSellTax
                                : _initialTax
                        )) /
                    100;
            } else if (automatedMarketMakerPairs[from]) {
                feeAmt =
                    (amount *
                        (
                            _buyCount > _reduceTaxAt ? totalBuyTax : _initialTax
                        )) /
                    100;
            }

            amount = amount - feeAmt;
            super._transfer(from, address(this), feeAmt);
        }
        super._transfer(from, to, amount);

        try dividendTracker.setBalance(from, balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(to, balanceOf(to)) {} catch {}
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 toSwapForLiq = ((tokens * sellTaxes.liquidity) / totalSellTax) /
                    2;
        uint256 tokensToAddLiquidityWith = ((tokens * sellTaxes.liquidity) /
            totalSellTax) / 2;
        uint256 toSwapForDev = (tokens * sellTaxes.dev) / totalSellTax;

        swapTokensForETH(toSwapForLiq);

        uint256 currentbalance = address(this).balance;

        if (currentbalance > 0) {
            // Add liquidity to uni
            addLiquidity(tokensToAddLiquidityWith, currentbalance);
        }

        swapTokensForETH(toSwapForDev);

        uint256 EthTaxBalance = address(this).balance;

        // Send ETH to dev
        uint256 devAmt = EthTaxBalance;

        if (devAmt > 0) {
            (bool success, ) = payable(devWallet).call{value: devAmt}("");
            require(success, "Failed to send ETH to dev wallet");
        }

        uint256 lpBalance = IERC20(pair).balanceOf(address(this));

        //Send LP to dividends
        uint256 dividends = lpBalance;

        if (dividends > 0) {
            bool success = IERC20(pair).transfer(
                address(dividendTracker),
                dividends
            );
            if (success) {
                dividendTracker.distributeLPDividends(dividends);
                emit SendDividends(tokens, dividends);
            }
        }
    }

    // transfers LP from the owners wallet to holders // must approve this contract, on pair contract before calling
    function ManualLiquidityDistribution(uint256 amount) public onlyOwner {
        bool success = IERC20(pair).transferFrom(
            msg.sender,
            address(dividendTracker),
            amount
        );
        if (success) {
            dividendTracker.distributeLPDividends(amount);
        }
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

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

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(router), tokenAmount);

        // add the liquidity
        router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(this),
            block.timestamp
        );
    }
}

contract DividendTracker is Ownable, DividendPayingToken {
    struct AccountInfo {
        address account;
        uint256 withdrawableDividends;
        uint256 totalDividends;
        uint256 lastClaimTime;
    }

    mapping(address => bool) public excludedFromDividends;

    mapping(address => uint256) public lastClaimTimes;

    event ExcludeFromDividends(address indexed account, bool value);
    event Claim(address indexed account, uint256 amount);

    constructor()
    DividendPayingToken("LIQ_Dividend_Tracker", "LIQ_Dividend_Tracker")
    {}

    function trackerRescueETH20Tokens(address recipient, address tokenAddress)
    external
    onlyOwner
    {
        IERC20(tokenAddress).transfer(
            recipient,
            IERC20(tokenAddress).balanceOf(address(this))
        );
    }

    function updateLP_Token(address _lpToken) external onlyOwner {
        LP_Token = _lpToken;
    }

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "LIQ_Dividend_Tracker: No transfers allowed");
    }

    function excludeFromDividends(address account, bool value)
    external
    onlyOwner
    {
        require(excludedFromDividends[account] != value);
        excludedFromDividends[account] = value;
        if (value == true) {
            _setBalance(account, 0);
        } else {
            _setBalance(account, balanceOf(account));
        }
        emit ExcludeFromDividends(account, value);
    }

    function getAccount(address account)
    public
    view
    returns (
        address,
        uint256,
        uint256,
        uint256,
        uint256
    )
    {
        AccountInfo memory info;
        info.account = account;
        info.withdrawableDividends = withdrawableDividendOf(account);
        info.totalDividends = accumulativeDividendOf(account);
        info.lastClaimTime = lastClaimTimes[account];
        return (
            info.account,
            info.withdrawableDividends,
            info.totalDividends,
            info.lastClaimTime,
            totalDividendsWithdrawn
        );
    }

    function setBalance(address account, uint256 newBalance)
    external
    onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }
        _setBalance(account, newBalance);
    }

    function processAccount(address payable account)
    external
    onlyOwner
    returns (bool)
    {
        uint256 amount = _withdrawDividendOfUser(account);

        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount);
            return true;
        }
        return false;
    }
}

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":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","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":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","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":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"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ManualLiquidityDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","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":"buyTaxes","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"dev","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"excludeFromDividends","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":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellAmount","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":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"rescueETH20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxes","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"dev","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setClaimEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"}],"name":"setLP_Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBuy","type":"uint256"},{"internalType":"uint256","name":"maxSell","type":"uint256"}],"name":"setMaxBuyAndSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBuyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"trackerRescueETH20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526001600760156101000a81548160ff0219169083151502179055506040518060400160405280600381526020016002815250600e5f820151815f0155602082015181600101555050604051806040016040528060038152602001600281525060105f820151815f01556020820151816001015550506005601255600560135560148055601e6015555f6016555f601755348015620000a0575f80fd5b506040518060400160405280600381526020017f4c495100000000000000000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f4c6971536861726573000000000000000000000000000000000000000000000081525081600390816200011e919062001321565b50806004908162000130919062001321565b50505062000153620001476200086d60201b60201c565b6200087460201b60201c565b6040516200016190620010af565b604051809103905ff0801580156200017b573d5f803e3d5ffd5b5060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001db620001cf6200086d60201b60201c565b6200093760201b60201c565b5f737a250d5630b4cf539739df2c5dacb4c659f2488d90505f8173ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200023e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200026491906200146a565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308473ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002ca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002f091906200146a565b6040518363ffffffff1660e01b81526004016200030f929190620014ab565b6020604051808303815f875af11580156200032c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200035291906200146a565b90508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003e8622dc6c06200098a60201b60201c565b620003fd6301312d00620009b960201b60201c565b620004136301312d008062000a3160201b60201c565b6200042681600162000b0f60201b60201c565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166344b6bd9e60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401620004a39190620014d6565b5f604051808303815f87803b158015620004bb575f80fd5b505af1158015620004ce573d5f803e3d5ffd5b5050505060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630483f7a060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016040518363ffffffff1660e01b8152600401620005529291906200150d565b5f604051808303815f87803b1580156200056a575f80fd5b505af11580156200057d573d5f803e3d5ffd5b5050505060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630483f7a03060016040518363ffffffff1660e01b8152600401620005e09291906200150d565b5f604051808303815f87803b158015620005f8575f80fd5b505af11580156200060b573d5f803e3d5ffd5b5050505060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630483f7a06200065c62000cd560201b60201c565b60016040518363ffffffff1660e01b81526004016200067d9291906200150d565b5f604051808303815f87803b15801562000695575f80fd5b505af1158015620006a8573d5f803e3d5ffd5b5050505060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630483f7a061dead60016040518363ffffffff1660e01b81526004016200070d9291906200150d565b5f604051808303815f87803b15801562000725575f80fd5b505af115801562000738573d5f803e3d5ffd5b5050505060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630483f7a08360016040518363ffffffff1660e01b81526004016200079b9291906200150d565b5f604051808303815f87803b158015620007b3575f80fd5b505af1158015620007c6573d5f803e3d5ffd5b50505050620007dd81600162000cfd60201b60201c565b620007f030600162000cfd60201b60201c565b6200080382600162000cfd60201b60201c565b620008256200081762000cd560201b60201c565b600162000d6560201b60201c565b6200083830600162000d6560201b60201c565b620008656200084c62000cd560201b60201c565b6b033b2e3c9fd0803ce800000062000eaf60201b60201c565b5050620019da565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620009476200101460201b60201c565b8060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6200099a6200101460201b60201c565b670de0b6b3a764000081620009b0919062001565565b600a8190555050565b620009c96200101460201b60201c565b6298968081101562000a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a099062001633565b60405180910390fd5b670de0b6b3a76400008162000a28919062001565565b600d8190555050565b62000a416200101460201b60201c565b6298968082101562000a8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a8190620016a1565b60405180910390fd5b624c4b4081101562000ad3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000aca9062001735565b60405180910390fd5b670de0b6b3a76400008262000ae9919062001565565b600b81905550670de0b6b3a76400008162000b05919062001565565b600c819055505050565b80151560195f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615150362000ba1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b9890620017c9565b60405180910390fd5b8060195f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550801562000c8b5760085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630483f7a08360016040518363ffffffff1660e01b815260040162000c5b9291906200150d565b5f604051808303815f87803b15801562000c73575f80fd5b505af115801562000c86573d5f803e3d5ffd5b505050505b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62000d0d6200101460201b60201c565b80601a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b62000d756200101460201b60201c565b80151560185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615150362000e07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000dfe906200185d565b60405180910390fd5b8060185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405162000ea391906200187d565b60405180910390a25050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000f20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f1790620018e6565b60405180910390fd5b62000f335f8383620010a560201b60201c565b8060025f82825462000f46919062001906565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000ff5919062001951565b60405180910390a3620010105f8383620010aa60201b60201c565b5050565b620010246200086d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200104a62000cd560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620010a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200109a90620019ba565b60405180910390fd5b565b505050565b505050565b6131c3806200683983390190565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200113957607f821691505b6020821081036200114f576200114e620010f4565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620011b37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001176565b620011bf868362001176565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6200120962001203620011fd84620011d7565b620011e0565b620011d7565b9050919050565b5f819050919050565b6200122483620011e9565b6200123c620012338262001210565b84845462001182565b825550505050565b5f90565b6200125262001244565b6200125f81848462001219565b505050565b5b8181101562001286576200127a5f8262001248565b60018101905062001265565b5050565b601f821115620012d5576200129f8162001155565b620012aa8462001167565b81016020851015620012ba578190505b620012d2620012c98562001167565b83018262001264565b50505b505050565b5f82821c905092915050565b5f620012f75f1984600802620012da565b1980831691505092915050565b5f620013118383620012e6565b9150826002028217905092915050565b6200132c82620010bd565b67ffffffffffffffff811115620013485762001347620010c7565b5b62001354825462001121565b620013618282856200128a565b5f60209050601f83116001811462001397575f841562001382578287015190505b6200138e858262001304565b865550620013fd565b601f198416620013a78662001155565b5f5b82811015620013d057848901518255600182019150602085019450602081019050620013a9565b86831015620013f05784890151620013ec601f891682620012e6565b8355505b6001600288020188555050505b505050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620014348262001409565b9050919050565b620014468162001428565b811462001451575f80fd5b50565b5f8151905062001464816200143b565b92915050565b5f6020828403121562001482576200148162001405565b5b5f620014918482850162001454565b91505092915050565b620014a58162001428565b82525050565b5f604082019050620014c05f8301856200149a565b620014cf60208301846200149a565b9392505050565b5f602082019050620014eb5f8301846200149a565b92915050565b5f8115159050919050565b6200150781620014f1565b82525050565b5f604082019050620015225f8301856200149a565b620015316020830184620014fc565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6200157182620011d7565b91506200157e83620011d7565b92508282026200158e81620011d7565b91508282048414831517620015a857620015a762001538565b5b5092915050565b5f82825260208201905092915050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e205f8201527f3125000000000000000000000000000000000000000000000000000000000000602082015250565b5f6200161b602283620015af565b91506200162882620015bf565b604082019050919050565b5f6020820190508181035f8301526200164c816200160d565b9050919050565b7f43616e6e6f7420736574206d6178627579206c6f776572207468616e203125205f82015250565b5f62001689602083620015af565b9150620016968262001653565b602082019050919050565b5f6020820190508181035f830152620016ba816200167b565b9050919050565b7f43616e6e6f7420736574206d617873656c6c206c6f776572207468616e20302e5f8201527f3525200000000000000000000000000000000000000000000000000000000000602082015250565b5f6200171d602383620015af565b91506200172a82620016c1565b604082019050919050565b5f6020820190508181035f8301526200174e816200170f565b9050919050565b7f4175746f6d61746564206d61726b6574206d616b6572207061697220697320615f8201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b5f620017b1603883620015af565b9150620017be8262001755565b604082019050919050565b5f6020820190508181035f830152620017e281620017a3565b9050919050565b7f4163636f756e7420697320616c7265616479207468652076616c7565206f66205f8201527f276578636c756465642700000000000000000000000000000000000000000000602082015250565b5f62001845602a83620015af565b91506200185282620017e9565b604082019050919050565b5f6020820190508181035f830152620018768162001837565b9050919050565b5f602082019050620018925f830184620014fc565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f620018ce601f83620015af565b9150620018db8262001898565b602082019050919050565b5f6020820190508181035f830152620018ff81620018c0565b9050919050565b5f6200191282620011d7565b91506200191f83620011d7565b92508282019050808211156200193a576200193962001538565b5b92915050565b6200194b81620011d7565b82525050565b5f602082019050620019665f83018462001940565b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f620019a2602083620015af565b9150620019af826200196c565b602082019050919050565b5f6020820190508181035f830152620019d38162001994565b9050919050565b614e5180620019e85f395ff3fe608060405260043610610338575f3560e01c8063864701a5116101aa578063afa4f3b2116100f6578063dd62ed3e11610094578063f2fde38b1161006e578063f2fde38b14610be4578063f66895a314610c0c578063f887ea4014610c37578063f8b45b0514610c615761033f565b8063dd62ed3e14610b56578063e01af92c14610b92578063e2f4560514610bba5761033f565b8063c0246668116100d0578063c024666814610ab6578063c18bc19514610ade578063c851cc3214610b06578063d2fcc00114610b2e5761033f565b8063afa4f3b214610a2a578063b62496f514610a52578063bdf1436d14610a8e5761033f565b806392929a0911610163578063a457c2d71161013d578063a457c2d71461094c578063a8aa1b3114610988578063a8b9d240146109b2578063a9059cbb146109ee5761033f565b806392929a09146108d257806395d89b41146108fa5780639a7a23d6146109245761033f565b8063864701a5146107d957806388bdd9be1461080457806388e765ff1461082c5780638c9684f9146108565780638da5cb5b1461087e5780638ea5220f146108a85761033f565b806330bb4cff1161028457806366d602ae1161022257806370a08231116101fc57806370a082311461071f578063715018a61461075b57806379b447bd146107715780637b510fe8146107995761033f565b806366d602ae1461068f5780636843cd84146106b95780636ddd1713146106f55761033f565b806346469afb1161025e57806346469afb146105e95780634ada218b146106135780634e71d92d1461063d5780634fbee193146106535761033f565b806330bb4cff14610559578063313ce5671461058357806339509351146105ad5761033f565b806318160ddd116102f157806323b872dd116102cb57806323b872dd146104a15780632866ed21146104dd5780632c1f5216146105075780632e1ab904146105315761033f565b806318160ddd146104255780631bff78981461044f5780631f53ac02146104795761033f565b80630483f7a01461034357806306fdde031461036b578063095ea7b3146103955780630a78097d146103d15780630bd05b69146103f957806312b77e8a1461040f5761033f565b3661033f57005b5f80fd5b34801561034e575f80fd5b50610369600480360381019061036491906138fc565b610c8b565b005b348015610376575f80fd5b5061037f610d20565b60405161038c91906139c4565b60405180910390f35b3480156103a0575f80fd5b506103bb60048036038101906103b69190613a17565b610db0565b6040516103c89190613a64565b60405180910390f35b3480156103dc575f80fd5b506103f760048036038101906103f29190613a7d565b610dd2565b005b348015610404575f80fd5b5061040d610ed7565b005b34801561041a575f80fd5b50610423610f4c565b005b348015610430575f80fd5b50610439610fee565b6040516104469190613ab7565b60405180910390f35b34801561045a575f80fd5b50610463610ff7565b6040516104709190613ab7565b60405180910390f35b348015610484575f80fd5b5061049f600480360381019061049a9190613a7d565b610ffd565b005b3480156104ac575f80fd5b506104c760048036038101906104c29190613ad0565b611048565b6040516104d49190613a64565b60405180910390f35b3480156104e8575f80fd5b506104f1611076565b6040516104fe9190613a64565b60405180910390f35b348015610512575f80fd5b5061051b611089565b6040516105289190613b7b565b60405180910390f35b34801561053c575f80fd5b5061055760048036038101906105529190613a7d565b6110ae565b005b348015610564575f80fd5b5061056d611140565b60405161057a9190613ab7565b60405180910390f35b34801561058e575f80fd5b506105976111d4565b6040516105a49190613baf565b60405180910390f35b3480156105b8575f80fd5b506105d360048036038101906105ce9190613a17565b6111dc565b6040516105e09190613a64565b60405180910390f35b3480156105f4575f80fd5b506105fd611212565b60405161060a9190613ab7565b60405180910390f35b34801561061e575f80fd5b50610627611218565b6040516106349190613a64565b60405180910390f35b348015610648575f80fd5b5061065161122b565b005b34801561065e575f80fd5b5061067960048036038101906106749190613a7d565b611317565b6040516106869190613a64565b60405180910390f35b34801561069a575f80fd5b506106a3611369565b6040516106b09190613ab7565b60405180910390f35b3480156106c4575f80fd5b506106df60048036038101906106da9190613a7d565b61136f565b6040516106ec9190613ab7565b60405180910390f35b348015610700575f80fd5b50610709611410565b6040516107169190613a64565b60405180910390f35b34801561072a575f80fd5b5061074560048036038101906107409190613a7d565b611423565b6040516107529190613ab7565b60405180910390f35b348015610766575f80fd5b5061076f611468565b005b34801561077c575f80fd5b5061079760048036038101906107929190613bc8565b61147b565b005b3480156107a4575f80fd5b506107bf60048036038101906107ba9190613a7d565b611547565b6040516107d0959493929190613c15565b60405180910390f35b3480156107e4575f80fd5b506107ed6115f8565b6040516107fb929190613c66565b60405180910390f35b34801561080f575f80fd5b5061082a60048036038101906108259190613a7d565b611609565b005b348015610837575f80fd5b50610840611825565b60405161084d9190613ab7565b60405180910390f35b348015610861575f80fd5b5061087c60048036038101906108779190613a7d565b61182b565b005b348015610889575f80fd5b506108926118bf565b60405161089f9190613c8d565b60405180910390f35b3480156108b3575f80fd5b506108bc6118e7565b6040516108c99190613c8d565b60405180910390f35b3480156108dd575f80fd5b506108f860048036038101906108f39190613ca6565b61190c565b005b348015610905575f80fd5b5061090e611931565b60405161091b91906139c4565b60405180910390f35b34801561092f575f80fd5b5061094a600480360381019061094591906138fc565b6119c1565b005b348015610957575f80fd5b50610972600480360381019061096d9190613a17565b6119d7565b60405161097f9190613a64565b60405180910390f35b348015610993575f80fd5b5061099c611a4c565b6040516109a99190613c8d565b60405180910390f35b3480156109bd575f80fd5b506109d860048036038101906109d39190613a7d565b611a71565b6040516109e59190613ab7565b60405180910390f35b3480156109f9575f80fd5b50610a146004803603810190610a0f9190613a17565b611b12565b604051610a219190613a64565b60405180910390f35b348015610a35575f80fd5b50610a506004803603810190610a4b9190613cd1565b611b34565b005b348015610a5d575f80fd5b50610a786004803603810190610a739190613a7d565b611b59565b604051610a859190613a64565b60405180910390f35b348015610a99575f80fd5b50610ab46004803603810190610aaf9190613cd1565b611b76565b005b348015610ac1575f80fd5b50610adc6004803603810190610ad791906138fc565b611cd2565b005b348015610ae9575f80fd5b50610b046004803603810190610aff9190613cd1565b611e0f565b005b348015610b11575f80fd5b50610b2c6004803603810190610b279190613a7d565b611e7a565b005b348015610b39575f80fd5b50610b546004803603810190610b4f91906138fc565b611ec5565b005b348015610b61575f80fd5b50610b7c6004803603810190610b779190613cfc565b611f25565b604051610b899190613ab7565b60405180910390f35b348015610b9d575f80fd5b50610bb86004803603810190610bb39190613ca6565b611fa7565b005b348015610bc5575f80fd5b50610bce611fcc565b604051610bdb9190613ab7565b60405180910390f35b348015610bef575f80fd5b50610c0a6004803603810190610c059190613a7d565b611fd2565b005b348015610c17575f80fd5b50610c20612054565b604051610c2e929190613c66565b60405180910390f35b348015610c42575f80fd5b50610c4b612065565b604051610c589190613d5a565b60405180910390f35b348015610c6c575f80fd5b50610c7561208a565b604051610c829190613ab7565b60405180910390f35b610c93612090565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630483f7a083836040518363ffffffff1660e01b8152600401610cef929190613d73565b5f604051808303815f87803b158015610d06575f80fd5b505af1158015610d18573d5f803e3d5ffd5b505050505050565b606060038054610d2f90613dc7565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5b90613dc7565b8015610da65780601f10610d7d57610100808354040283529160200191610da6565b820191905f5260205f20905b815481529060010190602001808311610d8957829003601f168201915b5050505050905090565b5f80610dba61210e565b9050610dc7818585612115565b600191505092915050565b610dda612090565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610dfe6118bf565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e379190613c8d565b602060405180830381865afa158015610e52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e769190613e0b565b6040518363ffffffff1660e01b8152600401610e93929190613e36565b6020604051808303815f875af1158015610eaf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed39190613e71565b5050565b610edf612090565b600760179054906101000a900460ff1615610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2690613ee6565b60405180910390fd5b6001600760176101000a81548160ff021916908315150217905550565b610f54612090565b5f4790505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610f9e90613f31565b5f6040518083038185875af1925050503d805f8114610fd8576040519150601f19603f3d011682016040523d82523d5f602084013e610fdd565b606091505b5050905080610fea575f80fd5b5050565b5f600254905090565b60135481565b611005612090565b8060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f8061105261210e565b905061105f8582856122d8565b61106a858585612363565b60019150509392505050565b600760169054906101000a900460ff1681565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110b6612090565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166344b6bd9e826040518263ffffffff1660e01b81526004016111109190613c8d565b5f604051808303815f87803b158015611127575f80fd5b505af1158015611139573d5f803e3d5ffd5b5050505050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385a6b3ae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cf9190613e0b565b905090565b5f6012905090565b5f806111e661210e565b90506112078185856111f88589611f25565b6112029190613f72565b612115565b600191505092915050565b60125481565b600760179054906101000a900460ff1681565b600760169054906101000a900460ff1661127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127190613fef565b60405180910390fd5b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663807ab4f7336040518263ffffffff1660e01b81526004016112d4919061402d565b6020604051808303815f875af11580156112f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113149190613e71565b50565b5f60185f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b600c5481565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016113ca9190613c8d565b602060405180830381865afa1580156113e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114099190613e0b565b9050919050565b600760159054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611470612090565b6114795f612caa565b565b611483612090565b629896808210156114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c090614090565b60405180910390fd5b624c4b4081101561150f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115069061411e565b60405180910390fd5b670de0b6b3a764000082611523919061413c565b600b81905550670de0b6b3a76400008161153d919061413c565b600c819055505050565b5f805f805f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fbcbc0f1876040518263ffffffff1660e01b81526004016115a69190613c8d565b60a060405180830381865afa1580156115c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115e59190614191565b9450945094509450945091939590929450565b600e805f0154908060010154905082565b611611612090565b5f8190508073ffffffffffffffffffffffffffffffffffffffff16630483f7a08260016040518363ffffffff1660e01b8152600401611651929190613d73565b5f604051808303815f87803b158015611668575f80fd5b505af115801561167a573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff16630483f7a03060016040518363ffffffff1660e01b81526004016116ba929190613d73565b5f604051808303815f87803b1580156116d1575f80fd5b505af11580156116e3573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff16630483f7a061170b6118bf565b60016040518363ffffffff1660e01b815260040161172a929190613d73565b5f604051808303815f87803b158015611741575f80fd5b505af1158015611753573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff16630483f7a060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016040518363ffffffff1660e01b81526004016117b4929190613d73565b5f604051808303815f87803b1580156117cb575f80fd5b505af11580156117dd573d5f803e3d5ffd5b505050508060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600b5481565b611833612090565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663497ec82333836040518363ffffffff1660e01b815260040161188f929190614208565b5f604051808303815f87803b1580156118a6575f80fd5b505af11580156118b8573d5f803e3d5ffd5b5050505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611914612090565b80600760166101000a81548160ff02191690831515021790555050565b60606004805461194090613dc7565b80601f016020809104026020016040519081016040528092919081815260200182805461196c90613dc7565b80156119b75780601f1061198e576101008083540402835291602001916119b7565b820191905f5260205f20905b81548152906001019060200180831161199a57829003601f168201915b5050505050905090565b6119c9612090565b6119d38282612d6d565b5050565b5f806119e161210e565b90505f6119ee8286611f25565b905083811015611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a9061429f565b60405180910390fd5b611a408286868403612115565b60019250505092915050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8b9d240836040518263ffffffff1660e01b8152600401611acc9190613c8d565b602060405180830381865afa158015611ae7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b0b9190613e0b565b9050919050565b5f80611b1c61210e565b9050611b29818585612363565b600191505092915050565b611b3c612090565b670de0b6b3a764000081611b50919061413c565b600a8190555050565b6019602052805f5260405f205f915054906101000a900460ff1681565b611b7e612090565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3360085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518463ffffffff1660e01b8152600401611bfe939291906142bd565b6020604051808303815f875af1158015611c1a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c3e9190613e71565b90508015611cce5760085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ede6ad9c836040518263ffffffff1660e01b8152600401611ca09190613ab7565b5f604051808303815f87803b158015611cb7575f80fd5b505af1158015611cc9573d5f803e3d5ffd5b505050505b5050565b611cda612090565b80151560185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090614362565b60405180910390fd5b8060185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611e039190613a64565b60405180910390a25050565b611e17612090565b62989680811015611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e54906143f0565b60405180910390fd5b670de0b6b3a764000081611e71919061413c565b600d8190555050565b611e82612090565b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611ecd612090565b80601a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611faf612090565b80600760156101000a81548160ff02191690831515021790555050565b600a5481565b611fda612090565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203f9061447e565b60405180910390fd5b61205181612caa565b50565b6010805f0154908060010154905082565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b61209861210e565b73ffffffffffffffffffffffffffffffffffffffff166120b66118bf565b73ffffffffffffffffffffffffffffffffffffffff161461210c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612103906144e6565b60405180910390fd5b565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217a90614574565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e890614602565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516122cb9190613ab7565b60405180910390a3505050565b5f6122e38484611f25565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461235d578181101561234f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123469061466a565b60405180910390fd5b61235c8484848403612115565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c8906146f8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361243f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243690614786565b60405180910390fd5b60185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156124dd575060185f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156124f65750600760149054906101000a900460ff16155b1561274f57600760179054906101000a900460ff1661254a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612541906147ee565b60405180910390fd5b60195f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156125fa57600c548111156125de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d590614856565b60405180910390fd5b60175f8154809291906125f090614874565b91905055506126a7565b60195f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156126a657600b5481111561268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268590614905565b60405180910390fd5b60165f8154809291906126a090614874565b91905055505b5b601a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661274e57600d5461270183611423565b8261270c9190613f72565b111561274d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127449061496d565b60405180910390fd5b5b5b5f81036127665761276183835f612f2b565b612ca5565b5f61277030611423565b90505f600a5482101590508080156127955750600760149054906101000a900460ff16155b80156127ad5750600760159054906101000a900460ff165b80156127ff575060195f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b8015612852575060185f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156128a5575060185f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156128f6576001600760146101000a81548160ff0219169083151502179055505f60135411156128db576128da600a54613197565b5b5f600760146101000a81548160ff0219169083151502179055505b5f600760149054906101000a900460ff1615905060185f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806129a5575060185f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156129ae575f90505b60195f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015612a4c575060195f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612a55575f90505b8015612b7c575f60195f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612ae057606460155460175411612ac057601454612ac4565b6013545b86612acf919061413c565b612ad991906149b8565b9050612b61565b60195f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612b6057606460155460165411612b4457601454612b48565b6012545b86612b53919061413c565b612b5d91906149b8565b90505b5b8085612b6d91906149e8565b9450612b7a873083612f2b565b505b612b87868686612f2b565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc87612bce89611423565b6040518363ffffffff1660e01b8152600401612beb929190613e36565b5f604051808303815f87803b158015612c02575f80fd5b505af1925050508015612c13575060015b5060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc86612c5b88611423565b6040518363ffffffff1660e01b8152600401612c78929190613e36565b5f604051808303815f87803b158015612c8f575f80fd5b505af1925050508015612ca0575060015b505050505b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80151560195f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503612dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df390614a8b565b60405180910390fd5b8060195f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015612ee15760085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630483f7a08360016040518363ffffffff1660e01b8152600401612eb3929190613d73565b5f604051808303815f87803b158015612eca575f80fd5b505af1158015612edc573d5f803e3d5ffd5b505050505b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f90906146f8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffe90614786565b60405180910390fd5b613012838383613550565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308c90614b19565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161317e9190613ab7565b60405180910390a3613191848484613555565b50505050565b5f600260135460105f0154846131ad919061413c565b6131b791906149b8565b6131c191906149b8565b90505f600260135460105f0154856131d9919061413c565b6131e391906149b8565b6131ed91906149b8565b90505f60135460106001015485613204919061413c565b61320e91906149b8565b90506132198361355a565b5f4790505f8111156132305761322f8382613790565b5b6132398261355a565b5f4790505f8190505f811115613314575f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161328f90613f31565b5f6040518083038185875af1925050503d805f81146132c9576040519150601f19603f3d011682016040523d82523d5f602084013e6132ce565b606091505b5050905080613312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330990614b81565b60405180910390fd5b505b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161336f9190613c8d565b602060405180830381865afa15801561338a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133ae9190613e0b565b90505f8190505f811115613545575f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b815260040161343a929190613e36565b6020604051808303815f875af1158015613456573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061347a9190613e71565b905080156135435760085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ede6ad9c836040518263ffffffff1660e01b81526004016134dc9190613ab7565b5f604051808303815f87803b1580156134f3575f80fd5b505af1158015613505573d5f803e3d5ffd5b505050507f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc38a8360405161353a929190613c66565b60405180910390a15b505b505050505050505050565b505050565b505050565b5f600267ffffffffffffffff81111561357657613575614b9f565b5b6040519080825280602002602001820160405280156135a45781602001602082028036833780820191505090505b50905030815f815181106135bb576135ba614bcc565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561365f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136839190614bf9565b8160018151811061369757613696614bcc565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506136fd3060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612115565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b815260040161375f959493929190614d14565b5f604051808303815f87803b158015613776575f80fd5b505af1158015613788573d5f803e3d5ffd5b505050505050565b6137bc3060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612115565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198230855f8030426040518863ffffffff1660e01b815260040161382196959493929190614d6c565b60606040518083038185885af115801561383d573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906138629190614dcb565b5050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6138968261386d565b9050919050565b6138a68161388c565b81146138b0575f80fd5b50565b5f813590506138c18161389d565b92915050565b5f8115159050919050565b6138db816138c7565b81146138e5575f80fd5b50565b5f813590506138f6816138d2565b92915050565b5f806040838503121561391257613911613869565b5b5f61391f858286016138b3565b9250506020613930858286016138e8565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613971578082015181840152602081019050613956565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6139968261393a565b6139a08185613944565b93506139b0818560208601613954565b6139b98161397c565b840191505092915050565b5f6020820190508181035f8301526139dc818461398c565b905092915050565b5f819050919050565b6139f6816139e4565b8114613a00575f80fd5b50565b5f81359050613a11816139ed565b92915050565b5f8060408385031215613a2d57613a2c613869565b5b5f613a3a858286016138b3565b9250506020613a4b85828601613a03565b9150509250929050565b613a5e816138c7565b82525050565b5f602082019050613a775f830184613a55565b92915050565b5f60208284031215613a9257613a91613869565b5b5f613a9f848285016138b3565b91505092915050565b613ab1816139e4565b82525050565b5f602082019050613aca5f830184613aa8565b92915050565b5f805f60608486031215613ae757613ae6613869565b5b5f613af4868287016138b3565b9350506020613b05868287016138b3565b9250506040613b1686828701613a03565b9150509250925092565b5f819050919050565b5f613b43613b3e613b398461386d565b613b20565b61386d565b9050919050565b5f613b5482613b29565b9050919050565b5f613b6582613b4a565b9050919050565b613b7581613b5b565b82525050565b5f602082019050613b8e5f830184613b6c565b92915050565b5f60ff82169050919050565b613ba981613b94565b82525050565b5f602082019050613bc25f830184613ba0565b92915050565b5f8060408385031215613bde57613bdd613869565b5b5f613beb85828601613a03565b9250506020613bfc85828601613a03565b9150509250929050565b613c0f8161388c565b82525050565b5f60a082019050613c285f830188613c06565b613c356020830187613aa8565b613c426040830186613aa8565b613c4f6060830185613aa8565b613c5c6080830184613aa8565b9695505050505050565b5f604082019050613c795f830185613aa8565b613c866020830184613aa8565b9392505050565b5f602082019050613ca05f830184613c06565b92915050565b5f60208284031215613cbb57613cba613869565b5b5f613cc8848285016138e8565b91505092915050565b5f60208284031215613ce657613ce5613869565b5b5f613cf384828501613a03565b91505092915050565b5f8060408385031215613d1257613d11613869565b5b5f613d1f858286016138b3565b9250506020613d30858286016138b3565b9150509250929050565b5f613d4482613b4a565b9050919050565b613d5481613d3a565b82525050565b5f602082019050613d6d5f830184613d4b565b92915050565b5f604082019050613d865f830185613c06565b613d936020830184613a55565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613dde57607f821691505b602082108103613df157613df0613d9a565b5b50919050565b5f81519050613e05816139ed565b92915050565b5f60208284031215613e2057613e1f613869565b5b5f613e2d84828501613df7565b91505092915050565b5f604082019050613e495f830185613c06565b613e566020830184613aa8565b9392505050565b5f81519050613e6b816138d2565b92915050565b5f60208284031215613e8657613e85613869565b5b5f613e9384828501613e5d565b91505092915050565b7f54726164696e6720616c726561647920656e61626c65640000000000000000005f82015250565b5f613ed0601783613944565b9150613edb82613e9c565b602082019050919050565b5f6020820190508181035f830152613efd81613ec4565b9050919050565b5f81905092915050565b50565b5f613f1c5f83613f04565b9150613f2782613f0e565b5f82019050919050565b5f613f3b82613f11565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613f7c826139e4565b9150613f87836139e4565b9250828201905080821115613f9f57613f9e613f45565b5b92915050565b7f436c61696d206e6f7420656e61626c65640000000000000000000000000000005f82015250565b5f613fd9601183613944565b9150613fe482613fa5565b602082019050919050565b5f6020820190508181035f83015261400681613fcd565b9050919050565b5f6140178261386d565b9050919050565b6140278161400d565b82525050565b5f6020820190506140405f83018461401e565b92915050565b7f43616e6e6f7420736574206d6178627579206c6f776572207468616e203125205f82015250565b5f61407a602083613944565b915061408582614046565b602082019050919050565b5f6020820190508181035f8301526140a78161406e565b9050919050565b7f43616e6e6f7420736574206d617873656c6c206c6f776572207468616e20302e5f8201527f3525200000000000000000000000000000000000000000000000000000000000602082015250565b5f614108602383613944565b9150614113826140ae565b604082019050919050565b5f6020820190508181035f830152614135816140fc565b9050919050565b5f614146826139e4565b9150614151836139e4565b925082820261415f816139e4565b9150828204841483151761417657614175613f45565b5b5092915050565b5f8151905061418b8161389d565b92915050565b5f805f805f60a086880312156141aa576141a9613869565b5b5f6141b78882890161417d565b95505060206141c888828901613df7565b94505060406141d988828901613df7565b93505060606141ea88828901613df7565b92505060806141fb88828901613df7565b9150509295509295909350565b5f60408201905061421b5f830185613c06565b6142286020830184613c06565b9392505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f614289602583613944565b91506142948261422f565b604082019050919050565b5f6020820190508181035f8301526142b68161427d565b9050919050565b5f6060820190506142d05f830186613c06565b6142dd6020830185613c06565b6142ea6040830184613aa8565b949350505050565b7f4163636f756e7420697320616c7265616479207468652076616c7565206f66205f8201527f276578636c756465642700000000000000000000000000000000000000000000602082015250565b5f61434c602a83613944565b9150614357826142f2565b604082019050919050565b5f6020820190508181035f83015261437981614340565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e205f8201527f3125000000000000000000000000000000000000000000000000000000000000602082015250565b5f6143da602283613944565b91506143e582614380565b604082019050919050565b5f6020820190508181035f830152614407816143ce565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614468602683613944565b91506144738261440e565b604082019050919050565b5f6020820190508181035f8301526144958161445c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6144d0602083613944565b91506144db8261449c565b602082019050919050565b5f6020820190508181035f8301526144fd816144c4565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61455e602483613944565b915061456982614504565b604082019050919050565b5f6020820190508181035f83015261458b81614552565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6145ec602283613944565b91506145f782614592565b604082019050919050565b5f6020820190508181035f830152614619816145e0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f614654601d83613944565b915061465f82614620565b602082019050919050565b5f6020820190508181035f83015261468181614648565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6146e2602583613944565b91506146ed82614688565b604082019050919050565b5f6020820190508181035f83015261470f816146d6565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f614770602383613944565b915061477b82614716565b604082019050919050565b5f6020820190508181035f83015261479d81614764565b9050919050565b7f54726164696e67206e6f742061637469766500000000000000000000000000005f82015250565b5f6147d8601283613944565b91506147e3826147a4565b602082019050919050565b5f6020820190508181035f830152614805816147cc565b9050919050565b7f596f752061726520657863656564696e67206d617853656c6c416d6f756e74005f82015250565b5f614840601f83613944565b915061484b8261480c565b602082019050919050565b5f6020820190508181035f83015261486d81614834565b9050919050565b5f61487e826139e4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148b0576148af613f45565b5b600182019050919050565b7f596f752061726520657863656564696e67206d6178427579416d6f756e7400005f82015250565b5f6148ef601e83613944565b91506148fa826148bb565b602082019050919050565b5f6020820190508181035f83015261491c816148e3565b9050919050565b7f556e61626c6520746f20657863656564204d61782057616c6c657400000000005f82015250565b5f614957601b83613944565b915061496282614923565b602082019050919050565b5f6020820190508181035f8301526149848161494b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6149c2826139e4565b91506149cd836139e4565b9250826149dd576149dc61498b565b5b828204905092915050565b5f6149f2826139e4565b91506149fd836139e4565b9250828203905081811115614a1557614a14613f45565b5b92915050565b7f4175746f6d61746564206d61726b6574206d616b6572207061697220697320615f8201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b5f614a75603883613944565b9150614a8082614a1b565b604082019050919050565b5f6020820190508181035f830152614aa281614a69565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f614b03602683613944565b9150614b0e82614aa9565b604082019050919050565b5f6020820190508181035f830152614b3081614af7565b9050919050565b7f4661696c656420746f2073656e642045544820746f206465762077616c6c65745f82015250565b5f614b6b602083613944565b9150614b7682614b37565b602082019050919050565b5f6020820190508181035f830152614b9881614b5f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215614c0e57614c0d613869565b5b5f614c1b8482850161417d565b91505092915050565b5f819050919050565b5f614c47614c42614c3d84614c24565b613b20565b6139e4565b9050919050565b614c5781614c2d565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614c8f8161388c565b82525050565b5f614ca08383614c86565b60208301905092915050565b5f602082019050919050565b5f614cc282614c5d565b614ccc8185614c67565b9350614cd783614c77565b805f5b83811015614d07578151614cee8882614c95565b9750614cf983614cac565b925050600181019050614cda565b5085935050505092915050565b5f60a082019050614d275f830188613aa8565b614d346020830187614c4e565b8181036040830152614d468186614cb8565b9050614d556060830185613c06565b614d626080830184613aa8565b9695505050505050565b5f60c082019050614d7f5f830189613c06565b614d8c6020830188613aa8565b614d996040830187614c4e565b614da66060830186614c4e565b614db36080830185613c06565b614dc060a0830184613aa8565b979650505050505050565b5f805f60608486031215614de257614de1613869565b5b5f614def86828701613df7565b9350506020614e0086828701613df7565b9250506040614e1186828701613df7565b915050925092509256fea26469706673582212207f15eb25e9be5649802253614eab50fb8b4b49e9065d4559a7c17e906465bd1364736f6c63430008150033608060405234801562000010575f80fd5b506040518060400160405280601481526020017f4c49515f4469766964656e645f547261636b65720000000000000000000000008152506040518060400160405280601481526020017f4c49515f4469766964656e645f547261636b657200000000000000000000000081525081818160039081620000909190620003fb565b508060049081620000a29190620003fb565b505050620000c5620000b9620000cd60201b60201c565b620000d460201b60201c565b5050620004df565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200021357607f821691505b602082108103620002295762000228620001ce565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200028d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000250565b62000299868362000250565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620002e3620002dd620002d784620002b1565b620002ba565b620002b1565b9050919050565b5f819050919050565b620002fe83620002c3565b620003166200030d82620002ea565b8484546200025c565b825550505050565b5f90565b6200032c6200031e565b62000339818484620002f3565b505050565b5b818110156200036057620003545f8262000322565b6001810190506200033f565b5050565b601f821115620003af5762000379816200022f565b620003848462000241565b8101602085101562000394578190505b620003ac620003a38562000241565b8301826200033e565b50505b505050565b5f82821c905092915050565b5f620003d15f1984600802620003b4565b1980831691505092915050565b5f620003eb8383620003c0565b9150826002028217905092915050565b620004068262000197565b67ffffffffffffffff811115620004225762000421620001a1565b5b6200042e8254620001fb565b6200043b82828562000364565b5f60209050601f83116001811462000471575f84156200045c578287015190505b620004688582620003de565b865550620004d7565b601f19841662000481866200022f565b5f5b82811015620004aa5784890151825560018201915060208501945060208101905062000483565b86831015620004ca5784890151620004c6601f891682620003c0565b8355505b6001600288020188555050505b505050505050565b612cd680620004ed5f395ff3fe608060405234801561000f575f80fd5b50600436106101e3575f3560e01c8063715018a61161010d578063a8b9d240116100a0578063e30443bc1161006f578063e30443bc146105df578063ede6ad9c146105fb578063f2fde38b14610617578063fbcbc0f114610633576101e3565b8063a8b9d2401461051f578063a9059cbb1461054f578063aafd847a1461057f578063dd62ed3e146105af576101e3565b806391b89fba116100dc57806391b89fba1461048357806395d89b41146104b35780639e1e0661146104d1578063a457c2d7146104ef576101e3565b8063715018a61461040d578063807ab4f71461041757806385a6b3ae146104475780638da5cb5b14610465576101e3565b806327ce014711610185578063497ec82311610154578063497ec823146103875780634e7b827f146103a35780636a474002146103d357806370a08231146103dd576101e3565b806327ce0147146102ed578063313ce5671461031d578063395093511461033b57806344b6bd9e1461036b576101e3565b80631162c4b6116101c15780631162c4b61461025157806318160ddd1461026f578063226cfa3d1461028d57806323b872dd146102bd576101e3565b80630483f7a0146101e757806306fdde0314610203578063095ea7b314610221575b5f80fd5b61020160048036038101906101fc9190611fb1565b610667565b005b61020b61079b565b6040516102189190612079565b60405180910390f35b61023b600480360381019061023691906120cc565b61082b565b6040516102489190612119565b60405180910390f35b61025961084d565b6040516102669190612141565b60405180910390f35b610277610872565b6040516102849190612169565b60405180910390f35b6102a760048036038101906102a29190612182565b61087b565b6040516102b49190612169565b60405180910390f35b6102d760048036038101906102d291906121ad565b610890565b6040516102e49190612119565b60405180910390f35b61030760048036038101906103029190612182565b6108be565b6040516103149190612169565b60405180910390f35b61032561095e565b6040516103329190612218565b60405180910390f35b610355600480360381019061035091906120cc565b610966565b6040516103629190612119565b60405180910390f35b61038560048036038101906103809190612182565b61099c565b005b6103a1600480360381019061039c9190612231565b6109e7565b005b6103bd60048036038101906103b89190612182565b610ae6565b6040516103ca9190612119565b60405180910390f35b6103db610b03565b005b6103f760048036038101906103f29190612182565b610b0f565b6040516104049190612169565b60405180910390f35b610415610b54565b005b610431600480360381019061042c91906122aa565b610b67565b60405161043e9190612119565b60405180910390f35b61044f610c28565b60405161045c9190612169565b60405180910390f35b61046d610c2e565b60405161047a9190612141565b60405180910390f35b61049d60048036038101906104989190612182565b610c56565b6040516104aa9190612169565b60405180910390f35b6104bb610c67565b6040516104c89190612079565b60405180910390f35b6104d9610cf7565b6040516104e69190612169565b60405180910390f35b610509600480360381019061050491906120cc565b610cfd565b6040516105169190612119565b60405180910390f35b61053960048036038101906105349190612182565b610d72565b6040516105469190612169565b60405180910390f35b610569600480360381019061056491906120cc565b610dd2565b6040516105769190612119565b60405180910390f35b61059960048036038101906105949190612182565b610df4565b6040516105a69190612169565b60405180910390f35b6105c960048036038101906105c49190612231565b610e3a565b6040516105d69190612169565b60405180910390f35b6105f960048036038101906105f491906120cc565b610ebc565b005b610615600480360381019061061091906122d5565b610f21565b005b610631600480360381019061062c9190612182565b611000565b005b61064d60048036038101906106489190612182565b611082565b60405161065e959493929190612300565b60405180910390f35b61066f61115b565b801515600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515036106c7575f80fd5b80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600115158115150361073657610731825f6111d9565b610749565b6107488261074384610b0f565b6111d9565b5b8173ffffffffffffffffffffffffffffffffffffffff167fa3c7c11b2e12c4144b09a7813f3393ba646392788638998c97be8da908cf04be8260405161078f9190612119565b60405180910390a25050565b6060600380546107aa9061237e565b80601f01602080910402602001604051908101604052809291908181526020018280546107d69061237e565b80156108215780601f106107f857610100808354040283529160200191610821565b820191905f5260205f20905b81548152906001019060200180831161080457829003601f168201915b5050505050905090565b5f80610835611243565b905061084281858561124a565b600191505092915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600254905090565b600d602052805f5260405f205f915090505481565b5f8061089a611243565b90506108a785828561140d565b6108b2858585611498565b60019150509392505050565b5f70010000000000000000000000000000000061094d61094860085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461093a61093561092488610b0f565b6007546114dd90919063ffffffff16565b611554565b61156e90919063ffffffff16565b6115b5565b6109579190612408565b9050919050565b5f6012905090565b5f80610970611243565b90506109918185856109828589610e3a565b61098c9190612438565b61124a565b600191505092915050565b6109a461115b565b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109ef61115b565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb838373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a459190612141565b602060405180830381865afa158015610a60573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a84919061247f565b6040518363ffffffff1660e01b8152600401610aa19291906124aa565b6020604051808303815f875af1158015610abd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ae191906124e5565b505050565b600c602052805f5260405f205f915054906101000a900460ff1681565b610b0c336115ca565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610b5c61115b565b610b655f611841565b565b5f610b7061115b565b5f610b7a836115ca565b90505f811115610c1e5742600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff167f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d482604051610c0c9190612169565b60405180910390a26001915050610c23565b5f9150505b919050565b600a5481565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f610c6082610d72565b9050919050565b606060048054610c769061237e565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca29061237e565b8015610ced5780601f10610cc457610100808354040283529160200191610ced565b820191905f5260205f20905b815481529060010190602001808311610cd057829003601f168201915b5050505050905090565b600b5481565b5f80610d07611243565b90505f610d148286610e3a565b905083811015610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5090612580565b60405180910390fd5b610d66828686840361124a565b60019250505092915050565b5f610dcb60095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610dbd846108be565b61190490919063ffffffff16565b9050919050565b5f80610ddc611243565b9050610de9818585611498565b600191505092915050565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610ec461115b565b600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610f1d57610f1c82826111d9565b5b5050565b610f2961115b565b5f610f32610872565b11610f3b575f80fd5b5f811115610ffd57610f8d610f4e610872565b610f72700100000000000000000000000000000000846114dd90919063ffffffff16565b610f7c9190612408565b60075461194d90919063ffffffff16565b6007819055503373ffffffffffffffffffffffffffffffffffffffff167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051610fd99190612169565b60405180910390a2610ff681600a5461194d90919063ffffffff16565b600a819055505b50565b61100861115b565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106d9061260e565b60405180910390fd5b61107f81611841565b50565b5f805f805f61108f611ee4565b86815f019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506110cf87610d72565b8160200181815250506110e1876108be565b816040018181525050600d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054816060018181525050805f0151816020015182604001518360600151600b54955095509550955095505091939590929450565b611163611243565b73ffffffffffffffffffffffffffffffffffffffff16611181610c2e565b73ffffffffffffffffffffffffffffffffffffffff16146111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce90612676565b60405180910390fd5b565b5f6111e383610b0f565b905080821115611213575f611201828461190490919063ffffffff16565b905061120d84826119aa565b5061123e565b8082101561123d575f61122f838361190490919063ffffffff16565b905061123b8482611a65565b505b5b505050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112af90612704565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d90612792565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516114009190612169565b60405180910390a3505050565b5f6114188484610e3a565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146114925781811015611484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147b906127fa565b60405180910390fd5b611491848484840361124a565b5b50505050565b5f6114d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cf90612888565b60405180910390fd5b505050565b5f8083036114ed575f905061154e565b5f82846114fa91906128a6565b90508284826115099190612408565b14611549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154090612957565b60405180910390fd5b809150505b92915050565b5f808290505f811215611565575f80fd5b80915050919050565b5f80828461157c919061297e565b90505f831215801561158e5750838112155b806115a357505f831280156115a257508381125b5b6115ab575f80fd5b8091505092915050565b5f808212156115c2575f80fd5b819050919050565b5f806115d583610d72565b90505f8111156118375761162f8160095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461194d90919063ffffffff16565b60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080600b5f8282546116819190612438565b925050819055508273ffffffffffffffffffffffffffffffffffffffff167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d826040516116ce9190612169565b60405180910390a25f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401611733929190612a1a565b6020604051808303815f875af115801561174f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177391906124e5565b90508061182d576117ca8260095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461190490919063ffffffff16565b60095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555081600b5f82825461181c9190612a41565b925050819055505f9250505061183c565b819250505061183c565b5f9150505b919050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f61194583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b20565b905092915050565b5f80828461195b9190612438565b9050838110156119a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199790612abe565b60405180910390fd5b8091505092915050565b6119b48282611b82565b611a206119d46119cf836007546114dd90919063ffffffff16565b611554565b60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611cd090919063ffffffff16565b60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b611a6f8282611d17565b611adb611a8f611a8a836007546114dd90919063ffffffff16565b611554565b60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461156e90919063ffffffff16565b60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050565b5f838311158290611b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5e9190612079565b60405180910390fd5b505f8385611b759190612a41565b9050809150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be790612b26565b60405180910390fd5b611bfb5f8383611eda565b8060025f828254611c0c9190612438565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611cb99190612169565b60405180910390a3611ccc5f8383611edf565b5050565b5f808284611cde9190612b44565b90505f8312158015611cf05750838113155b80611d0557505f83128015611d0457508381135b5b611d0d575f80fd5b8091505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7c90612bf4565b60405180910390fd5b611d90825f83611eda565b5f805f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0a90612c82565b60405180910390fd5b8181035f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f82825403925050819055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ec29190612169565b60405180910390a3611ed5835f84611edf565b505050565b505050565b505050565b60405180608001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81526020015f81525090565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611f4b82611f22565b9050919050565b611f5b81611f41565b8114611f65575f80fd5b50565b5f81359050611f7681611f52565b92915050565b5f8115159050919050565b611f9081611f7c565b8114611f9a575f80fd5b50565b5f81359050611fab81611f87565b92915050565b5f8060408385031215611fc757611fc6611f1e565b5b5f611fd485828601611f68565b9250506020611fe585828601611f9d565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561202657808201518184015260208101905061200b565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61204b82611fef565b6120558185611ff9565b9350612065818560208601612009565b61206e81612031565b840191505092915050565b5f6020820190508181035f8301526120918184612041565b905092915050565b5f819050919050565b6120ab81612099565b81146120b5575f80fd5b50565b5f813590506120c6816120a2565b92915050565b5f80604083850312156120e2576120e1611f1e565b5b5f6120ef85828601611f68565b9250506020612100858286016120b8565b9150509250929050565b61211381611f7c565b82525050565b5f60208201905061212c5f83018461210a565b92915050565b61213b81611f41565b82525050565b5f6020820190506121545f830184612132565b92915050565b61216381612099565b82525050565b5f60208201905061217c5f83018461215a565b92915050565b5f6020828403121561219757612196611f1e565b5b5f6121a484828501611f68565b91505092915050565b5f805f606084860312156121c4576121c3611f1e565b5b5f6121d186828701611f68565b93505060206121e286828701611f68565b92505060406121f3868287016120b8565b9150509250925092565b5f60ff82169050919050565b612212816121fd565b82525050565b5f60208201905061222b5f830184612209565b92915050565b5f806040838503121561224757612246611f1e565b5b5f61225485828601611f68565b925050602061226585828601611f68565b9150509250929050565b5f61227982611f22565b9050919050565b6122898161226f565b8114612293575f80fd5b50565b5f813590506122a481612280565b92915050565b5f602082840312156122bf576122be611f1e565b5b5f6122cc84828501612296565b91505092915050565b5f602082840312156122ea576122e9611f1e565b5b5f6122f7848285016120b8565b91505092915050565b5f60a0820190506123135f830188612132565b612320602083018761215a565b61232d604083018661215a565b61233a606083018561215a565b612347608083018461215a565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061239557607f821691505b6020821081036123a8576123a7612351565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61241282612099565b915061241d83612099565b92508261242d5761242c6123ae565b5b828204905092915050565b5f61244282612099565b915061244d83612099565b9250828201905080821115612465576124646123db565b5b92915050565b5f81519050612479816120a2565b92915050565b5f6020828403121561249457612493611f1e565b5b5f6124a18482850161246b565b91505092915050565b5f6040820190506124bd5f830185612132565b6124ca602083018461215a565b9392505050565b5f815190506124df81611f87565b92915050565b5f602082840312156124fa576124f9611f1e565b5b5f612507848285016124d1565b91505092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f61256a602583611ff9565b915061257582612510565b604082019050919050565b5f6020820190508181035f8301526125978161255e565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6125f8602683611ff9565b91506126038261259e565b604082019050919050565b5f6020820190508181035f830152612625816125ec565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612660602083611ff9565b915061266b8261262c565b602082019050919050565b5f6020820190508181035f83015261268d81612654565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f6126ee602483611ff9565b91506126f982612694565b604082019050919050565b5f6020820190508181035f83015261271b816126e2565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f61277c602283611ff9565b915061278782612722565b604082019050919050565b5f6020820190508181035f8301526127a981612770565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f6127e4601d83611ff9565b91506127ef826127b0565b602082019050919050565b5f6020820190508181035f830152612811816127d8565b9050919050565b7f4c49515f4469766964656e645f547261636b65723a204e6f207472616e7366655f8201527f727320616c6c6f77656400000000000000000000000000000000000000000000602082015250565b5f612872602a83611ff9565b915061287d82612818565b604082019050919050565b5f6020820190508181035f83015261289f81612866565b9050919050565b5f6128b082612099565b91506128bb83612099565b92508282026128c981612099565b915082820484148315176128e0576128df6123db565b5b5092915050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f5f8201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b5f612941602183611ff9565b915061294c826128e7565b604082019050919050565b5f6020820190508181035f83015261296e81612935565b9050919050565b5f819050919050565b5f61298882612975565b915061299383612975565b92508282019050828112155f8312168382125f8412151617156129b9576129b86123db565b5b92915050565b5f819050919050565b5f6129e26129dd6129d884611f22565b6129bf565b611f22565b9050919050565b5f6129f3826129c8565b9050919050565b5f612a04826129e9565b9050919050565b612a14816129fa565b82525050565b5f604082019050612a2d5f830185612a0b565b612a3a602083018461215a565b9392505050565b5f612a4b82612099565b9150612a5683612099565b9250828203905081811115612a6e57612a6d6123db565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f612aa8601b83611ff9565b9150612ab382612a74565b602082019050919050565b5f6020820190508181035f830152612ad581612a9c565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f612b10601f83611ff9565b9150612b1b82612adc565b602082019050919050565b5f6020820190508181035f830152612b3d81612b04565b9050919050565b5f612b4e82612975565b9150612b5983612975565b925082820390508181125f8412168282135f851215161715612b7e57612b7d6123db565b5b92915050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f612bde602183611ff9565b9150612be982612b84565b604082019050919050565b5f6020820190508181035f830152612c0b81612bd2565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e5f8201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b5f612c6c602283611ff9565b9150612c7782612c12565b604082019050919050565b5f6020820190508181035f830152612c9981612c60565b905091905056fea2646970667358221220a6c075b66f4f9edb40b4542133e1a9001bc39f7ab984c97f0107eb941803eb0d64736f6c63430008150033

Deployed Bytecode

0x608060405260043610610338575f3560e01c8063864701a5116101aa578063afa4f3b2116100f6578063dd62ed3e11610094578063f2fde38b1161006e578063f2fde38b14610be4578063f66895a314610c0c578063f887ea4014610c37578063f8b45b0514610c615761033f565b8063dd62ed3e14610b56578063e01af92c14610b92578063e2f4560514610bba5761033f565b8063c0246668116100d0578063c024666814610ab6578063c18bc19514610ade578063c851cc3214610b06578063d2fcc00114610b2e5761033f565b8063afa4f3b214610a2a578063b62496f514610a52578063bdf1436d14610a8e5761033f565b806392929a0911610163578063a457c2d71161013d578063a457c2d71461094c578063a8aa1b3114610988578063a8b9d240146109b2578063a9059cbb146109ee5761033f565b806392929a09146108d257806395d89b41146108fa5780639a7a23d6146109245761033f565b8063864701a5146107d957806388bdd9be1461080457806388e765ff1461082c5780638c9684f9146108565780638da5cb5b1461087e5780638ea5220f146108a85761033f565b806330bb4cff1161028457806366d602ae1161022257806370a08231116101fc57806370a082311461071f578063715018a61461075b57806379b447bd146107715780637b510fe8146107995761033f565b806366d602ae1461068f5780636843cd84146106b95780636ddd1713146106f55761033f565b806346469afb1161025e57806346469afb146105e95780634ada218b146106135780634e71d92d1461063d5780634fbee193146106535761033f565b806330bb4cff14610559578063313ce5671461058357806339509351146105ad5761033f565b806318160ddd116102f157806323b872dd116102cb57806323b872dd146104a15780632866ed21146104dd5780632c1f5216146105075780632e1ab904146105315761033f565b806318160ddd146104255780631bff78981461044f5780631f53ac02146104795761033f565b80630483f7a01461034357806306fdde031461036b578063095ea7b3146103955780630a78097d146103d15780630bd05b69146103f957806312b77e8a1461040f5761033f565b3661033f57005b5f80fd5b34801561034e575f80fd5b50610369600480360381019061036491906138fc565b610c8b565b005b348015610376575f80fd5b5061037f610d20565b60405161038c91906139c4565b60405180910390f35b3480156103a0575f80fd5b506103bb60048036038101906103b69190613a17565b610db0565b6040516103c89190613a64565b60405180910390f35b3480156103dc575f80fd5b506103f760048036038101906103f29190613a7d565b610dd2565b005b348015610404575f80fd5b5061040d610ed7565b005b34801561041a575f80fd5b50610423610f4c565b005b348015610430575f80fd5b50610439610fee565b6040516104469190613ab7565b60405180910390f35b34801561045a575f80fd5b50610463610ff7565b6040516104709190613ab7565b60405180910390f35b348015610484575f80fd5b5061049f600480360381019061049a9190613a7d565b610ffd565b005b3480156104ac575f80fd5b506104c760048036038101906104c29190613ad0565b611048565b6040516104d49190613a64565b60405180910390f35b3480156104e8575f80fd5b506104f1611076565b6040516104fe9190613a64565b60405180910390f35b348015610512575f80fd5b5061051b611089565b6040516105289190613b7b565b60405180910390f35b34801561053c575f80fd5b5061055760048036038101906105529190613a7d565b6110ae565b005b348015610564575f80fd5b5061056d611140565b60405161057a9190613ab7565b60405180910390f35b34801561058e575f80fd5b506105976111d4565b6040516105a49190613baf565b60405180910390f35b3480156105b8575f80fd5b506105d360048036038101906105ce9190613a17565b6111dc565b6040516105e09190613a64565b60405180910390f35b3480156105f4575f80fd5b506105fd611212565b60405161060a9190613ab7565b60405180910390f35b34801561061e575f80fd5b50610627611218565b6040516106349190613a64565b60405180910390f35b348015610648575f80fd5b5061065161122b565b005b34801561065e575f80fd5b5061067960048036038101906106749190613a7d565b611317565b6040516106869190613a64565b60405180910390f35b34801561069a575f80fd5b506106a3611369565b6040516106b09190613ab7565b60405180910390f35b3480156106c4575f80fd5b506106df60048036038101906106da9190613a7d565b61136f565b6040516106ec9190613ab7565b60405180910390f35b348015610700575f80fd5b50610709611410565b6040516107169190613a64565b60405180910390f35b34801561072a575f80fd5b5061074560048036038101906107409190613a7d565b611423565b6040516107529190613ab7565b60405180910390f35b348015610766575f80fd5b5061076f611468565b005b34801561077c575f80fd5b5061079760048036038101906107929190613bc8565b61147b565b005b3480156107a4575f80fd5b506107bf60048036038101906107ba9190613a7d565b611547565b6040516107d0959493929190613c15565b60405180910390f35b3480156107e4575f80fd5b506107ed6115f8565b6040516107fb929190613c66565b60405180910390f35b34801561080f575f80fd5b5061082a60048036038101906108259190613a7d565b611609565b005b348015610837575f80fd5b50610840611825565b60405161084d9190613ab7565b60405180910390f35b348015610861575f80fd5b5061087c60048036038101906108779190613a7d565b61182b565b005b348015610889575f80fd5b506108926118bf565b60405161089f9190613c8d565b60405180910390f35b3480156108b3575f80fd5b506108bc6118e7565b6040516108c99190613c8d565b60405180910390f35b3480156108dd575f80fd5b506108f860048036038101906108f39190613ca6565b61190c565b005b348015610905575f80fd5b5061090e611931565b60405161091b91906139c4565b60405180910390f35b34801561092f575f80fd5b5061094a600480360381019061094591906138fc565b6119c1565b005b348015610957575f80fd5b50610972600480360381019061096d9190613a17565b6119d7565b60405161097f9190613a64565b60405180910390f35b348015610993575f80fd5b5061099c611a4c565b6040516109a99190613c8d565b60405180910390f35b3480156109bd575f80fd5b506109d860048036038101906109d39190613a7d565b611a71565b6040516109e59190613ab7565b60405180910390f35b3480156109f9575f80fd5b50610a146004803603810190610a0f9190613a17565b611b12565b604051610a219190613a64565b60405180910390f35b348015610a35575f80fd5b50610a506004803603810190610a4b9190613cd1565b611b34565b005b348015610a5d575f80fd5b50610a786004803603810190610a739190613a7d565b611b59565b604051610a859190613a64565b60405180910390f35b348015610a99575f80fd5b50610ab46004803603810190610aaf9190613cd1565b611b76565b005b348015610ac1575f80fd5b50610adc6004803603810190610ad791906138fc565b611cd2565b005b348015610ae9575f80fd5b50610b046004803603810190610aff9190613cd1565b611e0f565b005b348015610b11575f80fd5b50610b2c6004803603810190610b279190613a7d565b611e7a565b005b348015610b39575f80fd5b50610b546004803603810190610b4f91906138fc565b611ec5565b005b348015610b61575f80fd5b50610b7c6004803603810190610b779190613cfc565b611f25565b604051610b899190613ab7565b60405180910390f35b348015610b9d575f80fd5b50610bb86004803603810190610bb39190613ca6565b611fa7565b005b348015610bc5575f80fd5b50610bce611fcc565b604051610bdb9190613ab7565b60405180910390f35b348015610bef575f80fd5b50610c0a6004803603810190610c059190613a7d565b611fd2565b005b348015610c17575f80fd5b50610c20612054565b604051610c2e929190613c66565b60405180910390f35b348015610c42575f80fd5b50610c4b612065565b604051610c589190613d5a565b60405180910390f35b348015610c6c575f80fd5b50610c7561208a565b604051610c829190613ab7565b60405180910390f35b610c93612090565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630483f7a083836040518363ffffffff1660e01b8152600401610cef929190613d73565b5f604051808303815f87803b158015610d06575f80fd5b505af1158015610d18573d5f803e3d5ffd5b505050505050565b606060038054610d2f90613dc7565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5b90613dc7565b8015610da65780601f10610d7d57610100808354040283529160200191610da6565b820191905f5260205f20905b815481529060010190602001808311610d8957829003601f168201915b5050505050905090565b5f80610dba61210e565b9050610dc7818585612115565b600191505092915050565b610dda612090565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610dfe6118bf565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e379190613c8d565b602060405180830381865afa158015610e52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e769190613e0b565b6040518363ffffffff1660e01b8152600401610e93929190613e36565b6020604051808303815f875af1158015610eaf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed39190613e71565b5050565b610edf612090565b600760179054906101000a900460ff1615610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2690613ee6565b60405180910390fd5b6001600760176101000a81548160ff021916908315150217905550565b610f54612090565b5f4790505f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610f9e90613f31565b5f6040518083038185875af1925050503d805f8114610fd8576040519150601f19603f3d011682016040523d82523d5f602084013e610fdd565b606091505b5050905080610fea575f80fd5b5050565b5f600254905090565b60135481565b611005612090565b8060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f8061105261210e565b905061105f8582856122d8565b61106a858585612363565b60019150509392505050565b600760169054906101000a900460ff1681565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110b6612090565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166344b6bd9e826040518263ffffffff1660e01b81526004016111109190613c8d565b5f604051808303815f87803b158015611127575f80fd5b505af1158015611139573d5f803e3d5ffd5b5050505050565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166385a6b3ae6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cf9190613e0b565b905090565b5f6012905090565b5f806111e661210e565b90506112078185856111f88589611f25565b6112029190613f72565b612115565b600191505092915050565b60125481565b600760179054906101000a900460ff1681565b600760169054906101000a900460ff1661127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127190613fef565b60405180910390fd5b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663807ab4f7336040518263ffffffff1660e01b81526004016112d4919061402d565b6020604051808303815f875af11580156112f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113149190613e71565b50565b5f60185f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b600c5481565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016113ca9190613c8d565b602060405180830381865afa1580156113e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114099190613e0b565b9050919050565b600760159054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611470612090565b6114795f612caa565b565b611483612090565b629896808210156114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c090614090565b60405180910390fd5b624c4b4081101561150f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115069061411e565b60405180910390fd5b670de0b6b3a764000082611523919061413c565b600b81905550670de0b6b3a76400008161153d919061413c565b600c819055505050565b5f805f805f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fbcbc0f1876040518263ffffffff1660e01b81526004016115a69190613c8d565b60a060405180830381865afa1580156115c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115e59190614191565b9450945094509450945091939590929450565b600e805f0154908060010154905082565b611611612090565b5f8190508073ffffffffffffffffffffffffffffffffffffffff16630483f7a08260016040518363ffffffff1660e01b8152600401611651929190613d73565b5f604051808303815f87803b158015611668575f80fd5b505af115801561167a573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff16630483f7a03060016040518363ffffffff1660e01b81526004016116ba929190613d73565b5f604051808303815f87803b1580156116d1575f80fd5b505af11580156116e3573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff16630483f7a061170b6118bf565b60016040518363ffffffff1660e01b815260040161172a929190613d73565b5f604051808303815f87803b158015611741575f80fd5b505af1158015611753573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff16630483f7a060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016040518363ffffffff1660e01b81526004016117b4929190613d73565b5f604051808303815f87803b1580156117cb575f80fd5b505af11580156117dd573d5f803e3d5ffd5b505050508060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600b5481565b611833612090565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663497ec82333836040518363ffffffff1660e01b815260040161188f929190614208565b5f604051808303815f87803b1580156118a6575f80fd5b505af11580156118b8573d5f803e3d5ffd5b5050505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611914612090565b80600760166101000a81548160ff02191690831515021790555050565b60606004805461194090613dc7565b80601f016020809104026020016040519081016040528092919081815260200182805461196c90613dc7565b80156119b75780601f1061198e576101008083540402835291602001916119b7565b820191905f5260205f20905b81548152906001019060200180831161199a57829003601f168201915b5050505050905090565b6119c9612090565b6119d38282612d6d565b5050565b5f806119e161210e565b90505f6119ee8286611f25565b905083811015611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a9061429f565b60405180910390fd5b611a408286868403612115565b60019250505092915050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a8b9d240836040518263ffffffff1660e01b8152600401611acc9190613c8d565b602060405180830381865afa158015611ae7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b0b9190613e0b565b9050919050565b5f80611b1c61210e565b9050611b29818585612363565b600191505092915050565b611b3c612090565b670de0b6b3a764000081611b50919061413c565b600a8190555050565b6019602052805f5260405f205f915054906101000a900460ff1681565b611b7e612090565b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3360085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856040518463ffffffff1660e01b8152600401611bfe939291906142bd565b6020604051808303815f875af1158015611c1a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c3e9190613e71565b90508015611cce5760085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ede6ad9c836040518263ffffffff1660e01b8152600401611ca09190613ab7565b5f604051808303815f87803b158015611cb7575f80fd5b505af1158015611cc9573d5f803e3d5ffd5b505050505b5050565b611cda612090565b80151560185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090614362565b60405180910390fd5b8060185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611e039190613a64565b60405180910390a25050565b611e17612090565b62989680811015611e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e54906143f0565b60405180910390fd5b670de0b6b3a764000081611e71919061413c565b600d8190555050565b611e82612090565b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611ecd612090565b80601a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611faf612090565b80600760156101000a81548160ff02191690831515021790555050565b600a5481565b611fda612090565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612048576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203f9061447e565b60405180910390fd5b61205181612caa565b50565b6010805f0154908060010154905082565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b61209861210e565b73ffffffffffffffffffffffffffffffffffffffff166120b66118bf565b73ffffffffffffffffffffffffffffffffffffffff161461210c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612103906144e6565b60405180910390fd5b565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217a90614574565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e890614602565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516122cb9190613ab7565b60405180910390a3505050565b5f6122e38484611f25565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461235d578181101561234f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123469061466a565b60405180910390fd5b61235c8484848403612115565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c8906146f8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361243f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243690614786565b60405180910390fd5b60185f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156124dd575060185f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156124f65750600760149054906101000a900460ff16155b1561274f57600760179054906101000a900460ff1661254a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612541906147ee565b60405180910390fd5b60195f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156125fa57600c548111156125de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d590614856565b60405180910390fd5b60175f8154809291906125f090614874565b91905055506126a7565b60195f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156126a657600b5481111561268e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268590614905565b60405180910390fd5b60165f8154809291906126a090614874565b91905055505b5b601a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661274e57600d5461270183611423565b8261270c9190613f72565b111561274d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127449061496d565b60405180910390fd5b5b5b5f81036127665761276183835f612f2b565b612ca5565b5f61277030611423565b90505f600a5482101590508080156127955750600760149054906101000a900460ff16155b80156127ad5750600760159054906101000a900460ff165b80156127ff575060195f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b8015612852575060185f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156128a5575060185f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156128f6576001600760146101000a81548160ff0219169083151502179055505f60135411156128db576128da600a54613197565b5b5f600760146101000a81548160ff0219169083151502179055505b5f600760149054906101000a900460ff1615905060185f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806129a5575060185f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156129ae575f90505b60195f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015612a4c575060195f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612a55575f90505b8015612b7c575f60195f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612ae057606460155460175411612ac057601454612ac4565b6013545b86612acf919061413c565b612ad991906149b8565b9050612b61565b60195f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612b6057606460155460165411612b4457601454612b48565b6012545b86612b53919061413c565b612b5d91906149b8565b90505b5b8085612b6d91906149e8565b9450612b7a873083612f2b565b505b612b87868686612f2b565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc87612bce89611423565b6040518363ffffffff1660e01b8152600401612beb929190613e36565b5f604051808303815f87803b158015612c02575f80fd5b505af1925050508015612c13575060015b5060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e30443bc86612c5b88611423565b6040518363ffffffff1660e01b8152600401612c78929190613e36565b5f604051808303815f87803b158015612c8f575f80fd5b505af1925050508015612ca0575060015b505050505b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80151560195f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503612dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df390614a8b565b60405180910390fd5b8060195f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508015612ee15760085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630483f7a08360016040518363ffffffff1660e01b8152600401612eb3929190613d73565b5f604051808303815f87803b158015612eca575f80fd5b505af1158015612edc573d5f803e3d5ffd5b505050505b8015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f90906146f8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffe90614786565b60405180910390fd5b613012838383613550565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308c90614b19565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161317e9190613ab7565b60405180910390a3613191848484613555565b50505050565b5f600260135460105f0154846131ad919061413c565b6131b791906149b8565b6131c191906149b8565b90505f600260135460105f0154856131d9919061413c565b6131e391906149b8565b6131ed91906149b8565b90505f60135460106001015485613204919061413c565b61320e91906149b8565b90506132198361355a565b5f4790505f8111156132305761322f8382613790565b5b6132398261355a565b5f4790505f8190505f811115613314575f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161328f90613f31565b5f6040518083038185875af1925050503d805f81146132c9576040519150601f19603f3d011682016040523d82523d5f602084013e6132ce565b606091505b5050905080613312576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330990614b81565b60405180910390fd5b505b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161336f9190613c8d565b602060405180830381865afa15801561338a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133ae9190613e0b565b90505f8190505f811115613545575f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b815260040161343a929190613e36565b6020604051808303815f875af1158015613456573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061347a9190613e71565b905080156135435760085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ede6ad9c836040518263ffffffff1660e01b81526004016134dc9190613ab7565b5f604051808303815f87803b1580156134f3575f80fd5b505af1158015613505573d5f803e3d5ffd5b505050507f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc38a8360405161353a929190613c66565b60405180910390a15b505b505050505050505050565b505050565b505050565b5f600267ffffffffffffffff81111561357657613575614b9f565b5b6040519080825280602002602001820160405280156135a45781602001602082028036833780820191505090505b50905030815f815181106135bb576135ba614bcc565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561365f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136839190614bf9565b8160018151811061369757613696614bcc565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506136fd3060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612115565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8430426040518663ffffffff1660e01b815260040161375f959493929190614d14565b5f604051808303815f87803b158015613776575f80fd5b505af1158015613788573d5f803e3d5ffd5b505050505050565b6137bc3060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612115565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198230855f8030426040518863ffffffff1660e01b815260040161382196959493929190614d6c565b60606040518083038185885af115801561383d573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906138629190614dcb565b5050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6138968261386d565b9050919050565b6138a68161388c565b81146138b0575f80fd5b50565b5f813590506138c18161389d565b92915050565b5f8115159050919050565b6138db816138c7565b81146138e5575f80fd5b50565b5f813590506138f6816138d2565b92915050565b5f806040838503121561391257613911613869565b5b5f61391f858286016138b3565b9250506020613930858286016138e8565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613971578082015181840152602081019050613956565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6139968261393a565b6139a08185613944565b93506139b0818560208601613954565b6139b98161397c565b840191505092915050565b5f6020820190508181035f8301526139dc818461398c565b905092915050565b5f819050919050565b6139f6816139e4565b8114613a00575f80fd5b50565b5f81359050613a11816139ed565b92915050565b5f8060408385031215613a2d57613a2c613869565b5b5f613a3a858286016138b3565b9250506020613a4b85828601613a03565b9150509250929050565b613a5e816138c7565b82525050565b5f602082019050613a775f830184613a55565b92915050565b5f60208284031215613a9257613a91613869565b5b5f613a9f848285016138b3565b91505092915050565b613ab1816139e4565b82525050565b5f602082019050613aca5f830184613aa8565b92915050565b5f805f60608486031215613ae757613ae6613869565b5b5f613af4868287016138b3565b9350506020613b05868287016138b3565b9250506040613b1686828701613a03565b9150509250925092565b5f819050919050565b5f613b43613b3e613b398461386d565b613b20565b61386d565b9050919050565b5f613b5482613b29565b9050919050565b5f613b6582613b4a565b9050919050565b613b7581613b5b565b82525050565b5f602082019050613b8e5f830184613b6c565b92915050565b5f60ff82169050919050565b613ba981613b94565b82525050565b5f602082019050613bc25f830184613ba0565b92915050565b5f8060408385031215613bde57613bdd613869565b5b5f613beb85828601613a03565b9250506020613bfc85828601613a03565b9150509250929050565b613c0f8161388c565b82525050565b5f60a082019050613c285f830188613c06565b613c356020830187613aa8565b613c426040830186613aa8565b613c4f6060830185613aa8565b613c5c6080830184613aa8565b9695505050505050565b5f604082019050613c795f830185613aa8565b613c866020830184613aa8565b9392505050565b5f602082019050613ca05f830184613c06565b92915050565b5f60208284031215613cbb57613cba613869565b5b5f613cc8848285016138e8565b91505092915050565b5f60208284031215613ce657613ce5613869565b5b5f613cf384828501613a03565b91505092915050565b5f8060408385031215613d1257613d11613869565b5b5f613d1f858286016138b3565b9250506020613d30858286016138b3565b9150509250929050565b5f613d4482613b4a565b9050919050565b613d5481613d3a565b82525050565b5f602082019050613d6d5f830184613d4b565b92915050565b5f604082019050613d865f830185613c06565b613d936020830184613a55565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613dde57607f821691505b602082108103613df157613df0613d9a565b5b50919050565b5f81519050613e05816139ed565b92915050565b5f60208284031215613e2057613e1f613869565b5b5f613e2d84828501613df7565b91505092915050565b5f604082019050613e495f830185613c06565b613e566020830184613aa8565b9392505050565b5f81519050613e6b816138d2565b92915050565b5f60208284031215613e8657613e85613869565b5b5f613e9384828501613e5d565b91505092915050565b7f54726164696e6720616c726561647920656e61626c65640000000000000000005f82015250565b5f613ed0601783613944565b9150613edb82613e9c565b602082019050919050565b5f6020820190508181035f830152613efd81613ec4565b9050919050565b5f81905092915050565b50565b5f613f1c5f83613f04565b9150613f2782613f0e565b5f82019050919050565b5f613f3b82613f11565b9150819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613f7c826139e4565b9150613f87836139e4565b9250828201905080821115613f9f57613f9e613f45565b5b92915050565b7f436c61696d206e6f7420656e61626c65640000000000000000000000000000005f82015250565b5f613fd9601183613944565b9150613fe482613fa5565b602082019050919050565b5f6020820190508181035f83015261400681613fcd565b9050919050565b5f6140178261386d565b9050919050565b6140278161400d565b82525050565b5f6020820190506140405f83018461401e565b92915050565b7f43616e6e6f7420736574206d6178627579206c6f776572207468616e203125205f82015250565b5f61407a602083613944565b915061408582614046565b602082019050919050565b5f6020820190508181035f8301526140a78161406e565b9050919050565b7f43616e6e6f7420736574206d617873656c6c206c6f776572207468616e20302e5f8201527f3525200000000000000000000000000000000000000000000000000000000000602082015250565b5f614108602383613944565b9150614113826140ae565b604082019050919050565b5f6020820190508181035f830152614135816140fc565b9050919050565b5f614146826139e4565b9150614151836139e4565b925082820261415f816139e4565b9150828204841483151761417657614175613f45565b5b5092915050565b5f8151905061418b8161389d565b92915050565b5f805f805f60a086880312156141aa576141a9613869565b5b5f6141b78882890161417d565b95505060206141c888828901613df7565b94505060406141d988828901613df7565b93505060606141ea88828901613df7565b92505060806141fb88828901613df7565b9150509295509295909350565b5f60408201905061421b5f830185613c06565b6142286020830184613c06565b9392505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f614289602583613944565b91506142948261422f565b604082019050919050565b5f6020820190508181035f8301526142b68161427d565b9050919050565b5f6060820190506142d05f830186613c06565b6142dd6020830185613c06565b6142ea6040830184613aa8565b949350505050565b7f4163636f756e7420697320616c7265616479207468652076616c7565206f66205f8201527f276578636c756465642700000000000000000000000000000000000000000000602082015250565b5f61434c602a83613944565b9150614357826142f2565b604082019050919050565b5f6020820190508181035f83015261437981614340565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e205f8201527f3125000000000000000000000000000000000000000000000000000000000000602082015250565b5f6143da602283613944565b91506143e582614380565b604082019050919050565b5f6020820190508181035f830152614407816143ce565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614468602683613944565b91506144738261440e565b604082019050919050565b5f6020820190508181035f8301526144958161445c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6144d0602083613944565b91506144db8261449c565b602082019050919050565b5f6020820190508181035f8301526144fd816144c4565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61455e602483613944565b915061456982614504565b604082019050919050565b5f6020820190508181035f83015261458b81614552565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6145ec602283613944565b91506145f782614592565b604082019050919050565b5f6020820190508181035f830152614619816145e0565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f614654601d83613944565b915061465f82614620565b602082019050919050565b5f6020820190508181035f83015261468181614648565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6146e2602583613944565b91506146ed82614688565b604082019050919050565b5f6020820190508181035f83015261470f816146d6565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f614770602383613944565b915061477b82614716565b604082019050919050565b5f6020820190508181035f83015261479d81614764565b9050919050565b7f54726164696e67206e6f742061637469766500000000000000000000000000005f82015250565b5f6147d8601283613944565b91506147e3826147a4565b602082019050919050565b5f6020820190508181035f830152614805816147cc565b9050919050565b7f596f752061726520657863656564696e67206d617853656c6c416d6f756e74005f82015250565b5f614840601f83613944565b915061484b8261480c565b602082019050919050565b5f6020820190508181035f83015261486d81614834565b9050919050565b5f61487e826139e4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036148b0576148af613f45565b5b600182019050919050565b7f596f752061726520657863656564696e67206d6178427579416d6f756e7400005f82015250565b5f6148ef601e83613944565b91506148fa826148bb565b602082019050919050565b5f6020820190508181035f83015261491c816148e3565b9050919050565b7f556e61626c6520746f20657863656564204d61782057616c6c657400000000005f82015250565b5f614957601b83613944565b915061496282614923565b602082019050919050565b5f6020820190508181035f8301526149848161494b565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6149c2826139e4565b91506149cd836139e4565b9250826149dd576149dc61498b565b5b828204905092915050565b5f6149f2826139e4565b91506149fd836139e4565b9250828203905081811115614a1557614a14613f45565b5b92915050565b7f4175746f6d61746564206d61726b6574206d616b6572207061697220697320615f8201527f6c72656164792073657420746f20746861742076616c75650000000000000000602082015250565b5f614a75603883613944565b9150614a8082614a1b565b604082019050919050565b5f6020820190508181035f830152614aa281614a69565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f614b03602683613944565b9150614b0e82614aa9565b604082019050919050565b5f6020820190508181035f830152614b3081614af7565b9050919050565b7f4661696c656420746f2073656e642045544820746f206465762077616c6c65745f82015250565b5f614b6b602083613944565b9150614b7682614b37565b602082019050919050565b5f6020820190508181035f830152614b9881614b5f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215614c0e57614c0d613869565b5b5f614c1b8482850161417d565b91505092915050565b5f819050919050565b5f614c47614c42614c3d84614c24565b613b20565b6139e4565b9050919050565b614c5781614c2d565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614c8f8161388c565b82525050565b5f614ca08383614c86565b60208301905092915050565b5f602082019050919050565b5f614cc282614c5d565b614ccc8185614c67565b9350614cd783614c77565b805f5b83811015614d07578151614cee8882614c95565b9750614cf983614cac565b925050600181019050614cda565b5085935050505092915050565b5f60a082019050614d275f830188613aa8565b614d346020830187614c4e565b8181036040830152614d468186614cb8565b9050614d556060830185613c06565b614d626080830184613aa8565b9695505050505050565b5f60c082019050614d7f5f830189613c06565b614d8c6020830188613aa8565b614d996040830187614c4e565b614da66060830186614c4e565b614db36080830185613c06565b614dc060a0830184613aa8565b979650505050505050565b5f805f60608486031215614de257614de1613869565b5b5f614def86828701613df7565b9350506020614e0086828701613df7565b9250506040614e1186828701613df7565b915050925092509256fea26469706673582212207f15eb25e9be5649802253614eab50fb8b4b49e9065d4559a7c17e906465bd1364736f6c63430008150033

Deployed Bytecode Sourcemap

40403:14883:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46552:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9714:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12159:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45243:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47073:148;;;;;;;;;;;;;:::i;:::-;;45545:204;;;;;;;;;;;;;:::i;:::-;;10843:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41066:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46722:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12965:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40575:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40641:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47332:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48242:141;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10685:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13669:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41029:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40606:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44142:149;;;;;;;;;;;;;:::i;:::-;;48391:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40795:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48705:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40538:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11014:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2894:103;;;;;;;;;;;;;:::i;:::-;;44493:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48872:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;40942:35;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;43528:562;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40761:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45757:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2253:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40688:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47229:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9933:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47519:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14430:493;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40482:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48525:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11377:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44835:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41319:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53944:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46165:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44299:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45925:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44962:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11658:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46966:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40721:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3152:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40984:36;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;40447:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40830:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46552:162;2139:13;:11;:13::i;:::-;46654:15:::1;;;;;;;;;;;:36;;;46691:7;46700:5;46654:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46552:162:::0;;:::o;9714:100::-;9768:13;9801:5;9794:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9714:100;:::o;12159:226::-;12262:4;12284:13;12300:12;:10;:12::i;:::-;12284:28;;12323:32;12332:5;12339:7;12348:6;12323:8;:32::i;:::-;12373:4;12366:11;;;12159:226;;;;:::o;45243:209::-;2139:13;:11;:13::i;:::-;45329:12:::1;45322:29;;;45366:7;:5;:7::i;:::-;45395:12;45388:30;;;45427:4;45388:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45322:122;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45243:209:::0;:::o;47073:148::-;2139:13;:11;:13::i;:::-;47139:14:::1;;;;;;;;;;;47138:15;47130:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;47209:4;47192:14;;:21;;;;;;;;;;;;;;;;;;47073:148::o:0;45545:204::-;2139:13;:11;:13::i;:::-;45596:18:::1;45617:21;45596:42;;45650:12;45676:9;;;;;;;;;;;45668:23;;45699:10;45668:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45649:65;;;45733:7;45725:16;;;::::0;::::1;;45585:164;;45545:204::o:0;10843:108::-;10904:7;10931:12;;10924:19;;10843:108;:::o;41066:31::-;;;;:::o;46722:98::-;2139:13;:11;:13::i;:::-;46803:9:::1;46791;;:21;;;;;;;;;;;;;;;;;;46722:98:::0;:::o;12965:295::-;13096:4;13113:15;13131:12;:10;:12::i;:::-;13113:30;;13154:38;13170:4;13176:7;13185:6;13154:15;:38::i;:::-;13203:27;13213:4;13219:2;13223:6;13203:9;:27::i;:::-;13248:4;13241:11;;;12965:295;;;;;:::o;40575:24::-;;;;;;;;;;;;;:::o;40641:38::-;;;;;;;;;;;;;:::o;47332:117::-;2139:13;:11;:13::i;:::-;47401:15:::1;;;;;;;;;;;:30;;;47432:8;47401:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;47332:117:::0;:::o;48242:141::-;48305:7;48332:15;;;;;;;;;;;:41;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48325:50;;48242:141;:::o;10685:93::-;10743:5;10768:2;10761:9;;10685:93;:::o;13669:258::-;13772:4;13794:13;13810:12;:10;:12::i;:::-;13794:28;;13833:64;13842:5;13849:7;13886:10;13858:25;13868:5;13875:7;13858:9;:25::i;:::-;:38;;;;:::i;:::-;13833:8;:64::i;:::-;13915:4;13908:11;;;13669:258;;;;:::o;41029:30::-;;;;:::o;40606:26::-;;;;;;;;;;;;;:::o;44142:149::-;44187:12;;;;;;;;;;;44179:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;44232:15;;;;;;;;;;;:30;;;44271:10;44232:51;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44142:149::o;48391:126::-;48457:4;48481:19;:28;48501:7;48481:28;;;;;;;;;;;;;;;;;;;;;;;;;48474:35;;48391:126;;;:::o;40795:28::-;;;;:::o;48705:159::-;48790:7;48822:15;;;;;;;;;;;:25;;;48848:7;48822:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48815:41;;48705:159;;;:::o;40538:30::-;;;;;;;;;;;;;:::o;11014:157::-;11113:7;11145:9;:18;11155:7;11145:18;;;;;;;;;;;;;;;;11138:25;;11014:157;;;:::o;2894:103::-;2139:13;:11;:13::i;:::-;2959:30:::1;2986:1;2959:18;:30::i;:::-;2894:103::o:0;44493:334::-;2139:13;:11;:13::i;:::-;44613:8:::1;44603:6;:18;;44595:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;44688:7;44677;:18;;44669:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;44770:6;44761;:15;;;;:::i;:::-;44746:12;:30;;;;44813:6;44803:7;:16;;;;:::i;:::-;44787:13;:32;;;;44493:334:::0;;:::o;48872:242::-;48961:7;48979;48997;49015;49033;49071:15;;;;;;;;;;;:26;;;49098:7;49071:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49064:42;;;;;;;;;;48872:242;;;;;;;:::o;40942:35::-;;;;;;;;;;;;;;:::o;43528:562::-;2139:13;:11;:13::i;:::-;43607:34:::1;43682:10;43607:97;;43715:18;:39;;;43777:18;43811:4;43715:111;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43837:18;:39;;;43885:4;43892;43837:60;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43908:18;:39;;;43948:7;:5;:7::i;:::-;43957:4;43908:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43973:18;:39;;;44021:6;;;;;;;;;;;44030:4;43973:62;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;44064:18;44046:15;;:36;;;;;;;;;;;;;;;;;;43596:494;43528:562:::0;:::o;40761:27::-;;;;:::o;45757:160::-;2139:13;:11;:13::i;:::-;45843:15:::1;;;;;;;;;;;:40;;;45884:10;45896:12;45843:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;45757:160:::0;:::o;2253:87::-;2299:7;2326:6;;;;;;;;;;;2319:13;;2253:87;:::o;40688:24::-;;;;;;;;;;;;;:::o;47229:95::-;2139:13;:11;:13::i;:::-;47311:5:::1;47296:12;;:20;;;;;;;;;;;;;;;;;;47229:95:::0;:::o;9933:104::-;9989:13;10022:7;10015:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9933:104;:::o;47519:163::-;2139:13;:11;:13::i;:::-;47630:44:::1;47659:7;47668:5;47630:28;:44::i;:::-;47519:163:::0;;:::o;14430:493::-;14538:4;14560:13;14576:12;:10;:12::i;:::-;14560:28;;14599:24;14626:25;14636:5;14643:7;14626:9;:25::i;:::-;14599:52;;14704:15;14684:16;:35;;14662:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;14820:60;14829:5;14836:7;14864:15;14845:16;:34;14820:8;:60::i;:::-;14911:4;14904:11;;;;14430:493;;;;:::o;40482:19::-;;;;;;;;;;;;;:::o;48525:172::-;48610:7;48642:15;;;;;;;;;;;:38;;;48681:7;48642:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48635:54;;48525:172;;;:::o;11377:218::-;11476:4;11498:13;11514:12;:10;:12::i;:::-;11498:28;;11537;11547:5;11554:2;11558:6;11537:9;:28::i;:::-;11583:4;11576:11;;;11377:218;;;;:::o;44835:119::-;2139:13;:11;:13::i;:::-;44940:6:::1;44931;:15;;;;:::i;:::-;44910:18;:36;;;;44835:119:::0;:::o;41319:57::-;;;;;;;;;;;;;;;;;;;;;;:::o;53944:320::-;2139:13;:11;:13::i;:::-;54025:12:::1;54047:4;;;;;;;;;;;54040:25;;;54080:10;54113:15;;;;;;;;;;;54144:6;54040:121;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54025:136;;54176:7;54172:85;;;54200:15;;;;;;;;;;;:37;;;54238:6;54200:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54172:85;54014:250;53944:320:::0;:::o;46165:327::-;2139:13;:11;:13::i;:::-;46304:8:::1;46272:40;;:19;:28;46292:7;46272:28;;;;;;;;;;;;;;;;;;;;;;;;;:40;;::::0;46250:132:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46424:8;46393:19;:28;46413:7;46393:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;46466:7;46450:34;;;46475:8;46450:34;;;;;;:::i;:::-;;;;;;;;46165:327:::0;;:::o;44299:186::-;2139:13;:11;:13::i;:::-;44392:8:::1;44382:6;:18;;44374:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44471:6;44462;:15;;;;:::i;:::-;44450:9;:27;;;;44299:186:::0;:::o;45925:113::-;2139:13;:11;:13::i;:::-;46020:9:::1;45996:6;;:34;;;;;;;;;;;;;;;;;;45925:113:::0;:::o;44962:157::-;2139:13;:11;:13::i;:::-;45103:8:::1;45067:24;:33;45092:7;45067:33;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;44962:157:::0;;:::o;11658:181::-;11772:7;11804:11;:18;11816:5;11804:18;;;;;;;;;;;;;;;:27;11823:7;11804:27;;;;;;;;;;;;;;;;11797:34;;11658:181;;;;:::o;46966:99::-;2139:13;:11;:13::i;:::-;47049:8:::1;47035:11;;:22;;;;;;;;;;;;;;;;;;46966:99:::0;:::o;40721:33::-;;;;:::o;3152:238::-;2139:13;:11;:13::i;:::-;3275:1:::1;3255:22;;:8;:22;;::::0;3233:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3354:28;3373:8;3354:18;:28::i;:::-;3152:238:::0;:::o;40984:36::-;;;;;;;;;;;;;;:::o;40447:28::-;;;;;;;;;;;;;:::o;40830:24::-;;;;:::o;2418:132::-;2493:12;:10;:12::i;:::-;2482:23;;:7;:5;:7::i;:::-;:23;;;2474:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2418:132::o;777:98::-;830:7;857:10;850:17;;777:98;:::o;18535:380::-;18688:1;18671:19;;:5;:19;;;18663:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18769:1;18750:21;;:7;:21;;;18742:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18853:6;18823:11;:18;18835:5;18823:18;;;;;;;;;;;;;;;:27;18842:7;18823:27;;;;;;;;;;;;;;;:36;;;;18891:7;18875:32;;18884:5;18875:32;;;18900:6;18875:32;;;;;;:::i;:::-;;;;;;;;18535:380;;;:::o;19206:502::-;19341:24;19368:25;19378:5;19385:7;19368:9;:25::i;:::-;19341:52;;19428:17;19408:16;:37;19404:297;;19508:6;19488:16;:26;;19462:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;19623:51;19632:5;19639:7;19667:6;19648:16;:25;19623:8;:51::i;:::-;19404:297;19330:378;19206:502;;;:::o;49214:3150::-;49362:1;49346:18;;:4;:18;;;49338:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49439:1;49425:16;;:2;:16;;;49417:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;49513:19;:25;49533:4;49513:25;;;;;;;;;;;;;;;;;;;;;;;;;49512:26;:54;;;;;49543:19;:23;49563:2;49543:23;;;;;;;;;;;;;;;;;;;;;;;;;49542:24;49512:54;:67;;;;;49571:8;;;;;;;;;;;49570:9;49512:67;49494:866;;;49614:14;;;;;;;;;;;49606:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;49670:25;:29;49696:2;49670:29;;;;;;;;;;;;;;;;;;;;;;;;;49666:463;;;49760:13;;49750:6;:23;;49720:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;49867:10;;:12;;;;;;;;;:::i;:::-;;;;;;49666:463;;;49905:25;:31;49931:4;49905:31;;;;;;;;;;;;;;;;;;;;;;;;;49901:228;;;49997:12;;49987:6;:22;;49957:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;50102:9;;:11;;;;;;;;;:::i;:::-;;;;;;49901:228;49666:463;50148:24;:28;50173:2;50148:28;;;;;;;;;;;;;;;;;;;;;;;;;50143:206;;50253:9;;50236:13;50246:2;50236:9;:13::i;:::-;50227:6;:22;;;;:::i;:::-;:35;;50197:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;50143:206;49494:866;50386:1;50376:6;:11;50372:93;;50404:28;50420:4;50426:2;50430:1;50404:15;:28::i;:::-;50447:7;;50372:93;50477:28;50508:24;50526:4;50508:9;:24::i;:::-;50477:55;;50543:12;50582:18;;50558:20;:42;;50543:57;;50631:7;:33;;;;;50656:8;;;;;;;;;;;50655:9;50631:33;:61;;;;;50681:11;;;;;;;;;;;50631:61;:107;;;;;50709:25;:29;50735:2;50709:29;;;;;;;;;;;;;;;;;;;;;;;;;50631:107;:150;;;;;50756:19;:25;50776:4;50756:25;;;;;;;;;;;;;;;;;;;;;;;;;50755:26;50631:150;:191;;;;;50799:19;:23;50819:2;50799:23;;;;;;;;;;;;;;;;;;;;;;;;;50798:24;50631:191;50613:403;;;50860:4;50849:8;;:15;;;;;;;;;;;;;;;;;;50900:1;50885:12;;:16;50881:91;;;50922:34;50937:18;;50922:14;:34::i;:::-;50881:91;50999:5;50988:8;;:16;;;;;;;;;;;;;;;;;;50613:403;51028:12;51044:8;;;;;;;;;;;51043:9;51028:24;;51154:19;:25;51174:4;51154:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;51183:19;:23;51203:2;51183:23;;;;;;;;;;;;;;;;;;;;;;;;;51154:52;51150:100;;;51233:5;51223:15;;51150:100;51267:25;:29;51293:2;51267:29;;;;;;;;;;;;;;;;;;;;;;;;;51266:30;:66;;;;;51301:25;:31;51327:4;51301:31;;;;;;;;;;;;;;;;;;;;;;;;;51300:32;51266:66;51262:100;;;51357:5;51347:15;;51262:100;51379:7;51375:790;;;51403:14;51436:25;:29;51462:2;51436:29;;;;;;;;;;;;;;;;;;;;;;;;;51432:622;;;51754:3;51595:12;;51582:10;;:25;:120;;51691:11;;51582:120;;;51643:12;;51582:120;51517:6;:212;;;;:::i;:::-;51516:241;;;;:::i;:::-;51486:271;;51432:622;;;51783:25;:31;51809:4;51783:31;;;;;;;;;;;;;;;;;;;;;;;;;51779:275;;;52035:3;51943:12;;51931:9;;:24;:52;;51972:11;;51931:52;;;51958:11;;51931:52;51866:6;:144;;;;:::i;:::-;51865:173;;;;:::i;:::-;51835:203;;51779:275;51432:622;52088:6;52079;:15;;;;:::i;:::-;52070:24;;52109:44;52125:4;52139;52146:6;52109:15;:44::i;:::-;51388:777;51375:790;52175:33;52191:4;52197:2;52201:6;52175:15;:33::i;:::-;52225:15;;;;;;;;;;;:26;;;52252:4;52258:15;52268:4;52258:9;:15::i;:::-;52225:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52221:65;52300:15;;;;;;;;;;;:26;;;52327:2;52331:13;52341:2;52331:9;:13::i;:::-;52300:45;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52296:61;49327:3037;;;49214:3150;;;;:::o;3550:191::-;3624:16;3643:6;;;;;;;;;;;3624:25;;3669:8;3660:6;;:17;;;;;;;;;;;;;;;;;;3724:8;3693:40;;3714:8;3693:40;;;;;;;;;;;;3613:128;3550:191;:::o;47690:458::-;47836:5;47798:43;;:25;:34;47824:7;47798:34;;;;;;;;;;;;;;;;;;;;;;;;;:43;;;47776:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;47973:5;47936:25;:34;47962:7;47936:34;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;47995:5;47991:89;;;48017:15;;;;;;;;;;;:36;;;48054:7;48063:4;48017:51;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47991:89;48134:5;48097:43;;48125:7;48097:43;;;;;;;;;;;;47690:458;;:::o;15393:869::-;15540:1;15524:18;;:4;:18;;;15516:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15617:1;15603:16;;:2;:16;;;15595:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;15672:38;15693:4;15699:2;15703:6;15672:20;:38::i;:::-;15723:19;15745:9;:15;15755:4;15745:15;;;;;;;;;;;;;;;;15723:37;;15808:6;15793:11;:21;;15771:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;15948:6;15934:11;:20;15916:9;:15;15926:4;15916:15;;;;;;;;;;;;;;;:38;;;;16143:6;16126:9;:13;16136:2;16126:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;16193:2;16178:26;;16187:4;16178:26;;;16197:6;16178:26;;;;;;:::i;:::-;;;;;;;;16217:37;16237:4;16243:2;16247:6;16217:19;:37::i;:::-;15505:757;15393:869;;;:::o;52372:1446::-;52431:20;52525:1;52488:12;;52465:9;:19;;;52456:6;:28;;;;:::i;:::-;52455:45;;;;:::i;:::-;52454:72;;;;:::i;:::-;52431:95;;52537:32;52635:1;52619:12;;52583:9;:19;;;52574:6;:28;;;;:::i;:::-;52573:58;;;;:::i;:::-;52572:64;;;;:::i;:::-;52537:99;;52647:20;52697:12;;52680:9;:13;;;52671:6;:22;;;;:::i;:::-;52670:39;;;;:::i;:::-;52647:62;;52722:30;52739:12;52722:16;:30::i;:::-;52765:22;52790:21;52765:46;;52845:1;52828:14;:18;52824:142;;;52900:54;52913:24;52939:14;52900:12;:54::i;:::-;52824:142;52978:30;52995:12;52978:16;:30::i;:::-;53021:21;53045;53021:45;;53107:14;53124:13;53107:30;;53163:1;53154:6;:10;53150:171;;;53182:12;53208:9;;;;;;;;;;;53200:23;;53231:6;53200:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53181:61;;;53265:7;53257:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;53166:155;53150:171;53333:17;53360:4;;;;;;;;;;;53353:22;;;53384:4;53353:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53333:57;;53435:17;53455:9;53435:29;;53493:1;53481:9;:13;53477:334;;;53511:12;53533:4;;;;;;;;;;;53526:21;;;53574:15;;;;;;;;;;;53609:9;53526:107;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53511:122;;53652:7;53648:152;;;53680:15;;;;;;;;;;;:37;;;53718:9;53680:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53752:32;53766:6;53774:9;53752:32;;;;;;;:::i;:::-;;;;;;;;53648:152;53496:315;53477:334;52420:1398;;;;;;;;52372:1446;:::o;20308:125::-;;;;:::o;21037:124::-;;;;:::o;54272:502::-;54338:21;54376:1;54362:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54338:40;;54407:4;54389;54394:1;54389:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;54433:6;;;;;;;;;;;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54423:4;54428:1;54423:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;54459:53;54476:4;54491:6;;;;;;;;;;;54500:11;54459:8;:53::i;:::-;54551:6;;;;;;;;;;;:57;;;54623:11;54649:1;54693:4;54720;54740:15;54551:215;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54327:447;54272:502;:::o;54782:501::-;54930:53;54947:4;54962:6;;;;;;;;;;;54971:11;54930:8;:53::i;:::-;55026:6;;;;;;;;;;;:22;;;55056:9;55089:4;55109:11;55135:1;55178;55229:4;55249:15;55026:249;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;54782:501;;:::o;88:117:1:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:90::-;875:7;918:5;911:13;904:21;893:32;;841:90;;;:::o;937:116::-;1007:21;1022:5;1007:21;:::i;:::-;1000:5;997:32;987:60;;1043:1;1040;1033:12;987:60;937:116;:::o;1059:133::-;1102:5;1140:6;1127:20;1118:29;;1156:30;1180:5;1156:30;:::i;:::-;1059:133;;;;:::o;1198:468::-;1263:6;1271;1320:2;1308:9;1299:7;1295:23;1291:32;1288:119;;;1326:79;;:::i;:::-;1288:119;1446:1;1471:53;1516:7;1507:6;1496:9;1492:22;1471:53;:::i;:::-;1461:63;;1417:117;1573:2;1599:50;1641:7;1632:6;1621:9;1617:22;1599:50;:::i;:::-;1589:60;;1544:115;1198:468;;;;;:::o;1672:99::-;1724:6;1758:5;1752:12;1742:22;;1672:99;;;:::o;1777:169::-;1861:11;1895:6;1890:3;1883:19;1935:4;1930:3;1926:14;1911:29;;1777:169;;;;:::o;1952:246::-;2033:1;2043:113;2057:6;2054:1;2051:13;2043:113;;;2142:1;2137:3;2133:11;2127:18;2123:1;2118:3;2114:11;2107:39;2079:2;2076:1;2072:10;2067:15;;2043:113;;;2190:1;2181:6;2176:3;2172:16;2165:27;2014:184;1952:246;;;:::o;2204:102::-;2245:6;2296:2;2292:7;2287:2;2280:5;2276:14;2272:28;2262:38;;2204:102;;;:::o;2312:377::-;2400:3;2428:39;2461:5;2428:39;:::i;:::-;2483:71;2547:6;2542:3;2483:71;:::i;:::-;2476:78;;2563:65;2621:6;2616:3;2609:4;2602:5;2598:16;2563:65;:::i;:::-;2653:29;2675:6;2653:29;:::i;:::-;2648:3;2644:39;2637:46;;2404:285;2312:377;;;;:::o;2695:313::-;2808:4;2846:2;2835:9;2831:18;2823:26;;2895:9;2889:4;2885:20;2881:1;2870:9;2866:17;2859:47;2923:78;2996:4;2987:6;2923:78;:::i;:::-;2915:86;;2695:313;;;;:::o;3014:77::-;3051:7;3080:5;3069:16;;3014:77;;;:::o;3097:122::-;3170:24;3188:5;3170:24;:::i;:::-;3163:5;3160:35;3150:63;;3209:1;3206;3199:12;3150:63;3097:122;:::o;3225:139::-;3271:5;3309:6;3296:20;3287:29;;3325:33;3352:5;3325:33;:::i;:::-;3225:139;;;;:::o;3370:474::-;3438:6;3446;3495:2;3483:9;3474:7;3470:23;3466:32;3463:119;;;3501:79;;:::i;:::-;3463:119;3621:1;3646:53;3691:7;3682:6;3671:9;3667:22;3646:53;:::i;:::-;3636:63;;3592:117;3748:2;3774:53;3819:7;3810:6;3799:9;3795:22;3774:53;:::i;:::-;3764:63;;3719:118;3370:474;;;;;:::o;3850:109::-;3931:21;3946:5;3931:21;:::i;:::-;3926:3;3919:34;3850:109;;:::o;3965:210::-;4052:4;4090:2;4079:9;4075:18;4067:26;;4103:65;4165:1;4154:9;4150:17;4141:6;4103:65;:::i;:::-;3965:210;;;;:::o;4181:329::-;4240:6;4289:2;4277:9;4268:7;4264:23;4260:32;4257:119;;;4295:79;;:::i;:::-;4257:119;4415:1;4440:53;4485:7;4476:6;4465:9;4461:22;4440:53;:::i;:::-;4430:63;;4386:117;4181:329;;;;:::o;4516:118::-;4603:24;4621:5;4603:24;:::i;:::-;4598:3;4591:37;4516:118;;:::o;4640:222::-;4733:4;4771:2;4760:9;4756:18;4748:26;;4784:71;4852:1;4841:9;4837:17;4828:6;4784:71;:::i;:::-;4640:222;;;;:::o;4868:619::-;4945:6;4953;4961;5010:2;4998:9;4989:7;4985:23;4981:32;4978:119;;;5016:79;;:::i;:::-;4978:119;5136:1;5161:53;5206:7;5197:6;5186:9;5182:22;5161:53;:::i;:::-;5151:63;;5107:117;5263:2;5289:53;5334:7;5325:6;5314:9;5310:22;5289:53;:::i;:::-;5279:63;;5234:118;5391:2;5417:53;5462:7;5453:6;5442:9;5438:22;5417:53;:::i;:::-;5407:63;;5362:118;4868:619;;;;;:::o;5493:60::-;5521:3;5542:5;5535:12;;5493:60;;;:::o;5559:142::-;5609:9;5642:53;5660:34;5669:24;5687:5;5669:24;:::i;:::-;5660:34;:::i;:::-;5642:53;:::i;:::-;5629:66;;5559:142;;;:::o;5707:126::-;5757:9;5790:37;5821:5;5790:37;:::i;:::-;5777:50;;5707:126;;;:::o;5839:150::-;5913:9;5946:37;5977:5;5946:37;:::i;:::-;5933:50;;5839:150;;;:::o;5995:179::-;6106:61;6161:5;6106:61;:::i;:::-;6101:3;6094:74;5995:179;;:::o;6180:270::-;6297:4;6335:2;6324:9;6320:18;6312:26;;6348:95;6440:1;6429:9;6425:17;6416:6;6348:95;:::i;:::-;6180:270;;;;:::o;6456:86::-;6491:7;6531:4;6524:5;6520:16;6509:27;;6456:86;;;:::o;6548:112::-;6631:22;6647:5;6631:22;:::i;:::-;6626:3;6619:35;6548:112;;:::o;6666:214::-;6755:4;6793:2;6782:9;6778:18;6770:26;;6806:67;6870:1;6859:9;6855:17;6846:6;6806:67;:::i;:::-;6666:214;;;;:::o;6886:474::-;6954:6;6962;7011:2;6999:9;6990:7;6986:23;6982:32;6979:119;;;7017:79;;:::i;:::-;6979:119;7137:1;7162:53;7207:7;7198:6;7187:9;7183:22;7162:53;:::i;:::-;7152:63;;7108:117;7264:2;7290:53;7335:7;7326:6;7315:9;7311:22;7290:53;:::i;:::-;7280:63;;7235:118;6886:474;;;;;:::o;7366:118::-;7453:24;7471:5;7453:24;:::i;:::-;7448:3;7441:37;7366:118;;:::o;7490:664::-;7695:4;7733:3;7722:9;7718:19;7710:27;;7747:71;7815:1;7804:9;7800:17;7791:6;7747:71;:::i;:::-;7828:72;7896:2;7885:9;7881:18;7872:6;7828:72;:::i;:::-;7910;7978:2;7967:9;7963:18;7954:6;7910:72;:::i;:::-;7992;8060:2;8049:9;8045:18;8036:6;7992:72;:::i;:::-;8074:73;8142:3;8131:9;8127:19;8118:6;8074:73;:::i;:::-;7490:664;;;;;;;;:::o;8160:332::-;8281:4;8319:2;8308:9;8304:18;8296:26;;8332:71;8400:1;8389:9;8385:17;8376:6;8332:71;:::i;:::-;8413:72;8481:2;8470:9;8466:18;8457:6;8413:72;:::i;:::-;8160:332;;;;;:::o;8498:222::-;8591:4;8629:2;8618:9;8614:18;8606:26;;8642:71;8710:1;8699:9;8695:17;8686:6;8642:71;:::i;:::-;8498:222;;;;:::o;8726:323::-;8782:6;8831:2;8819:9;8810:7;8806:23;8802:32;8799:119;;;8837:79;;:::i;:::-;8799:119;8957:1;8982:50;9024:7;9015:6;9004:9;9000:22;8982:50;:::i;:::-;8972:60;;8928:114;8726:323;;;;:::o;9055:329::-;9114:6;9163:2;9151:9;9142:7;9138:23;9134:32;9131:119;;;9169:79;;:::i;:::-;9131:119;9289:1;9314:53;9359:7;9350:6;9339:9;9335:22;9314:53;:::i;:::-;9304:63;;9260:117;9055:329;;;;:::o;9390:474::-;9458:6;9466;9515:2;9503:9;9494:7;9490:23;9486:32;9483:119;;;9521:79;;:::i;:::-;9483:119;9641:1;9666:53;9711:7;9702:6;9691:9;9687:22;9666:53;:::i;:::-;9656:63;;9612:117;9768:2;9794:53;9839:7;9830:6;9819:9;9815:22;9794:53;:::i;:::-;9784:63;;9739:118;9390:474;;;;;:::o;9870:149::-;9943:9;9976:37;10007:5;9976:37;:::i;:::-;9963:50;;9870:149;;;:::o;10025:177::-;10135:60;10189:5;10135:60;:::i;:::-;10130:3;10123:73;10025:177;;:::o;10208:268::-;10324:4;10362:2;10351:9;10347:18;10339:26;;10375:94;10466:1;10455:9;10451:17;10442:6;10375:94;:::i;:::-;10208:268;;;;:::o;10482:320::-;10597:4;10635:2;10624:9;10620:18;10612:26;;10648:71;10716:1;10705:9;10701:17;10692:6;10648:71;:::i;:::-;10729:66;10791:2;10780:9;10776:18;10767:6;10729:66;:::i;:::-;10482:320;;;;;:::o;10808:180::-;10856:77;10853:1;10846:88;10953:4;10950:1;10943:15;10977:4;10974:1;10967:15;10994:320;11038:6;11075:1;11069:4;11065:12;11055:22;;11122:1;11116:4;11112:12;11143:18;11133:81;;11199:4;11191:6;11187:17;11177:27;;11133:81;11261:2;11253:6;11250:14;11230:18;11227:38;11224:84;;11280:18;;:::i;:::-;11224:84;11045:269;10994:320;;;:::o;11320:143::-;11377:5;11408:6;11402:13;11393:22;;11424:33;11451:5;11424:33;:::i;:::-;11320:143;;;;:::o;11469:351::-;11539:6;11588:2;11576:9;11567:7;11563:23;11559:32;11556:119;;;11594:79;;:::i;:::-;11556:119;11714:1;11739:64;11795:7;11786:6;11775:9;11771:22;11739:64;:::i;:::-;11729:74;;11685:128;11469:351;;;;:::o;11826:332::-;11947:4;11985:2;11974:9;11970:18;11962:26;;11998:71;12066:1;12055:9;12051:17;12042:6;11998:71;:::i;:::-;12079:72;12147:2;12136:9;12132:18;12123:6;12079:72;:::i;:::-;11826:332;;;;;:::o;12164:137::-;12218:5;12249:6;12243:13;12234:22;;12265:30;12289:5;12265:30;:::i;:::-;12164:137;;;;:::o;12307:345::-;12374:6;12423:2;12411:9;12402:7;12398:23;12394:32;12391:119;;;12429:79;;:::i;:::-;12391:119;12549:1;12574:61;12627:7;12618:6;12607:9;12603:22;12574:61;:::i;:::-;12564:71;;12520:125;12307:345;;;;:::o;12658:173::-;12798:25;12794:1;12786:6;12782:14;12775:49;12658:173;:::o;12837:366::-;12979:3;13000:67;13064:2;13059:3;13000:67;:::i;:::-;12993:74;;13076:93;13165:3;13076:93;:::i;:::-;13194:2;13189:3;13185:12;13178:19;;12837:366;;;:::o;13209:419::-;13375:4;13413:2;13402:9;13398:18;13390:26;;13462:9;13456:4;13452:20;13448:1;13437:9;13433:17;13426:47;13490:131;13616:4;13490:131;:::i;:::-;13482:139;;13209:419;;;:::o;13634:147::-;13735:11;13772:3;13757:18;;13634:147;;;;:::o;13787:114::-;;:::o;13907:398::-;14066:3;14087:83;14168:1;14163:3;14087:83;:::i;:::-;14080:90;;14179:93;14268:3;14179:93;:::i;:::-;14297:1;14292:3;14288:11;14281:18;;13907:398;;;:::o;14311:379::-;14495:3;14517:147;14660:3;14517:147;:::i;:::-;14510:154;;14681:3;14674:10;;14311:379;;;:::o;14696:180::-;14744:77;14741:1;14734:88;14841:4;14838:1;14831:15;14865:4;14862:1;14855:15;14882:191;14922:3;14941:20;14959:1;14941:20;:::i;:::-;14936:25;;14975:20;14993:1;14975:20;:::i;:::-;14970:25;;15018:1;15015;15011:9;15004:16;;15039:3;15036:1;15033:10;15030:36;;;15046:18;;:::i;:::-;15030:36;14882:191;;;;:::o;15079:167::-;15219:19;15215:1;15207:6;15203:14;15196:43;15079:167;:::o;15252:366::-;15394:3;15415:67;15479:2;15474:3;15415:67;:::i;:::-;15408:74;;15491:93;15580:3;15491:93;:::i;:::-;15609:2;15604:3;15600:12;15593:19;;15252:366;;;:::o;15624:419::-;15790:4;15828:2;15817:9;15813:18;15805:26;;15877:9;15871:4;15867:20;15863:1;15852:9;15848:17;15841:47;15905:131;16031:4;15905:131;:::i;:::-;15897:139;;15624:419;;;:::o;16049:104::-;16094:7;16123:24;16141:5;16123:24;:::i;:::-;16112:35;;16049:104;;;:::o;16159:142::-;16262:32;16288:5;16262:32;:::i;:::-;16257:3;16250:45;16159:142;;:::o;16307:254::-;16416:4;16454:2;16443:9;16439:18;16431:26;;16467:87;16551:1;16540:9;16536:17;16527:6;16467:87;:::i;:::-;16307:254;;;;:::o;16567:182::-;16707:34;16703:1;16695:6;16691:14;16684:58;16567:182;:::o;16755:366::-;16897:3;16918:67;16982:2;16977:3;16918:67;:::i;:::-;16911:74;;16994:93;17083:3;16994:93;:::i;:::-;17112:2;17107:3;17103:12;17096:19;;16755:366;;;:::o;17127:419::-;17293:4;17331:2;17320:9;17316:18;17308:26;;17380:9;17374:4;17370:20;17366:1;17355:9;17351:17;17344:47;17408:131;17534:4;17408:131;:::i;:::-;17400:139;;17127:419;;;:::o;17552:222::-;17692:34;17688:1;17680:6;17676:14;17669:58;17761:5;17756:2;17748:6;17744:15;17737:30;17552:222;:::o;17780:366::-;17922:3;17943:67;18007:2;18002:3;17943:67;:::i;:::-;17936:74;;18019:93;18108:3;18019:93;:::i;:::-;18137:2;18132:3;18128:12;18121:19;;17780:366;;;:::o;18152:419::-;18318:4;18356:2;18345:9;18341:18;18333:26;;18405:9;18399:4;18395:20;18391:1;18380:9;18376:17;18369:47;18433:131;18559:4;18433:131;:::i;:::-;18425:139;;18152:419;;;:::o;18577:410::-;18617:7;18640:20;18658:1;18640:20;:::i;:::-;18635:25;;18674:20;18692:1;18674:20;:::i;:::-;18669:25;;18729:1;18726;18722:9;18751:30;18769:11;18751:30;:::i;:::-;18740:41;;18930:1;18921:7;18917:15;18914:1;18911:22;18891:1;18884:9;18864:83;18841:139;;18960:18;;:::i;:::-;18841:139;18625:362;18577:410;;;;:::o;18993:143::-;19050:5;19081:6;19075:13;19066:22;;19097:33;19124:5;19097:33;:::i;:::-;18993:143;;;;:::o;19142:977::-;19248:6;19256;19264;19272;19280;19329:3;19317:9;19308:7;19304:23;19300:33;19297:120;;;19336:79;;:::i;:::-;19297:120;19456:1;19481:64;19537:7;19528:6;19517:9;19513:22;19481:64;:::i;:::-;19471:74;;19427:128;19594:2;19620:64;19676:7;19667:6;19656:9;19652:22;19620:64;:::i;:::-;19610:74;;19565:129;19733:2;19759:64;19815:7;19806:6;19795:9;19791:22;19759:64;:::i;:::-;19749:74;;19704:129;19872:2;19898:64;19954:7;19945:6;19934:9;19930:22;19898:64;:::i;:::-;19888:74;;19843:129;20011:3;20038:64;20094:7;20085:6;20074:9;20070:22;20038:64;:::i;:::-;20028:74;;19982:130;19142:977;;;;;;;;:::o;20125:332::-;20246:4;20284:2;20273:9;20269:18;20261:26;;20297:71;20365:1;20354:9;20350:17;20341:6;20297:71;:::i;:::-;20378:72;20446:2;20435:9;20431:18;20422:6;20378:72;:::i;:::-;20125:332;;;;;:::o;20463:224::-;20603:34;20599:1;20591:6;20587:14;20580:58;20672:7;20667:2;20659:6;20655:15;20648:32;20463:224;:::o;20693:366::-;20835:3;20856:67;20920:2;20915:3;20856:67;:::i;:::-;20849:74;;20932:93;21021:3;20932:93;:::i;:::-;21050:2;21045:3;21041:12;21034:19;;20693:366;;;:::o;21065:419::-;21231:4;21269:2;21258:9;21254:18;21246:26;;21318:9;21312:4;21308:20;21304:1;21293:9;21289:17;21282:47;21346:131;21472:4;21346:131;:::i;:::-;21338:139;;21065:419;;;:::o;21490:442::-;21639:4;21677:2;21666:9;21662:18;21654:26;;21690:71;21758:1;21747:9;21743:17;21734:6;21690:71;:::i;:::-;21771:72;21839:2;21828:9;21824:18;21815:6;21771:72;:::i;:::-;21853;21921:2;21910:9;21906:18;21897:6;21853:72;:::i;:::-;21490:442;;;;;;:::o;21938:229::-;22078:34;22074:1;22066:6;22062:14;22055:58;22147:12;22142:2;22134:6;22130:15;22123:37;21938:229;:::o;22173:366::-;22315:3;22336:67;22400:2;22395:3;22336:67;:::i;:::-;22329:74;;22412:93;22501:3;22412:93;:::i;:::-;22530:2;22525:3;22521:12;22514:19;;22173:366;;;:::o;22545:419::-;22711:4;22749:2;22738:9;22734:18;22726:26;;22798:9;22792:4;22788:20;22784:1;22773:9;22769:17;22762:47;22826:131;22952:4;22826:131;:::i;:::-;22818:139;;22545:419;;;:::o;22970:221::-;23110:34;23106:1;23098:6;23094:14;23087:58;23179:4;23174:2;23166:6;23162:15;23155:29;22970:221;:::o;23197:366::-;23339:3;23360:67;23424:2;23419:3;23360:67;:::i;:::-;23353:74;;23436:93;23525:3;23436:93;:::i;:::-;23554:2;23549:3;23545:12;23538:19;;23197:366;;;:::o;23569:419::-;23735:4;23773:2;23762:9;23758:18;23750:26;;23822:9;23816:4;23812:20;23808:1;23797:9;23793:17;23786:47;23850:131;23976:4;23850:131;:::i;:::-;23842:139;;23569:419;;;:::o;23994:225::-;24134:34;24130:1;24122:6;24118:14;24111:58;24203:8;24198:2;24190:6;24186:15;24179:33;23994:225;:::o;24225:366::-;24367:3;24388:67;24452:2;24447:3;24388:67;:::i;:::-;24381:74;;24464:93;24553:3;24464:93;:::i;:::-;24582:2;24577:3;24573:12;24566:19;;24225:366;;;:::o;24597:419::-;24763:4;24801:2;24790:9;24786:18;24778:26;;24850:9;24844:4;24840:20;24836:1;24825:9;24821:17;24814:47;24878:131;25004:4;24878:131;:::i;:::-;24870:139;;24597:419;;;:::o;25022:182::-;25162:34;25158:1;25150:6;25146:14;25139:58;25022:182;:::o;25210:366::-;25352:3;25373:67;25437:2;25432:3;25373:67;:::i;:::-;25366:74;;25449:93;25538:3;25449:93;:::i;:::-;25567:2;25562:3;25558:12;25551:19;;25210:366;;;:::o;25582:419::-;25748:4;25786:2;25775:9;25771:18;25763:26;;25835:9;25829:4;25825:20;25821:1;25810:9;25806:17;25799:47;25863:131;25989:4;25863:131;:::i;:::-;25855:139;;25582:419;;;:::o;26007:223::-;26147:34;26143:1;26135:6;26131:14;26124:58;26216:6;26211:2;26203:6;26199:15;26192:31;26007:223;:::o;26236:366::-;26378:3;26399:67;26463:2;26458:3;26399:67;:::i;:::-;26392:74;;26475:93;26564:3;26475:93;:::i;:::-;26593:2;26588:3;26584:12;26577:19;;26236:366;;;:::o;26608:419::-;26774:4;26812:2;26801:9;26797:18;26789:26;;26861:9;26855:4;26851:20;26847:1;26836:9;26832:17;26825:47;26889:131;27015:4;26889:131;:::i;:::-;26881:139;;26608:419;;;:::o;27033:221::-;27173:34;27169:1;27161:6;27157:14;27150:58;27242:4;27237:2;27229:6;27225:15;27218:29;27033:221;:::o;27260:366::-;27402:3;27423:67;27487:2;27482:3;27423:67;:::i;:::-;27416:74;;27499:93;27588:3;27499:93;:::i;:::-;27617:2;27612:3;27608:12;27601:19;;27260:366;;;:::o;27632:419::-;27798:4;27836:2;27825:9;27821:18;27813:26;;27885:9;27879:4;27875:20;27871:1;27860:9;27856:17;27849:47;27913:131;28039:4;27913:131;:::i;:::-;27905:139;;27632:419;;;:::o;28057:179::-;28197:31;28193:1;28185:6;28181:14;28174:55;28057:179;:::o;28242:366::-;28384:3;28405:67;28469:2;28464:3;28405:67;:::i;:::-;28398:74;;28481:93;28570:3;28481:93;:::i;:::-;28599:2;28594:3;28590:12;28583:19;;28242:366;;;:::o;28614:419::-;28780:4;28818:2;28807:9;28803:18;28795:26;;28867:9;28861:4;28857:20;28853:1;28842:9;28838:17;28831:47;28895:131;29021:4;28895:131;:::i;:::-;28887:139;;28614:419;;;:::o;29039:224::-;29179:34;29175:1;29167:6;29163:14;29156:58;29248:7;29243:2;29235:6;29231:15;29224:32;29039:224;:::o;29269:366::-;29411:3;29432:67;29496:2;29491:3;29432:67;:::i;:::-;29425:74;;29508:93;29597:3;29508:93;:::i;:::-;29626:2;29621:3;29617:12;29610:19;;29269:366;;;:::o;29641:419::-;29807:4;29845:2;29834:9;29830:18;29822:26;;29894:9;29888:4;29884:20;29880:1;29869:9;29865:17;29858:47;29922:131;30048:4;29922:131;:::i;:::-;29914:139;;29641:419;;;:::o;30066:222::-;30206:34;30202:1;30194:6;30190:14;30183:58;30275:5;30270:2;30262:6;30258:15;30251:30;30066:222;:::o;30294:366::-;30436:3;30457:67;30521:2;30516:3;30457:67;:::i;:::-;30450:74;;30533:93;30622:3;30533:93;:::i;:::-;30651:2;30646:3;30642:12;30635:19;;30294:366;;;:::o;30666:419::-;30832:4;30870:2;30859:9;30855:18;30847:26;;30919:9;30913:4;30909:20;30905:1;30894:9;30890:17;30883:47;30947:131;31073:4;30947:131;:::i;:::-;30939:139;;30666:419;;;:::o;31091:168::-;31231:20;31227:1;31219:6;31215:14;31208:44;31091:168;:::o;31265:366::-;31407:3;31428:67;31492:2;31487:3;31428:67;:::i;:::-;31421:74;;31504:93;31593:3;31504:93;:::i;:::-;31622:2;31617:3;31613:12;31606:19;;31265:366;;;:::o;31637:419::-;31803:4;31841:2;31830:9;31826:18;31818:26;;31890:9;31884:4;31880:20;31876:1;31865:9;31861:17;31854:47;31918:131;32044:4;31918:131;:::i;:::-;31910:139;;31637:419;;;:::o;32062:181::-;32202:33;32198:1;32190:6;32186:14;32179:57;32062:181;:::o;32249:366::-;32391:3;32412:67;32476:2;32471:3;32412:67;:::i;:::-;32405:74;;32488:93;32577:3;32488:93;:::i;:::-;32606:2;32601:3;32597:12;32590:19;;32249:366;;;:::o;32621:419::-;32787:4;32825:2;32814:9;32810:18;32802:26;;32874:9;32868:4;32864:20;32860:1;32849:9;32845:17;32838:47;32902:131;33028:4;32902:131;:::i;:::-;32894:139;;32621:419;;;:::o;33046:233::-;33085:3;33108:24;33126:5;33108:24;:::i;:::-;33099:33;;33154:66;33147:5;33144:77;33141:103;;33224:18;;:::i;:::-;33141:103;33271:1;33264:5;33260:13;33253:20;;33046:233;;;:::o;33285:180::-;33425:32;33421:1;33413:6;33409:14;33402:56;33285:180;:::o;33471:366::-;33613:3;33634:67;33698:2;33693:3;33634:67;:::i;:::-;33627:74;;33710:93;33799:3;33710:93;:::i;:::-;33828:2;33823:3;33819:12;33812:19;;33471:366;;;:::o;33843:419::-;34009:4;34047:2;34036:9;34032:18;34024:26;;34096:9;34090:4;34086:20;34082:1;34071:9;34067:17;34060:47;34124:131;34250:4;34124:131;:::i;:::-;34116:139;;33843:419;;;:::o;34268:177::-;34408:29;34404:1;34396:6;34392:14;34385:53;34268:177;:::o;34451:366::-;34593:3;34614:67;34678:2;34673:3;34614:67;:::i;:::-;34607:74;;34690:93;34779:3;34690:93;:::i;:::-;34808:2;34803:3;34799:12;34792:19;;34451:366;;;:::o;34823:419::-;34989:4;35027:2;35016:9;35012:18;35004:26;;35076:9;35070:4;35066:20;35062:1;35051:9;35047:17;35040:47;35104:131;35230:4;35104:131;:::i;:::-;35096:139;;34823:419;;;:::o;35248:180::-;35296:77;35293:1;35286:88;35393:4;35390:1;35383:15;35417:4;35414:1;35407:15;35434:185;35474:1;35491:20;35509:1;35491:20;:::i;:::-;35486:25;;35525:20;35543:1;35525:20;:::i;:::-;35520:25;;35564:1;35554:35;;35569:18;;:::i;:::-;35554:35;35611:1;35608;35604:9;35599:14;;35434:185;;;;:::o;35625:194::-;35665:4;35685:20;35703:1;35685:20;:::i;:::-;35680:25;;35719:20;35737:1;35719:20;:::i;:::-;35714:25;;35763:1;35760;35756:9;35748:17;;35787:1;35781:4;35778:11;35775:37;;;35792:18;;:::i;:::-;35775:37;35625:194;;;;:::o;35825:243::-;35965:34;35961:1;35953:6;35949:14;35942:58;36034:26;36029:2;36021:6;36017:15;36010:51;35825:243;:::o;36074:366::-;36216:3;36237:67;36301:2;36296:3;36237:67;:::i;:::-;36230:74;;36313:93;36402:3;36313:93;:::i;:::-;36431:2;36426:3;36422:12;36415:19;;36074:366;;;:::o;36446:419::-;36612:4;36650:2;36639:9;36635:18;36627:26;;36699:9;36693:4;36689:20;36685:1;36674:9;36670:17;36663:47;36727:131;36853:4;36727:131;:::i;:::-;36719:139;;36446:419;;;:::o;36871:225::-;37011:34;37007:1;36999:6;36995:14;36988:58;37080:8;37075:2;37067:6;37063:15;37056:33;36871:225;:::o;37102:366::-;37244:3;37265:67;37329:2;37324:3;37265:67;:::i;:::-;37258:74;;37341:93;37430:3;37341:93;:::i;:::-;37459:2;37454:3;37450:12;37443:19;;37102:366;;;:::o;37474:419::-;37640:4;37678:2;37667:9;37663:18;37655:26;;37727:9;37721:4;37717:20;37713:1;37702:9;37698:17;37691:47;37755:131;37881:4;37755:131;:::i;:::-;37747:139;;37474:419;;;:::o;37899:182::-;38039:34;38035:1;38027:6;38023:14;38016:58;37899:182;:::o;38087:366::-;38229:3;38250:67;38314:2;38309:3;38250:67;:::i;:::-;38243:74;;38326:93;38415:3;38326:93;:::i;:::-;38444:2;38439:3;38435:12;38428:19;;38087:366;;;:::o;38459:419::-;38625:4;38663:2;38652:9;38648:18;38640:26;;38712:9;38706:4;38702:20;38698:1;38687:9;38683:17;38676:47;38740:131;38866:4;38740:131;:::i;:::-;38732:139;;38459:419;;;:::o;38884:180::-;38932:77;38929:1;38922:88;39029:4;39026:1;39019:15;39053:4;39050:1;39043:15;39070:180;39118:77;39115:1;39108:88;39215:4;39212:1;39205:15;39239:4;39236:1;39229:15;39256:351;39326:6;39375:2;39363:9;39354:7;39350:23;39346:32;39343:119;;;39381:79;;:::i;:::-;39343:119;39501:1;39526:64;39582:7;39573:6;39562:9;39558:22;39526:64;:::i;:::-;39516:74;;39472:128;39256:351;;;;:::o;39613:85::-;39658:7;39687:5;39676:16;;39613:85;;;:::o;39704:158::-;39762:9;39795:61;39813:42;39822:32;39848:5;39822:32;:::i;:::-;39813:42;:::i;:::-;39795:61;:::i;:::-;39782:74;;39704:158;;;:::o;39868:147::-;39963:45;40002:5;39963:45;:::i;:::-;39958:3;39951:58;39868:147;;:::o;40021:114::-;40088:6;40122:5;40116:12;40106:22;;40021:114;;;:::o;40141:184::-;40240:11;40274:6;40269:3;40262:19;40314:4;40309:3;40305:14;40290:29;;40141:184;;;;:::o;40331:132::-;40398:4;40421:3;40413:11;;40451:4;40446:3;40442:14;40434:22;;40331:132;;;:::o;40469:108::-;40546:24;40564:5;40546:24;:::i;:::-;40541:3;40534:37;40469:108;;:::o;40583:179::-;40652:10;40673:46;40715:3;40707:6;40673:46;:::i;:::-;40751:4;40746:3;40742:14;40728:28;;40583:179;;;;:::o;40768:113::-;40838:4;40870;40865:3;40861:14;40853:22;;40768:113;;;:::o;40917:732::-;41036:3;41065:54;41113:5;41065:54;:::i;:::-;41135:86;41214:6;41209:3;41135:86;:::i;:::-;41128:93;;41245:56;41295:5;41245:56;:::i;:::-;41324:7;41355:1;41340:284;41365:6;41362:1;41359:13;41340:284;;;41441:6;41435:13;41468:63;41527:3;41512:13;41468:63;:::i;:::-;41461:70;;41554:60;41607:6;41554:60;:::i;:::-;41544:70;;41400:224;41387:1;41384;41380:9;41375:14;;41340:284;;;41344:14;41640:3;41633:10;;41041:608;;;40917:732;;;;:::o;41655:831::-;41918:4;41956:3;41945:9;41941:19;41933:27;;41970:71;42038:1;42027:9;42023:17;42014:6;41970:71;:::i;:::-;42051:80;42127:2;42116:9;42112:18;42103:6;42051:80;:::i;:::-;42178:9;42172:4;42168:20;42163:2;42152:9;42148:18;42141:48;42206:108;42309:4;42300:6;42206:108;:::i;:::-;42198:116;;42324:72;42392:2;42381:9;42377:18;42368:6;42324:72;:::i;:::-;42406:73;42474:3;42463:9;42459:19;42450:6;42406:73;:::i;:::-;41655:831;;;;;;;;:::o;42492:807::-;42741:4;42779:3;42768:9;42764:19;42756:27;;42793:71;42861:1;42850:9;42846:17;42837:6;42793:71;:::i;:::-;42874:72;42942:2;42931:9;42927:18;42918:6;42874:72;:::i;:::-;42956:80;43032:2;43021:9;43017:18;43008:6;42956:80;:::i;:::-;43046;43122:2;43111:9;43107:18;43098:6;43046:80;:::i;:::-;43136:73;43204:3;43193:9;43189:19;43180:6;43136:73;:::i;:::-;43219;43287:3;43276:9;43272:19;43263:6;43219:73;:::i;:::-;42492:807;;;;;;;;;:::o;43305:663::-;43393:6;43401;43409;43458:2;43446:9;43437:7;43433:23;43429:32;43426:119;;;43464:79;;:::i;:::-;43426:119;43584:1;43609:64;43665:7;43656:6;43645:9;43641:22;43609:64;:::i;:::-;43599:74;;43555:128;43722:2;43748:64;43804:7;43795:6;43784:9;43780:22;43748:64;:::i;:::-;43738:74;;43693:129;43861:2;43887:64;43943:7;43934:6;43923:9;43919:22;43887:64;:::i;:::-;43877:74;;43832:129;43305:663;;;;;:::o

Swarm Source

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