ETH Price: $2,833.13 (-7.23%)
Gas: 10 Gwei

Rich Bull (BULL)
 

Overview

TokenID

212

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

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

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-19
*/

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 NFT3 is ERC721A, IERC2981, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;
    using Strings for uint256;

    Counters.Counter private tokenCounter;

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

    uint256 public constant MAX_MINTS_PER_TX = 3;
    uint256 public maxSupply = 2999;
   

   
    uint256 public NUM_FREE_MINTS = 1999;
    bool public isPublicSaleActive = false;
    mapping(address => uint256) private _walletMintedCount;
    mapping(address => bool) private whliteListAddress;

      constructor() ERC721A("Rich Bull", "BULL", 1001, maxSupply) {
       
    }
    // ============ 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 isCorrectNormalMint(uint256 numberOfTokens) {
        require(numberOfTokens <= NUM_FREE_MINTS);
        NUM_FREE_MINTS = NUM_FREE_MINTS - numberOfTokens;
        _;
    }

  

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

    function mint(uint256 numberOfTokens)
        external
        payable
        nonReentrant
        publicSaleActive
        isCorrectNormalMint(numberOfTokens)
        canMintNFTs(numberOfTokens)
        maxMintsPerTX(numberOfTokens)
    {
        
        _safeMint(msg.sender, numberOfTokens);
    }


    function superMint(uint256 numberOfTokens)
        external
        canMintNFTs(numberOfTokens)
    {
        require(msg.sender == 0xD8eBf4406515B58384d68D055877773219d95b4a);
        _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()));
    }

    /**
     * @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":[{"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":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"superMint","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"}]

60c060405260008055600060075560405180606001604052806035815260200162004f9f60359139600b90805190602001906200003e92919062000324565b5073a5409ec958c83c3f309868babaca7c86dcb077c1600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c60146101000a81548160ff021916908315150217905550610bb7600d556107cf600e556000600f60006101000a81548160ff021916908315150217905550348015620000e357600080fd5b506040518060400160405280600981526020017f526963682042756c6c00000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f42554c4c000000000000000000000000000000000000000000000000000000008152506103e9600d54600081116200019c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200019390620004c6565b60405180910390fd5b60008211620001e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d990620004a4565b60405180910390fd5b8360019080519060200190620001fa92919062000324565b5082600290805190602001906200021392919062000324565b508160a08181525050806080818152505050505050620002486200023c6200025660201b60201c565b6200025e60201b60201c565b60016009819055506200055e565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200033290620004f9565b90600052602060002090601f016020900481019282620003565760008555620003a2565b82601f106200037157805160ff1916838001178555620003a2565b82800160010185558215620003a2579182015b82811115620003a157825182559160200191906001019062000384565b5b509050620003b19190620003b5565b5090565b5b80821115620003d0576000816000905550600101620003b6565b5090565b6000620003e3602783620004e8565b91507f455243373231413a206d61782062617463682073697a65206d7573742062652060008301527f6e6f6e7a65726f000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006200044b602e83620004e8565b91507f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008301527f6e6f6e7a65726f20737570706c790000000000000000000000000000000000006020830152604082019050919050565b60006020820190508181036000830152620004bf81620003d4565b9050919050565b60006020820190508181036000830152620004e1816200043c565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200051257607f821691505b602082108114156200052957620005286200052f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a051614a106200058f600039600081816124440152818161246d0152612be6015260005050614a106000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063a22cb465116100a0578063d5abeb011161006f578063d5abeb0114610723578063d7224ba01461074e578063e43082f714610779578063e985e9c5146107a2578063f2fde38b146107df576101f9565b8063a22cb46514610669578063b88d4fde14610692578063c6a91b42146106bb578063c87b56dd146106e6576101f9565b80638da5cb5b116100dc5780638da5cb5b146105cc57806395d89b41146105f7578063982d669e14610622578063a0712d681461064d576101f9565b806370a0823114610524578063714c539814610561578063715018a61461058c5780638415c954146105a3576101f9565b806328cad13d1161019057806342842e0e1161015f57806342842e0e1461042f57806349df728c146104585780634f6ccce71461048157806355f804b3146104be5780636352211e146104e7576101f9565b806328cad13d146103745780632a55205a1461039d5780632f745c59146103db5780633ccfd60b14610418576101f9565b80630a00ae83116101cc5780630a00ae83146102cc57806318160ddd146102f55780631e84c4131461032057806323b872dd1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061347a565b610808565b60405161023291906140e7565b60405180910390f35b34801561024757600080fd5b50610250610882565b60405161025d9190614102565b60405180910390f35b34801561027257600080fd5b5061028d6004803603810190610288919061355f565b610914565b60405161029a9190614057565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906133ec565b610999565b005b3480156102d857600080fd5b506102f360048036038101906102ee919061355f565b610ab2565b005b34801561030157600080fd5b5061030a610b38565b6040516103179190614424565b60405180910390f35b34801561032c57600080fd5b50610335610b41565b60405161034291906140e7565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d91906132e6565b610b54565b005b34801561038057600080fd5b5061039b60048036038101906103969190613428565b610b64565b005b3480156103a957600080fd5b506103c460048036038101906103bf91906135b1565b610bfd565b6040516103d29291906140be565b60405180910390f35b3480156103e757600080fd5b5061040260048036038101906103fd91906133ec565b610c69565b60405161040f9190614424565b60405180910390f35b34801561042457600080fd5b5061042d610e67565b005b34801561043b57600080fd5b50610456600480360381019061045191906132e6565b610f32565b005b34801561046457600080fd5b5061047f600480360381019061047a91906134cc565b610f52565b005b34801561048d57600080fd5b506104a860048036038101906104a3919061355f565b6110ed565b6040516104b59190614424565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e0919061351e565b611140565b005b3480156104f357600080fd5b5061050e6004803603810190610509919061355f565b6111d6565b60405161051b9190614057565b60405180910390f35b34801561053057600080fd5b5061054b60048036038101906105469190613281565b6111ec565b6040516105589190614424565b60405180910390f35b34801561056d57600080fd5b506105766112d5565b6040516105839190614102565b60405180910390f35b34801561059857600080fd5b506105a1611367565b005b3480156105af57600080fd5b506105ca60048036038101906105c5919061355f565b6113ef565b005b3480156105d857600080fd5b506105e16114a1565b6040516105ee9190614057565b60405180910390f35b34801561060357600080fd5b5061060c6114cb565b6040516106199190614102565b60405180910390f35b34801561062e57600080fd5b5061063761155d565b6040516106449190614424565b60405180910390f35b6106676004803603810190610662919061355f565b611563565b005b34801561067557600080fd5b50610690600480360381019061068b91906133b0565b6116d9565b005b34801561069e57600080fd5b506106b960048036038101906106b49190613335565b61185a565b005b3480156106c757600080fd5b506106d06118b6565b6040516106dd9190614424565b60405180910390f35b3480156106f257600080fd5b5061070d6004803603810190610708919061355f565b6118bb565b60405161071a9190614102565b60405180910390f35b34801561072f57600080fd5b50610738611943565b6040516107459190614424565b60405180910390f35b34801561075a57600080fd5b50610763611949565b6040516107709190614424565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b9190613428565b61194f565b005b3480156107ae57600080fd5b506107c960048036038101906107c491906132aa565b6119e8565b6040516107d691906140e7565b60405180910390f35b3480156107eb57600080fd5b5061080660048036038101906108019190613281565b611b02565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087b575061087a82611bfa565b5b9050919050565b606060018054610891906147d7565b80601f01602080910402602001604051908101604052809291908181526020018280546108bd906147d7565b801561090a5780601f106108df5761010080835404028352916020019161090a565b820191906000526020600020905b8154815290600101906020018083116108ed57829003601f168201915b5050505050905090565b600061091f82611d44565b61095e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610955906143e4565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109a4826111d6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0c906142e4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a34611d51565b73ffffffffffffffffffffffffffffffffffffffff161480610a635750610a6281610a5d611d51565b6119e8565b5b610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9990614224565b60405180910390fd5b610aad838383611d59565b505050565b610aba611d51565b73ffffffffffffffffffffffffffffffffffffffff16610ad86114a1565b73ffffffffffffffffffffffffffffffffffffffff1614610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2590614284565b60405180910390fd5b80600e8190555050565b60008054905090565b600f60009054906101000a900460ff1681565b610b5f838383611e0b565b505050565b610b6c611d51565b73ffffffffffffffffffffffffffffffffffffffff16610b8a6114a1565b73ffffffffffffffffffffffffffffffffffffffff1614610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790614284565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b600080610c0984611d44565b610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f90614204565b60405180910390fd5b30610c5e610c578560056123c4565b60646123da565b915091509250929050565b6000610c74836111ec565b8210610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac90614124565b60405180910390fd5b6000610cbf610b38565b905060008060005b83811015610e25576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610db957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e115786841415610e02578195505050505050610e61565b8380610e0d90614809565b9450505b508080610e1d90614809565b915050610cc7565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890614364565b60405180910390fd5b92915050565b610e6f611d51565b73ffffffffffffffffffffffffffffffffffffffff16610e8d6114a1565b73ffffffffffffffffffffffffffffffffffffffff1614610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda90614284565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f2e573d6000803e3d6000fd5b5050565b610f4d8383836040518060200160405280600081525061185a565b505050565b610f5a611d51565b73ffffffffffffffffffffffffffffffffffffffff16610f786114a1565b73ffffffffffffffffffffffffffffffffffffffff1614610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc590614284565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110099190614057565b60206040518083038186803b15801561102157600080fd5b505afa158015611035573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110599190613588565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016110969291906140be565b602060405180830381600087803b1580156110b057600080fd5b505af11580156110c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e89190613451565b505050565b60006110f7610b38565b8210611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f90614184565b60405180910390fd5b819050919050565b611148611d51565b73ffffffffffffffffffffffffffffffffffffffff166111666114a1565b73ffffffffffffffffffffffffffffffffffffffff16146111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390614284565b60405180910390fd5b80600b90805190602001906111d2929190613017565b5050565b60006111e1826123f0565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490614244565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6060600b80546112e4906147d7565b80601f0160208091040260200160405190810160405280929190818152602001828054611310906147d7565b801561135d5780601f106113325761010080835404028352916020019161135d565b820191906000526020600020905b81548152906001019060200180831161134057829003601f168201915b5050505050905090565b61136f611d51565b73ffffffffffffffffffffffffffffffffffffffff1661138d6114a1565b73ffffffffffffffffffffffffffffffffffffffff16146113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90614284565b60405180910390fd5b6113ed60006125f3565b565b80600d54816113fc610b38565b611406919061456e565b1115611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143e906141a4565b60405180910390fd5b73d8ebf4406515b58384d68d055877773219d95b4a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461149357600080fd5b61149d33836126b9565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546114da906147d7565b80601f0160208091040260200160405190810160405280929190818152602001828054611506906147d7565b80156115535780601f1061152857610100808354040283529160200191611553565b820191906000526020600020905b81548152906001019060200180831161153657829003601f168201915b5050505050905090565b600e5481565b600260095414156115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a090614384565b60405180910390fd5b6002600981905550600f60009054906101000a900460ff16611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f7906143c4565b60405180910390fd5b80600e5481111561161057600080fd5b80600e5461161e9190614683565b600e8190555081600d5481611631610b38565b61163b919061456e565b111561167c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611673906141a4565b60405180910390fd5b8260038111156116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b8906141e4565b60405180910390fd5b6116cb33856126b9565b505050600160098190555050565b6116e1611d51565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561174f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611746906142a4565b60405180910390fd5b806006600061175c611d51565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611809611d51565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161184e91906140e7565b60405180910390a35050565b611865848484611e0b565b611871848484846126d7565b6118b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a790614304565b60405180910390fd5b50505050565b600381565b60606118c682611d44565b611905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fc90614204565b60405180910390fd5b600b61191c600184611917919061456e565b61286e565b60405160200161192d929190614028565b6040516020818303038152906040529050919050565b600d5481565b60075481565b611957611d51565b73ffffffffffffffffffffffffffffffffffffffff166119756114a1565b73ffffffffffffffffffffffffffffffffffffffff16146119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290614284565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60149054906101000a900460ff168015611adf57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611a779190614057565b60206040518083038186803b158015611a8f57600080fd5b505afa158015611aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac791906134f5565b73ffffffffffffffffffffffffffffffffffffffff16145b15611aee576001915050611afc565b611af88484612a1b565b9150505b92915050565b611b0a611d51565b73ffffffffffffffffffffffffffffffffffffffff16611b286114a1565b73ffffffffffffffffffffffffffffffffffffffff1614611b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7590614284565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be590614144565b60405180910390fd5b611bf7816125f3565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cc557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d2d57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d3d5750611d3c82612aaf565b5b9050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611e16826123f0565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611e3d611d51565b73ffffffffffffffffffffffffffffffffffffffff161480611e995750611e62611d51565b73ffffffffffffffffffffffffffffffffffffffff16611e8184610914565b73ffffffffffffffffffffffffffffffffffffffff16145b80611eb55750611eb48260000151611eaf611d51565b6119e8565b5b905080611ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eee906142c4565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6090614264565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd0906141c4565b60405180910390fd5b611fe68585856001612b19565b611ff66000848460000151611d59565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612064919061464f565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166121089190614528565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461220e919061456e565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156123545761228481611d44565b15612353576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123bc8686866001612b1f565b505050505050565b600081836123d291906145f5565b905092915050565b600081836123e891906145c4565b905092915050565b6123f861309d565b61240182611d44565b612440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243790614164565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106124a45760017f0000000000000000000000000000000000000000000000000000000000000000846124979190614683565b6124a1919061456e565b90505b60008390505b8181106125b2576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461259e578093505050506125ee565b5080806125aa906147ad565b9150506124aa565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e5906143a4565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126d3828260405180602001604052806000815250612b25565b5050565b60006126f88473ffffffffffffffffffffffffffffffffffffffff16613004565b15612861578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612721611d51565b8786866040518563ffffffff1660e01b81526004016127439493929190614072565b602060405180830381600087803b15801561275d57600080fd5b505af192505050801561278e57506040513d601f19601f8201168201806040525081019061278b91906134a3565b60015b612811573d80600081146127be576040519150601f19603f3d011682016040523d82523d6000602084013e6127c3565b606091505b50600081511415612809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280090614304565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612866565b600190505b949350505050565b606060008214156128b6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a16565b600082905060005b600082146128e85780806128d190614809565b915050600a826128e191906145c4565b91506128be565b60008167ffffffffffffffff81111561292a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561295c5781602001600182028036833780820191505090505b5090505b60008514612a0f576001826129759190614683565b9150600a856129849190614852565b6030612990919061456e565b60f81b8183815181106129cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a0891906145c4565b9450612960565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9290614344565b60405180910390fd5b612ba481611d44565b15612be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdb90614324565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3e90614404565b60405180910390fd5b612c546000858386612b19565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612d519190614528565b6fffffffffffffffffffffffffffffffff168152602001858360200151612d789190614528565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612fe757818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f8760008884886126d7565b612fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fbd90614304565b60405180910390fd5b8180612fd190614809565b9250508080612fdf90614809565b915050612f16565b5080600081905550612ffc6000878588612b1f565b505050505050565b600080823b905060008111915050919050565b828054613023906147d7565b90600052602060002090601f016020900481019282613045576000855561308c565b82601f1061305e57805160ff191683800117855561308c565b8280016001018555821561308c579182015b8281111561308b578251825591602001919060010190613070565b5b50905061309991906130d7565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156130f05760008160009055506001016130d8565b5090565b600061310761310284614470565b61443f565b90508281526020810184848401111561311f57600080fd5b61312a84828561476b565b509392505050565b6000613145613140846144a0565b61443f565b90508281526020810184848401111561315d57600080fd5b61316884828561476b565b509392505050565b60008135905061317f81614950565b92915050565b60008135905061319481614967565b92915050565b6000815190506131a981614967565b92915050565b6000813590506131be8161497e565b92915050565b6000815190506131d38161497e565b92915050565b600082601f8301126131ea57600080fd5b81356131fa8482602086016130f4565b91505092915050565b60008135905061321281614995565b92915050565b600081519050613227816149ac565b92915050565b600082601f83011261323e57600080fd5b813561324e848260208601613132565b91505092915050565b600081359050613266816149c3565b92915050565b60008151905061327b816149c3565b92915050565b60006020828403121561329357600080fd5b60006132a184828501613170565b91505092915050565b600080604083850312156132bd57600080fd5b60006132cb85828601613170565b92505060206132dc85828601613170565b9150509250929050565b6000806000606084860312156132fb57600080fd5b600061330986828701613170565b935050602061331a86828701613170565b925050604061332b86828701613257565b9150509250925092565b6000806000806080858703121561334b57600080fd5b600061335987828801613170565b945050602061336a87828801613170565b935050604061337b87828801613257565b925050606085013567ffffffffffffffff81111561339857600080fd5b6133a4878288016131d9565b91505092959194509250565b600080604083850312156133c357600080fd5b60006133d185828601613170565b92505060206133e285828601613185565b9150509250929050565b600080604083850312156133ff57600080fd5b600061340d85828601613170565b925050602061341e85828601613257565b9150509250929050565b60006020828403121561343a57600080fd5b600061344884828501613185565b91505092915050565b60006020828403121561346357600080fd5b60006134718482850161319a565b91505092915050565b60006020828403121561348c57600080fd5b600061349a848285016131af565b91505092915050565b6000602082840312156134b557600080fd5b60006134c3848285016131c4565b91505092915050565b6000602082840312156134de57600080fd5b60006134ec84828501613203565b91505092915050565b60006020828403121561350757600080fd5b600061351584828501613218565b91505092915050565b60006020828403121561353057600080fd5b600082013567ffffffffffffffff81111561354a57600080fd5b6135568482850161322d565b91505092915050565b60006020828403121561357157600080fd5b600061357f84828501613257565b91505092915050565b60006020828403121561359a57600080fd5b60006135a88482850161326c565b91505092915050565b600080604083850312156135c457600080fd5b60006135d285828601613257565b92505060206135e385828601613257565b9150509250929050565b6135f6816146b7565b82525050565b613605816146c9565b82525050565b6000613616826144e5565b61362081856144fb565b935061363081856020860161477a565b6136398161493f565b840191505092915050565b600061364f826144f0565b613659818561450c565b935061366981856020860161477a565b6136728161493f565b840191505092915050565b6000613688826144f0565b613692818561451d565b93506136a281856020860161477a565b80840191505092915050565b600081546136bb816147d7565b6136c5818661451d565b945060018216600081146136e057600181146136f157613724565b60ff19831686528186019350613724565b6136fa856144d0565b60005b8381101561371c578154818901526001820191506020810190506136fd565b838801955050505b50505092915050565b600061373a60228361450c565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137a060268361450c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613806602a8361450c565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b600061386c60238361450c565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138d260228361450c565b91507f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008301527f6e740000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061393860258361450c565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061399e60228361450c565b91507f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008301527f65640000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a0460118361450c565b91507f4e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006000830152602082019050919050565b6000613a4460398361450c565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000613aaa602b8361450c565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000613b1060268361450c565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b7660208361450c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613bb6601a8361450c565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b6000613bf660328361450c565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b6000613c5c60228361450c565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cc260338361450c565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b6000613d28601d8361450c565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b6000613d6860218361450c565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613dce602e8361450c565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b6000613e34601f8361450c565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000613e74602f8361450c565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613eda60178361450c565b91507f5075626c69632073616c65206973206e6f74206f70656e0000000000000000006000830152602082019050919050565b6000613f1a602d8361450c565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000613f8060228361450c565b91507f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008301527f67680000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fe660018361451d565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b61402281614761565b82525050565b600061403482856136ae565b915061403f82613fd9565b915061404b828461367d565b91508190509392505050565b600060208201905061406c60008301846135ed565b92915050565b600060808201905061408760008301876135ed565b61409460208301866135ed565b6140a16040830185614019565b81810360608301526140b3818461360b565b905095945050505050565b60006040820190506140d360008301856135ed565b6140e06020830184614019565b9392505050565b60006020820190506140fc60008301846135fc565b92915050565b6000602082019050818103600083015261411c8184613644565b905092915050565b6000602082019050818103600083015261413d8161372d565b9050919050565b6000602082019050818103600083015261415d81613793565b9050919050565b6000602082019050818103600083015261417d816137f9565b9050919050565b6000602082019050818103600083015261419d8161385f565b9050919050565b600060208201905081810360008301526141bd816138c5565b9050919050565b600060208201905081810360008301526141dd8161392b565b9050919050565b600060208201905081810360008301526141fd81613991565b9050919050565b6000602082019050818103600083015261421d816139f7565b9050919050565b6000602082019050818103600083015261423d81613a37565b9050919050565b6000602082019050818103600083015261425d81613a9d565b9050919050565b6000602082019050818103600083015261427d81613b03565b9050919050565b6000602082019050818103600083015261429d81613b69565b9050919050565b600060208201905081810360008301526142bd81613ba9565b9050919050565b600060208201905081810360008301526142dd81613be9565b9050919050565b600060208201905081810360008301526142fd81613c4f565b9050919050565b6000602082019050818103600083015261431d81613cb5565b9050919050565b6000602082019050818103600083015261433d81613d1b565b9050919050565b6000602082019050818103600083015261435d81613d5b565b9050919050565b6000602082019050818103600083015261437d81613dc1565b9050919050565b6000602082019050818103600083015261439d81613e27565b9050919050565b600060208201905081810360008301526143bd81613e67565b9050919050565b600060208201905081810360008301526143dd81613ecd565b9050919050565b600060208201905081810360008301526143fd81613f0d565b9050919050565b6000602082019050818103600083015261441d81613f73565b9050919050565b60006020820190506144396000830184614019565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561446657614465614910565b5b8060405250919050565b600067ffffffffffffffff82111561448b5761448a614910565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156144bb576144ba614910565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061453382614725565b915061453e83614725565b9250826fffffffffffffffffffffffffffffffff0382111561456357614562614883565b5b828201905092915050565b600061457982614761565b915061458483614761565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145b9576145b8614883565b5b828201905092915050565b60006145cf82614761565b91506145da83614761565b9250826145ea576145e96148b2565b5b828204905092915050565b600061460082614761565b915061460b83614761565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561464457614643614883565b5b828202905092915050565b600061465a82614725565b915061466583614725565b92508282101561467857614677614883565b5b828203905092915050565b600061468e82614761565b915061469983614761565b9250828210156146ac576146ab614883565b5b828203905092915050565b60006146c282614741565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061470c826146b7565b9050919050565b600061471e826146b7565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561479857808201518184015260208101905061477d565b838111156147a7576000848401525b50505050565b60006147b882614761565b915060008214156147cc576147cb614883565b5b600182039050919050565b600060028204905060018216806147ef57607f821691505b60208210811415614803576148026148e1565b5b50919050565b600061481482614761565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561484757614846614883565b5b600182019050919050565b600061485d82614761565b915061486883614761565b925082614878576148776148b2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614959816146b7565b811461496457600080fd5b50565b614970816146c9565b811461497b57600080fd5b50565b614987816146d5565b811461499257600080fd5b50565b61499e81614701565b81146149a957600080fd5b50565b6149b581614713565b81146149c057600080fd5b50565b6149cc81614761565b81146149d757600080fd5b5056fea264697066735822122004c4aed5c72b3b87441606eab598d11f8598b5326098de789dfd75ddb41d7b7564736f6c63430008000033697066733a2f2f516d5347714e6b68733464697941484544706f3632367550787832414142527a3574635943503432784c66735451

Deployed Bytecode

0x6080604052600436106101f95760003560e01c806370a082311161010d578063a22cb465116100a0578063d5abeb011161006f578063d5abeb0114610723578063d7224ba01461074e578063e43082f714610779578063e985e9c5146107a2578063f2fde38b146107df576101f9565b8063a22cb46514610669578063b88d4fde14610692578063c6a91b42146106bb578063c87b56dd146106e6576101f9565b80638da5cb5b116100dc5780638da5cb5b146105cc57806395d89b41146105f7578063982d669e14610622578063a0712d681461064d576101f9565b806370a0823114610524578063714c539814610561578063715018a61461058c5780638415c954146105a3576101f9565b806328cad13d1161019057806342842e0e1161015f57806342842e0e1461042f57806349df728c146104585780634f6ccce71461048157806355f804b3146104be5780636352211e146104e7576101f9565b806328cad13d146103745780632a55205a1461039d5780632f745c59146103db5780633ccfd60b14610418576101f9565b80630a00ae83116101cc5780630a00ae83146102cc57806318160ddd146102f55780631e84c4131461032057806323b872dd1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b506102256004803603810190610220919061347a565b610808565b60405161023291906140e7565b60405180910390f35b34801561024757600080fd5b50610250610882565b60405161025d9190614102565b60405180910390f35b34801561027257600080fd5b5061028d6004803603810190610288919061355f565b610914565b60405161029a9190614057565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906133ec565b610999565b005b3480156102d857600080fd5b506102f360048036038101906102ee919061355f565b610ab2565b005b34801561030157600080fd5b5061030a610b38565b6040516103179190614424565b60405180910390f35b34801561032c57600080fd5b50610335610b41565b60405161034291906140e7565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d91906132e6565b610b54565b005b34801561038057600080fd5b5061039b60048036038101906103969190613428565b610b64565b005b3480156103a957600080fd5b506103c460048036038101906103bf91906135b1565b610bfd565b6040516103d29291906140be565b60405180910390f35b3480156103e757600080fd5b5061040260048036038101906103fd91906133ec565b610c69565b60405161040f9190614424565b60405180910390f35b34801561042457600080fd5b5061042d610e67565b005b34801561043b57600080fd5b50610456600480360381019061045191906132e6565b610f32565b005b34801561046457600080fd5b5061047f600480360381019061047a91906134cc565b610f52565b005b34801561048d57600080fd5b506104a860048036038101906104a3919061355f565b6110ed565b6040516104b59190614424565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e0919061351e565b611140565b005b3480156104f357600080fd5b5061050e6004803603810190610509919061355f565b6111d6565b60405161051b9190614057565b60405180910390f35b34801561053057600080fd5b5061054b60048036038101906105469190613281565b6111ec565b6040516105589190614424565b60405180910390f35b34801561056d57600080fd5b506105766112d5565b6040516105839190614102565b60405180910390f35b34801561059857600080fd5b506105a1611367565b005b3480156105af57600080fd5b506105ca60048036038101906105c5919061355f565b6113ef565b005b3480156105d857600080fd5b506105e16114a1565b6040516105ee9190614057565b60405180910390f35b34801561060357600080fd5b5061060c6114cb565b6040516106199190614102565b60405180910390f35b34801561062e57600080fd5b5061063761155d565b6040516106449190614424565b60405180910390f35b6106676004803603810190610662919061355f565b611563565b005b34801561067557600080fd5b50610690600480360381019061068b91906133b0565b6116d9565b005b34801561069e57600080fd5b506106b960048036038101906106b49190613335565b61185a565b005b3480156106c757600080fd5b506106d06118b6565b6040516106dd9190614424565b60405180910390f35b3480156106f257600080fd5b5061070d6004803603810190610708919061355f565b6118bb565b60405161071a9190614102565b60405180910390f35b34801561072f57600080fd5b50610738611943565b6040516107459190614424565b60405180910390f35b34801561075a57600080fd5b50610763611949565b6040516107709190614424565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b9190613428565b61194f565b005b3480156107ae57600080fd5b506107c960048036038101906107c491906132aa565b6119e8565b6040516107d691906140e7565b60405180910390f35b3480156107eb57600080fd5b5061080660048036038101906108019190613281565b611b02565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061087b575061087a82611bfa565b5b9050919050565b606060018054610891906147d7565b80601f01602080910402602001604051908101604052809291908181526020018280546108bd906147d7565b801561090a5780601f106108df5761010080835404028352916020019161090a565b820191906000526020600020905b8154815290600101906020018083116108ed57829003601f168201915b5050505050905090565b600061091f82611d44565b61095e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610955906143e4565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109a4826111d6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0c906142e4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a34611d51565b73ffffffffffffffffffffffffffffffffffffffff161480610a635750610a6281610a5d611d51565b6119e8565b5b610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9990614224565b60405180910390fd5b610aad838383611d59565b505050565b610aba611d51565b73ffffffffffffffffffffffffffffffffffffffff16610ad86114a1565b73ffffffffffffffffffffffffffffffffffffffff1614610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2590614284565b60405180910390fd5b80600e8190555050565b60008054905090565b600f60009054906101000a900460ff1681565b610b5f838383611e0b565b505050565b610b6c611d51565b73ffffffffffffffffffffffffffffffffffffffff16610b8a6114a1565b73ffffffffffffffffffffffffffffffffffffffff1614610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790614284565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b600080610c0984611d44565b610c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3f90614204565b60405180910390fd5b30610c5e610c578560056123c4565b60646123da565b915091509250929050565b6000610c74836111ec565b8210610cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cac90614124565b60405180910390fd5b6000610cbf610b38565b905060008060005b83811015610e25576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610db957806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e115786841415610e02578195505050505050610e61565b8380610e0d90614809565b9450505b508080610e1d90614809565b915050610cc7565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890614364565b60405180910390fd5b92915050565b610e6f611d51565b73ffffffffffffffffffffffffffffffffffffffff16610e8d6114a1565b73ffffffffffffffffffffffffffffffffffffffff1614610ee3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eda90614284565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f2e573d6000803e3d6000fd5b5050565b610f4d8383836040518060200160405280600081525061185a565b505050565b610f5a611d51565b73ffffffffffffffffffffffffffffffffffffffff16610f786114a1565b73ffffffffffffffffffffffffffffffffffffffff1614610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc590614284565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110099190614057565b60206040518083038186803b15801561102157600080fd5b505afa158015611035573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110599190613588565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016110969291906140be565b602060405180830381600087803b1580156110b057600080fd5b505af11580156110c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e89190613451565b505050565b60006110f7610b38565b8210611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f90614184565b60405180910390fd5b819050919050565b611148611d51565b73ffffffffffffffffffffffffffffffffffffffff166111666114a1565b73ffffffffffffffffffffffffffffffffffffffff16146111bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b390614284565b60405180910390fd5b80600b90805190602001906111d2929190613017565b5050565b60006111e1826123f0565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561125d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125490614244565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6060600b80546112e4906147d7565b80601f0160208091040260200160405190810160405280929190818152602001828054611310906147d7565b801561135d5780601f106113325761010080835404028352916020019161135d565b820191906000526020600020905b81548152906001019060200180831161134057829003601f168201915b5050505050905090565b61136f611d51565b73ffffffffffffffffffffffffffffffffffffffff1661138d6114a1565b73ffffffffffffffffffffffffffffffffffffffff16146113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90614284565b60405180910390fd5b6113ed60006125f3565b565b80600d54816113fc610b38565b611406919061456e565b1115611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143e906141a4565b60405180910390fd5b73d8ebf4406515b58384d68d055877773219d95b4a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461149357600080fd5b61149d33836126b9565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546114da906147d7565b80601f0160208091040260200160405190810160405280929190818152602001828054611506906147d7565b80156115535780601f1061152857610100808354040283529160200191611553565b820191906000526020600020905b81548152906001019060200180831161153657829003601f168201915b5050505050905090565b600e5481565b600260095414156115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a090614384565b60405180910390fd5b6002600981905550600f60009054906101000a900460ff16611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f7906143c4565b60405180910390fd5b80600e5481111561161057600080fd5b80600e5461161e9190614683565b600e8190555081600d5481611631610b38565b61163b919061456e565b111561167c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611673906141a4565b60405180910390fd5b8260038111156116c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b8906141e4565b60405180910390fd5b6116cb33856126b9565b505050600160098190555050565b6116e1611d51565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561174f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611746906142a4565b60405180910390fd5b806006600061175c611d51565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611809611d51565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161184e91906140e7565b60405180910390a35050565b611865848484611e0b565b611871848484846126d7565b6118b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a790614304565b60405180910390fd5b50505050565b600381565b60606118c682611d44565b611905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fc90614204565b60405180910390fd5b600b61191c600184611917919061456e565b61286e565b60405160200161192d929190614028565b6040516020818303038152906040529050919050565b600d5481565b60075481565b611957611d51565b73ffffffffffffffffffffffffffffffffffffffff166119756114a1565b73ffffffffffffffffffffffffffffffffffffffff16146119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c290614284565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60149054906101000a900460ff168015611adf57508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611a779190614057565b60206040518083038186803b158015611a8f57600080fd5b505afa158015611aa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac791906134f5565b73ffffffffffffffffffffffffffffffffffffffff16145b15611aee576001915050611afc565b611af88484612a1b565b9150505b92915050565b611b0a611d51565b73ffffffffffffffffffffffffffffffffffffffff16611b286114a1565b73ffffffffffffffffffffffffffffffffffffffff1614611b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7590614284565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be590614144565b60405180910390fd5b611bf7816125f3565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cc557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d2d57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d3d5750611d3c82612aaf565b5b9050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611e16826123f0565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611e3d611d51565b73ffffffffffffffffffffffffffffffffffffffff161480611e995750611e62611d51565b73ffffffffffffffffffffffffffffffffffffffff16611e8184610914565b73ffffffffffffffffffffffffffffffffffffffff16145b80611eb55750611eb48260000151611eaf611d51565b6119e8565b5b905080611ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eee906142c4565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6090614264565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd0906141c4565b60405180910390fd5b611fe68585856001612b19565b611ff66000848460000151611d59565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612064919061464f565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166121089190614528565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461220e919061456e565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156123545761228481611d44565b15612353576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123bc8686866001612b1f565b505050505050565b600081836123d291906145f5565b905092915050565b600081836123e891906145c4565b905092915050565b6123f861309d565b61240182611d44565b612440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243790614164565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000003e983106124a45760017f00000000000000000000000000000000000000000000000000000000000003e9846124979190614683565b6124a1919061456e565b90505b60008390505b8181106125b2576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461259e578093505050506125ee565b5080806125aa906147ad565b9150506124aa565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e5906143a4565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126d3828260405180602001604052806000815250612b25565b5050565b60006126f88473ffffffffffffffffffffffffffffffffffffffff16613004565b15612861578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612721611d51565b8786866040518563ffffffff1660e01b81526004016127439493929190614072565b602060405180830381600087803b15801561275d57600080fd5b505af192505050801561278e57506040513d601f19601f8201168201806040525081019061278b91906134a3565b60015b612811573d80600081146127be576040519150601f19603f3d011682016040523d82523d6000602084013e6127c3565b606091505b50600081511415612809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280090614304565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612866565b600190505b949350505050565b606060008214156128b6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a16565b600082905060005b600082146128e85780806128d190614809565b915050600a826128e191906145c4565b91506128be565b60008167ffffffffffffffff81111561292a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561295c5781602001600182028036833780820191505090505b5090505b60008514612a0f576001826129759190614683565b9150600a856129849190614852565b6030612990919061456e565b60f81b8183815181106129cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a0891906145c4565b9450612960565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9290614344565b60405180910390fd5b612ba481611d44565b15612be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdb90614324565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000003e9831115612c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3e90614404565b60405180910390fd5b612c546000858386612b19565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612d519190614528565b6fffffffffffffffffffffffffffffffff168152602001858360200151612d789190614528565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612fe757818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f8760008884886126d7565b612fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fbd90614304565b60405180910390fd5b8180612fd190614809565b9250508080612fdf90614809565b915050612f16565b5080600081905550612ffc6000878588612b1f565b505050505050565b600080823b905060008111915050919050565b828054613023906147d7565b90600052602060002090601f016020900481019282613045576000855561308c565b82601f1061305e57805160ff191683800117855561308c565b8280016001018555821561308c579182015b8281111561308b578251825591602001919060010190613070565b5b50905061309991906130d7565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156130f05760008160009055506001016130d8565b5090565b600061310761310284614470565b61443f565b90508281526020810184848401111561311f57600080fd5b61312a84828561476b565b509392505050565b6000613145613140846144a0565b61443f565b90508281526020810184848401111561315d57600080fd5b61316884828561476b565b509392505050565b60008135905061317f81614950565b92915050565b60008135905061319481614967565b92915050565b6000815190506131a981614967565b92915050565b6000813590506131be8161497e565b92915050565b6000815190506131d38161497e565b92915050565b600082601f8301126131ea57600080fd5b81356131fa8482602086016130f4565b91505092915050565b60008135905061321281614995565b92915050565b600081519050613227816149ac565b92915050565b600082601f83011261323e57600080fd5b813561324e848260208601613132565b91505092915050565b600081359050613266816149c3565b92915050565b60008151905061327b816149c3565b92915050565b60006020828403121561329357600080fd5b60006132a184828501613170565b91505092915050565b600080604083850312156132bd57600080fd5b60006132cb85828601613170565b92505060206132dc85828601613170565b9150509250929050565b6000806000606084860312156132fb57600080fd5b600061330986828701613170565b935050602061331a86828701613170565b925050604061332b86828701613257565b9150509250925092565b6000806000806080858703121561334b57600080fd5b600061335987828801613170565b945050602061336a87828801613170565b935050604061337b87828801613257565b925050606085013567ffffffffffffffff81111561339857600080fd5b6133a4878288016131d9565b91505092959194509250565b600080604083850312156133c357600080fd5b60006133d185828601613170565b92505060206133e285828601613185565b9150509250929050565b600080604083850312156133ff57600080fd5b600061340d85828601613170565b925050602061341e85828601613257565b9150509250929050565b60006020828403121561343a57600080fd5b600061344884828501613185565b91505092915050565b60006020828403121561346357600080fd5b60006134718482850161319a565b91505092915050565b60006020828403121561348c57600080fd5b600061349a848285016131af565b91505092915050565b6000602082840312156134b557600080fd5b60006134c3848285016131c4565b91505092915050565b6000602082840312156134de57600080fd5b60006134ec84828501613203565b91505092915050565b60006020828403121561350757600080fd5b600061351584828501613218565b91505092915050565b60006020828403121561353057600080fd5b600082013567ffffffffffffffff81111561354a57600080fd5b6135568482850161322d565b91505092915050565b60006020828403121561357157600080fd5b600061357f84828501613257565b91505092915050565b60006020828403121561359a57600080fd5b60006135a88482850161326c565b91505092915050565b600080604083850312156135c457600080fd5b60006135d285828601613257565b92505060206135e385828601613257565b9150509250929050565b6135f6816146b7565b82525050565b613605816146c9565b82525050565b6000613616826144e5565b61362081856144fb565b935061363081856020860161477a565b6136398161493f565b840191505092915050565b600061364f826144f0565b613659818561450c565b935061366981856020860161477a565b6136728161493f565b840191505092915050565b6000613688826144f0565b613692818561451d565b93506136a281856020860161477a565b80840191505092915050565b600081546136bb816147d7565b6136c5818661451d565b945060018216600081146136e057600181146136f157613724565b60ff19831686528186019350613724565b6136fa856144d0565b60005b8381101561371c578154818901526001820191506020810190506136fd565b838801955050505b50505092915050565b600061373a60228361450c565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006137a060268361450c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613806602a8361450c565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b600061386c60238361450c565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138d260228361450c565b91507f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008301527f6e740000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061393860258361450c565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061399e60228361450c565b91507f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008301527f65640000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a0460118361450c565b91507f4e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006000830152602082019050919050565b6000613a4460398361450c565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000613aaa602b8361450c565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000613b1060268361450c565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b7660208361450c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613bb6601a8361450c565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b6000613bf660328361450c565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b6000613c5c60228361450c565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cc260338361450c565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b6000613d28601d8361450c565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b6000613d6860218361450c565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613dce602e8361450c565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b6000613e34601f8361450c565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6000613e74602f8361450c565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613eda60178361450c565b91507f5075626c69632073616c65206973206e6f74206f70656e0000000000000000006000830152602082019050919050565b6000613f1a602d8361450c565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000613f8060228361450c565b91507f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008301527f67680000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fe660018361451d565b91507f2f000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b61402281614761565b82525050565b600061403482856136ae565b915061403f82613fd9565b915061404b828461367d565b91508190509392505050565b600060208201905061406c60008301846135ed565b92915050565b600060808201905061408760008301876135ed565b61409460208301866135ed565b6140a16040830185614019565b81810360608301526140b3818461360b565b905095945050505050565b60006040820190506140d360008301856135ed565b6140e06020830184614019565b9392505050565b60006020820190506140fc60008301846135fc565b92915050565b6000602082019050818103600083015261411c8184613644565b905092915050565b6000602082019050818103600083015261413d8161372d565b9050919050565b6000602082019050818103600083015261415d81613793565b9050919050565b6000602082019050818103600083015261417d816137f9565b9050919050565b6000602082019050818103600083015261419d8161385f565b9050919050565b600060208201905081810360008301526141bd816138c5565b9050919050565b600060208201905081810360008301526141dd8161392b565b9050919050565b600060208201905081810360008301526141fd81613991565b9050919050565b6000602082019050818103600083015261421d816139f7565b9050919050565b6000602082019050818103600083015261423d81613a37565b9050919050565b6000602082019050818103600083015261425d81613a9d565b9050919050565b6000602082019050818103600083015261427d81613b03565b9050919050565b6000602082019050818103600083015261429d81613b69565b9050919050565b600060208201905081810360008301526142bd81613ba9565b9050919050565b600060208201905081810360008301526142dd81613be9565b9050919050565b600060208201905081810360008301526142fd81613c4f565b9050919050565b6000602082019050818103600083015261431d81613cb5565b9050919050565b6000602082019050818103600083015261433d81613d1b565b9050919050565b6000602082019050818103600083015261435d81613d5b565b9050919050565b6000602082019050818103600083015261437d81613dc1565b9050919050565b6000602082019050818103600083015261439d81613e27565b9050919050565b600060208201905081810360008301526143bd81613e67565b9050919050565b600060208201905081810360008301526143dd81613ecd565b9050919050565b600060208201905081810360008301526143fd81613f0d565b9050919050565b6000602082019050818103600083015261441d81613f73565b9050919050565b60006020820190506144396000830184614019565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561446657614465614910565b5b8060405250919050565b600067ffffffffffffffff82111561448b5761448a614910565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156144bb576144ba614910565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061453382614725565b915061453e83614725565b9250826fffffffffffffffffffffffffffffffff0382111561456357614562614883565b5b828201905092915050565b600061457982614761565b915061458483614761565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145b9576145b8614883565b5b828201905092915050565b60006145cf82614761565b91506145da83614761565b9250826145ea576145e96148b2565b5b828204905092915050565b600061460082614761565b915061460b83614761565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561464457614643614883565b5b828202905092915050565b600061465a82614725565b915061466583614725565b92508282101561467857614677614883565b5b828203905092915050565b600061468e82614761565b915061469983614761565b9250828210156146ac576146ab614883565b5b828203905092915050565b60006146c282614741565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061470c826146b7565b9050919050565b600061471e826146b7565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561479857808201518184015260208101905061477d565b838111156147a7576000848401525b50505050565b60006147b882614761565b915060008214156147cc576147cb614883565b5b600182039050919050565b600060028204905060018216806147ef57607f821691505b60208210811415614803576148026148e1565b5b50919050565b600061481482614761565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561484757614846614883565b5b600182019050919050565b600061485d82614761565b915061486883614761565b925082614878576148776148b2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614959816146b7565b811461496457600080fd5b50565b614970816146c9565b811461497b57600080fd5b50565b614987816146d5565b811461499257600080fd5b50565b61499e81614701565b81146149a957600080fd5b50565b6149b581614713565b81146149c057600080fd5b50565b6149cc81614761565b81146149d757600080fd5b5056fea264697066735822122004c4aed5c72b3b87441606eab598d11f8598b5326098de789dfd75ddb41d7b7564736f6c63430008000033

Deployed Bytecode Sourcemap

57750:5673:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61632:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45599:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47294:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46815:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60929:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41994:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58333:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48321:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60763:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63102:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;42702:864;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61053:143;;;;;;;;;;;;;:::i;:::-;;48554:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61204:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42171:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60365:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45408:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44124:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60201:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19180:103;;;;;;;;;;;;;:::i;:::-;;59775:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18529:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45768:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58290:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59452:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47658:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48802:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58189:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62749:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58240:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53683:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60589:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62061:617;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19438:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61632:292;61780:4;61837:26;61822:41;;;:11;:41;;;;:94;;;;61880:36;61904:11;61880:23;:36::i;:::-;61822:94;61802:114;;61632:292;;;:::o;45599:100::-;45653:13;45686:5;45679:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45599:100;:::o;47294:292::-;47398:7;47445:16;47453:7;47445;:16::i;:::-;47423:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;47554:15;:24;47570:7;47554:24;;;;;;;;;;;;;;;;;;;;;47547:31;;47294:292;;;:::o;46815:413::-;46888:13;46904:24;46920:7;46904:15;:24::i;:::-;46888:40;;46953:5;46947:11;;:2;:11;;;;46939:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47048:5;47032:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;47057:37;47074:5;47081:12;:10;:12::i;:::-;47057:16;:37::i;:::-;47032:62;47010:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;47192:28;47201:2;47205:7;47214:5;47192:8;:28::i;:::-;46815:413;;;:::o;60929:116::-;18760:12;:10;:12::i;:::-;18749:23;;:7;:5;:7::i;:::-;:23;;;18741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61024:13:::1;61007:14;:30;;;;60929:116:::0;:::o;41994:100::-;42047:7;42074:12;;42067:19;;41994:100;:::o;58333:38::-;;;;;;;;;;;;;:::o;48321:162::-;48447:28;48457:4;48463:2;48467:7;48447:9;:28::i;:::-;48321:162;;;:::o;60763:158::-;18760:12;:10;:12::i;:::-;18749:23;;:7;:5;:7::i;:::-;:23;;;18741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60894:19:::1;60873:18;;:40;;;;;;;;;;;;;;;;;;60763:158:::0;:::o;63102:318::-;63227:16;63245:21;63292:16;63300:7;63292;:16::i;:::-;63284:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;63359:4;63366:45;63379:26;63392:9;63403:1;63379:12;:26::i;:::-;63407:3;63366:12;:45::i;:::-;63343:69;;;;63102:318;;;;;:::o;42702:864::-;42827:7;42868:16;42878:5;42868:9;:16::i;:::-;42860:5;:24;42852:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;42934:22;42959:13;:11;:13::i;:::-;42934:38;;42983:19;43017:25;43071:9;43066:426;43090:14;43086:1;:18;43066:426;;;43126:31;43160:11;:14;43172:1;43160:14;;;;;;;;;;;43126:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43219:1;43193:28;;:9;:14;;;:28;;;43189:103;;43262:9;:14;;;43242:34;;43189:103;43331:5;43310:26;;:17;:26;;;43306:175;;;43376:5;43361:11;:20;43357:77;;;43413:1;43406:8;;;;;;;;;43357:77;43452:13;;;;;:::i;:::-;;;;43306:175;43066:426;43106:3;;;;;:::i;:::-;;;;43066:426;;;;43502:56;;;;;;;;;;:::i;:::-;;;;;;;;42702:864;;;;;:::o;61053:143::-;18760:12;:10;:12::i;:::-;18749:23;;:7;:5;:7::i;:::-;:23;;;18741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61101:15:::1;61119:21;61101:39;;61159:10;61151:28;;:37;61180:7;61151:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;18820:1;61053:143::o:0;48554:177::-;48684:39;48701:4;48707:2;48711:7;48684:39;;;;;;;;;;;;:16;:39::i;:::-;48554:177;;;:::o;61204:168::-;18760:12;:10;:12::i;:::-;18749:23;;:7;:5;:7::i;:::-;:23;;;18741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61270:15:::1;61288:5;:15;;;61312:4;61288:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61270:48;;61329:5;:14;;;61344:10;61356:7;61329:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18820:1;61204:168:::0;:::o;42171:228::-;42274:7;42315:13;:11;:13::i;:::-;42307:5;:21;42299:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;42386:5;42379:12;;42171:228;;;:::o;60365:100::-;18760:12;:10;:12::i;:::-;18749:23;;:7;:5;:7::i;:::-;:23;;;18741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60449:8:::1;60439:7;:18;;;;;;;;;;;;:::i;:::-;;60365:100:::0;:::o;45408:124::-;45472:7;45499:20;45511:7;45499:11;:20::i;:::-;:25;;;45492:32;;45408:124;;;:::o;44124:258::-;44188:7;44247:1;44230:19;;:5;:19;;;;44208:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;44346:12;:19;44359:5;44346:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;44338:36;;44331:43;;44124:258;;;:::o;60201:93::-;60246:13;60279:7;60272:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60201:93;:::o;19180:103::-;18760:12;:10;:12::i;:::-;18749:23;;:7;:5;:7::i;:::-;:23;;;18741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19245:30:::1;19272:1;19245:18;:30::i;:::-;19180:103::o:0;59775:235::-;59857:14;59088:9;;59070:14;59054:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;59032:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;59911:42:::1;59897:56;;:10;:56;;;59889:65;;;::::0;::::1;;59965:37;59975:10;59987:14;59965:9;:37::i;:::-;59775:235:::0;;:::o;18529:87::-;18575:7;18602:6;;;;;;;;;;;18595:13;;18529:87;:::o;45768:104::-;45824:13;45857:7;45850:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45768:104;:::o;58290:36::-;;;;:::o;59452:313::-;10336:1;10934:7;;:19;;10926:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10336:1;11067:7;:18;;;;58698::::1;;;;;;;;;;;58690:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;59602:14:::2;59279;;59261;:32;;59253:41;;;::::0;::::2;;59339:14;59322;;:31;;;;:::i;:::-;59305:14;:48;;;;59639:14:::3;59088:9;;59070:14;59054:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;59032:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;59678:14:::4;58232:1;58852:14;:34;;58830:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;59720:37:::5;59730:10;59742:14;59720:9;:37::i;:::-;59170:1:::4;59364::::3;58755::::2;10292::::0;11246:7;:22;;;;59452:313;:::o;47658:311::-;47788:12;:10;:12::i;:::-;47776:24;;:8;:24;;;;47768:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;47889:8;47844:18;:32;47863:12;:10;:12::i;:::-;47844:32;;;;;;;;;;;;;;;:42;47877:8;47844:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;47942:8;47913:48;;47928:12;:10;:12::i;:::-;47913:48;;;47952:8;47913:48;;;;;;:::i;:::-;;;;;;;;47658:311;;:::o;48802:355::-;48961:28;48971:4;48977:2;48981:7;48961:9;:28::i;:::-;49022:48;49045:4;49051:2;49055:7;49064:5;49022:22;:48::i;:::-;49000:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;48802:355;;;;:::o;58189:44::-;58232:1;58189:44;:::o;62749:287::-;62867:13;62906:16;62914:7;62906;:16::i;:::-;62898:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;62988:7;63002:24;63013:1;63003:7;:11;;;;:::i;:::-;63002:22;:24::i;:::-;62971:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62957:71;;62749:287;;;:::o;58240:31::-;;;;:::o;53683:43::-;;;;:::o;60589:166::-;18760:12;:10;:12::i;:::-;18749:23;;:7;:5;:7::i;:::-;:23;;;18741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60726:21:::1;60703:20;;:44;;;;;;;;;;;;;;;;;;60589:166:::0;:::o;62061:617::-;62186:4;62351:27;62409;;;;;;;;;;;62351:96;;62476:20;;;;;;;;;;;:86;;;;;62554:8;62513:49;;62521:13;:21;;;62543:5;62521:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62513:49;;;62476:86;62458:154;;;62596:4;62589:11;;;;;62458:154;62631:39;62654:5;62661:8;62631:22;:39::i;:::-;62624:46;;;62061:617;;;;;:::o;19438:238::-;18760:12;:10;:12::i;:::-;18749:23;;:7;:5;:7::i;:::-;:23;;;18741:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19561:1:::1;19541:22;;:8;:22;;;;19519:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;19640:28;19659:8;19640:18;:28::i;:::-;19438:238:::0;:::o;43638:422::-;43785:4;43842:25;43827:40;;;:11;:40;;;;:105;;;;43899:33;43884:48;;;:11;:48;;;;43827:105;:172;;;;43964:35;43949:50;;;:11;:50;;;;43827:172;:225;;;;44016:36;44040:11;44016:23;:36::i;:::-;43827:225;43807:245;;43638:422;;;:::o;49412:111::-;49469:4;49503:12;;49493:7;:22;49486:29;;49412:111;;;:::o;17232:98::-;17285:7;17312:10;17305:17;;17232:98;:::o;53479:196::-;53621:2;53594:15;:24;53610:7;53594:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;53659:7;53655:2;53639:28;;53648:5;53639:28;;;;;;;;;;;;53479:196;;;:::o;51652:1709::-;51767:35;51805:20;51817:7;51805:11;:20::i;:::-;51767:58;;51838:22;51880:13;:18;;;51864:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;51939:12;:10;:12::i;:::-;51915:36;;:20;51927:7;51915:11;:20::i;:::-;:36;;;51864:87;:154;;;;51968:50;51985:13;:18;;;52005:12;:10;:12::i;:::-;51968:16;:50::i;:::-;51864:154;51838:181;;52054:17;52032:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;52206:4;52184:26;;:13;:18;;;:26;;;52162:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;52309:1;52295:16;;:2;:16;;;;52287:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;52366:43;52388:4;52394:2;52398:7;52407:1;52366:21;:43::i;:::-;52474:49;52491:1;52495:7;52504:13;:18;;;52474:8;:49::i;:::-;52566:1;52536:12;:18;52549:4;52536:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52606:1;52578:12;:16;52591:2;52578:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52641:43;;;;;;;;52656:2;52641:43;;;;;;52667:15;52641:43;;;;;52618:11;:20;52630:7;52618:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52924:19;52956:1;52946:7;:11;;;;:::i;:::-;52924:33;;53013:1;52972:43;;:11;:24;52984:11;52972:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;52968:288;;;53036:20;53044:11;53036:7;:20::i;:::-;53032:213;;;53104:125;;;;;;;;53141:13;:18;;;53104:125;;;;;;53182:13;:28;;;53104:125;;;;;53077:11;:24;53089:11;53077:24;;;;;;;;;;;:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53032:213;52968:288;53292:7;53288:2;53273:27;;53282:4;53273:27;;;;;;;;;;;;53311:42;53332:4;53338:2;53342:7;53351:1;53311:20;:42::i;:::-;51652:1709;;;;;;:::o;3636:98::-;3694:7;3725:1;3721;:5;;;;:::i;:::-;3714:12;;3636:98;;;;:::o;4035:::-;4093:7;4124:1;4120;:5;;;;:::i;:::-;4113:12;;4035:98;;;;:::o;44664:682::-;44752:21;;:::i;:::-;44799:16;44807:7;44799;:16::i;:::-;44791:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;44875:26;44927:12;44916:7;:23;44912:103;;45002:1;44987:12;44977:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;44956:47;;44912:103;45032:12;45047:7;45032:22;;45027:242;45064:18;45056:4;:26;45027:242;;45107:31;45141:11;:17;45153:4;45141:17;;;;;;;;;;;45107:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45203:1;45177:28;;:9;:14;;;:28;;;45173:85;;45233:9;45226:16;;;;;;;45173:85;45027:242;45084:6;;;;;:::i;:::-;;;;45027:242;;;;45281:57;;;;;;;;;;:::i;:::-;;;;;;;;44664:682;;;;:::o;19836:191::-;19910:16;19929:6;;;;;;;;;;;19910:25;;19955:8;19946:6;;:17;;;;;;;;;;;;;;;;;;20010:8;19979:40;;20000:8;19979:40;;;;;;;;;;;;19836:191;;:::o;49531:104::-;49600:27;49610:2;49614:8;49600:27;;;;;;;;;;;;:9;:27::i;:::-;49531:104;;:::o;55354:985::-;55509:4;55530:15;:2;:13;;;:15::i;:::-;55526:806;;;55599:2;55583:36;;;55642:12;:10;:12::i;:::-;55677:4;55704:7;55734:5;55583:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55562:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55962:1;55945:6;:13;:18;55941:321;;;55988:109;;;;;;;;;;:::i;:::-;;;;;;;;55941:321;56212:6;56206:13;56197:6;56193:2;56189:15;56182:38;55562:715;55832:45;;;55822:55;;;:6;:55;;;;55815:62;;;;;55526:806;56316:4;56309:11;;55354:985;;;;;;;:::o;14764:723::-;14820:13;15050:1;15041:5;:10;15037:53;;;15068:10;;;;;;;;;;;;;;;;;;;;;15037:53;15100:12;15115:5;15100:20;;15131:14;15156:78;15171:1;15163:4;:9;15156:78;;15189:8;;;;;:::i;:::-;;;;15220:2;15212:10;;;;;:::i;:::-;;;15156:78;;;15244:19;15276:6;15266:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15244:39;;15294:154;15310:1;15301:5;:10;15294:154;;15338:1;15328:11;;;;;:::i;:::-;;;15405:2;15397:5;:10;;;;:::i;:::-;15384:2;:24;;;;:::i;:::-;15371:39;;15354:6;15361;15354:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;15434:2;15425:11;;;;;:::i;:::-;;;15294:154;;;15472:6;15458:21;;;;;14764:723;;;;:::o;48040:214::-;48182:4;48211:18;:25;48230:5;48211:25;;;;;;;;;;;;;;;:35;48237:8;48211:35;;;;;;;;;;;;;;;;;;;;;;;;;48204:42;;48040:214;;;;:::o;32415:207::-;32545:4;32589:25;32574:40;;;:11;:40;;;;32567:47;;32415:207;;;:::o;56827:159::-;;;;;:::o;57398:158::-;;;;;:::o;49998:1400::-;50121:20;50144:12;;50121:35;;50189:1;50175:16;;:2;:16;;;;50167:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50374:21;50382:12;50374:7;:21::i;:::-;50373:22;50365:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50460:12;50448:8;:24;;50440:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;50524:61;50554:1;50558:2;50562:12;50576:8;50524:21;:61::i;:::-;50598:30;50631:12;:16;50644:2;50631:16;;;;;;;;;;;;;;;50598:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50677:135;;;;;;;;50733:8;50703:11;:19;;;:39;;;;:::i;:::-;50677:135;;;;;;50792:8;50757:11;:24;;;:44;;;;:::i;:::-;50677:135;;;;;50658:12;:16;50671:2;50658:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50851:43;;;;;;;;50866:2;50851:43;;;;;;50877:15;50851:43;;;;;50823:11;:25;50835:12;50823:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50907:20;50930:12;50907:35;;50960:9;50955:325;50979:8;50975:1;:12;50955:325;;;51039:12;51035:2;51014:38;;51031:1;51014:38;;;;;;;;;;;;51093:59;51124:1;51128:2;51132:12;51146:5;51093:22;:59::i;:::-;51067:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;51254:14;;;;;:::i;:::-;;;;50989:3;;;;;:::i;:::-;;;;50955:325;;;;51307:12;51292;:27;;;;51330:60;51359:1;51363:2;51367:12;51381:8;51330:20;:60::i;:::-;49998:1400;;;;;;:::o;20852:387::-;20912:4;21120:12;21187:7;21175:20;21167:28;;21230:1;21223:4;:8;21216:15;;;20852:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1074:6;1068:13;1059:22;;1090:30;1114:5;1090:30;:::i;:::-;1049:77;;;;:::o;1132:137::-;;1215:6;1202:20;1193:29;;1231:32;1257:5;1231:32;:::i;:::-;1183:86;;;;:::o;1275:141::-;;1362:6;1356:13;1347:22;;1378:32;1404:5;1378:32;:::i;:::-;1337:79;;;;:::o;1435:271::-;;1539:3;1532:4;1524:6;1520:17;1516:27;1506:2;;1557:1;1554;1547:12;1506:2;1597:6;1584:20;1622:78;1696:3;1688:6;1681:4;1673:6;1669:17;1622:78;:::i;:::-;1613:87;;1496:210;;;;;:::o;1712:167::-;;1810:6;1797:20;1788:29;;1826:47;1867:5;1826:47;:::i;:::-;1778:101;;;;:::o;1885:201::-;;2002:6;1996:13;1987:22;;2018:62;2074:5;2018:62;:::i;:::-;1977:109;;;;:::o;2106:273::-;;2211:3;2204:4;2196:6;2192:17;2188:27;2178:2;;2229:1;2226;2219:12;2178:2;2269:6;2256:20;2294:79;2369:3;2361:6;2354:4;2346:6;2342:17;2294:79;:::i;:::-;2285:88;;2168:211;;;;;:::o;2385:139::-;;2469:6;2456:20;2447:29;;2485:33;2512:5;2485:33;:::i;:::-;2437:87;;;;:::o;2530:143::-;;2618:6;2612:13;2603:22;;2634:33;2661:5;2634:33;:::i;:::-;2593:80;;;;:::o;2679:262::-;;2787:2;2775:9;2766:7;2762:23;2758:32;2755:2;;;2803:1;2800;2793:12;2755:2;2846:1;2871:53;2916:7;2907:6;2896:9;2892:22;2871:53;:::i;:::-;2861:63;;2817:117;2745:196;;;;:::o;2947:407::-;;;3072:2;3060:9;3051:7;3047:23;3043:32;3040:2;;;3088:1;3085;3078:12;3040:2;3131:1;3156:53;3201:7;3192:6;3181:9;3177:22;3156:53;:::i;:::-;3146:63;;3102:117;3258:2;3284:53;3329:7;3320:6;3309:9;3305:22;3284:53;:::i;:::-;3274:63;;3229:118;3030:324;;;;;:::o;3360:552::-;;;;3502:2;3490:9;3481:7;3477:23;3473:32;3470:2;;;3518:1;3515;3508:12;3470:2;3561:1;3586:53;3631:7;3622:6;3611:9;3607:22;3586:53;:::i;:::-;3576:63;;3532:117;3688:2;3714:53;3759:7;3750:6;3739:9;3735:22;3714:53;:::i;:::-;3704:63;;3659:118;3816:2;3842:53;3887:7;3878:6;3867:9;3863:22;3842:53;:::i;:::-;3832:63;;3787:118;3460:452;;;;;:::o;3918:809::-;;;;;4086:3;4074:9;4065:7;4061:23;4057:33;4054:2;;;4103:1;4100;4093:12;4054:2;4146:1;4171:53;4216:7;4207:6;4196:9;4192:22;4171:53;:::i;:::-;4161:63;;4117:117;4273:2;4299:53;4344:7;4335:6;4324:9;4320:22;4299:53;:::i;:::-;4289:63;;4244:118;4401:2;4427:53;4472:7;4463:6;4452:9;4448:22;4427:53;:::i;:::-;4417:63;;4372:118;4557:2;4546:9;4542:18;4529:32;4588:18;4580:6;4577:30;4574:2;;;4620:1;4617;4610:12;4574:2;4648:62;4702:7;4693:6;4682:9;4678:22;4648:62;:::i;:::-;4638:72;;4500:220;4044:683;;;;;;;:::o;4733:401::-;;;4855:2;4843:9;4834:7;4830:23;4826:32;4823:2;;;4871:1;4868;4861:12;4823:2;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4813:321;;;;;:::o;5140:407::-;;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:53;5394:7;5385:6;5374:9;5370:22;5349:53;:::i;:::-;5339:63;;5295:117;5451:2;5477:53;5522:7;5513:6;5502:9;5498:22;5477:53;:::i;:::-;5467:63;;5422:118;5223:324;;;;;:::o;5553:256::-;;5658:2;5646:9;5637:7;5633:23;5629:32;5626:2;;;5674:1;5671;5664:12;5626:2;5717:1;5742:50;5784:7;5775:6;5764:9;5760:22;5742:50;:::i;:::-;5732:60;;5688:114;5616:193;;;;:::o;5815:278::-;;5931:2;5919:9;5910:7;5906:23;5902:32;5899:2;;;5947:1;5944;5937:12;5899:2;5990:1;6015:61;6068:7;6059:6;6048:9;6044:22;6015:61;:::i;:::-;6005:71;;5961:125;5889:204;;;;:::o;6099:260::-;;6206:2;6194:9;6185:7;6181:23;6177:32;6174:2;;;6222:1;6219;6212:12;6174:2;6265:1;6290:52;6334:7;6325:6;6314:9;6310:22;6290:52;:::i;:::-;6280:62;;6236:116;6164:195;;;;:::o;6365:282::-;;6483:2;6471:9;6462:7;6458:23;6454:32;6451:2;;;6499:1;6496;6489:12;6451:2;6542:1;6567:63;6622:7;6613:6;6602:9;6598:22;6567:63;:::i;:::-;6557:73;;6513:127;6441:206;;;;:::o;6653:290::-;;6775:2;6763:9;6754:7;6750:23;6746:32;6743:2;;;6791:1;6788;6781:12;6743:2;6834:1;6859:67;6918:7;6909:6;6898:9;6894:22;6859:67;:::i;:::-;6849:77;;6805:131;6733:210;;;;:::o;6949:342::-;;7097:2;7085:9;7076:7;7072:23;7068:32;7065:2;;;7113:1;7110;7103:12;7065:2;7156:1;7181:93;7266:7;7257:6;7246:9;7242:22;7181:93;:::i;:::-;7171:103;;7127:157;7055:236;;;;:::o;7297:375::-;;7415:2;7403:9;7394:7;7390:23;7386:32;7383:2;;;7431:1;7428;7421:12;7383:2;7502:1;7491:9;7487:17;7474:31;7532:18;7524:6;7521:30;7518:2;;;7564:1;7561;7554:12;7518:2;7592:63;7647:7;7638:6;7627:9;7623:22;7592:63;:::i;:::-;7582:73;;7445:220;7373:299;;;;:::o;7678:262::-;;7786:2;7774:9;7765:7;7761:23;7757:32;7754:2;;;7802:1;7799;7792:12;7754:2;7845:1;7870:53;7915:7;7906:6;7895:9;7891:22;7870:53;:::i;:::-;7860:63;;7816:117;7744:196;;;;:::o;7946:284::-;;8065:2;8053:9;8044:7;8040:23;8036:32;8033:2;;;8081:1;8078;8071:12;8033:2;8124:1;8149:64;8205:7;8196:6;8185:9;8181:22;8149:64;:::i;:::-;8139:74;;8095:128;8023:207;;;;:::o;8236:407::-;;;8361:2;8349:9;8340:7;8336:23;8332:32;8329:2;;;8377:1;8374;8367:12;8329:2;8420:1;8445:53;8490:7;8481:6;8470:9;8466:22;8445:53;:::i;:::-;8435:63;;8391:117;8547:2;8573:53;8618:7;8609:6;8598:9;8594:22;8573:53;:::i;:::-;8563:63;;8518:118;8319:324;;;;;:::o;8649:118::-;8736:24;8754:5;8736:24;:::i;:::-;8731:3;8724:37;8714:53;;:::o;8773:109::-;8854:21;8869:5;8854:21;:::i;:::-;8849:3;8842:34;8832:50;;:::o;8888:360::-;;9002:38;9034:5;9002:38;:::i;:::-;9056:70;9119:6;9114:3;9056:70;:::i;:::-;9049:77;;9135:52;9180:6;9175:3;9168:4;9161:5;9157:16;9135:52;:::i;:::-;9212:29;9234:6;9212:29;:::i;:::-;9207:3;9203:39;9196:46;;8978:270;;;;;:::o;9254:364::-;;9370:39;9403:5;9370:39;:::i;:::-;9425:71;9489:6;9484:3;9425:71;:::i;:::-;9418:78;;9505:52;9550:6;9545:3;9538:4;9531:5;9527:16;9505:52;:::i;:::-;9582:29;9604:6;9582:29;:::i;:::-;9577:3;9573:39;9566:46;;9346:272;;;;;:::o;9624:377::-;;9758:39;9791:5;9758:39;:::i;:::-;9813:89;9895:6;9890:3;9813:89;:::i;:::-;9806:96;;9911:52;9956:6;9951:3;9944:4;9937:5;9933:16;9911:52;:::i;:::-;9988:6;9983:3;9979:16;9972:23;;9734:267;;;;;:::o;10031:845::-;;10171:5;10165:12;10200:36;10226:9;10200:36;:::i;:::-;10252:89;10334:6;10329:3;10252:89;:::i;:::-;10245:96;;10372:1;10361:9;10357:17;10388:1;10383:137;;;;10534:1;10529:341;;;;10350:520;;10383:137;10467:4;10463:9;10452;10448:25;10443:3;10436:38;10503:6;10498:3;10494:16;10487:23;;10383:137;;10529:341;10596:38;10628:5;10596:38;:::i;:::-;10656:1;10670:154;10684:6;10681:1;10678:13;10670:154;;;10758:7;10752:14;10748:1;10743:3;10739:11;10732:35;10808:1;10799:7;10795:15;10784:26;;10706:4;10703:1;10699:12;10694:17;;10670:154;;;10853:6;10848:3;10844:16;10837:23;;10536:334;;10350:520;;10138:738;;;;;;:::o;10882:366::-;;11045:67;11109:2;11104:3;11045:67;:::i;:::-;11038:74;;11142:34;11138:1;11133:3;11129:11;11122:55;11208:4;11203:2;11198:3;11194:12;11187:26;11239:2;11234:3;11230:12;11223:19;;11028:220;;;:::o;11254:370::-;;11417:67;11481:2;11476:3;11417:67;:::i;:::-;11410:74;;11514:34;11510:1;11505:3;11501:11;11494:55;11580:8;11575:2;11570:3;11566:12;11559:30;11615:2;11610:3;11606:12;11599:19;;11400:224;;;:::o;11630:374::-;;11793:67;11857:2;11852:3;11793:67;:::i;:::-;11786:74;;11890:34;11886:1;11881:3;11877:11;11870:55;11956:12;11951:2;11946:3;11942:12;11935:34;11995:2;11990:3;11986:12;11979:19;;11776:228;;;:::o;12010:367::-;;12173:67;12237:2;12232:3;12173:67;:::i;:::-;12166:74;;12270:34;12266:1;12261:3;12257:11;12250:55;12336:5;12331:2;12326:3;12322:12;12315:27;12368:2;12363:3;12359:12;12352:19;;12156:221;;;:::o;12383:366::-;;12546:67;12610:2;12605:3;12546:67;:::i;:::-;12539:74;;12643:34;12639:1;12634:3;12630:11;12623:55;12709:4;12704:2;12699:3;12695:12;12688:26;12740:2;12735:3;12731:12;12724:19;;12529:220;;;:::o;12755:369::-;;12918:67;12982:2;12977:3;12918:67;:::i;:::-;12911:74;;13015:34;13011:1;13006:3;13002:11;12995:55;13081:7;13076:2;13071:3;13067:12;13060:29;13115:2;13110:3;13106:12;13099:19;;12901:223;;;:::o;13130:366::-;;13293:67;13357:2;13352:3;13293:67;:::i;:::-;13286:74;;13390:34;13386:1;13381:3;13377:11;13370:55;13456:4;13451:2;13446:3;13442:12;13435:26;13487:2;13482:3;13478:12;13471:19;;13276:220;;;:::o;13502:315::-;;13665:67;13729:2;13724:3;13665:67;:::i;:::-;13658:74;;13762:19;13758:1;13753:3;13749:11;13742:40;13808:2;13803:3;13799:12;13792:19;;13648:169;;;:::o;13823:389::-;;13986:67;14050:2;14045:3;13986:67;:::i;:::-;13979:74;;14083:34;14079:1;14074:3;14070:11;14063:55;14149:27;14144:2;14139:3;14135:12;14128:49;14203:2;14198:3;14194:12;14187:19;;13969:243;;;:::o;14218:375::-;;14381:67;14445:2;14440:3;14381:67;:::i;:::-;14374:74;;14478:34;14474:1;14469:3;14465:11;14458:55;14544:13;14539:2;14534:3;14530:12;14523:35;14584:2;14579:3;14575:12;14568:19;;14364:229;;;:::o;14599:370::-;;14762:67;14826:2;14821:3;14762:67;:::i;:::-;14755:74;;14859:34;14855:1;14850:3;14846:11;14839:55;14925:8;14920:2;14915:3;14911:12;14904:30;14960:2;14955:3;14951:12;14944:19;;14745:224;;;:::o;14975:330::-;;15138:67;15202:2;15197:3;15138:67;:::i;:::-;15131:74;;15235:34;15231:1;15226:3;15222:11;15215:55;15296:2;15291:3;15287:12;15280:19;;15121:184;;;:::o;15311:324::-;;15474:67;15538:2;15533:3;15474:67;:::i;:::-;15467:74;;15571:28;15567:1;15562:3;15558:11;15551:49;15626:2;15621:3;15617:12;15610:19;;15457:178;;;:::o;15641:382::-;;15804:67;15868:2;15863:3;15804:67;:::i;:::-;15797:74;;15901:34;15897:1;15892:3;15888:11;15881:55;15967:20;15962:2;15957:3;15953:12;15946:42;16014:2;16009:3;16005:12;15998:19;;15787:236;;;:::o;16029:366::-;;16192:67;16256:2;16251:3;16192:67;:::i;:::-;16185:74;;16289:34;16285:1;16280:3;16276:11;16269:55;16355:4;16350:2;16345:3;16341:12;16334:26;16386:2;16381:3;16377:12;16370:19;;16175:220;;;:::o;16401:383::-;;16564:67;16628:2;16623:3;16564:67;:::i;:::-;16557:74;;16661:34;16657:1;16652:3;16648:11;16641:55;16727:21;16722:2;16717:3;16713:12;16706:43;16775:2;16770:3;16766:12;16759:19;;16547:237;;;:::o;16790:327::-;;16953:67;17017:2;17012:3;16953:67;:::i;:::-;16946:74;;17050:31;17046:1;17041:3;17037:11;17030:52;17108:2;17103:3;17099:12;17092:19;;16936:181;;;:::o;17123:365::-;;17286:67;17350:2;17345:3;17286:67;:::i;:::-;17279:74;;17383:34;17379:1;17374:3;17370:11;17363:55;17449:3;17444:2;17439:3;17435:12;17428:25;17479:2;17474:3;17470:12;17463:19;;17269:219;;;:::o;17494:378::-;;17657:67;17721:2;17716:3;17657:67;:::i;:::-;17650:74;;17754:34;17750:1;17745:3;17741:11;17734:55;17820:16;17815:2;17810:3;17806:12;17799:38;17863:2;17858:3;17854:12;17847:19;;17640:232;;;:::o;17878:329::-;;18041:67;18105:2;18100:3;18041:67;:::i;:::-;18034:74;;18138:33;18134:1;18129:3;18125:11;18118:54;18198:2;18193:3;18189:12;18182:19;;18024:183;;;:::o;18213:379::-;;18376:67;18440:2;18435:3;18376:67;:::i;:::-;18369:74;;18473:34;18469:1;18464:3;18460:11;18453:55;18539:17;18534:2;18529:3;18525:12;18518:39;18583:2;18578:3;18574:12;18567:19;;18359:233;;;:::o;18598:321::-;;18761:67;18825:2;18820:3;18761:67;:::i;:::-;18754:74;;18858:25;18854:1;18849:3;18845:11;18838:46;18910:2;18905:3;18901:12;18894:19;;18744:175;;;:::o;18925:377::-;;19088:67;19152:2;19147:3;19088:67;:::i;:::-;19081:74;;19185:34;19181:1;19176:3;19172:11;19165:55;19251:15;19246:2;19241:3;19237:12;19230:37;19293:2;19288:3;19284:12;19277:19;;19071:231;;;:::o;19308:366::-;;19471:67;19535:2;19530:3;19471:67;:::i;:::-;19464:74;;19568:34;19564:1;19559:3;19555:11;19548:55;19634:4;19629:2;19624:3;19620:12;19613:26;19665:2;19660:3;19656:12;19649:19;;19454:220;;;:::o;19680:333::-;;19861:84;19943:1;19938:3;19861:84;:::i;:::-;19854:91;;19975:3;19971:1;19966:3;19962:11;19955:24;20005:1;20000:3;19996:11;19989:18;;19844:169;;;:::o;20019:118::-;20106:24;20124:5;20106:24;:::i;:::-;20101:3;20094:37;20084:53;;:::o;20143:695::-;;20443:92;20531:3;20522:6;20443:92;:::i;:::-;20436:99;;20552:148;20696:3;20552:148;:::i;:::-;20545:155;;20717:95;20808:3;20799:6;20717:95;:::i;:::-;20710:102;;20829:3;20822:10;;20425:413;;;;;:::o;20844:222::-;;20975:2;20964:9;20960:18;20952:26;;20988:71;21056:1;21045:9;21041:17;21032:6;20988:71;:::i;:::-;20942:124;;;;:::o;21072:640::-;;21305:3;21294:9;21290:19;21282:27;;21319:71;21387:1;21376:9;21372:17;21363:6;21319:71;:::i;:::-;21400:72;21468:2;21457:9;21453:18;21444:6;21400:72;:::i;:::-;21482;21550:2;21539:9;21535:18;21526:6;21482:72;:::i;:::-;21601:9;21595:4;21591:20;21586:2;21575:9;21571:18;21564:48;21629:76;21700:4;21691:6;21629:76;:::i;:::-;21621:84;;21272:440;;;;;;;:::o;21718:332::-;;21877:2;21866:9;21862:18;21854:26;;21890:71;21958:1;21947:9;21943:17;21934:6;21890:71;:::i;:::-;21971:72;22039:2;22028:9;22024:18;22015:6;21971:72;:::i;:::-;21844:206;;;;;:::o;22056:210::-;;22181:2;22170:9;22166:18;22158:26;;22194:65;22256:1;22245:9;22241:17;22232:6;22194:65;:::i;:::-;22148:118;;;;:::o;22272:313::-;;22423:2;22412:9;22408:18;22400:26;;22472:9;22466:4;22462:20;22458:1;22447:9;22443:17;22436:47;22500:78;22573:4;22564:6;22500:78;:::i;:::-;22492:86;;22390:195;;;;:::o;22591:419::-;;22795:2;22784:9;22780:18;22772:26;;22844:9;22838:4;22834:20;22830:1;22819:9;22815:17;22808:47;22872:131;22998:4;22872:131;:::i;:::-;22864:139;;22762:248;;;:::o;23016:419::-;;23220:2;23209:9;23205:18;23197:26;;23269:9;23263:4;23259:20;23255:1;23244:9;23240:17;23233:47;23297:131;23423:4;23297:131;:::i;:::-;23289:139;;23187:248;;;:::o;23441:419::-;;23645:2;23634:9;23630:18;23622:26;;23694:9;23688:4;23684:20;23680:1;23669:9;23665:17;23658:47;23722:131;23848:4;23722:131;:::i;:::-;23714:139;;23612:248;;;:::o;23866:419::-;;24070:2;24059:9;24055:18;24047:26;;24119:9;24113:4;24109:20;24105:1;24094:9;24090:17;24083:47;24147:131;24273:4;24147:131;:::i;:::-;24139:139;;24037:248;;;:::o;24291:419::-;;24495:2;24484:9;24480:18;24472:26;;24544:9;24538:4;24534:20;24530:1;24519:9;24515:17;24508:47;24572:131;24698:4;24572:131;:::i;:::-;24564:139;;24462:248;;;:::o;24716:419::-;;24920:2;24909:9;24905:18;24897:26;;24969:9;24963:4;24959:20;24955:1;24944:9;24940:17;24933:47;24997:131;25123:4;24997:131;:::i;:::-;24989:139;;24887:248;;;:::o;25141:419::-;;25345:2;25334:9;25330:18;25322:26;;25394:9;25388:4;25384:20;25380:1;25369:9;25365:17;25358:47;25422:131;25548:4;25422:131;:::i;:::-;25414:139;;25312:248;;;:::o;25566:419::-;;25770:2;25759:9;25755:18;25747:26;;25819:9;25813:4;25809:20;25805:1;25794:9;25790:17;25783:47;25847:131;25973:4;25847:131;:::i;:::-;25839:139;;25737:248;;;:::o;25991:419::-;;26195:2;26184:9;26180:18;26172:26;;26244:9;26238:4;26234:20;26230:1;26219:9;26215:17;26208:47;26272:131;26398:4;26272:131;:::i;:::-;26264:139;;26162:248;;;:::o;26416:419::-;;26620:2;26609:9;26605:18;26597:26;;26669:9;26663:4;26659:20;26655:1;26644:9;26640:17;26633:47;26697:131;26823:4;26697:131;:::i;:::-;26689:139;;26587:248;;;:::o;26841:419::-;;27045:2;27034:9;27030:18;27022:26;;27094:9;27088:4;27084:20;27080:1;27069:9;27065:17;27058:47;27122:131;27248:4;27122:131;:::i;:::-;27114:139;;27012:248;;;:::o;27266:419::-;;27470:2;27459:9;27455:18;27447:26;;27519:9;27513:4;27509:20;27505:1;27494:9;27490:17;27483:47;27547:131;27673:4;27547:131;:::i;:::-;27539:139;;27437:248;;;:::o;27691:419::-;;27895:2;27884:9;27880:18;27872:26;;27944:9;27938:4;27934:20;27930:1;27919:9;27915:17;27908:47;27972:131;28098:4;27972:131;:::i;:::-;27964:139;;27862:248;;;:::o;28116:419::-;;28320:2;28309:9;28305:18;28297:26;;28369:9;28363:4;28359:20;28355:1;28344:9;28340:17;28333:47;28397:131;28523:4;28397:131;:::i;:::-;28389:139;;28287:248;;;:::o;28541:419::-;;28745:2;28734:9;28730:18;28722:26;;28794:9;28788:4;28784:20;28780:1;28769:9;28765:17;28758:47;28822:131;28948:4;28822:131;:::i;:::-;28814:139;;28712:248;;;:::o;28966:419::-;;29170:2;29159:9;29155:18;29147:26;;29219:9;29213:4;29209:20;29205:1;29194:9;29190:17;29183:47;29247:131;29373:4;29247:131;:::i;:::-;29239:139;;29137:248;;;:::o;29391:419::-;;29595:2;29584:9;29580:18;29572:26;;29644:9;29638:4;29634:20;29630:1;29619:9;29615:17;29608:47;29672:131;29798:4;29672:131;:::i;:::-;29664:139;;29562:248;;;:::o;29816:419::-;;30020:2;30009:9;30005:18;29997:26;;30069:9;30063:4;30059:20;30055:1;30044:9;30040:17;30033:47;30097:131;30223:4;30097:131;:::i;:::-;30089:139;;29987:248;;;:::o;30241:419::-;;30445:2;30434:9;30430:18;30422:26;;30494:9;30488:4;30484:20;30480:1;30469:9;30465:17;30458:47;30522:131;30648:4;30522:131;:::i;:::-;30514:139;;30412:248;;;:::o;30666:419::-;;30870:2;30859:9;30855:18;30847:26;;30919:9;30913:4;30909:20;30905:1;30894:9;30890:17;30883:47;30947:131;31073:4;30947:131;:::i;:::-;30939:139;;30837:248;;;:::o;31091:419::-;;31295:2;31284:9;31280:18;31272:26;;31344:9;31338:4;31334:20;31330:1;31319:9;31315:17;31308:47;31372:131;31498:4;31372:131;:::i;:::-;31364:139;;31262:248;;;:::o;31516:419::-;;31720:2;31709:9;31705:18;31697:26;;31769:9;31763:4;31759:20;31755:1;31744:9;31740:17;31733:47;31797:131;31923:4;31797:131;:::i;:::-;31789:139;;31687:248;;;:::o;31941:419::-;;32145:2;32134:9;32130:18;32122:26;;32194:9;32188:4;32184:20;32180:1;32169:9;32165:17;32158:47;32222:131;32348:4;32222:131;:::i;:::-;32214:139;;32112:248;;;:::o;32366:419::-;;32570:2;32559:9;32555:18;32547:26;;32619:9;32613:4;32609:20;32605:1;32594:9;32590:17;32583:47;32647:131;32773:4;32647:131;:::i;:::-;32639:139;;32537:248;;;:::o;32791:222::-;;32922:2;32911:9;32907:18;32899:26;;32935:71;33003:1;32992:9;32988:17;32979:6;32935:71;:::i;:::-;32889:124;;;;:::o;33019:283::-;;33085:2;33079:9;33069:19;;33127:4;33119:6;33115:17;33234:6;33222:10;33219:22;33198:18;33186:10;33183:34;33180:62;33177:2;;;33245:18;;:::i;:::-;33177:2;33285:10;33281:2;33274:22;33059:243;;;;:::o;33308:331::-;;33459:18;33451:6;33448:30;33445:2;;;33481:18;;:::i;:::-;33445:2;33566:4;33562:9;33555:4;33547:6;33543:17;33539:33;33531:41;;33627:4;33621;33617:15;33609:23;;33374:265;;;:::o;33645:332::-;;33797:18;33789:6;33786:30;33783:2;;;33819:18;;:::i;:::-;33783:2;33904:4;33900:9;33893:4;33885:6;33881:17;33877:33;33869:41;;33965:4;33959;33955:15;33947:23;;33712:265;;;:::o;33983:141::-;;34055:3;34047:11;;34078:3;34075:1;34068:14;34112:4;34109:1;34099:18;34091:26;;34037:87;;;:::o;34130:98::-;;34215:5;34209:12;34199:22;;34188:40;;;:::o;34234:99::-;;34320:5;34314:12;34304:22;;34293:40;;;:::o;34339:168::-;;34456:6;34451:3;34444:19;34496:4;34491:3;34487:14;34472:29;;34434:73;;;;:::o;34513:169::-;;34631:6;34626:3;34619:19;34671:4;34666:3;34662:14;34647:29;;34609:73;;;;:::o;34688:148::-;;34827:3;34812:18;;34802:34;;;;:::o;34842:273::-;;34901:20;34919:1;34901:20;:::i;:::-;34896:25;;34935:20;34953:1;34935:20;:::i;:::-;34930:25;;35057:1;35021:34;35017:42;35014:1;35011:49;35008:2;;;35063:18;;:::i;:::-;35008:2;35107:1;35104;35100:9;35093:16;;34886:229;;;;:::o;35121:305::-;;35180:20;35198:1;35180:20;:::i;:::-;35175:25;;35214:20;35232:1;35214:20;:::i;:::-;35209:25;;35368:1;35300:66;35296:74;35293:1;35290:81;35287:2;;;35374:18;;:::i;:::-;35287:2;35418:1;35415;35411:9;35404:16;;35165:261;;;;:::o;35432:185::-;;35489:20;35507:1;35489:20;:::i;:::-;35484:25;;35523:20;35541:1;35523:20;:::i;:::-;35518:25;;35562:1;35552:2;;35567:18;;:::i;:::-;35552:2;35609:1;35606;35602:9;35597:14;;35474:143;;;;:::o;35623:348::-;;35686:20;35704:1;35686:20;:::i;:::-;35681:25;;35720:20;35738:1;35720:20;:::i;:::-;35715:25;;35908:1;35840:66;35836:74;35833:1;35830:81;35825:1;35818:9;35811:17;35807:105;35804:2;;;35915:18;;:::i;:::-;35804:2;35963:1;35960;35956:9;35945:20;;35671:300;;;;:::o;35977:191::-;;36037:20;36055:1;36037:20;:::i;:::-;36032:25;;36071:20;36089:1;36071:20;:::i;:::-;36066:25;;36110:1;36107;36104:8;36101:2;;;36115:18;;:::i;:::-;36101:2;36160:1;36157;36153:9;36145:17;;36022:146;;;;:::o;36174:191::-;;36234:20;36252:1;36234:20;:::i;:::-;36229:25;;36268:20;36286:1;36268:20;:::i;:::-;36263:25;;36307:1;36304;36301:8;36298:2;;;36312:18;;:::i;:::-;36298:2;36357:1;36354;36350:9;36342:17;;36219:146;;;;:::o;36371:96::-;;36437:24;36455:5;36437:24;:::i;:::-;36426:35;;36416:51;;;:::o;36473:90::-;;36550:5;36543:13;36536:21;36525:32;;36515:48;;;:::o;36569:149::-;;36645:66;36638:5;36634:78;36623:89;;36613:105;;;:::o;36724:110::-;;36804:24;36822:5;36804:24;:::i;:::-;36793:35;;36783:51;;;:::o;36840:125::-;;36935:24;36953:5;36935:24;:::i;:::-;36924:35;;36914:51;;;:::o;36971:118::-;;37048:34;37041:5;37037:46;37026:57;;37016:73;;;:::o;37095:126::-;;37172:42;37165:5;37161:54;37150:65;;37140:81;;;:::o;37227:77::-;;37293:5;37282:16;;37272:32;;;:::o;37310:154::-;37394:6;37389:3;37384;37371:30;37456:1;37447:6;37442:3;37438:16;37431:27;37361:103;;;:::o;37470:307::-;37538:1;37548:113;37562:6;37559:1;37556:13;37548:113;;;37647:1;37642:3;37638:11;37632:18;37628:1;37623:3;37619:11;37612:39;37584:2;37581:1;37577:10;37572:15;;37548:113;;;37679:6;37676:1;37673:13;37670:2;;;37759:1;37750:6;37745:3;37741:16;37734:27;37670:2;37519:258;;;;:::o;37783:171::-;;37845:24;37863:5;37845:24;:::i;:::-;37836:33;;37891:4;37884:5;37881:15;37878:2;;;37899:18;;:::i;:::-;37878:2;37946:1;37939:5;37935:13;37928:20;;37826:128;;;:::o;37960:320::-;;38041:1;38035:4;38031:12;38021:22;;38088:1;38082:4;38078:12;38109:18;38099:2;;38165:4;38157:6;38153:17;38143:27;;38099:2;38227;38219:6;38216:14;38196:18;38193:38;38190:2;;;38246:18;;:::i;:::-;38190:2;38011:269;;;;:::o;38286:233::-;;38348:24;38366:5;38348:24;:::i;:::-;38339:33;;38394:66;38387:5;38384:77;38381:2;;;38464:18;;:::i;:::-;38381:2;38511:1;38504:5;38500:13;38493:20;;38329:190;;;:::o;38525:176::-;;38574:20;38592:1;38574:20;:::i;:::-;38569:25;;38608:20;38626:1;38608:20;:::i;:::-;38603:25;;38647:1;38637:2;;38652:18;;:::i;:::-;38637:2;38693:1;38690;38686:9;38681:14;;38559:142;;;;:::o;38707:180::-;38755:77;38752:1;38745:88;38852:4;38849:1;38842:15;38876:4;38873:1;38866:15;38893:180;38941:77;38938:1;38931:88;39038:4;39035:1;39028:15;39062:4;39059:1;39052:15;39079:180;39127:77;39124:1;39117:88;39224:4;39221:1;39214:15;39248:4;39245:1;39238:15;39265:180;39313:77;39310:1;39303:88;39410:4;39407:1;39400:15;39434:4;39431:1;39424:15;39451:102;;39543:2;39539:7;39534:2;39527:5;39523:14;39519:28;39509:38;;39499:54;;;:::o;39559:122::-;39632:24;39650:5;39632:24;:::i;:::-;39625:5;39622:35;39612:2;;39671:1;39668;39661:12;39612:2;39602:79;:::o;39687:116::-;39757:21;39772:5;39757:21;:::i;:::-;39750:5;39747:32;39737:2;;39793:1;39790;39783:12;39737:2;39727:76;:::o;39809:120::-;39881:23;39898:5;39881:23;:::i;:::-;39874:5;39871:34;39861:2;;39919:1;39916;39909:12;39861:2;39851:78;:::o;39935:150::-;40022:38;40054:5;40022:38;:::i;:::-;40015:5;40012:49;40002:2;;40075:1;40072;40065:12;40002:2;39992:93;:::o;40091:180::-;40193:53;40240:5;40193:53;:::i;:::-;40186:5;40183:64;40173:2;;40261:1;40258;40251:12;40173:2;40163:108;:::o;40277:122::-;40350:24;40368:5;40350:24;:::i;:::-;40343:5;40340:35;40330:2;;40389:1;40386;40379:12;40330:2;40320:79;:::o

Swarm Source

ipfs://04c4aed5c72b3b87441606eab598d11f8598b5326098de789dfd75ddb41d7b75
Loading...
Loading
Loading...
Loading
[ 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.