ETH Price: $3,247.23 (-12.38%)

Token

Buy this NFT or Ape'll do it (Alldoit)
 

Overview

Max Total Supply

1,380 Alldoit

Holders

198

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 Alldoit
0x2bf0c4db2aa49abc857b8fdad3b16eb8f658201c
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.7+commit.e28d00a7

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-01
*/

/**
 *Submitted for verification at Etherscan.io on 2022-04-14
 */

// File: contracts/SixteenBitApes.sol

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

// File: contracts/ERC721A.sol

pragma solidity ^0.8.0;

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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 0;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

        uint256 updatedIndex = startTokenId;

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    uint256 public nextOwnerToExplicitlySet = 0;

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

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

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

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

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

pragma solidity ^0.8.0;

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

    Counters.Counter private tokenCounter;

    string private baseURI =
        "ipfs://QmSaKC7Etha3eCuZWosjrs8FqExgSjJTzCU55MLgSt4BXB";
    address private openSeaProxyRegistryAddress =
        0xa5409ec958C83C3f309868babACA7c86DCB077c1;
    bool private isOpenSeaProxyActive = true;
    mapping(address => bool) private _whiteList;

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

    uint256 public NUM_FREE_MINTS = 6969 - 500;
    bool public isPublicSaleActive = true;

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

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

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

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

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

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

    constructor()
        ERC721A("Buy this NFT or Ape'll do it", "Alldoit", 3000, maxSupply)
    {
        _whiteList[0x2913e29b22C071B4cf509a124593ccB2906DdA0D] = true;
        _whiteList[0xC639132DB51a4B70c35e641f7CC2af979512a6D8] = true;
    }

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

    function mint(uint256 numberOfTokens)
        external
        nonReentrant
        publicSaleActive
        isCorrectFreeMint(numberOfTokens)
        canMintNFTs(numberOfTokens)
        maxMintsPerTX(numberOfTokens)
    {
        require(balanceOf(msg.sender) < MAX_MINTS_PER_TX);

        _safeMint(msg.sender, numberOfTokens);
    }

    function whiteListMint(uint256 numberOfTokens)
        external
        canMintNFTs(numberOfTokens)
    {
        require(_whiteList[msg.sender] == true);

        _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":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isOpenSeaProxyActive","type":"bool"}],"name":"setIsOpenSeaProxyActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPublicSaleActive","type":"bool"}],"name":"setIsPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numfreemints","type":"uint256"}],"name":"setNumFreeMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"whiteListMint","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"}]

60c0604052600080556000600755604051806060016040528060358152602001620050bb60359139600b90805190602001906200003e929190620003fc565b5073a5409ec958c83c3f309868babaca7c86dcb077c1600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c60146101000a81548160ff021916908315150217905550611b39600e55611945600f556001601060006101000a81548160ff021916908315150217905550348015620000e357600080fd5b506040518060400160405280601c81526020017f4275792074686973204e4654206f7220417065276c6c20646f206974000000008152506040518060400160405280600781526020017f416c6c646f697400000000000000000000000000000000000000000000000000815250610bb8600e54600081116200019c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000193906200051c565b60405180910390fd5b60008211620001e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d990620004fa565b60405180910390fd5b8360019080519060200190620001fa929190620003fc565b50826002908051906020019062000213929190620003fc565b508160a08181525050806080818152505050505050620002486200023c6200032e60201b60201c565b6200033660201b60201c565b60016009819055506001600d6000732913e29b22c071b4cf509a124593ccb2906dda0d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d600073c639132db51a4b70c35e641f7cc2af979512a6d873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000652565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200040a906200054f565b90600052602060002090601f0160209004810192826200042e57600085556200047a565b82601f106200044957805160ff19168380011785556200047a565b828001600101855582156200047a579182015b82811115620004795782518255916020019190600101906200045c565b5b5090506200048991906200048d565b5090565b5b80821115620004a85760008160009055506001016200048e565b5090565b6000620004bb6027836200053e565b9150620004c882620005b4565b604082019050919050565b6000620004e2602e836200053e565b9150620004ef8262000603565b604082019050919050565b600060208201905081810360008301526200051581620004ac565b9050919050565b600060208201905081810360008301526200053781620004d3565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200056857607f821691505b602082108114156200057f576200057e62000585565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a051614a3862000683600039600081816122e8015281816123110152612a14015260005050614a386000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80636352211e1161011a578063a22cb465116100ad578063d5abeb011161007c578063d5abeb01146105c4578063d7224ba0146105e2578063e43082f714610600578063e985e9c51461061c578063f2fde38b1461064c57610206565b8063a22cb4651461053e578063b88d4fde1461055a578063c6a91b4214610576578063c87b56dd1461059457610206565b80638da5cb5b116100e95780638da5cb5b146104c857806395d89b41146104e6578063982d669e14610504578063a0712d681461052257610206565b80636352211e1461044057806370a0823114610470578063714c5398146104a0578063715018a6146104be57610206565b806323b872dd1161019d5780633ccfd60b1161016c5780633ccfd60b146103b257806342842e0e146103bc57806349df728c146103d85780634f6ccce7146103f457806355f804b31461042457610206565b806323b872dd1461031957806328cad13d146103355780632a55205a146103515780632f745c591461038257610206565b8063095ea7b3116101d9578063095ea7b3146102a55780630a00ae83146102c157806318160ddd146102dd5780631e84c413146102fb57610206565b806301ffc9a71461020b57806302e001ef1461023b57806306fdde0314610257578063081812fc14610275575b600080fd5b610225600480360381019061022091906132e8565b610668565b60405161023291906139f8565b60405180910390f35b610255600480360381019061025091906133e5565b6106e2565b005b61025f6107a5565b60405161026c9190613a13565b60405180910390f35b61028f600480360381019061028a91906133e5565b610837565b60405161029c9190613968565b60405180910390f35b6102bf60048036038101906102ba919061324e565b6108bc565b005b6102db60048036038101906102d691906133e5565b6109d5565b005b6102e5610a5b565b6040516102f29190613d35565b60405180910390f35b610303610a64565b60405161031091906139f8565b60405180910390f35b610333600480360381019061032e9190613138565b610a77565b005b61034f600480360381019061034a919061328e565b610a87565b005b61036b6004803603810190610366919061343f565b610b20565b6040516103799291906139cf565b60405180910390f35b61039c6004803603810190610397919061324e565b610b8c565b6040516103a99190613d35565b60405180910390f35b6103ba610d8a565b005b6103d660048036038101906103d19190613138565b610e55565b005b6103f260048036038101906103ed9190613342565b610e75565b005b61040e600480360381019061040991906133e5565b611010565b60405161041b9190613d35565b60405180910390f35b61043e6004803603810190610439919061339c565b611063565b005b61045a600480360381019061045591906133e5565b6110f9565b6040516104679190613968565b60405180910390f35b61048a600480360381019061048591906130cb565b61110f565b6040516104979190613d35565b60405180910390f35b6104a86111f8565b6040516104b59190613a13565b60405180910390f35b6104c661128a565b005b6104d0611312565b6040516104dd9190613968565b60405180910390f35b6104ee61133c565b6040516104fb9190613a13565b60405180910390f35b61050c6113ce565b6040516105199190613d35565b60405180910390f35b61053c600480360381019061053791906133e5565b6113d4565b005b6105586004803603810190610553919061320e565b61155f565b005b610574600480360381019061056f919061318b565b6116e0565b005b61057e61173c565b60405161058b9190613d35565b60405180910390f35b6105ae60048036038101906105a991906133e5565b611741565b6040516105bb9190613a13565b60405180910390f35b6105cc6117c9565b6040516105d99190613d35565b60405180910390f35b6105ea6117cf565b6040516105f79190613d35565b60405180910390f35b61061a6004803603810190610615919061328e565b6117d5565b005b610636600480360381019061063191906130f8565b61186e565b60405161064391906139f8565b60405180910390f35b610666600480360381019061066191906130cb565b611988565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106db57506106da82611a80565b5b9050919050565b80600e54816106ef610a5b565b6106f99190613e75565b111561073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073190613ab5565b60405180910390fd5b60011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461079757600080fd5b6107a13383611bca565b5050565b6060600180546107b4906140de565b80601f01602080910402602001604051908101604052809291908181526020018280546107e0906140de565b801561082d5780601f106108025761010080835404028352916020019161082d565b820191906000526020600020905b81548152906001019060200180831161081057829003601f168201915b5050505050905090565b600061084282611be8565b610881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087890613cf5565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c7826110f9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f90613bf5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610957611bf5565b73ffffffffffffffffffffffffffffffffffffffff161480610986575061098581610980611bf5565b61186e565b5b6109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90613b35565b60405180910390fd5b6109d0838383611bfd565b505050565b6109dd611bf5565b73ffffffffffffffffffffffffffffffffffffffff166109fb611312565b73ffffffffffffffffffffffffffffffffffffffff1614610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4890613b95565b60405180910390fd5b80600f8190555050565b60008054905090565b601060009054906101000a900460ff1681565b610a82838383611caf565b505050565b610a8f611bf5565b73ffffffffffffffffffffffffffffffffffffffff16610aad611312565b73ffffffffffffffffffffffffffffffffffffffff1614610b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afa90613b95565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b600080610b2c84611be8565b610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6290613b15565b60405180910390fd5b30610b81610b7a856005612268565b606461227e565b915091509250929050565b6000610b978361110f565b8210610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf90613a35565b60405180910390fd5b6000610be2610a5b565b905060008060005b83811015610d48576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610cdc57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d345786841415610d25578195505050505050610d84565b8380610d3090614141565b9450505b508080610d4090614141565b915050610bea565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7b90613c75565b60405180910390fd5b92915050565b610d92611bf5565b73ffffffffffffffffffffffffffffffffffffffff16610db0611312565b73ffffffffffffffffffffffffffffffffffffffff1614610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90613b95565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e51573d6000803e3d6000fd5b5050565b610e70838383604051806020016040528060008152506116e0565b505050565b610e7d611bf5565b73ffffffffffffffffffffffffffffffffffffffff16610e9b611312565b73ffffffffffffffffffffffffffffffffffffffff1614610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee890613b95565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f2c9190613968565b60206040518083038186803b158015610f4457600080fd5b505afa158015610f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7c9190613412565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610fb99291906139cf565b602060405180830381600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100b91906132bb565b505050565b600061101a610a5b565b821061105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105290613a95565b60405180910390fd5b819050919050565b61106b611bf5565b73ffffffffffffffffffffffffffffffffffffffff16611089611312565b73ffffffffffffffffffffffffffffffffffffffff16146110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d690613b95565b60405180910390fd5b80600b90805190602001906110f5929190612e51565b5050565b600061110482612294565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790613b55565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6060600b8054611207906140de565b80601f0160208091040260200160405190810160405280929190818152602001828054611233906140de565b80156112805780601f1061125557610100808354040283529160200191611280565b820191906000526020600020905b81548152906001019060200180831161126357829003601f168201915b5050505050905090565b611292611bf5565b73ffffffffffffffffffffffffffffffffffffffff166112b0611312565b73ffffffffffffffffffffffffffffffffffffffff1614611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd90613b95565b60405180910390fd5b6113106000612497565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461134b906140de565b80601f0160208091040260200160405190810160405280929190818152602001828054611377906140de565b80156113c45780601f10611399576101008083540402835291602001916113c4565b820191906000526020600020905b8154815290600101906020018083116113a757829003601f168201915b5050505050905090565b600f5481565b6002600954141561141a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141190613c95565b60405180910390fd5b6002600981905550601060009054906101000a900460ff16611471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146890613cd5565b60405180910390fd5b80600f5481111561148157600080fd5b80600f5461148f9190613f8a565b600f8190555081600e54816114a2610a5b565b6114ac9190613e75565b11156114ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e490613ab5565b60405180910390fd5b826002811115611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152990613af5565b60405180910390fd5b600261153d3361110f565b1061154757600080fd5b6115513385611bca565b505050600160098190555050565b611567611bf5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc90613bb5565b60405180910390fd5b80600660006115e2611bf5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661168f611bf5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116d491906139f8565b60405180910390a35050565b6116eb848484611caf565b6116f78484848461255d565b611736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172d90613c15565b60405180910390fd5b50505050565b600281565b606061174c82611be8565b61178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178290613b15565b60405180910390fd5b600b6117a260018461179d9190613e75565b6126f4565b6040516020016117b3929190613939565b6040516020818303038152906040529050919050565b600e5481565b60075481565b6117dd611bf5565b73ffffffffffffffffffffffffffffffffffffffff166117fb611312565b73ffffffffffffffffffffffffffffffffffffffff1614611851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184890613b95565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60149054906101000a900460ff16801561196557508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016118fd9190613968565b60206040518083038186803b15801561191557600080fd5b505afa158015611929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194d919061336f565b73ffffffffffffffffffffffffffffffffffffffff16145b15611974576001915050611982565b61197e8484612855565b9150505b92915050565b611990611bf5565b73ffffffffffffffffffffffffffffffffffffffff166119ae611312565b73ffffffffffffffffffffffffffffffffffffffff1614611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb90613b95565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b90613a55565b60405180910390fd5b611a7d81612497565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b4b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611bb357507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611bc35750611bc2826128e9565b5b9050919050565b611be4828260405180602001604052806000815250612953565b5050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611cba82612294565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611ce1611bf5565b73ffffffffffffffffffffffffffffffffffffffff161480611d3d5750611d06611bf5565b73ffffffffffffffffffffffffffffffffffffffff16611d2584610837565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d595750611d588260000151611d53611bf5565b61186e565b5b905080611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9290613bd5565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0490613b75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490613ad5565b60405180910390fd5b611e8a8585856001612e32565b611e9a6000848460000151611bfd565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611f089190613f56565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611fac9190613e2f565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846120b29190613e75565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121f85761212881611be8565b156121f7576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122608686866001612e38565b505050505050565b600081836122769190613efc565b905092915050565b6000818361228c9190613ecb565b905092915050565b61229c612ed7565b6122a582611be8565b6122e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122db90613a75565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106123485760017f00000000000000000000000000000000000000000000000000000000000000008461233b9190613f8a565b6123459190613e75565b90505b60008390505b818110612456576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461244257809350505050612492565b50808061244e906140b4565b91505061234e565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248990613cb5565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061257e8473ffffffffffffffffffffffffffffffffffffffff16612e3e565b156126e7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125a7611bf5565b8786866040518563ffffffff1660e01b81526004016125c99493929190613983565b602060405180830381600087803b1580156125e357600080fd5b505af192505050801561261457506040513d601f19601f820116820180604052508101906126119190613315565b60015b612697573d8060008114612644576040519150601f19603f3d011682016040523d82523d6000602084013e612649565b606091505b5060008151141561268f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268690613c15565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126ec565b600190505b949350505050565b6060600082141561273c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612850565b600082905060005b6000821461276e57808061275790614141565b915050600a826127679190613ecb565b9150612744565b60008167ffffffffffffffff81111561278a57612789614277565b5b6040519080825280601f01601f1916602001820160405280156127bc5781602001600182028036833780820191505090505b5090505b60008514612849576001826127d59190613f8a565b9150600a856127e4919061418a565b60306127f09190613e75565b60f81b81838151811061280657612805614248565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128429190613ecb565b94506127c0565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c090613c55565b60405180910390fd5b6129d281611be8565b15612a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0990613c35565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6c90613d15565b60405180910390fd5b612a826000858386612e32565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612b7f9190613e2f565b6fffffffffffffffffffffffffffffffff168152602001858360200151612ba69190613e2f565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612e1557818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612db5600088848861255d565b612df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612deb90613c15565b60405180910390fd5b8180612dff90614141565b9250508080612e0d90614141565b915050612d44565b5080600081905550612e2a6000878588612e38565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b828054612e5d906140de565b90600052602060002090601f016020900481019282612e7f5760008555612ec6565b82601f10612e9857805160ff1916838001178555612ec6565b82800160010185558215612ec6579182015b82811115612ec5578251825591602001919060010190612eaa565b5b509050612ed39190612f11565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612f2a576000816000905550600101612f12565b5090565b6000612f41612f3c84613d75565b613d50565b905082815260208101848484011115612f5d57612f5c6142ab565b5b612f68848285614072565b509392505050565b6000612f83612f7e84613da6565b613d50565b905082815260208101848484011115612f9f57612f9e6142ab565b5b612faa848285614072565b509392505050565b600081359050612fc181614978565b92915050565b600081359050612fd68161498f565b92915050565b600081519050612feb8161498f565b92915050565b600081359050613000816149a6565b92915050565b600081519050613015816149a6565b92915050565b600082601f8301126130305761302f6142a6565b5b8135613040848260208601612f2e565b91505092915050565b600081359050613058816149bd565b92915050565b60008151905061306d816149d4565b92915050565b600082601f830112613088576130876142a6565b5b8135613098848260208601612f70565b91505092915050565b6000813590506130b0816149eb565b92915050565b6000815190506130c5816149eb565b92915050565b6000602082840312156130e1576130e06142b5565b5b60006130ef84828501612fb2565b91505092915050565b6000806040838503121561310f5761310e6142b5565b5b600061311d85828601612fb2565b925050602061312e85828601612fb2565b9150509250929050565b600080600060608486031215613151576131506142b5565b5b600061315f86828701612fb2565b935050602061317086828701612fb2565b9250506040613181868287016130a1565b9150509250925092565b600080600080608085870312156131a5576131a46142b5565b5b60006131b387828801612fb2565b94505060206131c487828801612fb2565b93505060406131d5878288016130a1565b925050606085013567ffffffffffffffff8111156131f6576131f56142b0565b5b6132028782880161301b565b91505092959194509250565b60008060408385031215613225576132246142b5565b5b600061323385828601612fb2565b925050602061324485828601612fc7565b9150509250929050565b60008060408385031215613265576132646142b5565b5b600061327385828601612fb2565b9250506020613284858286016130a1565b9150509250929050565b6000602082840312156132a4576132a36142b5565b5b60006132b284828501612fc7565b91505092915050565b6000602082840312156132d1576132d06142b5565b5b60006132df84828501612fdc565b91505092915050565b6000602082840312156132fe576132fd6142b5565b5b600061330c84828501612ff1565b91505092915050565b60006020828403121561332b5761332a6142b5565b5b600061333984828501613006565b91505092915050565b600060208284031215613358576133576142b5565b5b600061336684828501613049565b91505092915050565b600060208284031215613385576133846142b5565b5b60006133938482850161305e565b91505092915050565b6000602082840312156133b2576133b16142b5565b5b600082013567ffffffffffffffff8111156133d0576133cf6142b0565b5b6133dc84828501613073565b91505092915050565b6000602082840312156133fb576133fa6142b5565b5b6000613409848285016130a1565b91505092915050565b600060208284031215613428576134276142b5565b5b6000613436848285016130b6565b91505092915050565b60008060408385031215613456576134556142b5565b5b6000613464858286016130a1565b9250506020613475858286016130a1565b9150509250929050565b61348881613fbe565b82525050565b61349781613fd0565b82525050565b60006134a882613dec565b6134b28185613e02565b93506134c2818560208601614081565b6134cb816142ba565b840191505092915050565b60006134e182613df7565b6134eb8185613e13565b93506134fb818560208601614081565b613504816142ba565b840191505092915050565b600061351a82613df7565b6135248185613e24565b9350613534818560208601614081565b80840191505092915050565b6000815461354d816140de565b6135578186613e24565b945060018216600081146135725760018114613583576135b6565b60ff198316865281860193506135b6565b61358c85613dd7565b60005b838110156135ae5781548189015260018201915060208101905061358f565b838801955050505b50505092915050565b60006135cc602283613e13565b91506135d7826142cb565b604082019050919050565b60006135ef602683613e13565b91506135fa8261431a565b604082019050919050565b6000613612602a83613e13565b915061361d82614369565b604082019050919050565b6000613635602383613e13565b9150613640826143b8565b604082019050919050565b6000613658602283613e13565b915061366382614407565b604082019050919050565b600061367b602583613e13565b915061368682614456565b604082019050919050565b600061369e602283613e13565b91506136a9826144a5565b604082019050919050565b60006136c1601183613e13565b91506136cc826144f4565b602082019050919050565b60006136e4603983613e13565b91506136ef8261451d565b604082019050919050565b6000613707602b83613e13565b91506137128261456c565b604082019050919050565b600061372a602683613e13565b9150613735826145bb565b604082019050919050565b600061374d602083613e13565b91506137588261460a565b602082019050919050565b6000613770601a83613e13565b915061377b82614633565b602082019050919050565b6000613793603283613e13565b915061379e8261465c565b604082019050919050565b60006137b6602283613e13565b91506137c1826146ab565b604082019050919050565b60006137d9603383613e13565b91506137e4826146fa565b604082019050919050565b60006137fc601d83613e13565b915061380782614749565b602082019050919050565b600061381f602183613e13565b915061382a82614772565b604082019050919050565b6000613842602e83613e13565b915061384d826147c1565b604082019050919050565b6000613865601f83613e13565b915061387082614810565b602082019050919050565b6000613888602f83613e13565b915061389382614839565b604082019050919050565b60006138ab601783613e13565b91506138b682614888565b602082019050919050565b60006138ce602d83613e13565b91506138d9826148b1565b604082019050919050565b60006138f1602283613e13565b91506138fc82614900565b604082019050919050565b6000613914600183613e24565b915061391f8261494f565b600182019050919050565b61393381614068565b82525050565b60006139458285613540565b915061395082613907565b915061395c828461350f565b91508190509392505050565b600060208201905061397d600083018461347f565b92915050565b6000608082019050613998600083018761347f565b6139a5602083018661347f565b6139b2604083018561392a565b81810360608301526139c4818461349d565b905095945050505050565b60006040820190506139e4600083018561347f565b6139f1602083018461392a565b9392505050565b6000602082019050613a0d600083018461348e565b92915050565b60006020820190508181036000830152613a2d81846134d6565b905092915050565b60006020820190508181036000830152613a4e816135bf565b9050919050565b60006020820190508181036000830152613a6e816135e2565b9050919050565b60006020820190508181036000830152613a8e81613605565b9050919050565b60006020820190508181036000830152613aae81613628565b9050919050565b60006020820190508181036000830152613ace8161364b565b9050919050565b60006020820190508181036000830152613aee8161366e565b9050919050565b60006020820190508181036000830152613b0e81613691565b9050919050565b60006020820190508181036000830152613b2e816136b4565b9050919050565b60006020820190508181036000830152613b4e816136d7565b9050919050565b60006020820190508181036000830152613b6e816136fa565b9050919050565b60006020820190508181036000830152613b8e8161371d565b9050919050565b60006020820190508181036000830152613bae81613740565b9050919050565b60006020820190508181036000830152613bce81613763565b9050919050565b60006020820190508181036000830152613bee81613786565b9050919050565b60006020820190508181036000830152613c0e816137a9565b9050919050565b60006020820190508181036000830152613c2e816137cc565b9050919050565b60006020820190508181036000830152613c4e816137ef565b9050919050565b60006020820190508181036000830152613c6e81613812565b9050919050565b60006020820190508181036000830152613c8e81613835565b9050919050565b60006020820190508181036000830152613cae81613858565b9050919050565b60006020820190508181036000830152613cce8161387b565b9050919050565b60006020820190508181036000830152613cee8161389e565b9050919050565b60006020820190508181036000830152613d0e816138c1565b9050919050565b60006020820190508181036000830152613d2e816138e4565b9050919050565b6000602082019050613d4a600083018461392a565b92915050565b6000613d5a613d6b565b9050613d668282614110565b919050565b6000604051905090565b600067ffffffffffffffff821115613d9057613d8f614277565b5b613d99826142ba565b9050602081019050919050565b600067ffffffffffffffff821115613dc157613dc0614277565b5b613dca826142ba565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e3a8261402c565b9150613e458361402c565b9250826fffffffffffffffffffffffffffffffff03821115613e6a57613e696141bb565b5b828201905092915050565b6000613e8082614068565b9150613e8b83614068565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ec057613ebf6141bb565b5b828201905092915050565b6000613ed682614068565b9150613ee183614068565b925082613ef157613ef06141ea565b5b828204905092915050565b6000613f0782614068565b9150613f1283614068565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f4b57613f4a6141bb565b5b828202905092915050565b6000613f618261402c565b9150613f6c8361402c565b925082821015613f7f57613f7e6141bb565b5b828203905092915050565b6000613f9582614068565b9150613fa083614068565b925082821015613fb357613fb26141bb565b5b828203905092915050565b6000613fc982614048565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061401382613fbe565b9050919050565b600061402582613fbe565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561409f578082015181840152602081019050614084565b838111156140ae576000848401525b50505050565b60006140bf82614068565b915060008214156140d3576140d26141bb565b5b600182039050919050565b600060028204905060018216806140f657607f821691505b6020821081141561410a57614109614219565b5b50919050565b614119826142ba565b810181811067ffffffffffffffff8211171561413857614137614277565b5b80604052505050565b600061414c82614068565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561417f5761417e6141bb565b5b600182019050919050565b600061419582614068565b91506141a083614068565b9250826141b0576141af6141ea565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61498181613fbe565b811461498c57600080fd5b50565b61499881613fd0565b81146149a357600080fd5b50565b6149af81613fdc565b81146149ba57600080fd5b50565b6149c681614008565b81146149d157600080fd5b50565b6149dd8161401a565b81146149e857600080fd5b50565b6149f481614068565b81146149ff57600080fd5b5056fea2646970667358221220fbfbfc6486758a051d45eb52397d21dc3c98738f65b82689c8a1643835f7370164736f6c63430008070033697066733a2f2f516d53614b433745746861336543755a576f736a7273384671457867536a4a547a435535354d4c67537434425842

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c80636352211e1161011a578063a22cb465116100ad578063d5abeb011161007c578063d5abeb01146105c4578063d7224ba0146105e2578063e43082f714610600578063e985e9c51461061c578063f2fde38b1461064c57610206565b8063a22cb4651461053e578063b88d4fde1461055a578063c6a91b4214610576578063c87b56dd1461059457610206565b80638da5cb5b116100e95780638da5cb5b146104c857806395d89b41146104e6578063982d669e14610504578063a0712d681461052257610206565b80636352211e1461044057806370a0823114610470578063714c5398146104a0578063715018a6146104be57610206565b806323b872dd1161019d5780633ccfd60b1161016c5780633ccfd60b146103b257806342842e0e146103bc57806349df728c146103d85780634f6ccce7146103f457806355f804b31461042457610206565b806323b872dd1461031957806328cad13d146103355780632a55205a146103515780632f745c591461038257610206565b8063095ea7b3116101d9578063095ea7b3146102a55780630a00ae83146102c157806318160ddd146102dd5780631e84c413146102fb57610206565b806301ffc9a71461020b57806302e001ef1461023b57806306fdde0314610257578063081812fc14610275575b600080fd5b610225600480360381019061022091906132e8565b610668565b60405161023291906139f8565b60405180910390f35b610255600480360381019061025091906133e5565b6106e2565b005b61025f6107a5565b60405161026c9190613a13565b60405180910390f35b61028f600480360381019061028a91906133e5565b610837565b60405161029c9190613968565b60405180910390f35b6102bf60048036038101906102ba919061324e565b6108bc565b005b6102db60048036038101906102d691906133e5565b6109d5565b005b6102e5610a5b565b6040516102f29190613d35565b60405180910390f35b610303610a64565b60405161031091906139f8565b60405180910390f35b610333600480360381019061032e9190613138565b610a77565b005b61034f600480360381019061034a919061328e565b610a87565b005b61036b6004803603810190610366919061343f565b610b20565b6040516103799291906139cf565b60405180910390f35b61039c6004803603810190610397919061324e565b610b8c565b6040516103a99190613d35565b60405180910390f35b6103ba610d8a565b005b6103d660048036038101906103d19190613138565b610e55565b005b6103f260048036038101906103ed9190613342565b610e75565b005b61040e600480360381019061040991906133e5565b611010565b60405161041b9190613d35565b60405180910390f35b61043e6004803603810190610439919061339c565b611063565b005b61045a600480360381019061045591906133e5565b6110f9565b6040516104679190613968565b60405180910390f35b61048a600480360381019061048591906130cb565b61110f565b6040516104979190613d35565b60405180910390f35b6104a86111f8565b6040516104b59190613a13565b60405180910390f35b6104c661128a565b005b6104d0611312565b6040516104dd9190613968565b60405180910390f35b6104ee61133c565b6040516104fb9190613a13565b60405180910390f35b61050c6113ce565b6040516105199190613d35565b60405180910390f35b61053c600480360381019061053791906133e5565b6113d4565b005b6105586004803603810190610553919061320e565b61155f565b005b610574600480360381019061056f919061318b565b6116e0565b005b61057e61173c565b60405161058b9190613d35565b60405180910390f35b6105ae60048036038101906105a991906133e5565b611741565b6040516105bb9190613a13565b60405180910390f35b6105cc6117c9565b6040516105d99190613d35565b60405180910390f35b6105ea6117cf565b6040516105f79190613d35565b60405180910390f35b61061a6004803603810190610615919061328e565b6117d5565b005b610636600480360381019061063191906130f8565b61186e565b60405161064391906139f8565b60405180910390f35b610666600480360381019061066191906130cb565b611988565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106db57506106da82611a80565b5b9050919050565b80600e54816106ef610a5b565b6106f99190613e75565b111561073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073190613ab5565b60405180910390fd5b60011515600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461079757600080fd5b6107a13383611bca565b5050565b6060600180546107b4906140de565b80601f01602080910402602001604051908101604052809291908181526020018280546107e0906140de565b801561082d5780601f106108025761010080835404028352916020019161082d565b820191906000526020600020905b81548152906001019060200180831161081057829003601f168201915b5050505050905090565b600061084282611be8565b610881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087890613cf5565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c7826110f9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f90613bf5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610957611bf5565b73ffffffffffffffffffffffffffffffffffffffff161480610986575061098581610980611bf5565b61186e565b5b6109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90613b35565b60405180910390fd5b6109d0838383611bfd565b505050565b6109dd611bf5565b73ffffffffffffffffffffffffffffffffffffffff166109fb611312565b73ffffffffffffffffffffffffffffffffffffffff1614610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4890613b95565b60405180910390fd5b80600f8190555050565b60008054905090565b601060009054906101000a900460ff1681565b610a82838383611caf565b505050565b610a8f611bf5565b73ffffffffffffffffffffffffffffffffffffffff16610aad611312565b73ffffffffffffffffffffffffffffffffffffffff1614610b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afa90613b95565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b600080610b2c84611be8565b610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6290613b15565b60405180910390fd5b30610b81610b7a856005612268565b606461227e565b915091509250929050565b6000610b978361110f565b8210610bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcf90613a35565b60405180910390fd5b6000610be2610a5b565b905060008060005b83811015610d48576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610cdc57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d345786841415610d25578195505050505050610d84565b8380610d3090614141565b9450505b508080610d4090614141565b915050610bea565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7b90613c75565b60405180910390fd5b92915050565b610d92611bf5565b73ffffffffffffffffffffffffffffffffffffffff16610db0611312565b73ffffffffffffffffffffffffffffffffffffffff1614610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90613b95565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e51573d6000803e3d6000fd5b5050565b610e70838383604051806020016040528060008152506116e0565b505050565b610e7d611bf5565b73ffffffffffffffffffffffffffffffffffffffff16610e9b611312565b73ffffffffffffffffffffffffffffffffffffffff1614610ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee890613b95565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610f2c9190613968565b60206040518083038186803b158015610f4457600080fd5b505afa158015610f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7c9190613412565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610fb99291906139cf565b602060405180830381600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100b91906132bb565b505050565b600061101a610a5b565b821061105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105290613a95565b60405180910390fd5b819050919050565b61106b611bf5565b73ffffffffffffffffffffffffffffffffffffffff16611089611312565b73ffffffffffffffffffffffffffffffffffffffff16146110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d690613b95565b60405180910390fd5b80600b90805190602001906110f5929190612e51565b5050565b600061110482612294565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117790613b55565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6060600b8054611207906140de565b80601f0160208091040260200160405190810160405280929190818152602001828054611233906140de565b80156112805780601f1061125557610100808354040283529160200191611280565b820191906000526020600020905b81548152906001019060200180831161126357829003601f168201915b5050505050905090565b611292611bf5565b73ffffffffffffffffffffffffffffffffffffffff166112b0611312565b73ffffffffffffffffffffffffffffffffffffffff1614611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd90613b95565b60405180910390fd5b6113106000612497565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461134b906140de565b80601f0160208091040260200160405190810160405280929190818152602001828054611377906140de565b80156113c45780601f10611399576101008083540402835291602001916113c4565b820191906000526020600020905b8154815290600101906020018083116113a757829003601f168201915b5050505050905090565b600f5481565b6002600954141561141a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141190613c95565b60405180910390fd5b6002600981905550601060009054906101000a900460ff16611471576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146890613cd5565b60405180910390fd5b80600f5481111561148157600080fd5b80600f5461148f9190613f8a565b600f8190555081600e54816114a2610a5b565b6114ac9190613e75565b11156114ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e490613ab5565b60405180910390fd5b826002811115611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152990613af5565b60405180910390fd5b600261153d3361110f565b1061154757600080fd5b6115513385611bca565b505050600160098190555050565b611567611bf5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115cc90613bb5565b60405180910390fd5b80600660006115e2611bf5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661168f611bf5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116d491906139f8565b60405180910390a35050565b6116eb848484611caf565b6116f78484848461255d565b611736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172d90613c15565b60405180910390fd5b50505050565b600281565b606061174c82611be8565b61178b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178290613b15565b60405180910390fd5b600b6117a260018461179d9190613e75565b6126f4565b6040516020016117b3929190613939565b6040516020818303038152906040529050919050565b600e5481565b60075481565b6117dd611bf5565b73ffffffffffffffffffffffffffffffffffffffff166117fb611312565b73ffffffffffffffffffffffffffffffffffffffff1614611851576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184890613b95565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600c60149054906101000a900460ff16801561196557508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016118fd9190613968565b60206040518083038186803b15801561191557600080fd5b505afa158015611929573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194d919061336f565b73ffffffffffffffffffffffffffffffffffffffff16145b15611974576001915050611982565b61197e8484612855565b9150505b92915050565b611990611bf5565b73ffffffffffffffffffffffffffffffffffffffff166119ae611312565b73ffffffffffffffffffffffffffffffffffffffff1614611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb90613b95565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6b90613a55565b60405180910390fd5b611a7d81612497565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b4b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611bb357507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611bc35750611bc2826128e9565b5b9050919050565b611be4828260405180602001604052806000815250612953565b5050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611cba82612294565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611ce1611bf5565b73ffffffffffffffffffffffffffffffffffffffff161480611d3d5750611d06611bf5565b73ffffffffffffffffffffffffffffffffffffffff16611d2584610837565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d595750611d588260000151611d53611bf5565b61186e565b5b905080611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9290613bd5565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611e0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0490613b75565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7490613ad5565b60405180910390fd5b611e8a8585856001612e32565b611e9a6000848460000151611bfd565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611f089190613f56565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611fac9190613e2f565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846120b29190613e75565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121f85761212881611be8565b156121f7576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122608686866001612e38565b505050505050565b600081836122769190613efc565b905092915050565b6000818361228c9190613ecb565b905092915050565b61229c612ed7565b6122a582611be8565b6122e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122db90613a75565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000bb883106123485760017f0000000000000000000000000000000000000000000000000000000000000bb88461233b9190613f8a565b6123459190613e75565b90505b60008390505b818110612456576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461244257809350505050612492565b50808061244e906140b4565b91505061234e565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248990613cb5565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061257e8473ffffffffffffffffffffffffffffffffffffffff16612e3e565b156126e7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125a7611bf5565b8786866040518563ffffffff1660e01b81526004016125c99493929190613983565b602060405180830381600087803b1580156125e357600080fd5b505af192505050801561261457506040513d601f19601f820116820180604052508101906126119190613315565b60015b612697573d8060008114612644576040519150601f19603f3d011682016040523d82523d6000602084013e612649565b606091505b5060008151141561268f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268690613c15565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126ec565b600190505b949350505050565b6060600082141561273c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612850565b600082905060005b6000821461276e57808061275790614141565b915050600a826127679190613ecb565b9150612744565b60008167ffffffffffffffff81111561278a57612789614277565b5b6040519080825280601f01601f1916602001820160405280156127bc5781602001600182028036833780820191505090505b5090505b60008514612849576001826127d59190613f8a565b9150600a856127e4919061418a565b60306127f09190613e75565b60f81b81838151811061280657612805614248565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128429190613ecb565b94506127c0565b8093505050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156129c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c090613c55565b60405180910390fd5b6129d281611be8565b15612a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0990613c35565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000bb8831115612a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6c90613d15565b60405180910390fd5b612a826000858386612e32565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612b7f9190613e2f565b6fffffffffffffffffffffffffffffffff168152602001858360200151612ba69190613e2f565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612e1557818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612db5600088848861255d565b612df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612deb90613c15565b60405180910390fd5b8180612dff90614141565b9250508080612e0d90614141565b915050612d44565b5080600081905550612e2a6000878588612e38565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b828054612e5d906140de565b90600052602060002090601f016020900481019282612e7f5760008555612ec6565b82601f10612e9857805160ff1916838001178555612ec6565b82800160010185558215612ec6579182015b82811115612ec5578251825591602001919060010190612eaa565b5b509050612ed39190612f11565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115612f2a576000816000905550600101612f12565b5090565b6000612f41612f3c84613d75565b613d50565b905082815260208101848484011115612f5d57612f5c6142ab565b5b612f68848285614072565b509392505050565b6000612f83612f7e84613da6565b613d50565b905082815260208101848484011115612f9f57612f9e6142ab565b5b612faa848285614072565b509392505050565b600081359050612fc181614978565b92915050565b600081359050612fd68161498f565b92915050565b600081519050612feb8161498f565b92915050565b600081359050613000816149a6565b92915050565b600081519050613015816149a6565b92915050565b600082601f8301126130305761302f6142a6565b5b8135613040848260208601612f2e565b91505092915050565b600081359050613058816149bd565b92915050565b60008151905061306d816149d4565b92915050565b600082601f830112613088576130876142a6565b5b8135613098848260208601612f70565b91505092915050565b6000813590506130b0816149eb565b92915050565b6000815190506130c5816149eb565b92915050565b6000602082840312156130e1576130e06142b5565b5b60006130ef84828501612fb2565b91505092915050565b6000806040838503121561310f5761310e6142b5565b5b600061311d85828601612fb2565b925050602061312e85828601612fb2565b9150509250929050565b600080600060608486031215613151576131506142b5565b5b600061315f86828701612fb2565b935050602061317086828701612fb2565b9250506040613181868287016130a1565b9150509250925092565b600080600080608085870312156131a5576131a46142b5565b5b60006131b387828801612fb2565b94505060206131c487828801612fb2565b93505060406131d5878288016130a1565b925050606085013567ffffffffffffffff8111156131f6576131f56142b0565b5b6132028782880161301b565b91505092959194509250565b60008060408385031215613225576132246142b5565b5b600061323385828601612fb2565b925050602061324485828601612fc7565b9150509250929050565b60008060408385031215613265576132646142b5565b5b600061327385828601612fb2565b9250506020613284858286016130a1565b9150509250929050565b6000602082840312156132a4576132a36142b5565b5b60006132b284828501612fc7565b91505092915050565b6000602082840312156132d1576132d06142b5565b5b60006132df84828501612fdc565b91505092915050565b6000602082840312156132fe576132fd6142b5565b5b600061330c84828501612ff1565b91505092915050565b60006020828403121561332b5761332a6142b5565b5b600061333984828501613006565b91505092915050565b600060208284031215613358576133576142b5565b5b600061336684828501613049565b91505092915050565b600060208284031215613385576133846142b5565b5b60006133938482850161305e565b91505092915050565b6000602082840312156133b2576133b16142b5565b5b600082013567ffffffffffffffff8111156133d0576133cf6142b0565b5b6133dc84828501613073565b91505092915050565b6000602082840312156133fb576133fa6142b5565b5b6000613409848285016130a1565b91505092915050565b600060208284031215613428576134276142b5565b5b6000613436848285016130b6565b91505092915050565b60008060408385031215613456576134556142b5565b5b6000613464858286016130a1565b9250506020613475858286016130a1565b9150509250929050565b61348881613fbe565b82525050565b61349781613fd0565b82525050565b60006134a882613dec565b6134b28185613e02565b93506134c2818560208601614081565b6134cb816142ba565b840191505092915050565b60006134e182613df7565b6134eb8185613e13565b93506134fb818560208601614081565b613504816142ba565b840191505092915050565b600061351a82613df7565b6135248185613e24565b9350613534818560208601614081565b80840191505092915050565b6000815461354d816140de565b6135578186613e24565b945060018216600081146135725760018114613583576135b6565b60ff198316865281860193506135b6565b61358c85613dd7565b60005b838110156135ae5781548189015260018201915060208101905061358f565b838801955050505b50505092915050565b60006135cc602283613e13565b91506135d7826142cb565b604082019050919050565b60006135ef602683613e13565b91506135fa8261431a565b604082019050919050565b6000613612602a83613e13565b915061361d82614369565b604082019050919050565b6000613635602383613e13565b9150613640826143b8565b604082019050919050565b6000613658602283613e13565b915061366382614407565b604082019050919050565b600061367b602583613e13565b915061368682614456565b604082019050919050565b600061369e602283613e13565b91506136a9826144a5565b604082019050919050565b60006136c1601183613e13565b91506136cc826144f4565b602082019050919050565b60006136e4603983613e13565b91506136ef8261451d565b604082019050919050565b6000613707602b83613e13565b91506137128261456c565b604082019050919050565b600061372a602683613e13565b9150613735826145bb565b604082019050919050565b600061374d602083613e13565b91506137588261460a565b602082019050919050565b6000613770601a83613e13565b915061377b82614633565b602082019050919050565b6000613793603283613e13565b915061379e8261465c565b604082019050919050565b60006137b6602283613e13565b91506137c1826146ab565b604082019050919050565b60006137d9603383613e13565b91506137e4826146fa565b604082019050919050565b60006137fc601d83613e13565b915061380782614749565b602082019050919050565b600061381f602183613e13565b915061382a82614772565b604082019050919050565b6000613842602e83613e13565b915061384d826147c1565b604082019050919050565b6000613865601f83613e13565b915061387082614810565b602082019050919050565b6000613888602f83613e13565b915061389382614839565b604082019050919050565b60006138ab601783613e13565b91506138b682614888565b602082019050919050565b60006138ce602d83613e13565b91506138d9826148b1565b604082019050919050565b60006138f1602283613e13565b91506138fc82614900565b604082019050919050565b6000613914600183613e24565b915061391f8261494f565b600182019050919050565b61393381614068565b82525050565b60006139458285613540565b915061395082613907565b915061395c828461350f565b91508190509392505050565b600060208201905061397d600083018461347f565b92915050565b6000608082019050613998600083018761347f565b6139a5602083018661347f565b6139b2604083018561392a565b81810360608301526139c4818461349d565b905095945050505050565b60006040820190506139e4600083018561347f565b6139f1602083018461392a565b9392505050565b6000602082019050613a0d600083018461348e565b92915050565b60006020820190508181036000830152613a2d81846134d6565b905092915050565b60006020820190508181036000830152613a4e816135bf565b9050919050565b60006020820190508181036000830152613a6e816135e2565b9050919050565b60006020820190508181036000830152613a8e81613605565b9050919050565b60006020820190508181036000830152613aae81613628565b9050919050565b60006020820190508181036000830152613ace8161364b565b9050919050565b60006020820190508181036000830152613aee8161366e565b9050919050565b60006020820190508181036000830152613b0e81613691565b9050919050565b60006020820190508181036000830152613b2e816136b4565b9050919050565b60006020820190508181036000830152613b4e816136d7565b9050919050565b60006020820190508181036000830152613b6e816136fa565b9050919050565b60006020820190508181036000830152613b8e8161371d565b9050919050565b60006020820190508181036000830152613bae81613740565b9050919050565b60006020820190508181036000830152613bce81613763565b9050919050565b60006020820190508181036000830152613bee81613786565b9050919050565b60006020820190508181036000830152613c0e816137a9565b9050919050565b60006020820190508181036000830152613c2e816137cc565b9050919050565b60006020820190508181036000830152613c4e816137ef565b9050919050565b60006020820190508181036000830152613c6e81613812565b9050919050565b60006020820190508181036000830152613c8e81613835565b9050919050565b60006020820190508181036000830152613cae81613858565b9050919050565b60006020820190508181036000830152613cce8161387b565b9050919050565b60006020820190508181036000830152613cee8161389e565b9050919050565b60006020820190508181036000830152613d0e816138c1565b9050919050565b60006020820190508181036000830152613d2e816138e4565b9050919050565b6000602082019050613d4a600083018461392a565b92915050565b6000613d5a613d6b565b9050613d668282614110565b919050565b6000604051905090565b600067ffffffffffffffff821115613d9057613d8f614277565b5b613d99826142ba565b9050602081019050919050565b600067ffffffffffffffff821115613dc157613dc0614277565b5b613dca826142ba565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613e3a8261402c565b9150613e458361402c565b9250826fffffffffffffffffffffffffffffffff03821115613e6a57613e696141bb565b5b828201905092915050565b6000613e8082614068565b9150613e8b83614068565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ec057613ebf6141bb565b5b828201905092915050565b6000613ed682614068565b9150613ee183614068565b925082613ef157613ef06141ea565b5b828204905092915050565b6000613f0782614068565b9150613f1283614068565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f4b57613f4a6141bb565b5b828202905092915050565b6000613f618261402c565b9150613f6c8361402c565b925082821015613f7f57613f7e6141bb565b5b828203905092915050565b6000613f9582614068565b9150613fa083614068565b925082821015613fb357613fb26141bb565b5b828203905092915050565b6000613fc982614048565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061401382613fbe565b9050919050565b600061402582613fbe565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561409f578082015181840152602081019050614084565b838111156140ae576000848401525b50505050565b60006140bf82614068565b915060008214156140d3576140d26141bb565b5b600182039050919050565b600060028204905060018216806140f657607f821691505b6020821081141561410a57614109614219565b5b50919050565b614119826142ba565b810181811067ffffffffffffffff8211171561413857614137614277565b5b80604052505050565b600061414c82614068565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561417f5761417e6141bb565b5b600182019050919050565b600061419582614068565b91506141a083614068565b9250826141b0576141af6141ea565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206d696e74732072656d61696e696e6720746f206d6960008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b61498181613fbe565b811461498c57600080fd5b50565b61499881613fd0565b81146149a357600080fd5b50565b6149af81613fdc565b81146149ba57600080fd5b50565b6149c681614008565b81146149d157600080fd5b50565b6149dd8161401a565b81146149e857600080fd5b50565b6149f481614068565b81146149ff57600080fd5b5056fea2646970667358221220fbfbfc6486758a051d45eb52397d21dc3c98738f65b82689c8a1643835f7370164736f6c63430008070033

Deployed Bytecode Sourcemap

57925:6254:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62388:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60551:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45774:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47469:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46990:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61685:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42169:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58554:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48496:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61519:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63858:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;42877:864;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61809:143;;;:::i;:::-;;48729:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61960:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42346:228;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61121:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45583:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44299:258;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60957:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19355:103;;;:::i;:::-;;18704:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45943:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58505:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60197:346;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47833:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48977:355;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58414:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63505:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58465:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53858:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61345:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62817:617;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19613:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62388:292;62536:4;62593:26;62578:41;;;:11;:41;;;;:94;;;;62636:36;62660:11;62636:23;:36::i;:::-;62578:94;62558:114;;62388:292;;;:::o;60551:215::-;60637:14;59105:9;;59087:14;59071:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;59049:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;60703:4:::1;60677:30;;:10;:22;60688:10;60677:22;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;60669:39;;;::::0;::::1;;60721:37;60731:10;60743:14;60721:9;:37::i;:::-;60551:215:::0;;:::o;45774:100::-;45828:13;45861:5;45854:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45774:100;:::o;47469:292::-;47573:7;47620:16;47628:7;47620;:16::i;:::-;47598:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;47729:15;:24;47745:7;47729:24;;;;;;;;;;;;;;;;;;;;;47722:31;;47469:292;;;:::o;46990:413::-;47063:13;47079:24;47095:7;47079:15;:24::i;:::-;47063:40;;47128:5;47122:11;;:2;:11;;;;47114:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47223:5;47207:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;47232:37;47249:5;47256:12;:10;:12::i;:::-;47232:16;:37::i;:::-;47207:62;47185:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;47367:28;47376:2;47380:7;47389:5;47367:8;:28::i;:::-;47052:351;46990:413;;:::o;61685:116::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61780:13:::1;61763:14;:30;;;;61685:116:::0;:::o;42169:100::-;42222:7;42249:12;;42242:19;;42169:100;:::o;58554:37::-;;;;;;;;;;;;;:::o;48496:162::-;48622:28;48632:4;48638:2;48642:7;48622:9;:28::i;:::-;48496:162;;;:::o;61519:158::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61650:19:::1;61629:18;;:40;;;;;;;;;;;;;;;;;;61519:158:::0;:::o;63858:318::-;63983:16;64001:21;64048:16;64056:7;64048;:16::i;:::-;64040:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;64115:4;64122:45;64135:26;64148:9;64159:1;64135:12;:26::i;:::-;64163:3;64122:12;:45::i;:::-;64099:69;;;;63858:318;;;;;:::o;42877:864::-;43002:7;43043:16;43053:5;43043:9;:16::i;:::-;43035:5;:24;43027:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43109:22;43134:13;:11;:13::i;:::-;43109:38;;43158:19;43192:25;43246:9;43241:426;43265:14;43261:1;:18;43241:426;;;43301:31;43335:11;:14;43347:1;43335:14;;;;;;;;;;;43301:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43394:1;43368:28;;:9;:14;;;:28;;;43364:103;;43437:9;:14;;;43417:34;;43364:103;43506:5;43485:26;;:17;:26;;;43481:175;;;43551:5;43536:11;:20;43532:77;;;43588:1;43581:8;;;;;;;;;43532:77;43627:13;;;;;:::i;:::-;;;;43481:175;43286:381;43281:3;;;;;:::i;:::-;;;;43241:426;;;;43677:56;;;;;;;;;;:::i;:::-;;;;;;;;42877:864;;;;;:::o;61809:143::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61857:15:::1;61875:21;61857:39;;61915:10;61907:28;;:37;61936:7;61907:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;61846:106;61809:143::o:0;48729:177::-;48859:39;48876:4;48882:2;48886:7;48859:39;;;;;;;;;;;;:16;:39::i;:::-;48729:177;;;:::o;61960:168::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62026:15:::1;62044:5;:15;;;62068:4;62044:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62026:48;;62085:5;:14;;;62100:10;62112:7;62085:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;62015:113;61960:168:::0;:::o;42346:228::-;42449:7;42490:13;:11;:13::i;:::-;42482:5;:21;42474:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;42561:5;42554:12;;42346:228;;;:::o;61121:100::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61205:8:::1;61195:7;:18;;;;;;;;;;;;:::i;:::-;;61121:100:::0;:::o;45583:124::-;45647:7;45674:20;45686:7;45674:11;:20::i;:::-;:25;;;45667:32;;45583:124;;;:::o;44299:258::-;44363:7;44422:1;44405:19;;:5;:19;;;;44383:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;44521:12;:19;44534:5;44521:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;44513:36;;44506:43;;44299:258;;;:::o;60957:93::-;61002:13;61035:7;61028:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60957:93;:::o;19355:103::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19420:30:::1;19447:1;19420:18;:30::i;:::-;19355:103::o:0;18704:87::-;18750:7;18777:6;;;;;;;;;;;18770:13;;18704:87;:::o;45943:104::-;45999:13;46032:7;46025:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45943:104;:::o;58505:42::-;;;;:::o;60197:346::-;10511:1;11109:7;;:19;;11101:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;10511:1;11242:7;:18;;;;58715::::1;;;;;;;;;;;58707:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;60328:14:::2;59774;;59756;:32;;59748:41;;;::::0;::::2;;59834:14;59817;;:31;;;;:::i;:::-;59800:14;:48;;;;60365:14:::3;59105:9;;59087:14;59071:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:43;;59049:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;60404:14:::4;58457:1;58869:14;:34;;58847:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;58457:1:::5;60444:21;60454:10;60444:9;:21::i;:::-;:40;60436:49;;;::::0;::::5;;60498:37;60508:10;60520:14;60498:9;:37::i;:::-;59187:1:::4;59859::::3;58772::::2;10467::::0;11421:7;:22;;;;60197:346;:::o;47833:311::-;47963:12;:10;:12::i;:::-;47951:24;;:8;:24;;;;47943:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;48064:8;48019:18;:32;48038:12;:10;:12::i;:::-;48019:32;;;;;;;;;;;;;;;:42;48052:8;48019:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;48117:8;48088:48;;48103:12;:10;:12::i;:::-;48088:48;;;48127:8;48088:48;;;;;;:::i;:::-;;;;;;;;47833:311;;:::o;48977:355::-;49136:28;49146:4;49152:2;49156:7;49136:9;:28::i;:::-;49197:48;49220:4;49226:2;49230:7;49239:5;49197:22;:48::i;:::-;49175:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;48977:355;;;;:::o;58414:44::-;58457:1;58414:44;:::o;63505:287::-;63623:13;63662:16;63670:7;63662;:16::i;:::-;63654:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;63744:7;63758:24;63769:1;63759:7;:11;;;;:::i;:::-;63758:22;:24::i;:::-;63727:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63713:71;;63505:287;;;:::o;58465:31::-;;;;:::o;53858:43::-;;;;:::o;61345:166::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61482:21:::1;61459:20;;:44;;;;;;;;;;;;;;;;;;61345:166:::0;:::o;62817:617::-;62942:4;63107:27;63165;;;;;;;;;;;63107:96;;63232:20;;;;;;;;;;;:86;;;;;63310:8;63269:49;;63277:13;:21;;;63299:5;63277:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63269:49;;;63232:86;63214:154;;;63352:4;63345:11;;;;;63214:154;63387:39;63410:5;63417:8;63387:22;:39::i;:::-;63380:46;;;62817:617;;;;;:::o;19613:238::-;18935:12;:10;:12::i;:::-;18924:23;;:7;:5;:7::i;:::-;:23;;;18916:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19736:1:::1;19716:22;;:8;:22;;;;19694:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;19815:28;19834:8;19815:18;:28::i;:::-;19613:238:::0;:::o;43813:422::-;43960:4;44017:25;44002:40;;;:11;:40;;;;:105;;;;44074:33;44059:48;;;:11;:48;;;;44002:105;:172;;;;44139:35;44124:50;;;:11;:50;;;;44002:172;:225;;;;44191:36;44215:11;44191:23;:36::i;:::-;44002:225;43982:245;;43813:422;;;:::o;49706:104::-;49775:27;49785:2;49789:8;49775:27;;;;;;;;;;;;:9;:27::i;:::-;49706:104;;:::o;49587:111::-;49644:4;49678:12;;49668:7;:22;49661:29;;49587:111;;;:::o;17407:98::-;17460:7;17487:10;17480:17;;17407:98;:::o;53654:196::-;53796:2;53769:15;:24;53785:7;53769:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;53834:7;53830:2;53814:28;;53823:5;53814:28;;;;;;;;;;;;53654:196;;;:::o;51827:1709::-;51942:35;51980:20;51992:7;51980:11;:20::i;:::-;51942:58;;52013:22;52055:13;:18;;;52039:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;52114:12;:10;:12::i;:::-;52090:36;;:20;52102:7;52090:11;:20::i;:::-;:36;;;52039:87;:154;;;;52143:50;52160:13;:18;;;52180:12;:10;:12::i;:::-;52143:16;:50::i;:::-;52039:154;52013:181;;52229:17;52207:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;52381:4;52359:26;;:13;:18;;;:26;;;52337:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;52484:1;52470:16;;:2;:16;;;;52462:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;52541:43;52563:4;52569:2;52573:7;52582:1;52541:21;:43::i;:::-;52649:49;52666:1;52670:7;52679:13;:18;;;52649:8;:49::i;:::-;52741:1;52711:12;:18;52724:4;52711:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52781:1;52753:12;:16;52766:2;52753:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;52816:43;;;;;;;;52831:2;52816:43;;;;;;52842:15;52816:43;;;;;52793:11;:20;52805:7;52793:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53099:19;53131:1;53121:7;:11;;;;:::i;:::-;53099:33;;53188:1;53147:43;;:11;:24;53159:11;53147:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;53143:288;;;53211:20;53219:11;53211:7;:20::i;:::-;53207:213;;;53279:125;;;;;;;;53316:13;:18;;;53279:125;;;;;;53357:13;:28;;;53279:125;;;;;53252:11;:24;53264:11;53252:24;;;;;;;;;;;:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53207:213;53143:288;53467:7;53463:2;53448:27;;53457:4;53448:27;;;;;;;;;;;;53486:42;53507:4;53513:2;53517:7;53526:1;53486:20;:42::i;:::-;51931:1605;;;51827:1709;;;:::o;3811:98::-;3869:7;3900:1;3896;:5;;;;:::i;:::-;3889:12;;3811:98;;;;:::o;4210:::-;4268:7;4299:1;4295;:5;;;;:::i;:::-;4288:12;;4210:98;;;;:::o;44839:682::-;44927:21;;:::i;:::-;44974:16;44982:7;44974;:16::i;:::-;44966:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;45050:26;45102:12;45091:7;:23;45087:103;;45177:1;45162:12;45152:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;45131:47;;45087:103;45207:12;45222:7;45207:22;;45202:242;45239:18;45231:4;:26;45202:242;;45282:31;45316:11;:17;45328:4;45316:17;;;;;;;;;;;45282:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45378:1;45352:28;;:9;:14;;;:28;;;45348:85;;45408:9;45401:16;;;;;;;45348:85;45267:177;45259:6;;;;;:::i;:::-;;;;45202:242;;;;45456:57;;;;;;;;;;:::i;:::-;;;;;;;;44839:682;;;;:::o;20011:191::-;20085:16;20104:6;;;;;;;;;;;20085:25;;20130:8;20121:6;;:17;;;;;;;;;;;;;;;;;;20185:8;20154:40;;20175:8;20154:40;;;;;;;;;;;;20074:128;20011:191;:::o;55529:985::-;55684:4;55705:15;:2;:13;;;:15::i;:::-;55701:806;;;55774:2;55758:36;;;55817:12;:10;:12::i;:::-;55852:4;55879:7;55909:5;55758:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55737:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56137:1;56120:6;:13;:18;56116:321;;;56163:109;;;;;;;;;;:::i;:::-;;;;;;;;56116:321;56387:6;56381:13;56372:6;56368:2;56364:15;56357:38;55737:715;56007:45;;;55997:55;;;:6;:55;;;;55990:62;;;;;55701:806;56491:4;56484:11;;55529:985;;;;;;;:::o;14939:723::-;14995:13;15225:1;15216:5;:10;15212:53;;;15243:10;;;;;;;;;;;;;;;;;;;;;15212:53;15275:12;15290:5;15275:20;;15306:14;15331:78;15346:1;15338:4;:9;15331:78;;15364:8;;;;;:::i;:::-;;;;15395:2;15387:10;;;;;:::i;:::-;;;15331:78;;;15419:19;15451:6;15441:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15419:39;;15469:154;15485:1;15476:5;:10;15469:154;;15513:1;15503:11;;;;;:::i;:::-;;;15580:2;15572:5;:10;;;;:::i;:::-;15559:2;:24;;;;:::i;:::-;15546:39;;15529:6;15536;15529:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;15609:2;15600:11;;;;;:::i;:::-;;;15469:154;;;15647:6;15633:21;;;;;14939:723;;;;:::o;48215:214::-;48357:4;48386:18;:25;48405:5;48386:25;;;;;;;;;;;;;;;:35;48412:8;48386:35;;;;;;;;;;;;;;;;;;;;;;;;;48379:42;;48215:214;;;;:::o;32590:207::-;32720:4;32764:25;32749:40;;;:11;:40;;;;32742:47;;32590:207;;;:::o;50173:1400::-;50296:20;50319:12;;50296:35;;50364:1;50350:16;;:2;:16;;;;50342:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50549:21;50557:12;50549:7;:21::i;:::-;50548:22;50540:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50635:12;50623:8;:24;;50615:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;50699:61;50729:1;50733:2;50737:12;50751:8;50699:21;:61::i;:::-;50773:30;50806:12;:16;50819:2;50806:16;;;;;;;;;;;;;;;50773:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50852:135;;;;;;;;50908:8;50878:11;:19;;;:39;;;;:::i;:::-;50852:135;;;;;;50967:8;50932:11;:24;;;:44;;;;:::i;:::-;50852:135;;;;;50833:12;:16;50846:2;50833:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51026:43;;;;;;;;51041:2;51026:43;;;;;;51052:15;51026:43;;;;;50998:11;:25;51010:12;50998:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51082:20;51105:12;51082:35;;51135:9;51130:325;51154:8;51150:1;:12;51130:325;;;51214:12;51210:2;51189:38;;51206:1;51189:38;;;;;;;;;;;;51268:59;51299:1;51303:2;51307:12;51321:5;51268:22;:59::i;:::-;51242:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;51429:14;;;;;:::i;:::-;;;;51164:3;;;;;:::i;:::-;;;;51130:325;;;;51482:12;51467;:27;;;;51505:60;51534:1;51538:2;51542:12;51556:8;51505:20;:60::i;:::-;50285:1288;;;50173:1400;;;:::o;57002:159::-;;;;;:::o;57573:158::-;;;;;:::o;21027:387::-;21087:4;21295:12;21362:7;21350:20;21342:28;;21405:1;21398:4;:8;21391:15;;;21027:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1915:167::-;1975:5;2013:6;2000:20;1991:29;;2029:47;2070:5;2029:47;:::i;:::-;1915:167;;;;:::o;2088:201::-;2174:5;2205:6;2199:13;2190:22;;2221:62;2277:5;2221:62;:::i;:::-;2088:201;;;;:::o;2309:340::-;2365:5;2414:3;2407:4;2399:6;2395:17;2391:27;2381:122;;2422:79;;:::i;:::-;2381:122;2539:6;2526:20;2564:79;2639:3;2631:6;2624:4;2616:6;2612:17;2564:79;:::i;:::-;2555:88;;2371:278;2309:340;;;;:::o;2655:139::-;2701:5;2739:6;2726:20;2717:29;;2755:33;2782:5;2755:33;:::i;:::-;2655:139;;;;:::o;2800:143::-;2857:5;2888:6;2882:13;2873:22;;2904:33;2931:5;2904:33;:::i;:::-;2800:143;;;;:::o;2949:329::-;3008:6;3057:2;3045:9;3036:7;3032:23;3028:32;3025:119;;;3063:79;;:::i;:::-;3025:119;3183:1;3208:53;3253:7;3244:6;3233:9;3229:22;3208:53;:::i;:::-;3198:63;;3154:117;2949:329;;;;:::o;3284:474::-;3352:6;3360;3409:2;3397:9;3388:7;3384:23;3380:32;3377:119;;;3415:79;;:::i;:::-;3377:119;3535:1;3560:53;3605:7;3596:6;3585:9;3581:22;3560:53;:::i;:::-;3550:63;;3506:117;3662:2;3688:53;3733:7;3724:6;3713:9;3709:22;3688:53;:::i;:::-;3678:63;;3633:118;3284:474;;;;;:::o;3764:619::-;3841:6;3849;3857;3906:2;3894:9;3885:7;3881:23;3877:32;3874:119;;;3912:79;;:::i;:::-;3874:119;4032:1;4057:53;4102:7;4093:6;4082:9;4078:22;4057:53;:::i;:::-;4047:63;;4003:117;4159:2;4185:53;4230:7;4221:6;4210:9;4206:22;4185:53;:::i;:::-;4175:63;;4130:118;4287:2;4313:53;4358:7;4349:6;4338:9;4334:22;4313:53;:::i;:::-;4303:63;;4258:118;3764:619;;;;;:::o;4389:943::-;4484:6;4492;4500;4508;4557:3;4545:9;4536:7;4532:23;4528:33;4525:120;;;4564:79;;:::i;:::-;4525:120;4684:1;4709:53;4754:7;4745:6;4734:9;4730:22;4709:53;:::i;:::-;4699:63;;4655:117;4811:2;4837:53;4882:7;4873:6;4862:9;4858:22;4837:53;:::i;:::-;4827:63;;4782:118;4939:2;4965:53;5010:7;5001:6;4990:9;4986:22;4965:53;:::i;:::-;4955:63;;4910:118;5095:2;5084:9;5080:18;5067:32;5126:18;5118:6;5115:30;5112:117;;;5148:79;;:::i;:::-;5112:117;5253:62;5307:7;5298:6;5287:9;5283:22;5253:62;:::i;:::-;5243:72;;5038:287;4389:943;;;;;;;:::o;5338:468::-;5403:6;5411;5460:2;5448:9;5439:7;5435:23;5431:32;5428:119;;;5466:79;;:::i;:::-;5428:119;5586:1;5611:53;5656:7;5647:6;5636:9;5632:22;5611:53;:::i;:::-;5601:63;;5557:117;5713:2;5739:50;5781:7;5772:6;5761:9;5757:22;5739:50;:::i;:::-;5729:60;;5684:115;5338:468;;;;;:::o;5812:474::-;5880:6;5888;5937:2;5925:9;5916:7;5912:23;5908:32;5905:119;;;5943:79;;:::i;:::-;5905:119;6063:1;6088:53;6133:7;6124:6;6113:9;6109:22;6088:53;:::i;:::-;6078:63;;6034:117;6190:2;6216:53;6261:7;6252:6;6241:9;6237:22;6216:53;:::i;:::-;6206:63;;6161:118;5812:474;;;;;:::o;6292:323::-;6348:6;6397:2;6385:9;6376:7;6372:23;6368:32;6365:119;;;6403:79;;:::i;:::-;6365:119;6523:1;6548:50;6590:7;6581:6;6570:9;6566:22;6548:50;:::i;:::-;6538:60;;6494:114;6292:323;;;;:::o;6621:345::-;6688:6;6737:2;6725:9;6716:7;6712:23;6708:32;6705:119;;;6743:79;;:::i;:::-;6705:119;6863:1;6888:61;6941:7;6932:6;6921:9;6917:22;6888:61;:::i;:::-;6878:71;;6834:125;6621:345;;;;:::o;6972:327::-;7030:6;7079:2;7067:9;7058:7;7054:23;7050:32;7047:119;;;7085:79;;:::i;:::-;7047:119;7205:1;7230:52;7274:7;7265:6;7254:9;7250:22;7230:52;:::i;:::-;7220:62;;7176:116;6972:327;;;;:::o;7305:349::-;7374:6;7423:2;7411:9;7402:7;7398:23;7394:32;7391:119;;;7429:79;;:::i;:::-;7391:119;7549:1;7574:63;7629:7;7620:6;7609:9;7605:22;7574:63;:::i;:::-;7564:73;;7520:127;7305:349;;;;:::o;7660:357::-;7733:6;7782:2;7770:9;7761:7;7757:23;7753:32;7750:119;;;7788:79;;:::i;:::-;7750:119;7908:1;7933:67;7992:7;7983:6;7972:9;7968:22;7933:67;:::i;:::-;7923:77;;7879:131;7660:357;;;;:::o;8023:409::-;8122:6;8171:2;8159:9;8150:7;8146:23;8142:32;8139:119;;;8177:79;;:::i;:::-;8139:119;8297:1;8322:93;8407:7;8398:6;8387:9;8383:22;8322:93;:::i;:::-;8312:103;;8268:157;8023:409;;;;:::o;8438:509::-;8507:6;8556:2;8544:9;8535:7;8531:23;8527:32;8524:119;;;8562:79;;:::i;:::-;8524:119;8710:1;8699:9;8695:17;8682:31;8740:18;8732:6;8729:30;8726:117;;;8762:79;;:::i;:::-;8726:117;8867:63;8922:7;8913:6;8902:9;8898:22;8867:63;:::i;:::-;8857:73;;8653:287;8438:509;;;;:::o;8953:329::-;9012:6;9061:2;9049:9;9040:7;9036:23;9032:32;9029:119;;;9067:79;;:::i;:::-;9029:119;9187:1;9212:53;9257:7;9248:6;9237:9;9233:22;9212:53;:::i;:::-;9202:63;;9158:117;8953:329;;;;:::o;9288:351::-;9358:6;9407:2;9395:9;9386:7;9382:23;9378:32;9375:119;;;9413:79;;:::i;:::-;9375:119;9533:1;9558:64;9614:7;9605:6;9594:9;9590:22;9558:64;:::i;:::-;9548:74;;9504:128;9288:351;;;;:::o;9645:474::-;9713:6;9721;9770:2;9758:9;9749:7;9745:23;9741:32;9738:119;;;9776:79;;:::i;:::-;9738:119;9896:1;9921:53;9966:7;9957:6;9946:9;9942:22;9921:53;:::i;:::-;9911:63;;9867:117;10023:2;10049:53;10094:7;10085:6;10074:9;10070:22;10049:53;:::i;:::-;10039:63;;9994:118;9645:474;;;;;:::o;10125:118::-;10212:24;10230:5;10212:24;:::i;:::-;10207:3;10200:37;10125:118;;:::o;10249:109::-;10330:21;10345:5;10330:21;:::i;:::-;10325:3;10318:34;10249:109;;:::o;10364:360::-;10450:3;10478:38;10510:5;10478:38;:::i;:::-;10532:70;10595:6;10590:3;10532:70;:::i;:::-;10525:77;;10611:52;10656:6;10651:3;10644:4;10637:5;10633:16;10611:52;:::i;:::-;10688:29;10710:6;10688:29;:::i;:::-;10683:3;10679:39;10672:46;;10454:270;10364:360;;;;:::o;10730:364::-;10818:3;10846:39;10879:5;10846:39;:::i;:::-;10901:71;10965:6;10960:3;10901:71;:::i;:::-;10894:78;;10981:52;11026:6;11021:3;11014:4;11007:5;11003:16;10981:52;:::i;:::-;11058:29;11080:6;11058:29;:::i;:::-;11053:3;11049:39;11042:46;;10822:272;10730:364;;;;:::o;11100:377::-;11206:3;11234:39;11267:5;11234:39;:::i;:::-;11289:89;11371:6;11366:3;11289:89;:::i;:::-;11282:96;;11387:52;11432:6;11427:3;11420:4;11413:5;11409:16;11387:52;:::i;:::-;11464:6;11459:3;11455:16;11448:23;;11210:267;11100:377;;;;:::o;11507:845::-;11610:3;11647:5;11641:12;11676:36;11702:9;11676:36;:::i;:::-;11728:89;11810:6;11805:3;11728:89;:::i;:::-;11721:96;;11848:1;11837:9;11833:17;11864:1;11859:137;;;;12010:1;12005:341;;;;11826:520;;11859:137;11943:4;11939:9;11928;11924:25;11919:3;11912:38;11979:6;11974:3;11970:16;11963:23;;11859:137;;12005:341;12072:38;12104:5;12072:38;:::i;:::-;12132:1;12146:154;12160:6;12157:1;12154:13;12146:154;;;12234:7;12228:14;12224:1;12219:3;12215:11;12208:35;12284:1;12275:7;12271:15;12260:26;;12182:4;12179:1;12175:12;12170:17;;12146:154;;;12329:6;12324:3;12320:16;12313:23;;12012:334;;11826:520;;11614:738;;11507:845;;;;:::o;12358:366::-;12500:3;12521:67;12585:2;12580:3;12521:67;:::i;:::-;12514:74;;12597:93;12686:3;12597:93;:::i;:::-;12715:2;12710:3;12706:12;12699:19;;12358:366;;;:::o;12730:::-;12872:3;12893:67;12957:2;12952:3;12893:67;:::i;:::-;12886:74;;12969:93;13058:3;12969:93;:::i;:::-;13087:2;13082:3;13078:12;13071:19;;12730:366;;;:::o;13102:::-;13244:3;13265:67;13329:2;13324:3;13265:67;:::i;:::-;13258:74;;13341:93;13430:3;13341:93;:::i;:::-;13459:2;13454:3;13450:12;13443:19;;13102:366;;;:::o;13474:::-;13616:3;13637:67;13701:2;13696:3;13637:67;:::i;:::-;13630:74;;13713:93;13802:3;13713:93;:::i;:::-;13831:2;13826:3;13822:12;13815:19;;13474:366;;;:::o;13846:::-;13988:3;14009:67;14073:2;14068:3;14009:67;:::i;:::-;14002:74;;14085:93;14174:3;14085:93;:::i;:::-;14203:2;14198:3;14194:12;14187:19;;13846:366;;;:::o;14218:::-;14360:3;14381:67;14445:2;14440:3;14381:67;:::i;:::-;14374:74;;14457:93;14546:3;14457:93;:::i;:::-;14575:2;14570:3;14566:12;14559:19;;14218:366;;;:::o;14590:::-;14732:3;14753:67;14817:2;14812:3;14753:67;:::i;:::-;14746:74;;14829:93;14918:3;14829:93;:::i;:::-;14947:2;14942:3;14938:12;14931:19;;14590:366;;;:::o;14962:::-;15104:3;15125:67;15189:2;15184:3;15125:67;:::i;:::-;15118:74;;15201:93;15290:3;15201:93;:::i;:::-;15319:2;15314:3;15310:12;15303:19;;14962:366;;;:::o;15334:::-;15476:3;15497:67;15561:2;15556:3;15497:67;:::i;:::-;15490:74;;15573:93;15662:3;15573:93;:::i;:::-;15691:2;15686:3;15682:12;15675:19;;15334:366;;;:::o;15706:::-;15848:3;15869:67;15933:2;15928:3;15869:67;:::i;:::-;15862:74;;15945:93;16034:3;15945:93;:::i;:::-;16063:2;16058:3;16054:12;16047:19;;15706:366;;;:::o;16078:::-;16220:3;16241:67;16305:2;16300:3;16241:67;:::i;:::-;16234:74;;16317:93;16406:3;16317:93;:::i;:::-;16435:2;16430:3;16426:12;16419:19;;16078:366;;;:::o;16450:::-;16592:3;16613:67;16677:2;16672:3;16613:67;:::i;:::-;16606:74;;16689:93;16778:3;16689:93;:::i;:::-;16807:2;16802:3;16798:12;16791:19;;16450:366;;;:::o;16822:::-;16964:3;16985:67;17049:2;17044:3;16985:67;:::i;:::-;16978:74;;17061:93;17150:3;17061:93;:::i;:::-;17179:2;17174:3;17170:12;17163:19;;16822:366;;;:::o;17194:::-;17336:3;17357:67;17421:2;17416:3;17357:67;:::i;:::-;17350:74;;17433:93;17522:3;17433:93;:::i;:::-;17551:2;17546:3;17542:12;17535:19;;17194:366;;;:::o;17566:::-;17708:3;17729:67;17793:2;17788:3;17729:67;:::i;:::-;17722:74;;17805:93;17894:3;17805:93;:::i;:::-;17923:2;17918:3;17914:12;17907:19;;17566:366;;;:::o;17938:::-;18080:3;18101:67;18165:2;18160:3;18101:67;:::i;:::-;18094:74;;18177:93;18266:3;18177:93;:::i;:::-;18295:2;18290:3;18286:12;18279:19;;17938:366;;;:::o;18310:::-;18452:3;18473:67;18537:2;18532:3;18473:67;:::i;:::-;18466:74;;18549:93;18638:3;18549:93;:::i;:::-;18667:2;18662:3;18658:12;18651:19;;18310:366;;;:::o;18682:::-;18824:3;18845:67;18909:2;18904:3;18845:67;:::i;:::-;18838:74;;18921:93;19010:3;18921:93;:::i;:::-;19039:2;19034:3;19030:12;19023:19;;18682:366;;;:::o;19054:::-;19196:3;19217:67;19281:2;19276:3;19217:67;:::i;:::-;19210:74;;19293:93;19382:3;19293:93;:::i;:::-;19411:2;19406:3;19402:12;19395:19;;19054:366;;;:::o;19426:::-;19568:3;19589:67;19653:2;19648:3;19589:67;:::i;:::-;19582:74;;19665:93;19754:3;19665:93;:::i;:::-;19783:2;19778:3;19774:12;19767:19;;19426:366;;;:::o;19798:::-;19940:3;19961:67;20025:2;20020:3;19961:67;:::i;:::-;19954:74;;20037:93;20126:3;20037:93;:::i;:::-;20155:2;20150:3;20146:12;20139:19;;19798:366;;;:::o;20170:::-;20312:3;20333:67;20397:2;20392:3;20333:67;:::i;:::-;20326:74;;20409:93;20498:3;20409:93;:::i;:::-;20527:2;20522:3;20518:12;20511:19;;20170:366;;;:::o;20542:::-;20684:3;20705:67;20769:2;20764:3;20705:67;:::i;:::-;20698:74;;20781:93;20870:3;20781:93;:::i;:::-;20899:2;20894:3;20890:12;20883:19;;20542:366;;;:::o;20914:::-;21056:3;21077:67;21141:2;21136:3;21077:67;:::i;:::-;21070:74;;21153:93;21242:3;21153:93;:::i;:::-;21271:2;21266:3;21262:12;21255:19;;20914:366;;;:::o;21286:400::-;21446:3;21467:84;21549:1;21544:3;21467:84;:::i;:::-;21460:91;;21560:93;21649:3;21560:93;:::i;:::-;21678:1;21673:3;21669:11;21662:18;;21286:400;;;:::o;21692:118::-;21779:24;21797:5;21779:24;:::i;:::-;21774:3;21767:37;21692:118;;:::o;21816:695::-;22094:3;22116:92;22204:3;22195:6;22116:92;:::i;:::-;22109:99;;22225:148;22369:3;22225:148;:::i;:::-;22218:155;;22390:95;22481:3;22472:6;22390:95;:::i;:::-;22383:102;;22502:3;22495:10;;21816:695;;;;;:::o;22517:222::-;22610:4;22648:2;22637:9;22633:18;22625:26;;22661:71;22729:1;22718:9;22714:17;22705:6;22661:71;:::i;:::-;22517:222;;;;:::o;22745:640::-;22940:4;22978:3;22967:9;22963:19;22955:27;;22992:71;23060:1;23049:9;23045:17;23036:6;22992:71;:::i;:::-;23073:72;23141:2;23130:9;23126:18;23117:6;23073:72;:::i;:::-;23155;23223:2;23212:9;23208:18;23199:6;23155:72;:::i;:::-;23274:9;23268:4;23264:20;23259:2;23248:9;23244:18;23237:48;23302:76;23373:4;23364:6;23302:76;:::i;:::-;23294:84;;22745:640;;;;;;;:::o;23391:332::-;23512:4;23550:2;23539:9;23535:18;23527:26;;23563:71;23631:1;23620:9;23616:17;23607:6;23563:71;:::i;:::-;23644:72;23712:2;23701:9;23697:18;23688:6;23644:72;:::i;:::-;23391:332;;;;;:::o;23729:210::-;23816:4;23854:2;23843:9;23839:18;23831:26;;23867:65;23929:1;23918:9;23914:17;23905:6;23867:65;:::i;:::-;23729:210;;;;:::o;23945:313::-;24058:4;24096:2;24085:9;24081:18;24073:26;;24145:9;24139:4;24135:20;24131:1;24120:9;24116:17;24109:47;24173:78;24246:4;24237:6;24173:78;:::i;:::-;24165:86;;23945:313;;;;:::o;24264:419::-;24430:4;24468:2;24457:9;24453:18;24445:26;;24517:9;24511:4;24507:20;24503:1;24492:9;24488:17;24481:47;24545:131;24671:4;24545:131;:::i;:::-;24537:139;;24264:419;;;:::o;24689:::-;24855:4;24893:2;24882:9;24878:18;24870:26;;24942:9;24936:4;24932:20;24928:1;24917:9;24913:17;24906:47;24970:131;25096:4;24970:131;:::i;:::-;24962:139;;24689:419;;;:::o;25114:::-;25280:4;25318:2;25307:9;25303:18;25295:26;;25367:9;25361:4;25357:20;25353:1;25342:9;25338:17;25331:47;25395:131;25521:4;25395:131;:::i;:::-;25387:139;;25114:419;;;:::o;25539:::-;25705:4;25743:2;25732:9;25728:18;25720:26;;25792:9;25786:4;25782:20;25778:1;25767:9;25763:17;25756:47;25820:131;25946:4;25820:131;:::i;:::-;25812:139;;25539:419;;;:::o;25964:::-;26130:4;26168:2;26157:9;26153:18;26145:26;;26217:9;26211:4;26207:20;26203:1;26192:9;26188:17;26181:47;26245:131;26371:4;26245:131;:::i;:::-;26237:139;;25964:419;;;:::o;26389:::-;26555:4;26593:2;26582:9;26578:18;26570:26;;26642:9;26636:4;26632:20;26628:1;26617:9;26613:17;26606:47;26670:131;26796:4;26670:131;:::i;:::-;26662:139;;26389:419;;;:::o;26814:::-;26980:4;27018:2;27007:9;27003:18;26995:26;;27067:9;27061:4;27057:20;27053:1;27042:9;27038:17;27031:47;27095:131;27221:4;27095:131;:::i;:::-;27087:139;;26814:419;;;:::o;27239:::-;27405:4;27443:2;27432:9;27428:18;27420:26;;27492:9;27486:4;27482:20;27478:1;27467:9;27463:17;27456:47;27520:131;27646:4;27520:131;:::i;:::-;27512:139;;27239:419;;;:::o;27664:::-;27830:4;27868:2;27857:9;27853:18;27845:26;;27917:9;27911:4;27907:20;27903:1;27892:9;27888:17;27881:47;27945:131;28071:4;27945:131;:::i;:::-;27937:139;;27664:419;;;:::o;28089:::-;28255:4;28293:2;28282:9;28278:18;28270:26;;28342:9;28336:4;28332:20;28328:1;28317:9;28313:17;28306:47;28370:131;28496:4;28370:131;:::i;:::-;28362:139;;28089:419;;;:::o;28514:::-;28680:4;28718:2;28707:9;28703:18;28695:26;;28767:9;28761:4;28757:20;28753:1;28742:9;28738:17;28731:47;28795:131;28921:4;28795:131;:::i;:::-;28787:139;;28514:419;;;:::o;28939:::-;29105:4;29143:2;29132:9;29128:18;29120:26;;29192:9;29186:4;29182:20;29178:1;29167:9;29163:17;29156:47;29220:131;29346:4;29220:131;:::i;:::-;29212:139;;28939:419;;;:::o;29364:::-;29530:4;29568:2;29557:9;29553:18;29545:26;;29617:9;29611:4;29607:20;29603:1;29592:9;29588:17;29581:47;29645:131;29771:4;29645:131;:::i;:::-;29637:139;;29364:419;;;:::o;29789:::-;29955:4;29993:2;29982:9;29978:18;29970:26;;30042:9;30036:4;30032:20;30028:1;30017:9;30013:17;30006:47;30070:131;30196:4;30070:131;:::i;:::-;30062:139;;29789:419;;;:::o;30214:::-;30380:4;30418:2;30407:9;30403:18;30395:26;;30467:9;30461:4;30457:20;30453:1;30442:9;30438:17;30431:47;30495:131;30621:4;30495:131;:::i;:::-;30487:139;;30214:419;;;:::o;30639:::-;30805:4;30843:2;30832:9;30828:18;30820:26;;30892:9;30886:4;30882:20;30878:1;30867:9;30863:17;30856:47;30920:131;31046:4;30920:131;:::i;:::-;30912:139;;30639:419;;;:::o;31064:::-;31230:4;31268:2;31257:9;31253:18;31245:26;;31317:9;31311:4;31307:20;31303:1;31292:9;31288:17;31281:47;31345:131;31471:4;31345:131;:::i;:::-;31337:139;;31064:419;;;:::o;31489:::-;31655:4;31693:2;31682:9;31678:18;31670:26;;31742:9;31736:4;31732:20;31728:1;31717:9;31713:17;31706:47;31770:131;31896:4;31770:131;:::i;:::-;31762:139;;31489:419;;;:::o;31914:::-;32080:4;32118:2;32107:9;32103:18;32095:26;;32167:9;32161:4;32157:20;32153:1;32142:9;32138:17;32131:47;32195:131;32321:4;32195:131;:::i;:::-;32187:139;;31914:419;;;:::o;32339:::-;32505:4;32543:2;32532:9;32528:18;32520:26;;32592:9;32586:4;32582:20;32578:1;32567:9;32563:17;32556:47;32620:131;32746:4;32620:131;:::i;:::-;32612:139;;32339:419;;;:::o;32764:::-;32930:4;32968:2;32957:9;32953:18;32945:26;;33017:9;33011:4;33007:20;33003:1;32992:9;32988:17;32981:47;33045:131;33171:4;33045:131;:::i;:::-;33037:139;;32764:419;;;:::o;33189:::-;33355:4;33393:2;33382:9;33378:18;33370:26;;33442:9;33436:4;33432:20;33428:1;33417:9;33413:17;33406:47;33470:131;33596:4;33470:131;:::i;:::-;33462:139;;33189:419;;;:::o;33614:::-;33780:4;33818:2;33807:9;33803:18;33795:26;;33867:9;33861:4;33857:20;33853:1;33842:9;33838:17;33831:47;33895:131;34021:4;33895:131;:::i;:::-;33887:139;;33614:419;;;:::o;34039:::-;34205:4;34243:2;34232:9;34228:18;34220:26;;34292:9;34286:4;34282:20;34278:1;34267:9;34263:17;34256:47;34320:131;34446:4;34320:131;:::i;:::-;34312:139;;34039:419;;;:::o;34464:222::-;34557:4;34595:2;34584:9;34580:18;34572:26;;34608:71;34676:1;34665:9;34661:17;34652:6;34608:71;:::i;:::-;34464:222;;;;:::o;34692:129::-;34726:6;34753:20;;:::i;:::-;34743:30;;34782:33;34810:4;34802:6;34782:33;:::i;:::-;34692:129;;;:::o;34827:75::-;34860:6;34893:2;34887:9;34877:19;;34827:75;:::o;34908:307::-;34969:4;35059:18;35051:6;35048:30;35045:56;;;35081:18;;:::i;:::-;35045:56;35119:29;35141:6;35119:29;:::i;:::-;35111:37;;35203:4;35197;35193:15;35185:23;;34908:307;;;:::o;35221:308::-;35283:4;35373:18;35365:6;35362:30;35359:56;;;35395:18;;:::i;:::-;35359:56;35433:29;35455:6;35433:29;:::i;:::-;35425:37;;35517:4;35511;35507:15;35499:23;;35221:308;;;:::o;35535:141::-;35584:4;35607:3;35599:11;;35630:3;35627:1;35620:14;35664:4;35661:1;35651:18;35643:26;;35535:141;;;:::o;35682:98::-;35733:6;35767:5;35761:12;35751:22;;35682:98;;;:::o;35786:99::-;35838:6;35872:5;35866:12;35856:22;;35786:99;;;:::o;35891:168::-;35974:11;36008:6;36003:3;35996:19;36048:4;36043:3;36039:14;36024:29;;35891:168;;;;:::o;36065:169::-;36149:11;36183:6;36178:3;36171:19;36223:4;36218:3;36214:14;36199:29;;36065:169;;;;:::o;36240:148::-;36342:11;36379:3;36364:18;;36240:148;;;;:::o;36394:273::-;36434:3;36453:20;36471:1;36453:20;:::i;:::-;36448:25;;36487:20;36505:1;36487:20;:::i;:::-;36482:25;;36609:1;36573:34;36569:42;36566:1;36563:49;36560:75;;;36615:18;;:::i;:::-;36560:75;36659:1;36656;36652:9;36645:16;;36394:273;;;;:::o;36673:305::-;36713:3;36732:20;36750:1;36732:20;:::i;:::-;36727:25;;36766:20;36784:1;36766:20;:::i;:::-;36761:25;;36920:1;36852:66;36848:74;36845:1;36842:81;36839:107;;;36926:18;;:::i;:::-;36839:107;36970:1;36967;36963:9;36956:16;;36673:305;;;;:::o;36984:185::-;37024:1;37041:20;37059:1;37041:20;:::i;:::-;37036:25;;37075:20;37093:1;37075:20;:::i;:::-;37070:25;;37114:1;37104:35;;37119:18;;:::i;:::-;37104:35;37161:1;37158;37154:9;37149:14;;36984:185;;;;:::o;37175:348::-;37215:7;37238:20;37256:1;37238:20;:::i;:::-;37233:25;;37272:20;37290:1;37272:20;:::i;:::-;37267:25;;37460:1;37392:66;37388:74;37385:1;37382:81;37377:1;37370:9;37363:17;37359:105;37356:131;;;37467:18;;:::i;:::-;37356:131;37515:1;37512;37508:9;37497:20;;37175:348;;;;:::o;37529:191::-;37569:4;37589:20;37607:1;37589:20;:::i;:::-;37584:25;;37623:20;37641:1;37623:20;:::i;:::-;37618:25;;37662:1;37659;37656:8;37653:34;;;37667:18;;:::i;:::-;37653:34;37712:1;37709;37705:9;37697:17;;37529:191;;;;:::o;37726:::-;37766:4;37786:20;37804:1;37786:20;:::i;:::-;37781:25;;37820:20;37838:1;37820:20;:::i;:::-;37815:25;;37859:1;37856;37853:8;37850:34;;;37864:18;;:::i;:::-;37850:34;37909:1;37906;37902:9;37894:17;;37726:191;;;;:::o;37923:96::-;37960:7;37989:24;38007:5;37989:24;:::i;:::-;37978:35;;37923:96;;;:::o;38025:90::-;38059:7;38102:5;38095:13;38088:21;38077:32;;38025:90;;;:::o;38121:149::-;38157:7;38197:66;38190:5;38186:78;38175:89;;38121:149;;;:::o;38276:110::-;38327:7;38356:24;38374:5;38356:24;:::i;:::-;38345:35;;38276:110;;;:::o;38392:125::-;38458:7;38487:24;38505:5;38487:24;:::i;:::-;38476:35;;38392:125;;;:::o;38523:118::-;38560:7;38600:34;38593:5;38589:46;38578:57;;38523:118;;;:::o;38647:126::-;38684:7;38724:42;38717:5;38713:54;38702:65;;38647:126;;;:::o;38779:77::-;38816:7;38845:5;38834:16;;38779:77;;;:::o;38862:154::-;38946:6;38941:3;38936;38923:30;39008:1;38999:6;38994:3;38990:16;38983:27;38862:154;;;:::o;39022:307::-;39090:1;39100:113;39114:6;39111:1;39108:13;39100:113;;;39199:1;39194:3;39190:11;39184:18;39180:1;39175:3;39171:11;39164:39;39136:2;39133:1;39129:10;39124:15;;39100:113;;;39231:6;39228:1;39225:13;39222:101;;;39311:1;39302:6;39297:3;39293:16;39286:27;39222:101;39071:258;39022:307;;;:::o;39335:171::-;39374:3;39397:24;39415:5;39397:24;:::i;:::-;39388:33;;39443:4;39436:5;39433:15;39430:41;;;39451:18;;:::i;:::-;39430:41;39498:1;39491:5;39487:13;39480:20;;39335:171;;;:::o;39512:320::-;39556:6;39593:1;39587:4;39583:12;39573:22;;39640:1;39634:4;39630:12;39661:18;39651:81;;39717:4;39709:6;39705:17;39695:27;;39651:81;39779:2;39771:6;39768:14;39748:18;39745:38;39742:84;;;39798:18;;:::i;:::-;39742:84;39563:269;39512:320;;;:::o;39838:281::-;39921:27;39943:4;39921:27;:::i;:::-;39913:6;39909:40;40051:6;40039:10;40036:22;40015:18;40003:10;40000:34;39997:62;39994:88;;;40062:18;;:::i;:::-;39994:88;40102:10;40098:2;40091:22;39881:238;39838:281;;:::o;40125:233::-;40164:3;40187:24;40205:5;40187:24;:::i;:::-;40178:33;;40233:66;40226:5;40223:77;40220:103;;;40303:18;;:::i;:::-;40220:103;40350:1;40343:5;40339:13;40332:20;;40125:233;;;:::o;40364:176::-;40396:1;40413:20;40431:1;40413:20;:::i;:::-;40408:25;;40447:20;40465:1;40447:20;:::i;:::-;40442:25;;40486:1;40476:35;;40491:18;;:::i;:::-;40476:35;40532:1;40529;40525:9;40520:14;;40364:176;;;;:::o;40546:180::-;40594:77;40591:1;40584:88;40691:4;40688:1;40681:15;40715:4;40712:1;40705:15;40732:180;40780:77;40777:1;40770:88;40877:4;40874:1;40867:15;40901:4;40898:1;40891:15;40918:180;40966:77;40963:1;40956:88;41063:4;41060:1;41053:15;41087:4;41084:1;41077:15;41104:180;41152:77;41149:1;41142:88;41249:4;41246:1;41239:15;41273:4;41270:1;41263:15;41290:180;41338:77;41335:1;41328:88;41435:4;41432:1;41425:15;41459:4;41456:1;41449:15;41476:117;41585:1;41582;41575:12;41599:117;41708:1;41705;41698:12;41722:117;41831:1;41828;41821:12;41845:117;41954:1;41951;41944:12;41968:102;42009:6;42060:2;42056:7;42051:2;42044:5;42040:14;42036:28;42026:38;;41968:102;;;:::o;42076:221::-;42216:34;42212:1;42204:6;42200:14;42193:58;42285:4;42280:2;42272:6;42268:15;42261:29;42076:221;:::o;42303:225::-;42443:34;42439:1;42431:6;42427:14;42420:58;42512:8;42507:2;42499:6;42495:15;42488:33;42303:225;:::o;42534:229::-;42674:34;42670:1;42662:6;42658:14;42651:58;42743:12;42738:2;42730:6;42726:15;42719:37;42534:229;:::o;42769:222::-;42909:34;42905:1;42897:6;42893:14;42886:58;42978:5;42973:2;42965:6;42961:15;42954:30;42769:222;:::o;42997:221::-;43137:34;43133:1;43125:6;43121:14;43114:58;43206:4;43201:2;43193:6;43189:15;43182:29;42997:221;:::o;43224:224::-;43364:34;43360:1;43352:6;43348:14;43341:58;43433:7;43428:2;43420:6;43416:15;43409:32;43224:224;:::o;43454:221::-;43594:34;43590:1;43582:6;43578:14;43571:58;43663:4;43658:2;43650:6;43646:15;43639:29;43454:221;:::o;43681:167::-;43821:19;43817:1;43809:6;43805:14;43798:43;43681:167;:::o;43854:244::-;43994:34;43990:1;43982:6;43978:14;43971:58;44063:27;44058:2;44050:6;44046:15;44039:52;43854:244;:::o;44104:230::-;44244:34;44240:1;44232:6;44228:14;44221:58;44313:13;44308:2;44300:6;44296:15;44289:38;44104:230;:::o;44340:225::-;44480:34;44476:1;44468:6;44464:14;44457:58;44549:8;44544:2;44536:6;44532:15;44525:33;44340:225;:::o;44571:182::-;44711:34;44707:1;44699:6;44695:14;44688:58;44571:182;:::o;44759:176::-;44899:28;44895:1;44887:6;44883:14;44876:52;44759:176;:::o;44941:237::-;45081:34;45077:1;45069:6;45065:14;45058:58;45150:20;45145:2;45137:6;45133:15;45126:45;44941:237;:::o;45184:221::-;45324:34;45320:1;45312:6;45308:14;45301:58;45393:4;45388:2;45380:6;45376:15;45369:29;45184:221;:::o;45411:238::-;45551:34;45547:1;45539:6;45535:14;45528:58;45620:21;45615:2;45607:6;45603:15;45596:46;45411:238;:::o;45655:179::-;45795:31;45791:1;45783:6;45779:14;45772:55;45655:179;:::o;45840:220::-;45980:34;45976:1;45968:6;45964:14;45957:58;46049:3;46044:2;46036:6;46032:15;46025:28;45840:220;:::o;46066:233::-;46206:34;46202:1;46194:6;46190:14;46183:58;46275:16;46270:2;46262:6;46258:15;46251:41;46066:233;:::o;46305:181::-;46445:33;46441:1;46433:6;46429:14;46422:57;46305:181;:::o;46492:234::-;46632:34;46628:1;46620:6;46616:14;46609:58;46701:17;46696:2;46688:6;46684:15;46677:42;46492:234;:::o;46732:173::-;46872:25;46868:1;46860:6;46856:14;46849:49;46732:173;:::o;46911:232::-;47051:34;47047:1;47039:6;47035:14;47028:58;47120:15;47115:2;47107:6;47103:15;47096:40;46911:232;:::o;47149:221::-;47289:34;47285:1;47277:6;47273:14;47266:58;47358:4;47353:2;47345:6;47341:15;47334:29;47149:221;:::o;47376:151::-;47516:3;47512:1;47504:6;47500:14;47493:27;47376:151;:::o;47533:122::-;47606:24;47624:5;47606:24;:::i;:::-;47599:5;47596:35;47586:63;;47645:1;47642;47635:12;47586:63;47533:122;:::o;47661:116::-;47731:21;47746:5;47731:21;:::i;:::-;47724:5;47721:32;47711:60;;47767:1;47764;47757:12;47711:60;47661:116;:::o;47783:120::-;47855:23;47872:5;47855:23;:::i;:::-;47848:5;47845:34;47835:62;;47893:1;47890;47883:12;47835:62;47783:120;:::o;47909:150::-;47996:38;48028:5;47996:38;:::i;:::-;47989:5;47986:49;47976:77;;48049:1;48046;48039:12;47976:77;47909:150;:::o;48065:180::-;48167:53;48214:5;48167:53;:::i;:::-;48160:5;48157:64;48147:92;;48235:1;48232;48225:12;48147:92;48065:180;:::o;48251:122::-;48324:24;48342:5;48324:24;:::i;:::-;48317:5;48314:35;48304:63;;48363:1;48360;48353:12;48304:63;48251:122;:::o

Swarm Source

ipfs://fbfbfc6486758a051d45eb52397d21dc3c98738f65b82689c8a1643835f73701
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.