ETH Price: $2,760.39 (+4.59%)

Token

The Feens (tf)
 

Overview

Max Total Supply

684 tf

Holders

385

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 tf
0x353b086d1eb800d95457012d47fff77a8a9e1185
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:
TheFeens

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-22
*/

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


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/interfaces/IERC20.sol


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

pragma solidity ^0.8.0;


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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/interfaces/IERC165.sol


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

pragma solidity ^0.8.0;


// File: @openzeppelin/contracts/interfaces/IERC2981.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: contracts/ERC721A.sol



pragma solidity ^0.8.0;









/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Mapping from token ID to ownership details
  // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

  // Mapping from token ID to approved address
  mapping(uint256 => address) private _tokenApprovals;

  // Mapping from owner to operator approvals
  mapping(address => mapping(address => bool)) private _operatorApprovals;

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

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

  /**
   * @dev See {IERC721Enumerable-tokenByIndex}.
   */
  function tokenByIndex(uint256 index) public view override returns (uint256) {
    require(index < totalSupply(), "ERC721A: global index out of bounds");
    return index;
  }

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

  /**
   * @dev See {IERC165-supportsInterface}.
   */
  function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(ERC165, IERC165)
    returns (bool)
  {
    return
      interfaceId == type(IERC721).interfaceId ||
      interfaceId == type(IERC721Metadata).interfaceId ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      super.supportsInterface(interfaceId);
  }

  /**
   * @dev See {IERC721-balanceOf}.
   */
  function balanceOf(address owner) public view override returns (uint256) {
    require(owner != address(0), "ERC721A: balance query for the zero address");
    return uint256(_addressData[owner].balance);
  }

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

  /**
   * @dev See {IERC721Metadata-name}.
   */
  function name() public view virtual override returns (string memory) {
    return _name;
  }

  /**
   * @dev See {IERC721Metadata-symbol}.
   */
  function symbol() public view virtual override returns (string memory) {
    return _symbol;
  }

  /**
   * @dev See {IERC721Metadata-tokenURI}.
   */
  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    string memory baseURI = _baseURI();
    return
      bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, tokenId.toString()))
        : "";
  }

  /**
   * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
   * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
   * by default, can be overriden in child contracts.
   */
  function _baseURI() internal view virtual returns (string memory) {
    return "";
  }

  /**
   * @dev See {IERC721-approve}.
   */
  function approve(address to, uint256 tokenId) public override {
    address owner = ERC721A.ownerOf(tokenId);
    require(to != owner, "ERC721A: approval to current owner");

    require(
      _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
      "ERC721A: approve caller is not owner nor approved for all"
    );

    _approve(to, tokenId, owner);
  }

  /**
   * @dev See {IERC721-getApproved}.
   */
  function getApproved(uint256 tokenId) public view override returns (address) {
    require(_exists(tokenId), "ERC721A: approved query for nonexistent token");

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: approve to caller");

    _operatorApprovals[_msgSender()][operator] = approved;
    emit ApprovalForAll(_msgSender(), operator, approved);
  }

  /**
   * @dev See {IERC721-isApprovedForAll}.
   */
  function isApprovedForAll(address owner, address operator)
    public
    view
    virtual
    override
    returns (bool)
  {
    return _operatorApprovals[owner][operator];
  }

  /**
   * @dev See {IERC721-transferFrom}.
   */
  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public override {
    _transfer(from, to, tokenId);
  }

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public override {
    safeTransferFrom(from, to, tokenId, "");
  }

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: transfer to non ERC721Receiver implementer"
    );
  }

  /**
   * @dev Returns whether `tokenId` exists.
   *
   * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
   *
   * Tokens start existing when they are minted (`_mint`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

    // Clear approvals from the previous owner
    _approve(address(0), tokenId, prevOwnership.addr);

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

    emit Transfer(from, to, tokenId);
    _afterTokenTransfers(from, to, tokenId, 1);
  }

  /**
   * @dev Approve `to` to operate on `tokenId`
   *
   * Emits a {Approval} event.
   */
  function _approve(
    address to,
    uint256 tokenId,
    address owner
  ) private {
    _tokenApprovals[tokenId] = to;
    emit Approval(owner, to, tokenId);
  }

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

  /**
   * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
   * The call is not executed if the target address is not a contract.
   *
   * @param from address representing the previous owner of the given token ID
   * @param to target address that will receive the tokens
   * @param tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return bool whether the call correctly returned the expected magic value
   */
  function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) private returns (bool) {
    if (to.isContract()) {
      try
        IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
      returns (bytes4 retval) {
        return retval == IERC721Receiver(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721A: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
   * transferred to `to`.
   * - When `from` is zero, `tokenId` will be minted for `to`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  /**
   * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
   * minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero.
   * - `from` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}

//SPDX-License-Identifier: MIT
//Contract based on [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)

pragma solidity ^0.8.0;









contract TheFeens is ERC721A, IERC2981, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;
    using Strings for uint256;

    Counters.Counter private tokenCounter;

    string private baseURI = "ipfs://QmNnm7SfxG6LyFpypZj2Nau6X1s3mK7XZmGEvQ8EEddGf2";
    address private openSeaProxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;
    bool private isOpenSeaProxyActive = true;

    uint256 public constant MAX_MINTS_PER_TX = 2;
    uint256 public maxSupply = 3333;

    uint256 public constant PUBLIC_SALE_PRICE = 0.005 ether;
    uint256 public NUM_FREE_MINTS = 500 ;
    bool public isPublicSaleActive = false;




    // ============ ACCESS CONTROL/SANITY MODIFIERS ============

    modifier publicSaleActive() {
        require(isPublicSaleActive, "Public sale is not open");
        _;
    }



    modifier maxMintsPerTX(uint256 numberOfTokens) {
        require(
            numberOfTokens <= MAX_MINTS_PER_TX,
            "Max mints per transaction exceeded"
        );
        _;
    }

    modifier canMintNFTs(uint256 numberOfTokens) {
        require(
            totalSupply() + numberOfTokens <=
                maxSupply,
            "Not enough mints remaining to mint"
        );
        _;
    }

    modifier freeMintsAvailable() {
        require(
            totalSupply() <=
                NUM_FREE_MINTS,
            "Not enough free mints remain"
        );
        _;
    }



    modifier isCorrectPayment(uint256 price, uint256 numberOfTokens) {
        if(totalSupply()>NUM_FREE_MINTS){
        require(
            (price * numberOfTokens) == msg.value,
            "Incorrect ETH value sent"
        );
        }
        _;
    }


    constructor(
    ) ERC721A("The Feens ", "tf", 100, maxSupply) {
    }

    // ============ PUBLIC FUNCTIONS FOR MINTING ============

    function mint(uint256 numberOfTokens)
        external
        payable
        nonReentrant
        isCorrectPayment(PUBLIC_SALE_PRICE, numberOfTokens)
        publicSaleActive
        canMintNFTs(numberOfTokens)
        maxMintsPerTX(numberOfTokens)
    {

        _safeMint(msg.sender, numberOfTokens);
    }



    //A simple free mint function to avoid confusion
    //The normal mint function with a cost of 0 would work too

    // ============ PUBLIC READ-ONLY FUNCTIONS ============

    function getBaseURI() external view returns (string memory) {
        return baseURI;
    }

    // ============ OWNER-ONLY ADMIN FUNCTIONS ============

    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
    }

    // function to disable gasless listings for security in case
    // opensea ever shuts down or is compromised
    function setIsOpenSeaProxyActive(bool _isOpenSeaProxyActive)
        external
        onlyOwner
    {
        isOpenSeaProxyActive = _isOpenSeaProxyActive;
    }

    function setIsPublicSaleActive(bool _isPublicSaleActive)
        external
        onlyOwner
    {
        isPublicSaleActive = _isPublicSaleActive;
    }


    function setNumFreeMints(uint256 _numfreemints)
        external
        onlyOwner
    {
        NUM_FREE_MINTS = _numfreemints;
    }


    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function withdrawTokens(IERC20 token) public onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        token.transfer(msg.sender, balance);
    }



    // ============ SUPPORTING FUNCTIONS ============

    function nextTokenId() private returns (uint256) {
        tokenCounter.increment();
        return tokenCounter.current();
    }

    // ============ FUNCTION OVERRIDES ============

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721A, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev Override isApprovedForAll to allowlist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        // Get a reference to OpenSea's proxy registry contract by instantiating
        // the contract using the already existing address.
        ProxyRegistry proxyRegistry = ProxyRegistry(
            openSeaProxyRegistryAddress
        );
        if (
            isOpenSeaProxyActive &&
            address(proxyRegistry.proxies(owner)) == operator
        ) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId), "Nonexistent token");

        return
            string(abi.encodePacked(baseURI, "/", (tokenId+1).toString(), ".json"));
    }

    /**
     * @dev See {IERC165-royaltyInfo}.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        require(_exists(tokenId), "Nonexistent token");

        return (address(this), SafeMath.div(SafeMath.mul(salePrice, 5), 100));
    }
}

// These contract definitions are used to create a reference to the OpenSea
// ProxyRegistry contract by using the registry's address (see isApprovedForAll).
contract OwnableDelegateProxy {

}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

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":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINTS_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUM_FREE_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isOpenSeaProxyActive","type":"bool"}],"name":"setIsOpenSeaProxyActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPublicSaleActive","type":"bool"}],"name":"setIsPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numfreemints","type":"uint256"}],"name":"setNumFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526000805560006007556040518060600160405280603581526020016200553960359139600b908162000037919062000588565b5073a5409ec958c83c3f309868babaca7c86dcb077c1600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c60146101000a81548160ff021916908315150217905550610d05600d556101f4600e556000600f60006101000a81548160ff021916908315150217905550348015620000dc57600080fd5b506040518060400160405280600a81526020017f546865204665656e7320000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f74660000000000000000000000000000000000000000000000000000000000008152506064600d546000811162000194576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200018b90620006f6565b60405180910390fd5b60008211620001da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d1906200078e565b60405180910390fd5b8360019081620001eb919062000588565b508260029081620001fd919062000588565b508160a0818152505080608081815250505050505062000232620002266200024060201b60201c565b6200024860201b60201c565b6001600981905550620007b0565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200039057607f821691505b602082108103620003a657620003a562000348565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004107fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003d1565b6200041c8683620003d1565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000469620004636200045d8462000434565b6200043e565b62000434565b9050919050565b6000819050919050565b620004858362000448565b6200049d620004948262000470565b848454620003de565b825550505050565b600090565b620004b4620004a5565b620004c18184846200047a565b505050565b5b81811015620004e957620004dd600082620004aa565b600181019050620004c7565b5050565b601f82111562000538576200050281620003ac565b6200050d84620003c1565b810160208510156200051d578190505b620005356200052c85620003c1565b830182620004c6565b50505b505050565b600082821c905092915050565b60006200055d600019846008026200053d565b1980831691505092915050565b60006200057883836200054a565b9150826002028217905092915050565b62000593826200030e565b67ffffffffffffffff811115620005af57620005ae62000319565b5b620005bb825462000377565b620005c8828285620004ed565b600060209050601f831160018114620006005760008415620005eb578287015190505b620005f785826200056a565b86555062000667565b601f1984166200061086620003ac565b60005b828110156200063a5784890151825560018201915060208501945060208101905062000613565b868310156200065a578489015162000656601f8916826200054a565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b6000620006de602e836200066f565b9150620006eb8262000680565b604082019050919050565b600060208201905081810360008301526200071181620006cf565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b6000620007766027836200066f565b9150620007838262000718565b604082019050919050565b60006020820190508181036000830152620007a98162000767565b9050919050565b60805160a051614d58620007e1600039600081816123a7015281816123d00152612aeb015260005050614d586000f3fe6080604052600436106101f95760003560e01c80636352211e1161010d578063a22cb465116100a0578063d5abeb011161006f578063d5abeb0114610725578063d7224ba014610750578063e43082f71461077b578063e985e9c5146107a4578063f2fde38b146107e1576101f9565b8063a22cb4651461066b578063b88d4fde14610694578063c6a91b42146106bd578063c87b56dd146106e8576101f9565b80638da5cb5b116100dc5780638da5cb5b146105ce57806395d89b41146105f9578063982d669e14610624578063a0712d681461064f576101f9565b80636352211e1461051257806370a082311461054f578063714c53981461058c578063715018a6146105b7576101f9565b806323b872dd116101905780633ccfd60b1161015f5780633ccfd60b1461044357806342842e0e1461045a57806349df728c146104835780634f6ccce7146104ac57806355f804b3146104e9576101f9565b806323b872dd1461037657806328cad13d1461039f5780632a55205a146103c85780632f745c5914610406576101f9565b8063095ea7b3116101cc578063095ea7b3146102ce5780630a00ae83146102f757806318160ddd146103205780631e84c4131461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b57806307e89ec014610266578063081812fc14610291575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612fc2565b61080a565b604051610232919061300a565b60405180910390f35b34801561024757600080fd5b50610250610884565b60405161025d91906130b5565b60405180910390f35b34801561027257600080fd5b5061027b610916565b60405161028891906130f0565b60405180910390f35b34801561029d57600080fd5b506102b860048036038101906102b39190613137565b610921565b6040516102c591906131a5565b60405180910390f35b3480156102da57600080fd5b506102f560048036038101906102f091906131ec565b6109a6565b005b34801561030357600080fd5b5061031e60048036038101906103199190613137565b610abe565b005b34801561032c57600080fd5b50610335610b44565b60405161034291906130f0565b60405180910390f35b34801561035757600080fd5b50610360610b4d565b60405161036d919061300a565b60405180910390f35b34801561038257600080fd5b5061039d6004803603810190610398919061322c565b610b60565b005b3480156103ab57600080fd5b506103c660048036038101906103c191906132ab565b610b70565b005b3480156103d457600080fd5b506103ef60048036038101906103ea91906132d8565b610c09565b6040516103fd929190613318565b60405180910390f35b34801561041257600080fd5b5061042d600480360381019061042891906131ec565b610c75565b60405161043a91906130f0565b60405180910390f35b34801561044f57600080fd5b50610458610e71565b005b34801561046657600080fd5b50610481600480360381019061047c919061322c565b610f3c565b005b34801561048f57600080fd5b506104aa60048036038101906104a5919061337f565b610f5c565b005b3480156104b857600080fd5b506104d360048036038101906104ce9190613137565b6110d9565b6040516104e091906130f0565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b91906134e1565b61112c565b005b34801561051e57600080fd5b5061053960048036038101906105349190613137565b6111bb565b60405161054691906131a5565b60405180910390f35b34801561055b57600080fd5b506105766004803603810190610571919061352a565b6111d1565b60405161058391906130f0565b60405180910390f35b34801561059857600080fd5b506105a16112b9565b6040516105ae91906130b5565b60405180910390f35b3480156105c357600080fd5b506105cc61134b565b005b3480156105da57600080fd5b506105e36113d3565b6040516105f091906131a5565b60405180910390f35b34801561060557600080fd5b5061060e6113fd565b60405161061b91906130b5565b60405180910390f35b34801561063057600080fd5b5061063961148f565b60405161064691906130f0565b60405180910390f35b61066960048036038101906106649190613137565b611495565b005b34801561067757600080fd5b50610692600480360381019061068d9190613557565b61164f565b005b3480156106a057600080fd5b506106bb60048036038101906106b69190613638565b6117cf565b005b3480156106c957600080fd5b506106d261182b565b6040516106df91906130f0565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a9190613137565b611830565b60405161071c91906130b5565b60405180910390f35b34801561073157600080fd5b5061073a6118b8565b60405161074791906130f0565b60405180910390f35b34801561075c57600080fd5b506107656118be565b60405161077291906130f0565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d91906132ab565b6118c4565b005b3480156107b057600080fd5b506107cb60048036038101906107c691906136bb565b61195d565b6040516107d8919061300a565b60405180910390f35b3480156107ed57600080fd5b506108086004803603810190610803919061352a565b611a68565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087d575061087c82611b5f565b5b9050919050565b6060600180546108939061372a565b80601f01602080910402602001604051908101604052809291908181526020018280546108bf9061372a565b801561090c5780601f106108e15761010080835404028352916020019161090c565b820191906000526020600020905b8154815290600101906020018083116108ef57829003601f168201915b5050505050905090565b6611c37937e0800081565b600061092c82611ca9565b61096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906137cd565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109b1826111bb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a189061385f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a40611cb6565b73ffffffffffffffffffffffffffffffffffffffff161480610a6f5750610a6e81610a69611cb6565b61195d565b5b610aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa5906138f1565b60405180910390fd5b610ab9838383611cbe565b505050565b610ac6611cb6565b73ffffffffffffffffffffffffffffffffffffffff16610ae46113d3565b73ffffffffffffffffffffffffffffffffffffffff1614610b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b319061395d565b60405180910390fd5b80600e8190555050565b60008054905090565b600f60009054906101000a900460ff1681565b610b6b838383611d70565b505050565b610b78611cb6565b73ffffffffffffffffffffffffffffffffffffffff16610b966113d3565b73ffffffffffffffffffffffffffffffffffffffff1614610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be39061395d565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b600080610c1584611ca9565b610c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4b906139c9565b60405180910390fd5b30610c6a610c63856005612327565b606461233d565b915091509250929050565b6000610c80836111d1565b8210610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb890613a5b565b60405180910390fd5b6000610ccb610b44565b905060008060005b83811015610e2f576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610dc557806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e1b57868403610e0c578195505050505050610e6b565b8380610e1790613aaa565b9450505b508080610e2790613aaa565b915050610cd3565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290613b64565b60405180910390fd5b92915050565b610e79611cb6565b73ffffffffffffffffffffffffffffffffffffffff16610e976113d3565b73ffffffffffffffffffffffffffffffffffffffff1614610eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee49061395d565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f38573d6000803e3d6000fd5b5050565b610f57838383604051806020016040528060008152506117cf565b505050565b610f64611cb6565b73ffffffffffffffffffffffffffffffffffffffff16610f826113d3565b73ffffffffffffffffffffffffffffffffffffffff1614610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf9061395d565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161101391906131a5565b602060405180830381865afa158015611030573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110549190613b99565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611091929190613318565b6020604051808303816000875af11580156110b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d49190613bdb565b505050565b60006110e3610b44565b8210611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b90613c7a565b60405180910390fd5b819050919050565b611134611cb6565b73ffffffffffffffffffffffffffffffffffffffff166111526113d3565b73ffffffffffffffffffffffffffffffffffffffff16146111a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119f9061395d565b60405180910390fd5b80600b90816111b79190613e46565b5050565b60006111c682612353565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123890613f8a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6060600b80546112c89061372a565b80601f01602080910402602001604051908101604052809291908181526020018280546112f49061372a565b80156113415780601f1061131657610100808354040283529160200191611341565b820191906000526020600020905b81548152906001019060200180831161132457829003601f168201915b5050505050905090565b611353611cb6565b73ffffffffffffffffffffffffffffffffffffffff166113716113d3565b73ffffffffffffffffffffffffffffffffffffffff16146113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be9061395d565b60405180910390fd5b6113d16000612556565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461140c9061372a565b80601f01602080910402602001604051908101604052809291908181526020018280546114389061372a565b80156114855780601f1061145a57610100808354040283529160200191611485565b820191906000526020600020905b81548152906001019060200180831161146857829003601f168201915b5050505050905090565b600e5481565b6002600954036114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d190613ff6565b60405180910390fd5b60026009819055506611c37937e0800081600e546114f6610b44565b111561154a573481836115099190614016565b14611549576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611540906140a4565b60405180910390fd5b5b600f60009054906101000a900460ff16611599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159090614110565b60405180910390fd5b82600d54816115a6610b44565b6115b09190614130565b11156115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e8906141d6565b60405180910390fd5b836002811115611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d90614268565b60405180910390fd5b611640338661261c565b50505050600160098190555050565b611657611cb6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb906142d4565b60405180910390fd5b80600660006116d1611cb6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661177e611cb6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117c3919061300a565b60405180910390a35050565b6117da848484611d70565b6117e68484848461263a565b611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90614366565b60405180910390fd5b50505050565b600281565b606061183b82611ca9565b61187a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611871906139c9565b60405180910390fd5b600b61189160018461188c9190614130565b6127c1565b6040516020016118a29291906144dd565b6040516020818303038152906040529050919050565b600d5481565b60075481565b6118cc611cb6565b73ffffffffffffffffffffffffffffffffffffffff166118ea6113d3565b73ffffffffffffffffffffffffffffffffffffffff1614611940576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119379061395d565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60149054906101000a900460ff168015611a4557508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016119ec91906131a5565b602060405180830381865afa158015611a09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2d9190614555565b73ffffffffffffffffffffffffffffffffffffffff16145b15611a54576001915050611a62565b611a5e8484612921565b9150505b92915050565b611a70611cb6565b73ffffffffffffffffffffffffffffffffffffffff16611a8e6113d3565b73ffffffffffffffffffffffffffffffffffffffff1614611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb9061395d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a906145f4565b60405180910390fd5b611b5c81612556565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c2a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c9257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ca25750611ca1826129b5565b5b9050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611d7b82612353565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611da2611cb6565b73ffffffffffffffffffffffffffffffffffffffff161480611dfe5750611dc7611cb6565b73ffffffffffffffffffffffffffffffffffffffff16611de684610921565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e1a5750611e198260000151611e14611cb6565b61195d565b5b905080611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5390614686565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec590614718565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f34906147aa565b60405180910390fd5b611f4a8585856001612a1f565b611f5a6000848460000151611cbe565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611fc891906147e6565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661206c919061482a565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846121729190614130565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036122b7576121e781611ca9565b156122b6576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461231f8686866001612a25565b505050505050565b600081836123359190614016565b905092915050565b6000818361234b919061489d565b905092915050565b61235b612f1c565b61236482611ca9565b6123a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239a90614940565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106124075760017f0000000000000000000000000000000000000000000000000000000000000000846123fa9190614960565b6124049190614130565b90505b60008390505b818110612515576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461250157809350505050612551565b50808061250d90614994565b91505061240d565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254890614a2f565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612636828260405180602001604052806000815250612a2b565b5050565b600061265b8473ffffffffffffffffffffffffffffffffffffffff16612f09565b156127b4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612684611cb6565b8786866040518563ffffffff1660e01b81526004016126a69493929190614aa4565b6020604051808303816000875af19250505080156126e257506040513d601f19601f820116820180604052508101906126df9190614b05565b60015b612764573d8060008114612712576040519150601f19603f3d011682016040523d82523d6000602084013e612717565b606091505b50600081510361275c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275390614366565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127b9565b600190505b949350505050565b606060008203612808576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061291c565b600082905060005b6000821461283a57808061282390613aaa565b915050600a82612833919061489d565b9150612810565b60008167ffffffffffffffff811115612856576128556133b6565b5b6040519080825280601f01601f1916602001820160405280156128885781602001600182028036833780820191505090505b5090505b60008514612915576001826128a19190614960565b9150600a856128b09190614b32565b60306128bc9190614130565b60f81b8183815181106128d2576128d1614b63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561290e919061489d565b945061288c565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9790614c04565b60405180910390fd5b612aa981611ca9565b15612ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae090614c70565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4390614d02565b60405180910390fd5b612b596000858386612a1f565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612c56919061482a565b6fffffffffffffffffffffffffffffffff168152602001858360200151612c7d919061482a565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612eec57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e8c600088848861263a565b612ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec290614366565b60405180910390fd5b8180612ed690613aaa565b9250508080612ee490613aaa565b915050612e1b565b5080600081905550612f016000878588612a25565b505050505050565b600080823b905060008111915050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f9f81612f6a565b8114612faa57600080fd5b50565b600081359050612fbc81612f96565b92915050565b600060208284031215612fd857612fd7612f60565b5b6000612fe684828501612fad565b91505092915050565b60008115159050919050565b61300481612fef565b82525050565b600060208201905061301f6000830184612ffb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561305f578082015181840152602081019050613044565b60008484015250505050565b6000601f19601f8301169050919050565b600061308782613025565b6130918185613030565b93506130a1818560208601613041565b6130aa8161306b565b840191505092915050565b600060208201905081810360008301526130cf818461307c565b905092915050565b6000819050919050565b6130ea816130d7565b82525050565b600060208201905061310560008301846130e1565b92915050565b613114816130d7565b811461311f57600080fd5b50565b6000813590506131318161310b565b92915050565b60006020828403121561314d5761314c612f60565b5b600061315b84828501613122565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061318f82613164565b9050919050565b61319f81613184565b82525050565b60006020820190506131ba6000830184613196565b92915050565b6131c981613184565b81146131d457600080fd5b50565b6000813590506131e6816131c0565b92915050565b6000806040838503121561320357613202612f60565b5b6000613211858286016131d7565b925050602061322285828601613122565b9150509250929050565b60008060006060848603121561324557613244612f60565b5b6000613253868287016131d7565b9350506020613264868287016131d7565b925050604061327586828701613122565b9150509250925092565b61328881612fef565b811461329357600080fd5b50565b6000813590506132a58161327f565b92915050565b6000602082840312156132c1576132c0612f60565b5b60006132cf84828501613296565b91505092915050565b600080604083850312156132ef576132ee612f60565b5b60006132fd85828601613122565b925050602061330e85828601613122565b9150509250929050565b600060408201905061332d6000830185613196565b61333a60208301846130e1565b9392505050565b600061334c82613184565b9050919050565b61335c81613341565b811461336757600080fd5b50565b60008135905061337981613353565b92915050565b60006020828403121561339557613394612f60565b5b60006133a38482850161336a565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133ee8261306b565b810181811067ffffffffffffffff8211171561340d5761340c6133b6565b5b80604052505050565b6000613420612f56565b905061342c82826133e5565b919050565b600067ffffffffffffffff82111561344c5761344b6133b6565b5b6134558261306b565b9050602081019050919050565b82818337600083830152505050565b600061348461347f84613431565b613416565b9050828152602081018484840111156134a05761349f6133b1565b5b6134ab848285613462565b509392505050565b600082601f8301126134c8576134c76133ac565b5b81356134d8848260208601613471565b91505092915050565b6000602082840312156134f7576134f6612f60565b5b600082013567ffffffffffffffff81111561351557613514612f65565b5b613521848285016134b3565b91505092915050565b6000602082840312156135405761353f612f60565b5b600061354e848285016131d7565b91505092915050565b6000806040838503121561356e5761356d612f60565b5b600061357c858286016131d7565b925050602061358d85828601613296565b9150509250929050565b600067ffffffffffffffff8211156135b2576135b16133b6565b5b6135bb8261306b565b9050602081019050919050565b60006135db6135d684613597565b613416565b9050828152602081018484840111156135f7576135f66133b1565b5b613602848285613462565b509392505050565b600082601f83011261361f5761361e6133ac565b5b813561362f8482602086016135c8565b91505092915050565b6000806000806080858703121561365257613651612f60565b5b6000613660878288016131d7565b9450506020613671878288016131d7565b935050604061368287828801613122565b925050606085013567ffffffffffffffff8111156136a3576136a2612f65565b5b6136af8782880161360a565b91505092959194509250565b600080604083850312156136d2576136d1612f60565b5b60006136e0858286016131d7565b92505060206136f1858286016131d7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061374257607f821691505b602082108103613755576137546136fb565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006137b7602d83613030565b91506137c28261375b565b604082019050919050565b600060208201905081810360008301526137e6816137aa565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613849602283613030565b9150613854826137ed565b604082019050919050565b600060208201905081810360008301526138788161383c565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006138db603983613030565b91506138e68261387f565b604082019050919050565b6000602082019050818103600083015261390a816138ce565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613947602083613030565b915061395282613911565b602082019050919050565b600060208201905081810360008301526139768161393a565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b60006139b3601183613030565b91506139be8261397d565b602082019050919050565b600060208201905081810360008301526139e2816139a6565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a45602283613030565b9150613a50826139e9565b604082019050919050565b60006020820190508181036000830152613a7481613a38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ab5826130d7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ae757613ae6613a7b565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613b4e602e83613030565b9150613b5982613af2565b604082019050919050565b60006020820190508181036000830152613b7d81613b41565b9050919050565b600081519050613b938161310b565b92915050565b600060208284031215613baf57613bae612f60565b5b6000613bbd84828501613b84565b91505092915050565b600081519050613bd58161327f565b92915050565b600060208284031215613bf157613bf0612f60565b5b6000613bff84828501613bc6565b91505092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613c64602383613030565b9150613c6f82613c08565b604082019050919050565b60006020820190508181036000830152613c9381613c57565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613cfc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613cbf565b613d068683613cbf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613d43613d3e613d39846130d7565b613d1e565b6130d7565b9050919050565b6000819050919050565b613d5d83613d28565b613d71613d6982613d4a565b848454613ccc565b825550505050565b600090565b613d86613d79565b613d91818484613d54565b505050565b5b81811015613db557613daa600082613d7e565b600181019050613d97565b5050565b601f821115613dfa57613dcb81613c9a565b613dd484613caf565b81016020851015613de3578190505b613df7613def85613caf565b830182613d96565b50505b505050565b600082821c905092915050565b6000613e1d60001984600802613dff565b1980831691505092915050565b6000613e368383613e0c565b9150826002028217905092915050565b613e4f82613025565b67ffffffffffffffff811115613e6857613e676133b6565b5b613e72825461372a565b613e7d828285613db9565b600060209050601f831160018114613eb05760008415613e9e578287015190505b613ea88582613e2a565b865550613f10565b601f198416613ebe86613c9a565b60005b82811015613ee657848901518255600182019150602085019450602081019050613ec1565b86831015613f035784890151613eff601f891682613e0c565b8355505b6001600288020188555050505b505050505050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613f74602b83613030565b9150613f7f82613f18565b604082019050919050565b60006020820190508181036000830152613fa381613f67565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613fe0601f83613030565b9150613feb82613faa565b602082019050919050565b6000602082019050818103600083015261400f81613fd3565b9050919050565b6000614021826130d7565b915061402c836130d7565b925082820261403a816130d7565b9150828204841483151761405157614050613a7b565b5b5092915050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b600061408e601883613030565b915061409982614058565b602082019050919050565b600060208201905081810360008301526140bd81614081565b9050919050565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b60006140fa601783613030565b9150614105826140c4565b602082019050919050565b60006020820190508181036000830152614129816140ed565b9050919050565b600061413b826130d7565b9150614146836130d7565b925082820190508082111561415e5761415d613a7b565b5b92915050565b7f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b60006141c0602283613030565b91506141cb82614164565b604082019050919050565b600060208201905081810360008301526141ef816141b3565b9050919050565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000614252602283613030565b915061425d826141f6565b604082019050919050565b6000602082019050818103600083015261428181614245565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006142be601a83613030565b91506142c982614288565b602082019050919050565b600060208201905081810360008301526142ed816142b1565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614350603383613030565b915061435b826142f4565b604082019050919050565b6000602082019050818103600083015261437f81614343565b9050919050565b600081905092915050565b6000815461439e8161372a565b6143a88186614386565b945060018216600081146143c357600181146143d85761440b565b60ff198316865281151582028601935061440b565b6143e185613c9a565b60005b83811015614403578154818901526001820191506020810190506143e4565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061444a600183614386565b915061445582614414565b600182019050919050565b600061446b82613025565b6144758185614386565b9350614485818560208601613041565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006144c7600583614386565b91506144d282614491565b600582019050919050565b60006144e98285614391565b91506144f48261443d565b91506145008284614460565b915061450b826144ba565b91508190509392505050565b600061452282613184565b9050919050565b61453281614517565b811461453d57600080fd5b50565b60008151905061454f81614529565b92915050565b60006020828403121561456b5761456a612f60565b5b600061457984828501614540565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145de602683613030565b91506145e982614582565b604082019050919050565b6000602082019050818103600083015261460d816145d1565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614670603283613030565b915061467b82614614565b604082019050919050565b6000602082019050818103600083015261469f81614663565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000614702602683613030565b915061470d826146a6565b604082019050919050565b60006020820190508181036000830152614731816146f5565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614794602583613030565b915061479f82614738565b604082019050919050565b600060208201905081810360008301526147c381614787565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006147f1826147ca565b91506147fc836147ca565b925082820390506fffffffffffffffffffffffffffffffff81111561482457614823613a7b565b5b92915050565b6000614835826147ca565b9150614840836147ca565b925082820190506fffffffffffffffffffffffffffffffff81111561486857614867613a7b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148a8826130d7565b91506148b3836130d7565b9250826148c3576148c261486e565b5b828204905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b600061492a602a83613030565b9150614935826148ce565b604082019050919050565b600060208201905081810360008301526149598161491d565b9050919050565b600061496b826130d7565b9150614976836130d7565b925082820390508181111561498e5761498d613a7b565b5b92915050565b600061499f826130d7565b9150600082036149b2576149b1613a7b565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000614a19602f83613030565b9150614a24826149bd565b604082019050919050565b60006020820190508181036000830152614a4881614a0c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614a7682614a4f565b614a808185614a5a565b9350614a90818560208601613041565b614a998161306b565b840191505092915050565b6000608082019050614ab96000830187613196565b614ac66020830186613196565b614ad360408301856130e1565b8181036060830152614ae58184614a6b565b905095945050505050565b600081519050614aff81612f96565b92915050565b600060208284031215614b1b57614b1a612f60565b5b6000614b2984828501614af0565b91505092915050565b6000614b3d826130d7565b9150614b48836130d7565b925082614b5857614b5761486e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bee602183613030565b9150614bf982614b92565b604082019050919050565b60006020820190508181036000830152614c1d81614be1565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000614c5a601d83613030565b9150614c6582614c24565b602082019050919050565b60006020820190508181036000830152614c8981614c4d565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000614cec602283613030565b9150614cf782614c90565b604082019050919050565b60006020820190508181036000830152614d1b81614cdf565b905091905056fea2646970667358221220a164731e5c827738fc37a0480e50564684382964b26872dddeea641f12d89c5564736f6c63430008120033697066733a2f2f516d4e6e6d3753667847364c79467079705a6a324e617536583173336d4b37585a6d474576513845456464476632

Deployed Bytecode

0x6080604052600436106101f95760003560e01c80636352211e1161010d578063a22cb465116100a0578063d5abeb011161006f578063d5abeb0114610725578063d7224ba014610750578063e43082f71461077b578063e985e9c5146107a4578063f2fde38b146107e1576101f9565b8063a22cb4651461066b578063b88d4fde14610694578063c6a91b42146106bd578063c87b56dd146106e8576101f9565b80638da5cb5b116100dc5780638da5cb5b146105ce57806395d89b41146105f9578063982d669e14610624578063a0712d681461064f576101f9565b80636352211e1461051257806370a082311461054f578063714c53981461058c578063715018a6146105b7576101f9565b806323b872dd116101905780633ccfd60b1161015f5780633ccfd60b1461044357806342842e0e1461045a57806349df728c146104835780634f6ccce7146104ac57806355f804b3146104e9576101f9565b806323b872dd1461037657806328cad13d1461039f5780632a55205a146103c85780632f745c5914610406576101f9565b8063095ea7b3116101cc578063095ea7b3146102ce5780630a00ae83146102f757806318160ddd146103205780631e84c4131461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b57806307e89ec014610266578063081812fc14610291575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190612fc2565b61080a565b604051610232919061300a565b60405180910390f35b34801561024757600080fd5b50610250610884565b60405161025d91906130b5565b60405180910390f35b34801561027257600080fd5b5061027b610916565b60405161028891906130f0565b60405180910390f35b34801561029d57600080fd5b506102b860048036038101906102b39190613137565b610921565b6040516102c591906131a5565b60405180910390f35b3480156102da57600080fd5b506102f560048036038101906102f091906131ec565b6109a6565b005b34801561030357600080fd5b5061031e60048036038101906103199190613137565b610abe565b005b34801561032c57600080fd5b50610335610b44565b60405161034291906130f0565b60405180910390f35b34801561035757600080fd5b50610360610b4d565b60405161036d919061300a565b60405180910390f35b34801561038257600080fd5b5061039d6004803603810190610398919061322c565b610b60565b005b3480156103ab57600080fd5b506103c660048036038101906103c191906132ab565b610b70565b005b3480156103d457600080fd5b506103ef60048036038101906103ea91906132d8565b610c09565b6040516103fd929190613318565b60405180910390f35b34801561041257600080fd5b5061042d600480360381019061042891906131ec565b610c75565b60405161043a91906130f0565b60405180910390f35b34801561044f57600080fd5b50610458610e71565b005b34801561046657600080fd5b50610481600480360381019061047c919061322c565b610f3c565b005b34801561048f57600080fd5b506104aa60048036038101906104a5919061337f565b610f5c565b005b3480156104b857600080fd5b506104d360048036038101906104ce9190613137565b6110d9565b6040516104e091906130f0565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b91906134e1565b61112c565b005b34801561051e57600080fd5b5061053960048036038101906105349190613137565b6111bb565b60405161054691906131a5565b60405180910390f35b34801561055b57600080fd5b506105766004803603810190610571919061352a565b6111d1565b60405161058391906130f0565b60405180910390f35b34801561059857600080fd5b506105a16112b9565b6040516105ae91906130b5565b60405180910390f35b3480156105c357600080fd5b506105cc61134b565b005b3480156105da57600080fd5b506105e36113d3565b6040516105f091906131a5565b60405180910390f35b34801561060557600080fd5b5061060e6113fd565b60405161061b91906130b5565b60405180910390f35b34801561063057600080fd5b5061063961148f565b60405161064691906130f0565b60405180910390f35b61066960048036038101906106649190613137565b611495565b005b34801561067757600080fd5b50610692600480360381019061068d9190613557565b61164f565b005b3480156106a057600080fd5b506106bb60048036038101906106b69190613638565b6117cf565b005b3480156106c957600080fd5b506106d261182b565b6040516106df91906130f0565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a9190613137565b611830565b60405161071c91906130b5565b60405180910390f35b34801561073157600080fd5b5061073a6118b8565b60405161074791906130f0565b60405180910390f35b34801561075c57600080fd5b506107656118be565b60405161077291906130f0565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d91906132ab565b6118c4565b005b3480156107b057600080fd5b506107cb60048036038101906107c691906136bb565b61195d565b6040516107d8919061300a565b60405180910390f35b3480156107ed57600080fd5b506108086004803603810190610803919061352a565b611a68565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087d575061087c82611b5f565b5b9050919050565b6060600180546108939061372a565b80601f01602080910402602001604051908101604052809291908181526020018280546108bf9061372a565b801561090c5780601f106108e15761010080835404028352916020019161090c565b820191906000526020600020905b8154815290600101906020018083116108ef57829003601f168201915b5050505050905090565b6611c37937e0800081565b600061092c82611ca9565b61096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906137cd565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109b1826111bb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a189061385f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a40611cb6565b73ffffffffffffffffffffffffffffffffffffffff161480610a6f5750610a6e81610a69611cb6565b61195d565b5b610aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa5906138f1565b60405180910390fd5b610ab9838383611cbe565b505050565b610ac6611cb6565b73ffffffffffffffffffffffffffffffffffffffff16610ae46113d3565b73ffffffffffffffffffffffffffffffffffffffff1614610b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b319061395d565b60405180910390fd5b80600e8190555050565b60008054905090565b600f60009054906101000a900460ff1681565b610b6b838383611d70565b505050565b610b78611cb6565b73ffffffffffffffffffffffffffffffffffffffff16610b966113d3565b73ffffffffffffffffffffffffffffffffffffffff1614610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be39061395d565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b600080610c1584611ca9565b610c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4b906139c9565b60405180910390fd5b30610c6a610c63856005612327565b606461233d565b915091509250929050565b6000610c80836111d1565b8210610cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb890613a5b565b60405180910390fd5b6000610ccb610b44565b905060008060005b83811015610e2f576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610dc557806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e1b57868403610e0c578195505050505050610e6b565b8380610e1790613aaa565b9450505b508080610e2790613aaa565b915050610cd3565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290613b64565b60405180910390fd5b92915050565b610e79611cb6565b73ffffffffffffffffffffffffffffffffffffffff16610e976113d3565b73ffffffffffffffffffffffffffffffffffffffff1614610eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee49061395d565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f38573d6000803e3d6000fd5b5050565b610f57838383604051806020016040528060008152506117cf565b505050565b610f64611cb6565b73ffffffffffffffffffffffffffffffffffffffff16610f826113d3565b73ffffffffffffffffffffffffffffffffffffffff1614610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf9061395d565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161101391906131a5565b602060405180830381865afa158015611030573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110549190613b99565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401611091929190613318565b6020604051808303816000875af11580156110b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d49190613bdb565b505050565b60006110e3610b44565b8210611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b90613c7a565b60405180910390fd5b819050919050565b611134611cb6565b73ffffffffffffffffffffffffffffffffffffffff166111526113d3565b73ffffffffffffffffffffffffffffffffffffffff16146111a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119f9061395d565b60405180910390fd5b80600b90816111b79190613e46565b5050565b60006111c682612353565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123890613f8a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6060600b80546112c89061372a565b80601f01602080910402602001604051908101604052809291908181526020018280546112f49061372a565b80156113415780601f1061131657610100808354040283529160200191611341565b820191906000526020600020905b81548152906001019060200180831161132457829003601f168201915b5050505050905090565b611353611cb6565b73ffffffffffffffffffffffffffffffffffffffff166113716113d3565b73ffffffffffffffffffffffffffffffffffffffff16146113c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113be9061395d565b60405180910390fd5b6113d16000612556565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461140c9061372a565b80601f01602080910402602001604051908101604052809291908181526020018280546114389061372a565b80156114855780601f1061145a57610100808354040283529160200191611485565b820191906000526020600020905b81548152906001019060200180831161146857829003601f168201915b5050505050905090565b600e5481565b6002600954036114da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d190613ff6565b60405180910390fd5b60026009819055506611c37937e0800081600e546114f6610b44565b111561154a573481836115099190614016565b14611549576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611540906140a4565b60405180910390fd5b5b600f60009054906101000a900460ff16611599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159090614110565b60405180910390fd5b82600d54816115a6610b44565b6115b09190614130565b11156115f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e8906141d6565b60405180910390fd5b836002811115611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d90614268565b60405180910390fd5b611640338661261c565b50505050600160098190555050565b611657611cb6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb906142d4565b60405180910390fd5b80600660006116d1611cb6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661177e611cb6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117c3919061300a565b60405180910390a35050565b6117da848484611d70565b6117e68484848461263a565b611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90614366565b60405180910390fd5b50505050565b600281565b606061183b82611ca9565b61187a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611871906139c9565b60405180910390fd5b600b61189160018461188c9190614130565b6127c1565b6040516020016118a29291906144dd565b6040516020818303038152906040529050919050565b600d5481565b60075481565b6118cc611cb6565b73ffffffffffffffffffffffffffffffffffffffff166118ea6113d3565b73ffffffffffffffffffffffffffffffffffffffff1614611940576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119379061395d565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60149054906101000a900460ff168015611a4557508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016119ec91906131a5565b602060405180830381865afa158015611a09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2d9190614555565b73ffffffffffffffffffffffffffffffffffffffff16145b15611a54576001915050611a62565b611a5e8484612921565b9150505b92915050565b611a70611cb6565b73ffffffffffffffffffffffffffffffffffffffff16611a8e6113d3565b73ffffffffffffffffffffffffffffffffffffffff1614611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb9061395d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a906145f4565b60405180910390fd5b611b5c81612556565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c2a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c9257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ca25750611ca1826129b5565b5b9050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611d7b82612353565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611da2611cb6565b73ffffffffffffffffffffffffffffffffffffffff161480611dfe5750611dc7611cb6565b73ffffffffffffffffffffffffffffffffffffffff16611de684610921565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e1a5750611e198260000151611e14611cb6565b61195d565b5b905080611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5390614686565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec590614718565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f34906147aa565b60405180910390fd5b611f4a8585856001612a1f565b611f5a6000848460000151611cbe565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611fc891906147e6565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661206c919061482a565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846121729190614130565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036122b7576121e781611ca9565b156122b6576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461231f8686866001612a25565b505050505050565b600081836123359190614016565b905092915050565b6000818361234b919061489d565b905092915050565b61235b612f1c565b61236482611ca9565b6123a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239a90614940565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000006483106124075760017f0000000000000000000000000000000000000000000000000000000000000064846123fa9190614960565b6124049190614130565b90505b60008390505b818110612515576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461250157809350505050612551565b50808061250d90614994565b91505061240d565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254890614a2f565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612636828260405180602001604052806000815250612a2b565b5050565b600061265b8473ffffffffffffffffffffffffffffffffffffffff16612f09565b156127b4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612684611cb6565b8786866040518563ffffffff1660e01b81526004016126a69493929190614aa4565b6020604051808303816000875af19250505080156126e257506040513d601f19601f820116820180604052508101906126df9190614b05565b60015b612764573d8060008114612712576040519150601f19603f3d011682016040523d82523d6000602084013e612717565b606091505b50600081510361275c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275390614366565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127b9565b600190505b949350505050565b606060008203612808576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061291c565b600082905060005b6000821461283a57808061282390613aaa565b915050600a82612833919061489d565b9150612810565b60008167ffffffffffffffff811115612856576128556133b6565b5b6040519080825280601f01601f1916602001820160405280156128885781602001600182028036833780820191505090505b5090505b60008514612915576001826128a19190614960565b9150600a856128b09190614b32565b60306128bc9190614130565b60f81b8183815181106128d2576128d1614b63565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561290e919061489d565b945061288c565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612aa0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9790614c04565b60405180910390fd5b612aa981611ca9565b15612ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae090614c70565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000064831115612b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4390614d02565b60405180910390fd5b612b596000858386612a1f565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612c56919061482a565b6fffffffffffffffffffffffffffffffff168152602001858360200151612c7d919061482a565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612eec57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e8c600088848861263a565b612ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec290614366565b60405180910390fd5b8180612ed690613aaa565b9250508080612ee490613aaa565b915050612e1b565b5080600081905550612f016000878588612a25565b505050505050565b600080823b905060008111915050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f9f81612f6a565b8114612faa57600080fd5b50565b600081359050612fbc81612f96565b92915050565b600060208284031215612fd857612fd7612f60565b5b6000612fe684828501612fad565b91505092915050565b60008115159050919050565b61300481612fef565b82525050565b600060208201905061301f6000830184612ffb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561305f578082015181840152602081019050613044565b60008484015250505050565b6000601f19601f8301169050919050565b600061308782613025565b6130918185613030565b93506130a1818560208601613041565b6130aa8161306b565b840191505092915050565b600060208201905081810360008301526130cf818461307c565b905092915050565b6000819050919050565b6130ea816130d7565b82525050565b600060208201905061310560008301846130e1565b92915050565b613114816130d7565b811461311f57600080fd5b50565b6000813590506131318161310b565b92915050565b60006020828403121561314d5761314c612f60565b5b600061315b84828501613122565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061318f82613164565b9050919050565b61319f81613184565b82525050565b60006020820190506131ba6000830184613196565b92915050565b6131c981613184565b81146131d457600080fd5b50565b6000813590506131e6816131c0565b92915050565b6000806040838503121561320357613202612f60565b5b6000613211858286016131d7565b925050602061322285828601613122565b9150509250929050565b60008060006060848603121561324557613244612f60565b5b6000613253868287016131d7565b9350506020613264868287016131d7565b925050604061327586828701613122565b9150509250925092565b61328881612fef565b811461329357600080fd5b50565b6000813590506132a58161327f565b92915050565b6000602082840312156132c1576132c0612f60565b5b60006132cf84828501613296565b91505092915050565b600080604083850312156132ef576132ee612f60565b5b60006132fd85828601613122565b925050602061330e85828601613122565b9150509250929050565b600060408201905061332d6000830185613196565b61333a60208301846130e1565b9392505050565b600061334c82613184565b9050919050565b61335c81613341565b811461336757600080fd5b50565b60008135905061337981613353565b92915050565b60006020828403121561339557613394612f60565b5b60006133a38482850161336a565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133ee8261306b565b810181811067ffffffffffffffff8211171561340d5761340c6133b6565b5b80604052505050565b6000613420612f56565b905061342c82826133e5565b919050565b600067ffffffffffffffff82111561344c5761344b6133b6565b5b6134558261306b565b9050602081019050919050565b82818337600083830152505050565b600061348461347f84613431565b613416565b9050828152602081018484840111156134a05761349f6133b1565b5b6134ab848285613462565b509392505050565b600082601f8301126134c8576134c76133ac565b5b81356134d8848260208601613471565b91505092915050565b6000602082840312156134f7576134f6612f60565b5b600082013567ffffffffffffffff81111561351557613514612f65565b5b613521848285016134b3565b91505092915050565b6000602082840312156135405761353f612f60565b5b600061354e848285016131d7565b91505092915050565b6000806040838503121561356e5761356d612f60565b5b600061357c858286016131d7565b925050602061358d85828601613296565b9150509250929050565b600067ffffffffffffffff8211156135b2576135b16133b6565b5b6135bb8261306b565b9050602081019050919050565b60006135db6135d684613597565b613416565b9050828152602081018484840111156135f7576135f66133b1565b5b613602848285613462565b509392505050565b600082601f83011261361f5761361e6133ac565b5b813561362f8482602086016135c8565b91505092915050565b6000806000806080858703121561365257613651612f60565b5b6000613660878288016131d7565b9450506020613671878288016131d7565b935050604061368287828801613122565b925050606085013567ffffffffffffffff8111156136a3576136a2612f65565b5b6136af8782880161360a565b91505092959194509250565b600080604083850312156136d2576136d1612f60565b5b60006136e0858286016131d7565b92505060206136f1858286016131d7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061374257607f821691505b602082108103613755576137546136fb565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006137b7602d83613030565b91506137c28261375b565b604082019050919050565b600060208201905081810360008301526137e6816137aa565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613849602283613030565b9150613854826137ed565b604082019050919050565b600060208201905081810360008301526138788161383c565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006138db603983613030565b91506138e68261387f565b604082019050919050565b6000602082019050818103600083015261390a816138ce565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613947602083613030565b915061395282613911565b602082019050919050565b600060208201905081810360008301526139768161393a565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b60006139b3601183613030565b91506139be8261397d565b602082019050919050565b600060208201905081810360008301526139e2816139a6565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a45602283613030565b9150613a50826139e9565b604082019050919050565b60006020820190508181036000830152613a7481613a38565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ab5826130d7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ae757613ae6613a7b565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613b4e602e83613030565b9150613b5982613af2565b604082019050919050565b60006020820190508181036000830152613b7d81613b41565b9050919050565b600081519050613b938161310b565b92915050565b600060208284031215613baf57613bae612f60565b5b6000613bbd84828501613b84565b91505092915050565b600081519050613bd58161327f565b92915050565b600060208284031215613bf157613bf0612f60565b5b6000613bff84828501613bc6565b91505092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000613c64602383613030565b9150613c6f82613c08565b604082019050919050565b60006020820190508181036000830152613c9381613c57565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613cfc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613cbf565b613d068683613cbf565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613d43613d3e613d39846130d7565b613d1e565b6130d7565b9050919050565b6000819050919050565b613d5d83613d28565b613d71613d6982613d4a565b848454613ccc565b825550505050565b600090565b613d86613d79565b613d91818484613d54565b505050565b5b81811015613db557613daa600082613d7e565b600181019050613d97565b5050565b601f821115613dfa57613dcb81613c9a565b613dd484613caf565b81016020851015613de3578190505b613df7613def85613caf565b830182613d96565b50505b505050565b600082821c905092915050565b6000613e1d60001984600802613dff565b1980831691505092915050565b6000613e368383613e0c565b9150826002028217905092915050565b613e4f82613025565b67ffffffffffffffff811115613e6857613e676133b6565b5b613e72825461372a565b613e7d828285613db9565b600060209050601f831160018114613eb05760008415613e9e578287015190505b613ea88582613e2a565b865550613f10565b601f198416613ebe86613c9a565b60005b82811015613ee657848901518255600182019150602085019450602081019050613ec1565b86831015613f035784890151613eff601f891682613e0c565b8355505b6001600288020188555050505b505050505050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613f74602b83613030565b9150613f7f82613f18565b604082019050919050565b60006020820190508181036000830152613fa381613f67565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613fe0601f83613030565b9150613feb82613faa565b602082019050919050565b6000602082019050818103600083015261400f81613fd3565b9050919050565b6000614021826130d7565b915061402c836130d7565b925082820261403a816130d7565b9150828204841483151761405157614050613a7b565b5b5092915050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b600061408e601883613030565b915061409982614058565b602082019050919050565b600060208201905081810360008301526140bd81614081565b9050919050565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b60006140fa601783613030565b9150614105826140c4565b602082019050919050565b60006020820190508181036000830152614129816140ed565b9050919050565b600061413b826130d7565b9150614146836130d7565b925082820190508082111561415e5761415d613a7b565b5b92915050565b7f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b60006141c0602283613030565b91506141cb82614164565b604082019050919050565b600060208201905081810360008301526141ef816141b3565b9050919050565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b6000614252602283613030565b915061425d826141f6565b604082019050919050565b6000602082019050818103600083015261428181614245565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b60006142be601a83613030565b91506142c982614288565b602082019050919050565b600060208201905081810360008301526142ed816142b1565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614350603383613030565b915061435b826142f4565b604082019050919050565b6000602082019050818103600083015261437f81614343565b9050919050565b600081905092915050565b6000815461439e8161372a565b6143a88186614386565b945060018216600081146143c357600181146143d85761440b565b60ff198316865281151582028601935061440b565b6143e185613c9a565b60005b83811015614403578154818901526001820191506020810190506143e4565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600061444a600183614386565b915061445582614414565b600182019050919050565b600061446b82613025565b6144758185614386565b9350614485818560208601613041565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006144c7600583614386565b91506144d282614491565b600582019050919050565b60006144e98285614391565b91506144f48261443d565b91506145008284614460565b915061450b826144ba565b91508190509392505050565b600061452282613184565b9050919050565b61453281614517565b811461453d57600080fd5b50565b60008151905061454f81614529565b92915050565b60006020828403121561456b5761456a612f60565b5b600061457984828501614540565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006145de602683613030565b91506145e982614582565b604082019050919050565b6000602082019050818103600083015261460d816145d1565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614670603283613030565b915061467b82614614565b604082019050919050565b6000602082019050818103600083015261469f81614663565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000614702602683613030565b915061470d826146a6565b604082019050919050565b60006020820190508181036000830152614731816146f5565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614794602583613030565b915061479f82614738565b604082019050919050565b600060208201905081810360008301526147c381614787565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006147f1826147ca565b91506147fc836147ca565b925082820390506fffffffffffffffffffffffffffffffff81111561482457614823613a7b565b5b92915050565b6000614835826147ca565b9150614840836147ca565b925082820190506fffffffffffffffffffffffffffffffff81111561486857614867613a7b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148a8826130d7565b91506148b3836130d7565b9250826148c3576148c261486e565b5b828204905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b600061492a602a83613030565b9150614935826148ce565b604082019050919050565b600060208201905081810360008301526149598161491d565b9050919050565b600061496b826130d7565b9150614976836130d7565b925082820390508181111561498e5761498d613a7b565b5b92915050565b600061499f826130d7565b9150600082036149b2576149b1613a7b565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000614a19602f83613030565b9150614a24826149bd565b604082019050919050565b60006020820190508181036000830152614a4881614a0c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614a7682614a4f565b614a808185614a5a565b9350614a90818560208601613041565b614a998161306b565b840191505092915050565b6000608082019050614ab96000830187613196565b614ac66020830186613196565b614ad360408301856130e1565b8181036060830152614ae58184614a6b565b905095945050505050565b600081519050614aff81612f96565b92915050565b600060208284031215614b1b57614b1a612f60565b5b6000614b2984828501614af0565b91505092915050565b6000614b3d826130d7565b9150614b48836130d7565b925082614b5857614b5761486e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bee602183613030565b9150614bf982614b92565b604082019050919050565b60006020820190508181036000830152614c1d81614be1565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000614c5a601d83613030565b9150614c6582614c24565b602082019050919050565b60006020820190508181036000830152614c8981614c4d565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000614cec602283613030565b9150614cf782614c90565b604082019050919050565b60006020820190508181036000830152614d1b81614cdf565b905091905056fea2646970667358221220a164731e5c827738fc37a0480e50564684382964b26872dddeea641f12d89c5564736f6c63430008120033

Deployed Bytecode Sourcemap

54949:5703:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58841:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44168:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55465:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45693:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45256:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58109:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41003:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55570:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46543:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57941:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60331:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;41634:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58258:143;;;;;;;;;;;;;:::i;:::-;;46748:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58409:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41166:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57543:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43991:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42868:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57379:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19026:103;;;;;;;;;;;;;:::i;:::-;;18375:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44323:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55527:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56863:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45961:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46968:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55374:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59958:307;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55425:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51383:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57767:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59270:617;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19284:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58841:292;58989:4;59046:26;59031:41;;;:11;:41;;;;:94;;;;59089:36;59113:11;59089:23;:36::i;:::-;59031:94;59011:114;;58841:292;;;:::o;44168:94::-;44222:13;44251:5;44244:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44168:94;:::o;55465:55::-;55509:11;55465:55;:::o;45693:204::-;45761:7;45785:16;45793:7;45785;:16::i;:::-;45777:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45867:15;:24;45883:7;45867:24;;;;;;;;;;;;;;;;;;;;;45860:31;;45693:204;;;:::o;45256:379::-;45325:13;45341:24;45357:7;45341:15;:24::i;:::-;45325:40;;45386:5;45380:11;;:2;:11;;;45372:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;45471:5;45455:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;45480:37;45497:5;45504:12;:10;:12::i;:::-;45480:16;:37::i;:::-;45455:62;45439:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;45601:28;45610:2;45614:7;45623:5;45601:8;:28::i;:::-;45318:317;45256:379;;:::o;58109:139::-;18606:12;:10;:12::i;:::-;18595:23;;:7;:5;:7::i;:::-;:23;;;18587:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58227:13:::1;58210:14;:30;;;;58109:139:::0;:::o;41003:94::-;41056:7;41079:12;;41072:19;;41003:94;:::o;55570:38::-;;;;;;;;;;;;;:::o;46543:142::-;46651:28;46661:4;46667:2;46671:7;46651:9;:28::i;:::-;46543:142;;;:::o;57941:158::-;18606:12;:10;:12::i;:::-;18595:23;;:7;:5;:7::i;:::-;:23;;;18587:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58072:19:::1;58051:18;;:40;;;;;;;;;;;;;;;;;;57941:158:::0;:::o;60331:318::-;60456:16;60474:21;60521:16;60529:7;60521;:16::i;:::-;60513:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;60588:4;60595:45;60608:26;60621:9;60632:1;60608:12;:26::i;:::-;60636:3;60595:12;:45::i;:::-;60572:69;;;;60331:318;;;;;:::o;41634:744::-;41743:7;41778:16;41788:5;41778:9;:16::i;:::-;41770:5;:24;41762:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;41840:22;41865:13;:11;:13::i;:::-;41840:38;;41885:19;41915:25;41965:9;41960:350;41984:14;41980:1;:18;41960:350;;;42014:31;42048:11;:14;42060:1;42048:14;;;;;;;;;;;42014:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42101:1;42075:28;;:9;:14;;;:28;;;42071:89;;42136:9;:14;;;42116:34;;42071:89;42193:5;42172:26;;:17;:26;;;42168:135;;42230:5;42215:11;:20;42211:59;;42257:1;42250:8;;;;;;;;;42211:59;42280:13;;;;;:::i;:::-;;;;42168:135;42005:305;42000:3;;;;;:::i;:::-;;;;41960:350;;;;42316:56;;;;;;;;;;:::i;:::-;;;;;;;;41634:744;;;;;:::o;58258:143::-;18606:12;:10;:12::i;:::-;18595:23;;:7;:5;:7::i;:::-;:23;;;18587:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58306:15:::1;58324:21;58306:39;;58364:10;58356:28;;:37;58385:7;58356:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;58295:106;58258:143::o:0;46748:157::-;46860:39;46877:4;46883:2;46887:7;46860:39;;;;;;;;;;;;:16;:39::i;:::-;46748:157;;;:::o;58409:168::-;18606:12;:10;:12::i;:::-;18595:23;;:7;:5;:7::i;:::-;:23;;;18587:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58475:15:::1;58493:5;:15;;;58517:4;58493:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58475:48;;58534:5;:14;;;58549:10;58561:7;58534:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;58464:113;58409:168:::0;:::o;41166:177::-;41233:7;41265:13;:11;:13::i;:::-;41257:5;:21;41249:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;41332:5;41325:12;;41166:177;;;:::o;57543:100::-;18606:12;:10;:12::i;:::-;18595:23;;:7;:5;:7::i;:::-;:23;;;18587:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57627:8:::1;57617:7;:18;;;;;;:::i;:::-;;57543:100:::0;:::o;43991:118::-;44055:7;44078:20;44090:7;44078:11;:20::i;:::-;:25;;;44071:32;;43991:118;;;:::o;42868:211::-;42932:7;42973:1;42956:19;;:5;:19;;;42948:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;43045:12;:19;43058:5;43045:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;43037:36;;43030:43;;42868:211;;;:::o;57379:93::-;57424:13;57457:7;57450:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57379:93;:::o;19026:103::-;18606:12;:10;:12::i;:::-;18595:23;;:7;:5;:7::i;:::-;:23;;;18587:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19091:30:::1;19118:1;19091:18;:30::i;:::-;19026:103::o:0;18375:87::-;18421:7;18448:6;;;;;;;;;;;18441:13;;18375:87;:::o;44323:98::-;44379:13;44408:7;44401:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44323:98;:::o;55527:35::-;;;;:::o;56863:321::-;10304:1;10902:7;;:19;10894:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10304:1;11035:7;:18;;;;55509:11:::1;57003:14;56540;;56526:13;:11;:13::i;:::-;:28;56523:166;;;56616:9;56597:14;56589:5;:22;;;;:::i;:::-;56588:37;56566:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;56523:166;55738:18:::2;;;;;;;;;;;55730:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;57066:14:::3;56149:9;;56114:14;56098:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:60;;56076:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;57105:14:::4;55417:1;55896:14;:34;;55874:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;57139:37:::5;57149:10;57161:14;57139:9;:37::i;:::-;56231:1:::4;55795::::3;11066::::1;;10260::::0;11214:7;:22;;;;56863:321;:::o;45961:274::-;46064:12;:10;:12::i;:::-;46052:24;;:8;:24;;;46044:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46161:8;46116:18;:32;46135:12;:10;:12::i;:::-;46116:32;;;;;;;;;;;;;;;:42;46149:8;46116:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46210:8;46181:48;;46196:12;:10;:12::i;:::-;46181:48;;;46220:8;46181:48;;;;;;:::i;:::-;;;;;;;;45961:274;;:::o;46968:311::-;47105:28;47115:4;47121:2;47125:7;47105:9;:28::i;:::-;47156:48;47179:4;47185:2;47189:7;47198:5;47156:22;:48::i;:::-;47140:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;46968:311;;;;:::o;55374:44::-;55417:1;55374:44;:::o;59958:307::-;60076:13;60115:16;60123:7;60115;:16::i;:::-;60107:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;60210:7;60224:22;60233:1;60225:7;:9;;;;:::i;:::-;60224:20;:22::i;:::-;60193:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60166:91;;59958:307;;;:::o;55425:31::-;;;;:::o;51383:43::-;;;;:::o;57767:166::-;18606:12;:10;:12::i;:::-;18595:23;;:7;:5;:7::i;:::-;:23;;;18587:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57904:21:::1;57881:20;;:44;;;;;;;;;;;;;;;;;;57767:166:::0;:::o;59270:617::-;59395:4;59560:27;59618;;;;;;;;;;;59560:96;;59685:20;;;;;;;;;;;:86;;;;;59763:8;59722:49;;59730:13;:21;;;59752:5;59730:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59722:49;;;59685:86;59667:154;;;59805:4;59798:11;;;;;59667:154;59840:39;59863:5;59870:8;59840:22;:39::i;:::-;59833:46;;;59270:617;;;;;:::o;19284:201::-;18606:12;:10;:12::i;:::-;18595:23;;:7;:5;:7::i;:::-;:23;;;18587:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19393:1:::1;19373:22;;:8;:22;;::::0;19365:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19449:28;19468:8;19449:18;:28::i;:::-;19284:201:::0;:::o;42442:370::-;42569:4;42614:25;42599:40;;;:11;:40;;;;:99;;;;42665:33;42650:48;;;:11;:48;;;;42599:99;:160;;;;42724:35;42709:50;;;:11;:50;;;;42599:160;:207;;;;42770:36;42794:11;42770:23;:36::i;:::-;42599:207;42585:221;;42442:370;;;:::o;47518:105::-;47575:4;47605:12;;47595:7;:22;47588:29;;47518:105;;;:::o;17099:98::-;17152:7;17179:10;17172:17;;17099:98;:::o;51205:172::-;51329:2;51302:15;:24;51318:7;51302:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51363:7;51359:2;51343:28;;51352:5;51343:28;;;;;;;;;;;;51205:172;;;:::o;49570:1529::-;49667:35;49705:20;49717:7;49705:11;:20::i;:::-;49667:58;;49734:22;49776:13;:18;;;49760:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;49829:12;:10;:12::i;:::-;49805:36;;:20;49817:7;49805:11;:20::i;:::-;:36;;;49760:81;:142;;;;49852:50;49869:13;:18;;;49889:12;:10;:12::i;:::-;49852:16;:50::i;:::-;49760:142;49734:169;;49928:17;49912:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;50060:4;50038:26;;:13;:18;;;:26;;;50022:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;50149:1;50135:16;;:2;:16;;;50127:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50202:43;50224:4;50230:2;50234:7;50243:1;50202:21;:43::i;:::-;50302:49;50319:1;50323:7;50332:13;:18;;;50302:8;:49::i;:::-;50390:1;50360:12;:18;50373:4;50360:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50426:1;50398:12;:16;50411:2;50398:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;50457:43;;;;;;;;50472:2;50457:43;;;;;;50483:15;50457:43;;;;;50434:11;:20;50446:7;50434:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50728:19;50760:1;50750:7;:11;;;;:::i;:::-;50728:33;;50813:1;50772:43;;:11;:24;50784:11;50772:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;50768:236;;50830:20;50838:11;50830:7;:20::i;:::-;50826:171;;;50890:97;;;;;;;;50917:13;:18;;;50890:97;;;;;;50948:13;:28;;;50890:97;;;;;50863:11;:24;50875:11;50863:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50826:171;50768:236;51036:7;51032:2;51017:27;;51026:4;51017:27;;;;;;;;;;;;51051:42;51072:4;51078:2;51082:7;51091:1;51051:20;:42::i;:::-;49660:1439;;;49570:1529;;;:::o;3600:98::-;3658:7;3689:1;3685;:5;;;;:::i;:::-;3678:12;;3600:98;;;;:::o;3999:::-;4057:7;4088:1;4084;:5;;;;:::i;:::-;4077:12;;3999:98;;;;:::o;43331:606::-;43407:21;;:::i;:::-;43448:16;43456:7;43448;:16::i;:::-;43440:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43520:26;43568:12;43557:7;:23;43553:93;;43637:1;43622:12;43612:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;43591:47;;43553:93;43659:12;43674:7;43659:22;;43654:212;43691:18;43683:4;:26;43654:212;;43728:31;43762:11;:17;43774:4;43762:17;;;;;;;;;;;43728:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43818:1;43792:28;;:9;:14;;;:28;;;43788:71;;43840:9;43833:16;;;;;;;43788:71;43719:147;43711:6;;;;;:::i;:::-;;;;43654:212;;;;43874:57;;;;;;;;;;:::i;:::-;;;;;;;;43331:606;;;;:::o;19645:191::-;19719:16;19738:6;;;;;;;;;;;19719:25;;19764:8;19755:6;;:17;;;;;;;;;;;;;;;;;;19819:8;19788:40;;19809:8;19788:40;;;;;;;;;;;;19708:128;19645:191;:::o;47629:98::-;47694:27;47704:2;47708:8;47694:27;;;;;;;;;;;;:9;:27::i;:::-;47629:98;;:::o;52920:690::-;53057:4;53074:15;:2;:13;;;:15::i;:::-;53070:535;;;53129:2;53113:36;;;53150:12;:10;:12::i;:::-;53164:4;53170:7;53179:5;53113:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53100:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53361:1;53344:6;:13;:18;53340:215;;53377:61;;;;;;;;;;:::i;:::-;;;;;;;;53340:215;53523:6;53517:13;53508:6;53504:2;53500:15;53493:38;53100:464;53245:45;;;53235:55;;;:6;:55;;;;53228:62;;;;;53070:535;53593:4;53586:11;;52920:690;;;;;;;:::o;14661:723::-;14717:13;14947:1;14938:5;:10;14934:53;;14965:10;;;;;;;;;;;;;;;;;;;;;14934:53;14997:12;15012:5;14997:20;;15028:14;15053:78;15068:1;15060:4;:9;15053:78;;15086:8;;;;;:::i;:::-;;;;15117:2;15109:10;;;;;:::i;:::-;;;15053:78;;;15141:19;15173:6;15163:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15141:39;;15191:154;15207:1;15198:5;:10;15191:154;;15235:1;15225:11;;;;;:::i;:::-;;;15302:2;15294:5;:10;;;;:::i;:::-;15281:2;:24;;;;:::i;:::-;15268:39;;15251:6;15258;15251:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;15331:2;15322:11;;;;;:::i;:::-;;;15191:154;;;15369:6;15355:21;;;;;14661:723;;;;:::o;46298:186::-;46420:4;46443:18;:25;46462:5;46443:25;;;;;;;;;;;;;;;:35;46469:8;46443:35;;;;;;;;;;;;;;;;;;;;;;;;;46436:42;;46298:186;;;;:::o;31775:157::-;31860:4;31899:25;31884:40;;;:11;:40;;;;31877:47;;31775:157;;;:::o;54072:141::-;;;;;:::o;54599:140::-;;;;;:::o;48066:1272::-;48171:20;48194:12;;48171:35;;48235:1;48221:16;;:2;:16;;;48213:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48412:21;48420:12;48412:7;:21::i;:::-;48411:22;48403:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;48494:12;48482:8;:24;;48474:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48554:61;48584:1;48588:2;48592:12;48606:8;48554:21;:61::i;:::-;48624:30;48657:12;:16;48670:2;48657:16;;;;;;;;;;;;;;;48624:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48699:119;;;;;;;;48749:8;48719:11;:19;;;:39;;;;:::i;:::-;48699:119;;;;;;48802:8;48767:11;:24;;;:44;;;;:::i;:::-;48699:119;;;;;48680:12;:16;48693:2;48680:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48853:43;;;;;;;;48868:2;48853:43;;;;;;48879:15;48853:43;;;;;48825:11;:25;48837:12;48825:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48905:20;48928:12;48905:35;;48954:9;48949:281;48973:8;48969:1;:12;48949:281;;;49027:12;49023:2;49002:38;;49019:1;49002:38;;;;;;;;;;;;49067:59;49098:1;49102:2;49106:12;49120:5;49067:22;:59::i;:::-;49049:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;49208:14;;;;;:::i;:::-;;;;48983:3;;;;;:::i;:::-;;;;48949:281;;;;49253:12;49238;:27;;;;49272:60;49301:1;49305:2;49309:12;49323:8;49272:20;:60::i;:::-;48164:1174;;;48066:1272;;;:::o;20663:387::-;20723:4;20931:12;20998:7;20986:20;20978:28;;21041:1;21034:4;:8;21027:15;;;20663:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:118::-;3030:24;3048:5;3030:24;:::i;:::-;3025:3;3018:37;2943:118;;:::o;3067:222::-;3160:4;3198:2;3187:9;3183:18;3175:26;;3211:71;3279:1;3268:9;3264:17;3255:6;3211:71;:::i;:::-;3067:222;;;;:::o;3295:122::-;3368:24;3386:5;3368:24;:::i;:::-;3361:5;3358:35;3348:63;;3407:1;3404;3397:12;3348:63;3295:122;:::o;3423:139::-;3469:5;3507:6;3494:20;3485:29;;3523:33;3550:5;3523:33;:::i;:::-;3423:139;;;;:::o;3568:329::-;3627:6;3676:2;3664:9;3655:7;3651:23;3647:32;3644:119;;;3682:79;;:::i;:::-;3644:119;3802:1;3827:53;3872:7;3863:6;3852:9;3848:22;3827:53;:::i;:::-;3817:63;;3773:117;3568:329;;;;:::o;3903:126::-;3940:7;3980:42;3973:5;3969:54;3958:65;;3903:126;;;:::o;4035:96::-;4072:7;4101:24;4119:5;4101:24;:::i;:::-;4090:35;;4035:96;;;:::o;4137:118::-;4224:24;4242:5;4224:24;:::i;:::-;4219:3;4212:37;4137:118;;:::o;4261:222::-;4354:4;4392:2;4381:9;4377:18;4369:26;;4405:71;4473:1;4462:9;4458:17;4449:6;4405:71;:::i;:::-;4261:222;;;;:::o;4489:122::-;4562:24;4580:5;4562:24;:::i;:::-;4555:5;4552:35;4542:63;;4601:1;4598;4591:12;4542:63;4489:122;:::o;4617:139::-;4663:5;4701:6;4688:20;4679:29;;4717:33;4744:5;4717:33;:::i;:::-;4617:139;;;;:::o;4762:474::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:119;;;4893:79;;:::i;:::-;4855:119;5013:1;5038:53;5083:7;5074:6;5063:9;5059:22;5038:53;:::i;:::-;5028:63;;4984:117;5140:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5111:118;4762:474;;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:116::-;5937:21;5952:5;5937:21;:::i;:::-;5930:5;5927:32;5917:60;;5973:1;5970;5963:12;5917:60;5867:116;:::o;5989:133::-;6032:5;6070:6;6057:20;6048:29;;6086:30;6110:5;6086:30;:::i;:::-;5989:133;;;;:::o;6128:323::-;6184:6;6233:2;6221:9;6212:7;6208:23;6204:32;6201:119;;;6239:79;;:::i;:::-;6201:119;6359:1;6384:50;6426:7;6417:6;6406:9;6402:22;6384:50;:::i;:::-;6374:60;;6330:114;6128:323;;;;:::o;6457:474::-;6525:6;6533;6582:2;6570:9;6561:7;6557:23;6553:32;6550:119;;;6588:79;;:::i;:::-;6550:119;6708:1;6733:53;6778:7;6769:6;6758:9;6754:22;6733:53;:::i;:::-;6723:63;;6679:117;6835:2;6861:53;6906:7;6897:6;6886:9;6882:22;6861:53;:::i;:::-;6851:63;;6806:118;6457:474;;;;;:::o;6937:332::-;7058:4;7096:2;7085:9;7081:18;7073:26;;7109:71;7177:1;7166:9;7162:17;7153:6;7109:71;:::i;:::-;7190:72;7258:2;7247:9;7243:18;7234:6;7190:72;:::i;:::-;6937:332;;;;;:::o;7275:110::-;7326:7;7355:24;7373:5;7355:24;:::i;:::-;7344:35;;7275:110;;;:::o;7391:150::-;7478:38;7510:5;7478:38;:::i;:::-;7471:5;7468:49;7458:77;;7531:1;7528;7521:12;7458:77;7391:150;:::o;7547:167::-;7607:5;7645:6;7632:20;7623:29;;7661:47;7702:5;7661:47;:::i;:::-;7547:167;;;;:::o;7720:357::-;7793:6;7842:2;7830:9;7821:7;7817:23;7813:32;7810:119;;;7848:79;;:::i;:::-;7810:119;7968:1;7993:67;8052:7;8043:6;8032:9;8028:22;7993:67;:::i;:::-;7983:77;;7939:131;7720:357;;;;:::o;8083:117::-;8192:1;8189;8182:12;8206:117;8315:1;8312;8305:12;8329:180;8377:77;8374:1;8367:88;8474:4;8471:1;8464:15;8498:4;8495:1;8488:15;8515:281;8598:27;8620:4;8598:27;:::i;:::-;8590:6;8586:40;8728:6;8716:10;8713:22;8692:18;8680:10;8677:34;8674:62;8671:88;;;8739:18;;:::i;:::-;8671:88;8779:10;8775:2;8768:22;8558:238;8515:281;;:::o;8802:129::-;8836:6;8863:20;;:::i;:::-;8853:30;;8892:33;8920:4;8912:6;8892:33;:::i;:::-;8802:129;;;:::o;8937:308::-;8999:4;9089:18;9081:6;9078:30;9075:56;;;9111:18;;:::i;:::-;9075:56;9149:29;9171:6;9149:29;:::i;:::-;9141:37;;9233:4;9227;9223:15;9215:23;;8937:308;;;:::o;9251:146::-;9348:6;9343:3;9338;9325:30;9389:1;9380:6;9375:3;9371:16;9364:27;9251:146;;;:::o;9403:425::-;9481:5;9506:66;9522:49;9564:6;9522:49;:::i;:::-;9506:66;:::i;:::-;9497:75;;9595:6;9588:5;9581:21;9633:4;9626:5;9622:16;9671:3;9662:6;9657:3;9653:16;9650:25;9647:112;;;9678:79;;:::i;:::-;9647:112;9768:54;9815:6;9810:3;9805;9768:54;:::i;:::-;9487:341;9403:425;;;;;:::o;9848:340::-;9904:5;9953:3;9946:4;9938:6;9934:17;9930:27;9920:122;;9961:79;;:::i;:::-;9920:122;10078:6;10065:20;10103:79;10178:3;10170:6;10163:4;10155:6;10151:17;10103:79;:::i;:::-;10094:88;;9910:278;9848:340;;;;:::o;10194:509::-;10263:6;10312:2;10300:9;10291:7;10287:23;10283:32;10280:119;;;10318:79;;:::i;:::-;10280:119;10466:1;10455:9;10451:17;10438:31;10496:18;10488:6;10485:30;10482:117;;;10518:79;;:::i;:::-;10482:117;10623:63;10678:7;10669:6;10658:9;10654:22;10623:63;:::i;:::-;10613:73;;10409:287;10194:509;;;;:::o;10709:329::-;10768:6;10817:2;10805:9;10796:7;10792:23;10788:32;10785:119;;;10823:79;;:::i;:::-;10785:119;10943:1;10968:53;11013:7;11004:6;10993:9;10989:22;10968:53;:::i;:::-;10958:63;;10914:117;10709:329;;;;:::o;11044:468::-;11109:6;11117;11166:2;11154:9;11145:7;11141:23;11137:32;11134:119;;;11172:79;;:::i;:::-;11134:119;11292:1;11317:53;11362:7;11353:6;11342:9;11338:22;11317:53;:::i;:::-;11307:63;;11263:117;11419:2;11445:50;11487:7;11478:6;11467:9;11463:22;11445:50;:::i;:::-;11435:60;;11390:115;11044:468;;;;;:::o;11518:307::-;11579:4;11669:18;11661:6;11658:30;11655:56;;;11691:18;;:::i;:::-;11655:56;11729:29;11751:6;11729:29;:::i;:::-;11721:37;;11813:4;11807;11803:15;11795:23;;11518:307;;;:::o;11831:423::-;11908:5;11933:65;11949:48;11990:6;11949:48;:::i;:::-;11933:65;:::i;:::-;11924:74;;12021:6;12014:5;12007:21;12059:4;12052:5;12048:16;12097:3;12088:6;12083:3;12079:16;12076:25;12073:112;;;12104:79;;:::i;:::-;12073:112;12194:54;12241:6;12236:3;12231;12194:54;:::i;:::-;11914:340;11831:423;;;;;:::o;12273:338::-;12328:5;12377:3;12370:4;12362:6;12358:17;12354:27;12344:122;;12385:79;;:::i;:::-;12344:122;12502:6;12489:20;12527:78;12601:3;12593:6;12586:4;12578:6;12574:17;12527:78;:::i;:::-;12518:87;;12334:277;12273:338;;;;:::o;12617:943::-;12712:6;12720;12728;12736;12785:3;12773:9;12764:7;12760:23;12756:33;12753:120;;;12792:79;;:::i;:::-;12753:120;12912:1;12937:53;12982:7;12973:6;12962:9;12958:22;12937:53;:::i;:::-;12927:63;;12883:117;13039:2;13065:53;13110:7;13101:6;13090:9;13086:22;13065:53;:::i;:::-;13055:63;;13010:118;13167:2;13193:53;13238:7;13229:6;13218:9;13214:22;13193:53;:::i;:::-;13183:63;;13138:118;13323:2;13312:9;13308:18;13295:32;13354:18;13346:6;13343:30;13340:117;;;13376:79;;:::i;:::-;13340:117;13481:62;13535:7;13526:6;13515:9;13511:22;13481:62;:::i;:::-;13471:72;;13266:287;12617:943;;;;;;;:::o;13566:474::-;13634:6;13642;13691:2;13679:9;13670:7;13666:23;13662:32;13659:119;;;13697:79;;:::i;:::-;13659:119;13817:1;13842:53;13887:7;13878:6;13867:9;13863:22;13842:53;:::i;:::-;13832:63;;13788:117;13944:2;13970:53;14015:7;14006:6;13995:9;13991:22;13970:53;:::i;:::-;13960:63;;13915:118;13566:474;;;;;:::o;14046:180::-;14094:77;14091:1;14084:88;14191:4;14188:1;14181:15;14215:4;14212:1;14205:15;14232:320;14276:6;14313:1;14307:4;14303:12;14293:22;;14360:1;14354:4;14350:12;14381:18;14371:81;;14437:4;14429:6;14425:17;14415:27;;14371:81;14499:2;14491:6;14488:14;14468:18;14465:38;14462:84;;14518:18;;:::i;:::-;14462:84;14283:269;14232:320;;;:::o;14558:232::-;14698:34;14694:1;14686:6;14682:14;14675:58;14767:15;14762:2;14754:6;14750:15;14743:40;14558:232;:::o;14796:366::-;14938:3;14959:67;15023:2;15018:3;14959:67;:::i;:::-;14952:74;;15035:93;15124:3;15035:93;:::i;:::-;15153:2;15148:3;15144:12;15137:19;;14796:366;;;:::o;15168:419::-;15334:4;15372:2;15361:9;15357:18;15349:26;;15421:9;15415:4;15411:20;15407:1;15396:9;15392:17;15385:47;15449:131;15575:4;15449:131;:::i;:::-;15441:139;;15168:419;;;:::o;15593:221::-;15733:34;15729:1;15721:6;15717:14;15710:58;15802:4;15797:2;15789:6;15785:15;15778:29;15593:221;:::o;15820:366::-;15962:3;15983:67;16047:2;16042:3;15983:67;:::i;:::-;15976:74;;16059:93;16148:3;16059:93;:::i;:::-;16177:2;16172:3;16168:12;16161:19;;15820:366;;;:::o;16192:419::-;16358:4;16396:2;16385:9;16381:18;16373:26;;16445:9;16439:4;16435:20;16431:1;16420:9;16416:17;16409:47;16473:131;16599:4;16473:131;:::i;:::-;16465:139;;16192:419;;;:::o;16617:244::-;16757:34;16753:1;16745:6;16741:14;16734:58;16826:27;16821:2;16813:6;16809:15;16802:52;16617:244;:::o;16867:366::-;17009:3;17030:67;17094:2;17089:3;17030:67;:::i;:::-;17023:74;;17106:93;17195:3;17106:93;:::i;:::-;17224:2;17219:3;17215:12;17208:19;;16867:366;;;:::o;17239:419::-;17405:4;17443:2;17432:9;17428:18;17420:26;;17492:9;17486:4;17482:20;17478:1;17467:9;17463:17;17456:47;17520:131;17646:4;17520:131;:::i;:::-;17512:139;;17239:419;;;:::o;17664:182::-;17804:34;17800:1;17792:6;17788:14;17781:58;17664:182;:::o;17852:366::-;17994:3;18015:67;18079:2;18074:3;18015:67;:::i;:::-;18008:74;;18091:93;18180:3;18091:93;:::i;:::-;18209:2;18204:3;18200:12;18193:19;;17852:366;;;:::o;18224:419::-;18390:4;18428:2;18417:9;18413:18;18405:26;;18477:9;18471:4;18467:20;18463:1;18452:9;18448:17;18441:47;18505:131;18631:4;18505:131;:::i;:::-;18497:139;;18224:419;;;:::o;18649:167::-;18789:19;18785:1;18777:6;18773:14;18766:43;18649:167;:::o;18822:366::-;18964:3;18985:67;19049:2;19044:3;18985:67;:::i;:::-;18978:74;;19061:93;19150:3;19061:93;:::i;:::-;19179:2;19174:3;19170:12;19163:19;;18822:366;;;:::o;19194:419::-;19360:4;19398:2;19387:9;19383:18;19375:26;;19447:9;19441:4;19437:20;19433:1;19422:9;19418:17;19411:47;19475:131;19601:4;19475:131;:::i;:::-;19467:139;;19194:419;;;:::o;19619:221::-;19759:34;19755:1;19747:6;19743:14;19736:58;19828:4;19823:2;19815:6;19811:15;19804:29;19619:221;:::o;19846:366::-;19988:3;20009:67;20073:2;20068:3;20009:67;:::i;:::-;20002:74;;20085:93;20174:3;20085:93;:::i;:::-;20203:2;20198:3;20194:12;20187:19;;19846:366;;;:::o;20218:419::-;20384:4;20422:2;20411:9;20407:18;20399:26;;20471:9;20465:4;20461:20;20457:1;20446:9;20442:17;20435:47;20499:131;20625:4;20499:131;:::i;:::-;20491:139;;20218:419;;;:::o;20643:180::-;20691:77;20688:1;20681:88;20788:4;20785:1;20778:15;20812:4;20809:1;20802:15;20829:233;20868:3;20891:24;20909:5;20891:24;:::i;:::-;20882:33;;20937:66;20930:5;20927:77;20924:103;;21007:18;;:::i;:::-;20924:103;21054:1;21047:5;21043:13;21036:20;;20829:233;;;:::o;21068:::-;21208:34;21204:1;21196:6;21192:14;21185:58;21277:16;21272:2;21264:6;21260:15;21253:41;21068:233;:::o;21307:366::-;21449:3;21470:67;21534:2;21529:3;21470:67;:::i;:::-;21463:74;;21546:93;21635:3;21546:93;:::i;:::-;21664:2;21659:3;21655:12;21648:19;;21307:366;;;:::o;21679:419::-;21845:4;21883:2;21872:9;21868:18;21860:26;;21932:9;21926:4;21922:20;21918:1;21907:9;21903:17;21896:47;21960:131;22086:4;21960:131;:::i;:::-;21952:139;;21679:419;;;:::o;22104:143::-;22161:5;22192:6;22186:13;22177:22;;22208:33;22235:5;22208:33;:::i;:::-;22104:143;;;;:::o;22253:351::-;22323:6;22372:2;22360:9;22351:7;22347:23;22343:32;22340:119;;;22378:79;;:::i;:::-;22340:119;22498:1;22523:64;22579:7;22570:6;22559:9;22555:22;22523:64;:::i;:::-;22513:74;;22469:128;22253:351;;;;:::o;22610:137::-;22664:5;22695:6;22689:13;22680:22;;22711:30;22735:5;22711:30;:::i;:::-;22610:137;;;;:::o;22753:345::-;22820:6;22869:2;22857:9;22848:7;22844:23;22840:32;22837:119;;;22875:79;;:::i;:::-;22837:119;22995:1;23020:61;23073:7;23064:6;23053:9;23049:22;23020:61;:::i;:::-;23010:71;;22966:125;22753:345;;;;:::o;23104:222::-;23244:34;23240:1;23232:6;23228:14;23221:58;23313:5;23308:2;23300:6;23296:15;23289:30;23104:222;:::o;23332:366::-;23474:3;23495:67;23559:2;23554:3;23495:67;:::i;:::-;23488:74;;23571:93;23660:3;23571:93;:::i;:::-;23689:2;23684:3;23680:12;23673:19;;23332:366;;;:::o;23704:419::-;23870:4;23908:2;23897:9;23893:18;23885:26;;23957:9;23951:4;23947:20;23943:1;23932:9;23928:17;23921:47;23985:131;24111:4;23985:131;:::i;:::-;23977:139;;23704:419;;;:::o;24129:141::-;24178:4;24201:3;24193:11;;24224:3;24221:1;24214:14;24258:4;24255:1;24245:18;24237:26;;24129:141;;;:::o;24276:93::-;24313:6;24360:2;24355;24348:5;24344:14;24340:23;24330:33;;24276:93;;;:::o;24375:107::-;24419:8;24469:5;24463:4;24459:16;24438:37;;24375:107;;;;:::o;24488:393::-;24557:6;24607:1;24595:10;24591:18;24630:97;24660:66;24649:9;24630:97;:::i;:::-;24748:39;24778:8;24767:9;24748:39;:::i;:::-;24736:51;;24820:4;24816:9;24809:5;24805:21;24796:30;;24869:4;24859:8;24855:19;24848:5;24845:30;24835:40;;24564:317;;24488:393;;;;;:::o;24887:60::-;24915:3;24936:5;24929:12;;24887:60;;;:::o;24953:142::-;25003:9;25036:53;25054:34;25063:24;25081:5;25063:24;:::i;:::-;25054:34;:::i;:::-;25036:53;:::i;:::-;25023:66;;24953:142;;;:::o;25101:75::-;25144:3;25165:5;25158:12;;25101:75;;;:::o;25182:269::-;25292:39;25323:7;25292:39;:::i;:::-;25353:91;25402:41;25426:16;25402:41;:::i;:::-;25394:6;25387:4;25381:11;25353:91;:::i;:::-;25347:4;25340:105;25258:193;25182:269;;;:::o;25457:73::-;25502:3;25457:73;:::o;25536:189::-;25613:32;;:::i;:::-;25654:65;25712:6;25704;25698:4;25654:65;:::i;:::-;25589:136;25536:189;;:::o;25731:186::-;25791:120;25808:3;25801:5;25798:14;25791:120;;;25862:39;25899:1;25892:5;25862:39;:::i;:::-;25835:1;25828:5;25824:13;25815:22;;25791:120;;;25731:186;;:::o;25923:543::-;26024:2;26019:3;26016:11;26013:446;;;26058:38;26090:5;26058:38;:::i;:::-;26142:29;26160:10;26142:29;:::i;:::-;26132:8;26128:44;26325:2;26313:10;26310:18;26307:49;;;26346:8;26331:23;;26307:49;26369:80;26425:22;26443:3;26425:22;:::i;:::-;26415:8;26411:37;26398:11;26369:80;:::i;:::-;26028:431;;26013:446;25923:543;;;:::o;26472:117::-;26526:8;26576:5;26570:4;26566:16;26545:37;;26472:117;;;;:::o;26595:169::-;26639:6;26672:51;26720:1;26716:6;26708:5;26705:1;26701:13;26672:51;:::i;:::-;26668:56;26753:4;26747;26743:15;26733:25;;26646:118;26595:169;;;;:::o;26769:295::-;26845:4;26991:29;27016:3;27010:4;26991:29;:::i;:::-;26983:37;;27053:3;27050:1;27046:11;27040:4;27037:21;27029:29;;26769:295;;;;:::o;27069:1395::-;27186:37;27219:3;27186:37;:::i;:::-;27288:18;27280:6;27277:30;27274:56;;;27310:18;;:::i;:::-;27274:56;27354:38;27386:4;27380:11;27354:38;:::i;:::-;27439:67;27499:6;27491;27485:4;27439:67;:::i;:::-;27533:1;27557:4;27544:17;;27589:2;27581:6;27578:14;27606:1;27601:618;;;;28263:1;28280:6;28277:77;;;28329:9;28324:3;28320:19;28314:26;28305:35;;28277:77;28380:67;28440:6;28433:5;28380:67;:::i;:::-;28374:4;28367:81;28236:222;27571:887;;27601:618;27653:4;27649:9;27641:6;27637:22;27687:37;27719:4;27687:37;:::i;:::-;27746:1;27760:208;27774:7;27771:1;27768:14;27760:208;;;27853:9;27848:3;27844:19;27838:26;27830:6;27823:42;27904:1;27896:6;27892:14;27882:24;;27951:2;27940:9;27936:18;27923:31;;27797:4;27794:1;27790:12;27785:17;;27760:208;;;27996:6;27987:7;27984:19;27981:179;;;28054:9;28049:3;28045:19;28039:26;28097:48;28139:4;28131:6;28127:17;28116:9;28097:48;:::i;:::-;28089:6;28082:64;28004:156;27981:179;28206:1;28202;28194:6;28190:14;28186:22;28180:4;28173:36;27608:611;;;27571:887;;27161:1303;;;27069:1395;;:::o;28470:230::-;28610:34;28606:1;28598:6;28594:14;28587:58;28679:13;28674:2;28666:6;28662:15;28655:38;28470:230;:::o;28706:366::-;28848:3;28869:67;28933:2;28928:3;28869:67;:::i;:::-;28862:74;;28945:93;29034:3;28945:93;:::i;:::-;29063:2;29058:3;29054:12;29047:19;;28706:366;;;:::o;29078:419::-;29244:4;29282:2;29271:9;29267:18;29259:26;;29331:9;29325:4;29321:20;29317:1;29306:9;29302:17;29295:47;29359:131;29485:4;29359:131;:::i;:::-;29351:139;;29078:419;;;:::o;29503:181::-;29643:33;29639:1;29631:6;29627:14;29620:57;29503:181;:::o;29690:366::-;29832:3;29853:67;29917:2;29912:3;29853:67;:::i;:::-;29846:74;;29929:93;30018:3;29929:93;:::i;:::-;30047:2;30042:3;30038:12;30031:19;;29690:366;;;:::o;30062:419::-;30228:4;30266:2;30255:9;30251:18;30243:26;;30315:9;30309:4;30305:20;30301:1;30290:9;30286:17;30279:47;30343:131;30469:4;30343:131;:::i;:::-;30335:139;;30062:419;;;:::o;30487:410::-;30527:7;30550:20;30568:1;30550:20;:::i;:::-;30545:25;;30584:20;30602:1;30584:20;:::i;:::-;30579:25;;30639:1;30636;30632:9;30661:30;30679:11;30661:30;:::i;:::-;30650:41;;30840:1;30831:7;30827:15;30824:1;30821:22;30801:1;30794:9;30774:83;30751:139;;30870:18;;:::i;:::-;30751:139;30535:362;30487:410;;;;:::o;30903:174::-;31043:26;31039:1;31031:6;31027:14;31020:50;30903:174;:::o;31083:366::-;31225:3;31246:67;31310:2;31305:3;31246:67;:::i;:::-;31239:74;;31322:93;31411:3;31322:93;:::i;:::-;31440:2;31435:3;31431:12;31424:19;;31083:366;;;:::o;31455:419::-;31621:4;31659:2;31648:9;31644:18;31636:26;;31708:9;31702:4;31698:20;31694:1;31683:9;31679:17;31672:47;31736:131;31862:4;31736:131;:::i;:::-;31728:139;;31455:419;;;:::o;31880:173::-;32020:25;32016:1;32008:6;32004:14;31997:49;31880:173;:::o;32059:366::-;32201:3;32222:67;32286:2;32281:3;32222:67;:::i;:::-;32215:74;;32298:93;32387:3;32298:93;:::i;:::-;32416:2;32411:3;32407:12;32400:19;;32059:366;;;:::o;32431:419::-;32597:4;32635:2;32624:9;32620:18;32612:26;;32684:9;32678:4;32674:20;32670:1;32659:9;32655:17;32648:47;32712:131;32838:4;32712:131;:::i;:::-;32704:139;;32431:419;;;:::o;32856:191::-;32896:3;32915:20;32933:1;32915:20;:::i;:::-;32910:25;;32949:20;32967:1;32949:20;:::i;:::-;32944:25;;32992:1;32989;32985:9;32978:16;;33013:3;33010:1;33007:10;33004:36;;;33020:18;;:::i;:::-;33004:36;32856:191;;;;:::o;33053:221::-;33193:34;33189:1;33181:6;33177:14;33170:58;33262:4;33257:2;33249:6;33245:15;33238:29;33053:221;:::o;33280:366::-;33422:3;33443:67;33507:2;33502:3;33443:67;:::i;:::-;33436:74;;33519:93;33608:3;33519:93;:::i;:::-;33637:2;33632:3;33628:12;33621:19;;33280:366;;;:::o;33652:419::-;33818:4;33856:2;33845:9;33841:18;33833:26;;33905:9;33899:4;33895:20;33891:1;33880:9;33876:17;33869:47;33933:131;34059:4;33933:131;:::i;:::-;33925:139;;33652:419;;;:::o;34077:221::-;34217:34;34213:1;34205:6;34201:14;34194:58;34286:4;34281:2;34273:6;34269:15;34262:29;34077:221;:::o;34304:366::-;34446:3;34467:67;34531:2;34526:3;34467:67;:::i;:::-;34460:74;;34543:93;34632:3;34543:93;:::i;:::-;34661:2;34656:3;34652:12;34645:19;;34304:366;;;:::o;34676:419::-;34842:4;34880:2;34869:9;34865:18;34857:26;;34929:9;34923:4;34919:20;34915:1;34904:9;34900:17;34893:47;34957:131;35083:4;34957:131;:::i;:::-;34949:139;;34676:419;;;:::o;35101:176::-;35241:28;35237:1;35229:6;35225:14;35218:52;35101:176;:::o;35283:366::-;35425:3;35446:67;35510:2;35505:3;35446:67;:::i;:::-;35439:74;;35522:93;35611:3;35522:93;:::i;:::-;35640:2;35635:3;35631:12;35624:19;;35283:366;;;:::o;35655:419::-;35821:4;35859:2;35848:9;35844:18;35836:26;;35908:9;35902:4;35898:20;35894:1;35883:9;35879:17;35872:47;35936:131;36062:4;35936:131;:::i;:::-;35928:139;;35655:419;;;:::o;36080:238::-;36220:34;36216:1;36208:6;36204:14;36197:58;36289:21;36284:2;36276:6;36272:15;36265:46;36080:238;:::o;36324:366::-;36466:3;36487:67;36551:2;36546:3;36487:67;:::i;:::-;36480:74;;36563:93;36652:3;36563:93;:::i;:::-;36681:2;36676:3;36672:12;36665:19;;36324:366;;;:::o;36696:419::-;36862:4;36900:2;36889:9;36885:18;36877:26;;36949:9;36943:4;36939:20;36935:1;36924:9;36920:17;36913:47;36977:131;37103:4;36977:131;:::i;:::-;36969:139;;36696:419;;;:::o;37121:148::-;37223:11;37260:3;37245:18;;37121:148;;;;:::o;37299:874::-;37402:3;37439:5;37433:12;37468:36;37494:9;37468:36;:::i;:::-;37520:89;37602:6;37597:3;37520:89;:::i;:::-;37513:96;;37640:1;37629:9;37625:17;37656:1;37651:166;;;;37831:1;37826:341;;;;37618:549;;37651:166;37735:4;37731:9;37720;37716:25;37711:3;37704:38;37797:6;37790:14;37783:22;37775:6;37771:35;37766:3;37762:45;37755:52;;37651:166;;37826:341;37893:38;37925:5;37893:38;:::i;:::-;37953:1;37967:154;37981:6;37978:1;37975:13;37967:154;;;38055:7;38049:14;38045:1;38040:3;38036:11;38029:35;38105:1;38096:7;38092:15;38081:26;;38003:4;38000:1;37996:12;37991:17;;37967:154;;;38150:6;38145:3;38141:16;38134:23;;37833:334;;37618:549;;37406:767;;37299:874;;;;:::o;38179:151::-;38319:3;38315:1;38307:6;38303:14;38296:27;38179:151;:::o;38336:400::-;38496:3;38517:84;38599:1;38594:3;38517:84;:::i;:::-;38510:91;;38610:93;38699:3;38610:93;:::i;:::-;38728:1;38723:3;38719:11;38712:18;;38336:400;;;:::o;38742:390::-;38848:3;38876:39;38909:5;38876:39;:::i;:::-;38931:89;39013:6;39008:3;38931:89;:::i;:::-;38924:96;;39029:65;39087:6;39082:3;39075:4;39068:5;39064:16;39029:65;:::i;:::-;39119:6;39114:3;39110:16;39103:23;;38852:280;38742:390;;;;:::o;39138:155::-;39278:7;39274:1;39266:6;39262:14;39255:31;39138:155;:::o;39299:400::-;39459:3;39480:84;39562:1;39557:3;39480:84;:::i;:::-;39473:91;;39573:93;39662:3;39573:93;:::i;:::-;39691:1;39686:3;39682:11;39675:18;;39299:400;;;:::o;39705:961::-;40084:3;40106:92;40194:3;40185:6;40106:92;:::i;:::-;40099:99;;40215:148;40359:3;40215:148;:::i;:::-;40208:155;;40380:95;40471:3;40462:6;40380:95;:::i;:::-;40373:102;;40492:148;40636:3;40492:148;:::i;:::-;40485:155;;40657:3;40650:10;;39705:961;;;;;:::o;40672:125::-;40738:7;40767:24;40785:5;40767:24;:::i;:::-;40756:35;;40672:125;;;:::o;40803:180::-;40905:53;40952:5;40905:53;:::i;:::-;40898:5;40895:64;40885:92;;40973:1;40970;40963:12;40885:92;40803:180;:::o;40989:201::-;41075:5;41106:6;41100:13;41091:22;;41122:62;41178:5;41122:62;:::i;:::-;40989:201;;;;:::o;41196:409::-;41295:6;41344:2;41332:9;41323:7;41319:23;41315:32;41312:119;;;41350:79;;:::i;:::-;41312:119;41470:1;41495:93;41580:7;41571:6;41560:9;41556:22;41495:93;:::i;:::-;41485:103;;41441:157;41196:409;;;;:::o;41611:225::-;41751:34;41747:1;41739:6;41735:14;41728:58;41820:8;41815:2;41807:6;41803:15;41796:33;41611:225;:::o;41842:366::-;41984:3;42005:67;42069:2;42064:3;42005:67;:::i;:::-;41998:74;;42081:93;42170:3;42081:93;:::i;:::-;42199:2;42194:3;42190:12;42183:19;;41842:366;;;:::o;42214:419::-;42380:4;42418:2;42407:9;42403:18;42395:26;;42467:9;42461:4;42457:20;42453:1;42442:9;42438:17;42431:47;42495:131;42621:4;42495:131;:::i;:::-;42487:139;;42214:419;;;:::o;42639:237::-;42779:34;42775:1;42767:6;42763:14;42756:58;42848:20;42843:2;42835:6;42831:15;42824:45;42639:237;:::o;42882:366::-;43024:3;43045:67;43109:2;43104:3;43045:67;:::i;:::-;43038:74;;43121:93;43210:3;43121:93;:::i;:::-;43239:2;43234:3;43230:12;43223:19;;42882:366;;;:::o;43254:419::-;43420:4;43458:2;43447:9;43443:18;43435:26;;43507:9;43501:4;43497:20;43493:1;43482:9;43478:17;43471:47;43535:131;43661:4;43535:131;:::i;:::-;43527:139;;43254:419;;;:::o;43679:225::-;43819:34;43815:1;43807:6;43803:14;43796:58;43888:8;43883:2;43875:6;43871:15;43864:33;43679:225;:::o;43910:366::-;44052:3;44073:67;44137:2;44132:3;44073:67;:::i;:::-;44066:74;;44149:93;44238:3;44149:93;:::i;:::-;44267:2;44262:3;44258:12;44251:19;;43910:366;;;:::o;44282:419::-;44448:4;44486:2;44475:9;44471:18;44463:26;;44535:9;44529:4;44525:20;44521:1;44510:9;44506:17;44499:47;44563:131;44689:4;44563:131;:::i;:::-;44555:139;;44282:419;;;:::o;44707:224::-;44847:34;44843:1;44835:6;44831:14;44824:58;44916:7;44911:2;44903:6;44899:15;44892:32;44707:224;:::o;44937:366::-;45079:3;45100:67;45164:2;45159:3;45100:67;:::i;:::-;45093:74;;45176:93;45265:3;45176:93;:::i;:::-;45294:2;45289:3;45285:12;45278:19;;44937:366;;;:::o;45309:419::-;45475:4;45513:2;45502:9;45498:18;45490:26;;45562:9;45556:4;45552:20;45548:1;45537:9;45533:17;45526:47;45590:131;45716:4;45590:131;:::i;:::-;45582:139;;45309:419;;;:::o;45734:118::-;45771:7;45811:34;45804:5;45800:46;45789:57;;45734:118;;;:::o;45858:227::-;45898:4;45918:20;45936:1;45918:20;:::i;:::-;45913:25;;45952:20;45970:1;45952:20;:::i;:::-;45947:25;;45996:1;45993;45989:9;45981:17;;46020:34;46014:4;46011:44;46008:70;;;46058:18;;:::i;:::-;46008:70;45858:227;;;;:::o;46091:224::-;46131:3;46150:20;46168:1;46150:20;:::i;:::-;46145:25;;46184:20;46202:1;46184:20;:::i;:::-;46179:25;;46227:1;46224;46220:9;46213:16;;46250:34;46245:3;46242:43;46239:69;;;46288:18;;:::i;:::-;46239:69;46091:224;;;;:::o;46321:180::-;46369:77;46366:1;46359:88;46466:4;46463:1;46456:15;46490:4;46487:1;46480:15;46507:185;46547:1;46564:20;46582:1;46564:20;:::i;:::-;46559:25;;46598:20;46616:1;46598:20;:::i;:::-;46593:25;;46637:1;46627:35;;46642:18;;:::i;:::-;46627:35;46684:1;46681;46677:9;46672:14;;46507:185;;;;:::o;46698:229::-;46838:34;46834:1;46826:6;46822:14;46815:58;46907:12;46902:2;46894:6;46890:15;46883:37;46698:229;:::o;46933:366::-;47075:3;47096:67;47160:2;47155:3;47096:67;:::i;:::-;47089:74;;47172:93;47261:3;47172:93;:::i;:::-;47290:2;47285:3;47281:12;47274:19;;46933:366;;;:::o;47305:419::-;47471:4;47509:2;47498:9;47494:18;47486:26;;47558:9;47552:4;47548:20;47544:1;47533:9;47529:17;47522:47;47586:131;47712:4;47586:131;:::i;:::-;47578:139;;47305:419;;;:::o;47730:194::-;47770:4;47790:20;47808:1;47790:20;:::i;:::-;47785:25;;47824:20;47842:1;47824:20;:::i;:::-;47819:25;;47868:1;47865;47861:9;47853:17;;47892:1;47886:4;47883:11;47880:37;;;47897:18;;:::i;:::-;47880:37;47730:194;;;;:::o;47930:171::-;47969:3;47992:24;48010:5;47992:24;:::i;:::-;47983:33;;48038:4;48031:5;48028:15;48025:41;;48046:18;;:::i;:::-;48025:41;48093:1;48086:5;48082:13;48075:20;;47930:171;;;:::o;48107:234::-;48247:34;48243:1;48235:6;48231:14;48224:58;48316:17;48311:2;48303:6;48299:15;48292:42;48107:234;:::o;48347:366::-;48489:3;48510:67;48574:2;48569:3;48510:67;:::i;:::-;48503:74;;48586:93;48675:3;48586:93;:::i;:::-;48704:2;48699:3;48695:12;48688:19;;48347:366;;;:::o;48719:419::-;48885:4;48923:2;48912:9;48908:18;48900:26;;48972:9;48966:4;48962:20;48958:1;48947:9;48943:17;48936:47;49000:131;49126:4;49000:131;:::i;:::-;48992:139;;48719:419;;;:::o;49144:98::-;49195:6;49229:5;49223:12;49213:22;;49144:98;;;:::o;49248:168::-;49331:11;49365:6;49360:3;49353:19;49405:4;49400:3;49396:14;49381:29;;49248:168;;;;:::o;49422:373::-;49508:3;49536:38;49568:5;49536:38;:::i;:::-;49590:70;49653:6;49648:3;49590:70;:::i;:::-;49583:77;;49669:65;49727:6;49722:3;49715:4;49708:5;49704:16;49669:65;:::i;:::-;49759:29;49781:6;49759:29;:::i;:::-;49754:3;49750:39;49743:46;;49512:283;49422:373;;;;:::o;49801:640::-;49996:4;50034:3;50023:9;50019:19;50011:27;;50048:71;50116:1;50105:9;50101:17;50092:6;50048:71;:::i;:::-;50129:72;50197:2;50186:9;50182:18;50173:6;50129:72;:::i;:::-;50211;50279:2;50268:9;50264:18;50255:6;50211:72;:::i;:::-;50330:9;50324:4;50320:20;50315:2;50304:9;50300:18;50293:48;50358:76;50429:4;50420:6;50358:76;:::i;:::-;50350:84;;49801:640;;;;;;;:::o;50447:141::-;50503:5;50534:6;50528:13;50519:22;;50550:32;50576:5;50550:32;:::i;:::-;50447:141;;;;:::o;50594:349::-;50663:6;50712:2;50700:9;50691:7;50687:23;50683:32;50680:119;;;50718:79;;:::i;:::-;50680:119;50838:1;50863:63;50918:7;50909:6;50898:9;50894:22;50863:63;:::i;:::-;50853:73;;50809:127;50594:349;;;;:::o;50949:176::-;50981:1;50998:20;51016:1;50998:20;:::i;:::-;50993:25;;51032:20;51050:1;51032:20;:::i;:::-;51027:25;;51071:1;51061:35;;51076:18;;:::i;:::-;51061:35;51117:1;51114;51110:9;51105:14;;50949:176;;;;:::o;51131:180::-;51179:77;51176:1;51169:88;51276:4;51273:1;51266:15;51300:4;51297:1;51290:15;51317:220;51457:34;51453:1;51445:6;51441:14;51434:58;51526:3;51521:2;51513:6;51509:15;51502:28;51317:220;:::o;51543:366::-;51685:3;51706:67;51770:2;51765:3;51706:67;:::i;:::-;51699:74;;51782:93;51871:3;51782:93;:::i;:::-;51900:2;51895:3;51891:12;51884:19;;51543:366;;;:::o;51915:419::-;52081:4;52119:2;52108:9;52104:18;52096:26;;52168:9;52162:4;52158:20;52154:1;52143:9;52139:17;52132:47;52196:131;52322:4;52196:131;:::i;:::-;52188:139;;51915:419;;;:::o;52340:179::-;52480:31;52476:1;52468:6;52464:14;52457:55;52340:179;:::o;52525:366::-;52667:3;52688:67;52752:2;52747:3;52688:67;:::i;:::-;52681:74;;52764:93;52853:3;52764:93;:::i;:::-;52882:2;52877:3;52873:12;52866:19;;52525:366;;;:::o;52897:419::-;53063:4;53101:2;53090:9;53086:18;53078:26;;53150:9;53144:4;53140:20;53136:1;53125:9;53121:17;53114:47;53178:131;53304:4;53178:131;:::i;:::-;53170:139;;52897:419;;;:::o;53322:221::-;53462:34;53458:1;53450:6;53446:14;53439:58;53531:4;53526:2;53518:6;53514:15;53507:29;53322:221;:::o;53549:366::-;53691:3;53712:67;53776:2;53771:3;53712:67;:::i;:::-;53705:74;;53788:93;53877:3;53788:93;:::i;:::-;53906:2;53901:3;53897:12;53890:19;;53549:366;;;:::o;53921:419::-;54087:4;54125:2;54114:9;54110:18;54102:26;;54174:9;54168:4;54164:20;54160:1;54149:9;54145:17;54138:47;54202:131;54328:4;54202:131;:::i;:::-;54194:139;;53921:419;;;:::o

Swarm Source

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