ETH Price: $3,356.18 (-0.97%)

Token

FantasyFootball (FFB)
 

Overview

Max Total Supply

0 FFB

Holders

762

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
25 FFB
0x5b85988f0032ee818f911ec969dd9c649caa0a14
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Team Rankings: https://nftfantasy.football/leaderboard/

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
FantasyFootball

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 2021-09-09
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/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/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/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/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/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/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 no longer needed starting with Solidity 0.8. 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/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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File: @openzeppelin/contracts/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/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/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: @openzeppelin/contracts/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/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // 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 Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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 virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: 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 virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: 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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: contracts/FantasyFootball.sol


pragma solidity ^0.8.0;






contract FantasyFootball is ERC721, Ownable {
    using Strings for uint256;
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdTracker;

    uint256 public constant MAX_ELEMENTS = 10000;
    uint256 public constant MAX_BY_MINT = 20;
    address
        public constant creatorAddress = 0xc988f2D5BDB203955c5fBB70E2191D62478b2ee7;

    event CreateTeam(uint256 indexed id);

    constructor() public ERC721("FantasyFootball", "FFB") {}

    modifier saleIsOpen {
        require(_totalSupply() <= MAX_ELEMENTS, "Sale end");
        _;
    }

    function _totalSupply() internal view returns (uint256) {
        return _tokenIdTracker.current();
    }

    function totalMint() public view returns (uint256) {
        return _totalSupply();
    }

    function mint(address _to, uint256 _count) public payable saleIsOpen {
        uint256 total = _totalSupply();
        require(total + _count <= MAX_ELEMENTS, "Max limit");
        require(total <= MAX_ELEMENTS, "Sale end");
        require(_count <= MAX_BY_MINT, "Exceeds number");

        for (uint256 i = 0; i < _count; i++) {
            _mintAnElement(_to);
        }
    }

    function _mintAnElement(address _to) private {
        uint256 id = _totalSupply();
        _tokenIdTracker.increment();
        _safeMint(_to, id);
        emit CreateTeam(id);
    }

    /**
     * @dev Returns an URI for a given token ID
     */
    function tokenURI(uint256 _tokenId) public view override returns (string memory) {
        string memory fantasyFootballUri = "https://gateway.pinata.cloud/ipfs/QmQGZNiaiR93w5sYFhV6XB1vaBo4iZsguS5uaXEzJoe3n3/";
        return string(abi.encodePacked(fantasyFootballUri, _tokenId.toString()));
    }

    function withdrawAll() public payable onlyOwner {
        uint256 balance = address(this).balance;
        require(balance > 0);
        _widthdraw(creatorAddress, address(this).balance);
    }

    function _widthdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }
}

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":"uint256","name":"id","type":"uint256"}],"name":"CreateTeam","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_BY_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ELEMENTS","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":[],"name":"creatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"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":"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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600f81526020017f46616e74617379466f6f7462616c6c00000000000000000000000000000000008152506040518060400160405280600381526020017f4646420000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001a6565b508060019080519060200190620000af929190620001a6565b505050620000d2620000c6620000d860201b60201c565b620000e060201b60201c565b620002bb565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b49062000256565b90600052602060002090601f016020900481019282620001d8576000855562000224565b82601f10620001f357805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022357825182559160200191906001019062000206565b5b50905062000233919062000237565b5090565b5b808211156200025257600081600090555060010162000238565b5090565b600060028204905060018216806200026f57607f821691505b602082108114156200028657620002856200028c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61316380620002cb6000396000f3fe6080604052600436106101355760003560e01c8063715018a6116100ab578063a22cb4651161006f578063a22cb465146103e8578063b88d4fde14610411578063c87b56dd1461043a578063e927fc5c14610477578063e985e9c5146104a2578063f2fde38b146104df57610135565b8063715018a614610346578063853828b61461035d5780638ad5de28146103675780638da5cb5b1461039257806395d89b41146103bd57610135565b80633502a716116100fd5780633502a7161461023157806340c10f191461025c57806342842e0e1461027857806359a7715a146102a15780636352211e146102cc57806370a082311461030957610135565b806301ffc9a71461013a57806306fdde0314610177578063081812fc146101a2578063095ea7b3146101df57806323b872dd14610208575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c9190612063565b610508565b60405161016e9190612516565b60405180910390f35b34801561018357600080fd5b5061018c6105ea565b6040516101999190612531565b60405180910390f35b3480156101ae57600080fd5b506101c960048036038101906101c491906120bd565b61067c565b6040516101d691906124af565b60405180910390f35b3480156101eb57600080fd5b5061020660048036038101906102019190612023565b610701565b005b34801561021457600080fd5b5061022f600480360381019061022a9190611f0d565b610819565b005b34801561023d57600080fd5b50610246610879565b60405161025391906127b3565b60405180910390f35b61027660048036038101906102719190612023565b61087f565b005b34801561028457600080fd5b5061029f600480360381019061029a9190611f0d565b6109dd565b005b3480156102ad57600080fd5b506102b66109fd565b6040516102c391906127b3565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee91906120bd565b610a0c565b60405161030091906124af565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b9190611ea0565b610abe565b60405161033d91906127b3565b60405180910390f35b34801561035257600080fd5b5061035b610b76565b005b610365610bfe565b005b34801561037357600080fd5b5061037c610cad565b60405161038991906127b3565b60405180910390f35b34801561039e57600080fd5b506103a7610cb2565b6040516103b491906124af565b60405180910390f35b3480156103c957600080fd5b506103d2610cdc565b6040516103df9190612531565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190611fe3565b610d6e565b005b34801561041d57600080fd5b5061043860048036038101906104339190611f60565b610eef565b005b34801561044657600080fd5b50610461600480360381019061045c91906120bd565b610f51565b60405161046e9190612531565b60405180910390f35b34801561048357600080fd5b5061048c610fa2565b60405161049991906124af565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190611ecd565b610fba565b6040516104d69190612516565b60405180910390f35b3480156104eb57600080fd5b5061050660048036038101906105019190611ea0565b61104e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105d357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105e357506105e282611146565b5b9050919050565b6060600080546105f9906129e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610625906129e3565b80156106725780601f1061064757610100808354040283529160200191610672565b820191906000526020600020905b81548152906001019060200180831161065557829003601f168201915b5050505050905090565b6000610687826111b0565b6106c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd906126f3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070c82610a0c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561077d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077490612753565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079c61121c565b73ffffffffffffffffffffffffffffffffffffffff1614806107cb57506107ca816107c561121c565b610fba565b5b61080a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080190612653565b60405180910390fd5b6108148383611224565b505050565b61082a61082461121c565b826112dd565b610869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086090612793565b60405180910390fd5b6108748383836113bb565b505050565b61271081565b61271061088a611617565b11156108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c2906126d3565b60405180910390fd5b60006108d5611617565b905061271082826108e69190612872565b1115610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e90612613565b60405180910390fd5b61271081111561096c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610963906126d3565b60405180910390fd5b60148211156109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a790612553565b60405180910390fd5b60005b828110156109d7576109c484611628565b80806109cf90612a46565b9150506109b3565b50505050565b6109f883838360405180602001604052806000815250610eef565b505050565b6000610a07611617565b905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac90612693565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690612673565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b7e61121c565b73ffffffffffffffffffffffffffffffffffffffff16610b9c610cb2565b73ffffffffffffffffffffffffffffffffffffffff1614610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990612713565b60405180910390fd5b610bfc6000611679565b565b610c0661121c565b73ffffffffffffffffffffffffffffffffffffffff16610c24610cb2565b73ffffffffffffffffffffffffffffffffffffffff1614610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7190612713565b60405180910390fd5b600047905060008111610c8c57600080fd5b610caa73c988f2d5bdb203955c5fbb70e2191d62478b2ee74761173f565b50565b601481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ceb906129e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d17906129e3565b8015610d645780601f10610d3957610100808354040283529160200191610d64565b820191906000526020600020905b815481529060010190602001808311610d4757829003601f168201915b5050505050905090565b610d7661121c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb906125f3565b60405180910390fd5b8060056000610df161121c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e9e61121c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ee39190612516565b60405180910390a35050565b610f00610efa61121c565b836112dd565b610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3690612793565b60405180910390fd5b610f4b848484846117f0565b50505050565b606060006040518060800160405280605181526020016130dd60519139905080610f7a8461184c565b604051602001610f8b929190612476565b604051602081830303815290604052915050919050565b73c988f2d5bdb203955c5fbb70e2191d62478b2ee781565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61105661121c565b73ffffffffffffffffffffffffffffffffffffffff16611074610cb2565b73ffffffffffffffffffffffffffffffffffffffff16146110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c190612713565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113190612593565b60405180910390fd5b61114381611679565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661129783610a0c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006112e8826111b0565b611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90612633565b60405180910390fd5b600061133283610a0c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806113a157508373ffffffffffffffffffffffffffffffffffffffff166113898461067c565b73ffffffffffffffffffffffffffffffffffffffff16145b806113b257506113b18185610fba565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166113db82610a0c565b73ffffffffffffffffffffffffffffffffffffffff1614611431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142890612733565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611498906125d3565b60405180910390fd5b6114ac8383836119ad565b6114b7600082611224565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461150791906128f9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461155e9190612872565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061162360076119b2565b905090565b6000611632611617565b905061163e60076119c0565b61164882826119d6565b807f8f67e94654e1c603ffade98162d89da1242025c87ae55426ae20d88aae4e58c660405160405180910390a25050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516117659061249a565b60006040518083038185875af1925050503d80600081146117a2576040519150601f19603f3d011682016040523d82523d6000602084013e6117a7565b606091505b50509050806117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e290612773565b60405180910390fd5b505050565b6117fb8484846113bb565b611807848484846119f4565b611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90612573565b60405180910390fd5b50505050565b60606000821415611894576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506119a8565b600082905060005b600082146118c65780806118af90612a46565b915050600a826118bf91906128c8565b915061189c565b60008167ffffffffffffffff8111156118e2576118e1612b7c565b5b6040519080825280601f01601f1916602001820160405280156119145781602001600182028036833780820191505090505b5090505b600085146119a15760018261192d91906128f9565b9150600a8561193c9190612a8f565b60306119489190612872565b60f81b81838151811061195e5761195d612b4d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561199a91906128c8565b9450611918565b8093505050505b919050565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6119f0828260405180602001604052806000815250611b8b565b5050565b6000611a158473ffffffffffffffffffffffffffffffffffffffff16611be6565b15611b7e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a3e61121c565b8786866040518563ffffffff1660e01b8152600401611a6094939291906124ca565b602060405180830381600087803b158015611a7a57600080fd5b505af1925050508015611aab57506040513d601f19601f82011682018060405250810190611aa89190612090565b60015b611b2e573d8060008114611adb576040519150601f19603f3d011682016040523d82523d6000602084013e611ae0565b606091505b50600081511415611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d90612573565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611b83565b600190505b949350505050565b611b958383611bf9565b611ba260008484846119f4565b611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd890612573565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c60906126b3565b60405180910390fd5b611c72816111b0565b15611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca9906125b3565b60405180910390fd5b611cbe600083836119ad565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d0e9190612872565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000611dda611dd5846127f3565b6127ce565b905082815260208101848484011115611df657611df5612bb0565b5b611e018482856129a1565b509392505050565b600081359050611e1881613080565b92915050565b600081359050611e2d81613097565b92915050565b600081359050611e42816130ae565b92915050565b600081519050611e57816130ae565b92915050565b600082601f830112611e7257611e71612bab565b5b8135611e82848260208601611dc7565b91505092915050565b600081359050611e9a816130c5565b92915050565b600060208284031215611eb657611eb5612bba565b5b6000611ec484828501611e09565b91505092915050565b60008060408385031215611ee457611ee3612bba565b5b6000611ef285828601611e09565b9250506020611f0385828601611e09565b9150509250929050565b600080600060608486031215611f2657611f25612bba565b5b6000611f3486828701611e09565b9350506020611f4586828701611e09565b9250506040611f5686828701611e8b565b9150509250925092565b60008060008060808587031215611f7a57611f79612bba565b5b6000611f8887828801611e09565b9450506020611f9987828801611e09565b9350506040611faa87828801611e8b565b925050606085013567ffffffffffffffff811115611fcb57611fca612bb5565b5b611fd787828801611e5d565b91505092959194509250565b60008060408385031215611ffa57611ff9612bba565b5b600061200885828601611e09565b925050602061201985828601611e1e565b9150509250929050565b6000806040838503121561203a57612039612bba565b5b600061204885828601611e09565b925050602061205985828601611e8b565b9150509250929050565b60006020828403121561207957612078612bba565b5b600061208784828501611e33565b91505092915050565b6000602082840312156120a6576120a5612bba565b5b60006120b484828501611e48565b91505092915050565b6000602082840312156120d3576120d2612bba565b5b60006120e184828501611e8b565b91505092915050565b6120f38161292d565b82525050565b6121028161293f565b82525050565b600061211382612824565b61211d818561283a565b935061212d8185602086016129b0565b61213681612bbf565b840191505092915050565b600061214c8261282f565b6121568185612856565b93506121668185602086016129b0565b61216f81612bbf565b840191505092915050565b60006121858261282f565b61218f8185612867565b935061219f8185602086016129b0565b80840191505092915050565b60006121b8600e83612856565b91506121c382612bd0565b602082019050919050565b60006121db603283612856565b91506121e682612bf9565b604082019050919050565b60006121fe602683612856565b915061220982612c48565b604082019050919050565b6000612221601c83612856565b915061222c82612c97565b602082019050919050565b6000612244602483612856565b915061224f82612cc0565b604082019050919050565b6000612267601983612856565b915061227282612d0f565b602082019050919050565b600061228a600983612856565b915061229582612d38565b602082019050919050565b60006122ad602c83612856565b91506122b882612d61565b604082019050919050565b60006122d0603883612856565b91506122db82612db0565b604082019050919050565b60006122f3602a83612856565b91506122fe82612dff565b604082019050919050565b6000612316602983612856565b915061232182612e4e565b604082019050919050565b6000612339602083612856565b915061234482612e9d565b602082019050919050565b600061235c600883612856565b915061236782612ec6565b602082019050919050565b600061237f602c83612856565b915061238a82612eef565b604082019050919050565b60006123a2602083612856565b91506123ad82612f3e565b602082019050919050565b60006123c5602983612856565b91506123d082612f67565b604082019050919050565b60006123e8602183612856565b91506123f382612fb6565b604082019050919050565b600061240b60008361284b565b915061241682613005565b600082019050919050565b600061242e601083612856565b915061243982613008565b602082019050919050565b6000612451603183612856565b915061245c82613031565b604082019050919050565b61247081612997565b82525050565b6000612482828561217a565b915061248e828461217a565b91508190509392505050565b60006124a5826123fe565b9150819050919050565b60006020820190506124c460008301846120ea565b92915050565b60006080820190506124df60008301876120ea565b6124ec60208301866120ea565b6124f96040830185612467565b818103606083015261250b8184612108565b905095945050505050565b600060208201905061252b60008301846120f9565b92915050565b6000602082019050818103600083015261254b8184612141565b905092915050565b6000602082019050818103600083015261256c816121ab565b9050919050565b6000602082019050818103600083015261258c816121ce565b9050919050565b600060208201905081810360008301526125ac816121f1565b9050919050565b600060208201905081810360008301526125cc81612214565b9050919050565b600060208201905081810360008301526125ec81612237565b9050919050565b6000602082019050818103600083015261260c8161225a565b9050919050565b6000602082019050818103600083015261262c8161227d565b9050919050565b6000602082019050818103600083015261264c816122a0565b9050919050565b6000602082019050818103600083015261266c816122c3565b9050919050565b6000602082019050818103600083015261268c816122e6565b9050919050565b600060208201905081810360008301526126ac81612309565b9050919050565b600060208201905081810360008301526126cc8161232c565b9050919050565b600060208201905081810360008301526126ec8161234f565b9050919050565b6000602082019050818103600083015261270c81612372565b9050919050565b6000602082019050818103600083015261272c81612395565b9050919050565b6000602082019050818103600083015261274c816123b8565b9050919050565b6000602082019050818103600083015261276c816123db565b9050919050565b6000602082019050818103600083015261278c81612421565b9050919050565b600060208201905081810360008301526127ac81612444565b9050919050565b60006020820190506127c86000830184612467565b92915050565b60006127d86127e9565b90506127e48282612a15565b919050565b6000604051905090565b600067ffffffffffffffff82111561280e5761280d612b7c565b5b61281782612bbf565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061287d82612997565b915061288883612997565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156128bd576128bc612ac0565b5b828201905092915050565b60006128d382612997565b91506128de83612997565b9250826128ee576128ed612aef565b5b828204905092915050565b600061290482612997565b915061290f83612997565b92508282101561292257612921612ac0565b5b828203905092915050565b600061293882612977565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156129ce5780820151818401526020810190506129b3565b838111156129dd576000848401525b50505050565b600060028204905060018216806129fb57607f821691505b60208210811415612a0f57612a0e612b1e565b5b50919050565b612a1e82612bbf565b810181811067ffffffffffffffff82111715612a3d57612a3c612b7c565b5b80604052505050565b6000612a5182612997565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a8457612a83612ac0565b5b600182019050919050565b6000612a9a82612997565b9150612aa583612997565b925082612ab557612ab4612aef565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45786365656473206e756d626572000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6130898161292d565b811461309457600080fd5b50565b6130a08161293f565b81146130ab57600080fd5b50565b6130b78161294b565b81146130c257600080fd5b50565b6130ce81612997565b81146130d957600080fd5b5056fe68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d51475a4e69616952393377357359466856365842317661426f34695a7367755335756158457a4a6f65336e332fa2646970667358221220243fc4b3fa3cf847d965711bdc4511d6ef51f6714bedd80ca083a9cfff6feb9a64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101355760003560e01c8063715018a6116100ab578063a22cb4651161006f578063a22cb465146103e8578063b88d4fde14610411578063c87b56dd1461043a578063e927fc5c14610477578063e985e9c5146104a2578063f2fde38b146104df57610135565b8063715018a614610346578063853828b61461035d5780638ad5de28146103675780638da5cb5b1461039257806395d89b41146103bd57610135565b80633502a716116100fd5780633502a7161461023157806340c10f191461025c57806342842e0e1461027857806359a7715a146102a15780636352211e146102cc57806370a082311461030957610135565b806301ffc9a71461013a57806306fdde0314610177578063081812fc146101a2578063095ea7b3146101df57806323b872dd14610208575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c9190612063565b610508565b60405161016e9190612516565b60405180910390f35b34801561018357600080fd5b5061018c6105ea565b6040516101999190612531565b60405180910390f35b3480156101ae57600080fd5b506101c960048036038101906101c491906120bd565b61067c565b6040516101d691906124af565b60405180910390f35b3480156101eb57600080fd5b5061020660048036038101906102019190612023565b610701565b005b34801561021457600080fd5b5061022f600480360381019061022a9190611f0d565b610819565b005b34801561023d57600080fd5b50610246610879565b60405161025391906127b3565b60405180910390f35b61027660048036038101906102719190612023565b61087f565b005b34801561028457600080fd5b5061029f600480360381019061029a9190611f0d565b6109dd565b005b3480156102ad57600080fd5b506102b66109fd565b6040516102c391906127b3565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee91906120bd565b610a0c565b60405161030091906124af565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b9190611ea0565b610abe565b60405161033d91906127b3565b60405180910390f35b34801561035257600080fd5b5061035b610b76565b005b610365610bfe565b005b34801561037357600080fd5b5061037c610cad565b60405161038991906127b3565b60405180910390f35b34801561039e57600080fd5b506103a7610cb2565b6040516103b491906124af565b60405180910390f35b3480156103c957600080fd5b506103d2610cdc565b6040516103df9190612531565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a9190611fe3565b610d6e565b005b34801561041d57600080fd5b5061043860048036038101906104339190611f60565b610eef565b005b34801561044657600080fd5b50610461600480360381019061045c91906120bd565b610f51565b60405161046e9190612531565b60405180910390f35b34801561048357600080fd5b5061048c610fa2565b60405161049991906124af565b60405180910390f35b3480156104ae57600080fd5b506104c960048036038101906104c49190611ecd565b610fba565b6040516104d69190612516565b60405180910390f35b3480156104eb57600080fd5b5061050660048036038101906105019190611ea0565b61104e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105d357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105e357506105e282611146565b5b9050919050565b6060600080546105f9906129e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610625906129e3565b80156106725780601f1061064757610100808354040283529160200191610672565b820191906000526020600020905b81548152906001019060200180831161065557829003601f168201915b5050505050905090565b6000610687826111b0565b6106c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd906126f3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070c82610a0c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561077d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077490612753565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079c61121c565b73ffffffffffffffffffffffffffffffffffffffff1614806107cb57506107ca816107c561121c565b610fba565b5b61080a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080190612653565b60405180910390fd5b6108148383611224565b505050565b61082a61082461121c565b826112dd565b610869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086090612793565b60405180910390fd5b6108748383836113bb565b505050565b61271081565b61271061088a611617565b11156108cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c2906126d3565b60405180910390fd5b60006108d5611617565b905061271082826108e69190612872565b1115610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e90612613565b60405180910390fd5b61271081111561096c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610963906126d3565b60405180910390fd5b60148211156109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a790612553565b60405180910390fd5b60005b828110156109d7576109c484611628565b80806109cf90612a46565b9150506109b3565b50505050565b6109f883838360405180602001604052806000815250610eef565b505050565b6000610a07611617565b905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac90612693565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2690612673565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b7e61121c565b73ffffffffffffffffffffffffffffffffffffffff16610b9c610cb2565b73ffffffffffffffffffffffffffffffffffffffff1614610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990612713565b60405180910390fd5b610bfc6000611679565b565b610c0661121c565b73ffffffffffffffffffffffffffffffffffffffff16610c24610cb2565b73ffffffffffffffffffffffffffffffffffffffff1614610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7190612713565b60405180910390fd5b600047905060008111610c8c57600080fd5b610caa73c988f2d5bdb203955c5fbb70e2191d62478b2ee74761173f565b50565b601481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ceb906129e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610d17906129e3565b8015610d645780601f10610d3957610100808354040283529160200191610d64565b820191906000526020600020905b815481529060010190602001808311610d4757829003601f168201915b5050505050905090565b610d7661121c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb906125f3565b60405180910390fd5b8060056000610df161121c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e9e61121c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ee39190612516565b60405180910390a35050565b610f00610efa61121c565b836112dd565b610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3690612793565b60405180910390fd5b610f4b848484846117f0565b50505050565b606060006040518060800160405280605181526020016130dd60519139905080610f7a8461184c565b604051602001610f8b929190612476565b604051602081830303815290604052915050919050565b73c988f2d5bdb203955c5fbb70e2191d62478b2ee781565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61105661121c565b73ffffffffffffffffffffffffffffffffffffffff16611074610cb2565b73ffffffffffffffffffffffffffffffffffffffff16146110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c190612713565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561113a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113190612593565b60405180910390fd5b61114381611679565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661129783610a0c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006112e8826111b0565b611327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131e90612633565b60405180910390fd5b600061133283610a0c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806113a157508373ffffffffffffffffffffffffffffffffffffffff166113898461067c565b73ffffffffffffffffffffffffffffffffffffffff16145b806113b257506113b18185610fba565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166113db82610a0c565b73ffffffffffffffffffffffffffffffffffffffff1614611431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142890612733565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611498906125d3565b60405180910390fd5b6114ac8383836119ad565b6114b7600082611224565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461150791906128f9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461155e9190612872565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061162360076119b2565b905090565b6000611632611617565b905061163e60076119c0565b61164882826119d6565b807f8f67e94654e1c603ffade98162d89da1242025c87ae55426ae20d88aae4e58c660405160405180910390a25050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008273ffffffffffffffffffffffffffffffffffffffff16826040516117659061249a565b60006040518083038185875af1925050503d80600081146117a2576040519150601f19603f3d011682016040523d82523d6000602084013e6117a7565b606091505b50509050806117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e290612773565b60405180910390fd5b505050565b6117fb8484846113bb565b611807848484846119f4565b611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90612573565b60405180910390fd5b50505050565b60606000821415611894576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506119a8565b600082905060005b600082146118c65780806118af90612a46565b915050600a826118bf91906128c8565b915061189c565b60008167ffffffffffffffff8111156118e2576118e1612b7c565b5b6040519080825280601f01601f1916602001820160405280156119145781602001600182028036833780820191505090505b5090505b600085146119a15760018261192d91906128f9565b9150600a8561193c9190612a8f565b60306119489190612872565b60f81b81838151811061195e5761195d612b4d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561199a91906128c8565b9450611918565b8093505050505b919050565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b6119f0828260405180602001604052806000815250611b8b565b5050565b6000611a158473ffffffffffffffffffffffffffffffffffffffff16611be6565b15611b7e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a3e61121c565b8786866040518563ffffffff1660e01b8152600401611a6094939291906124ca565b602060405180830381600087803b158015611a7a57600080fd5b505af1925050508015611aab57506040513d601f19601f82011682018060405250810190611aa89190612090565b60015b611b2e573d8060008114611adb576040519150601f19603f3d011682016040523d82523d6000602084013e611ae0565b606091505b50600081511415611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d90612573565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611b83565b600190505b949350505050565b611b958383611bf9565b611ba260008484846119f4565b611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd890612573565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c60906126b3565b60405180910390fd5b611c72816111b0565b15611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca9906125b3565b60405180910390fd5b611cbe600083836119ad565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d0e9190612872565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000611dda611dd5846127f3565b6127ce565b905082815260208101848484011115611df657611df5612bb0565b5b611e018482856129a1565b509392505050565b600081359050611e1881613080565b92915050565b600081359050611e2d81613097565b92915050565b600081359050611e42816130ae565b92915050565b600081519050611e57816130ae565b92915050565b600082601f830112611e7257611e71612bab565b5b8135611e82848260208601611dc7565b91505092915050565b600081359050611e9a816130c5565b92915050565b600060208284031215611eb657611eb5612bba565b5b6000611ec484828501611e09565b91505092915050565b60008060408385031215611ee457611ee3612bba565b5b6000611ef285828601611e09565b9250506020611f0385828601611e09565b9150509250929050565b600080600060608486031215611f2657611f25612bba565b5b6000611f3486828701611e09565b9350506020611f4586828701611e09565b9250506040611f5686828701611e8b565b9150509250925092565b60008060008060808587031215611f7a57611f79612bba565b5b6000611f8887828801611e09565b9450506020611f9987828801611e09565b9350506040611faa87828801611e8b565b925050606085013567ffffffffffffffff811115611fcb57611fca612bb5565b5b611fd787828801611e5d565b91505092959194509250565b60008060408385031215611ffa57611ff9612bba565b5b600061200885828601611e09565b925050602061201985828601611e1e565b9150509250929050565b6000806040838503121561203a57612039612bba565b5b600061204885828601611e09565b925050602061205985828601611e8b565b9150509250929050565b60006020828403121561207957612078612bba565b5b600061208784828501611e33565b91505092915050565b6000602082840312156120a6576120a5612bba565b5b60006120b484828501611e48565b91505092915050565b6000602082840312156120d3576120d2612bba565b5b60006120e184828501611e8b565b91505092915050565b6120f38161292d565b82525050565b6121028161293f565b82525050565b600061211382612824565b61211d818561283a565b935061212d8185602086016129b0565b61213681612bbf565b840191505092915050565b600061214c8261282f565b6121568185612856565b93506121668185602086016129b0565b61216f81612bbf565b840191505092915050565b60006121858261282f565b61218f8185612867565b935061219f8185602086016129b0565b80840191505092915050565b60006121b8600e83612856565b91506121c382612bd0565b602082019050919050565b60006121db603283612856565b91506121e682612bf9565b604082019050919050565b60006121fe602683612856565b915061220982612c48565b604082019050919050565b6000612221601c83612856565b915061222c82612c97565b602082019050919050565b6000612244602483612856565b915061224f82612cc0565b604082019050919050565b6000612267601983612856565b915061227282612d0f565b602082019050919050565b600061228a600983612856565b915061229582612d38565b602082019050919050565b60006122ad602c83612856565b91506122b882612d61565b604082019050919050565b60006122d0603883612856565b91506122db82612db0565b604082019050919050565b60006122f3602a83612856565b91506122fe82612dff565b604082019050919050565b6000612316602983612856565b915061232182612e4e565b604082019050919050565b6000612339602083612856565b915061234482612e9d565b602082019050919050565b600061235c600883612856565b915061236782612ec6565b602082019050919050565b600061237f602c83612856565b915061238a82612eef565b604082019050919050565b60006123a2602083612856565b91506123ad82612f3e565b602082019050919050565b60006123c5602983612856565b91506123d082612f67565b604082019050919050565b60006123e8602183612856565b91506123f382612fb6565b604082019050919050565b600061240b60008361284b565b915061241682613005565b600082019050919050565b600061242e601083612856565b915061243982613008565b602082019050919050565b6000612451603183612856565b915061245c82613031565b604082019050919050565b61247081612997565b82525050565b6000612482828561217a565b915061248e828461217a565b91508190509392505050565b60006124a5826123fe565b9150819050919050565b60006020820190506124c460008301846120ea565b92915050565b60006080820190506124df60008301876120ea565b6124ec60208301866120ea565b6124f96040830185612467565b818103606083015261250b8184612108565b905095945050505050565b600060208201905061252b60008301846120f9565b92915050565b6000602082019050818103600083015261254b8184612141565b905092915050565b6000602082019050818103600083015261256c816121ab565b9050919050565b6000602082019050818103600083015261258c816121ce565b9050919050565b600060208201905081810360008301526125ac816121f1565b9050919050565b600060208201905081810360008301526125cc81612214565b9050919050565b600060208201905081810360008301526125ec81612237565b9050919050565b6000602082019050818103600083015261260c8161225a565b9050919050565b6000602082019050818103600083015261262c8161227d565b9050919050565b6000602082019050818103600083015261264c816122a0565b9050919050565b6000602082019050818103600083015261266c816122c3565b9050919050565b6000602082019050818103600083015261268c816122e6565b9050919050565b600060208201905081810360008301526126ac81612309565b9050919050565b600060208201905081810360008301526126cc8161232c565b9050919050565b600060208201905081810360008301526126ec8161234f565b9050919050565b6000602082019050818103600083015261270c81612372565b9050919050565b6000602082019050818103600083015261272c81612395565b9050919050565b6000602082019050818103600083015261274c816123b8565b9050919050565b6000602082019050818103600083015261276c816123db565b9050919050565b6000602082019050818103600083015261278c81612421565b9050919050565b600060208201905081810360008301526127ac81612444565b9050919050565b60006020820190506127c86000830184612467565b92915050565b60006127d86127e9565b90506127e48282612a15565b919050565b6000604051905090565b600067ffffffffffffffff82111561280e5761280d612b7c565b5b61281782612bbf565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061287d82612997565b915061288883612997565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156128bd576128bc612ac0565b5b828201905092915050565b60006128d382612997565b91506128de83612997565b9250826128ee576128ed612aef565b5b828204905092915050565b600061290482612997565b915061290f83612997565b92508282101561292257612921612ac0565b5b828203905092915050565b600061293882612977565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156129ce5780820151818401526020810190506129b3565b838111156129dd576000848401525b50505050565b600060028204905060018216806129fb57607f821691505b60208210811415612a0f57612a0e612b1e565b5b50919050565b612a1e82612bbf565b810181811067ffffffffffffffff82111715612a3d57612a3c612b7c565b5b80604052505050565b6000612a5182612997565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a8457612a83612ac0565b5b600182019050919050565b6000612a9a82612997565b9150612aa583612997565b925082612ab557612ab4612aef565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45786365656473206e756d626572000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4d6178206c696d69740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c6520656e64000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6130898161292d565b811461309457600080fd5b50565b6130a08161293f565b81146130ab57600080fd5b50565b6130b78161294b565b81146130c257600080fd5b50565b6130ce81612997565b81146130d957600080fd5b5056fe68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d51475a4e69616952393377357359466856365842317661426f34695a7367755335756158457a4a6f65336e332fa2646970667358221220243fc4b3fa3cf847d965711bdc4511d6ef51f6714bedd80ca083a9cfff6feb9a64736f6c63430008070033

Deployed Bytecode Sourcemap

43539:2198:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31335:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32280:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33839:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33362:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34729:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43748:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44380:388;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35139:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44281:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31974:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31704:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17506:94;;;;;;;;;;;;;:::i;:::-;;45348:197;;;:::i;:::-;;43799:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16855:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32449:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34132:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35395:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45039:301;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43846:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34498:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17755:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31335:305;31437:4;31489:25;31474:40;;;:11;:40;;;;:105;;;;31546:33;31531:48;;;:11;:48;;;;31474:105;:158;;;;31596:36;31620:11;31596:23;:36::i;:::-;31474:158;31454:178;;31335:305;;;:::o;32280:100::-;32334:13;32367:5;32360:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32280:100;:::o;33839:221::-;33915:7;33943:16;33951:7;33943;:16::i;:::-;33935:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34028:15;:24;34044:7;34028:24;;;;;;;;;;;;;;;;;;;;;34021:31;;33839:221;;;:::o;33362:411::-;33443:13;33459:23;33474:7;33459:14;:23::i;:::-;33443:39;;33507:5;33501:11;;:2;:11;;;;33493:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33601:5;33585:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33610:37;33627:5;33634:12;:10;:12::i;:::-;33610:16;:37::i;:::-;33585:62;33563:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;33744:21;33753:2;33757:7;33744:8;:21::i;:::-;33432:341;33362:411;;:::o;34729:339::-;34924:41;34943:12;:10;:12::i;:::-;34957:7;34924:18;:41::i;:::-;34916:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35032:28;35042:4;35048:2;35052:7;35032:9;:28::i;:::-;34729:339;;;:::o;43748:44::-;43787:5;43748:44;:::o;44380:388::-;43787:5;44095:14;:12;:14::i;:::-;:30;;44087:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;44460:13:::1;44476:14;:12;:14::i;:::-;44460:30;;43787:5;44517:6;44509:5;:14;;;;:::i;:::-;:30;;44501:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;43787:5;44572;:21;;44564:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;43837:2;44625:6;:21;;44617:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;44683:9;44678:83;44702:6;44698:1;:10;44678:83;;;44730:19;44745:3;44730:14;:19::i;:::-;44710:3;;;;;:::i;:::-;;;;44678:83;;;;44449:319;44380:388:::0;;:::o;35139:185::-;35277:39;35294:4;35300:2;35304:7;35277:39;;;;;;;;;;;;:16;:39::i;:::-;35139:185;;;:::o;44281:91::-;44323:7;44350:14;:12;:14::i;:::-;44343:21;;44281:91;:::o;31974:239::-;32046:7;32066:13;32082:7;:16;32090:7;32082:16;;;;;;;;;;;;;;;;;;;;;32066:32;;32134:1;32117:19;;:5;:19;;;;32109:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32200:5;32193:12;;;31974:239;;;:::o;31704:208::-;31776:7;31821:1;31804:19;;:5;:19;;;;31796:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31888:9;:16;31898:5;31888:16;;;;;;;;;;;;;;;;31881:23;;31704:208;;;:::o;17506:94::-;17086:12;:10;:12::i;:::-;17075:23;;:7;:5;:7::i;:::-;:23;;;17067:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17571:21:::1;17589:1;17571:9;:21::i;:::-;17506:94::o:0;45348:197::-;17086:12;:10;:12::i;:::-;17075:23;;:7;:5;:7::i;:::-;:23;;;17067:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45407:15:::1;45425:21;45407:39;;45475:1;45465:7;:11;45457:20;;;::::0;::::1;;45488:49;43896:42;45515:21;45488:10;:49::i;:::-;45396:149;45348:197::o:0;43799:40::-;43837:2;43799:40;:::o;16855:87::-;16901:7;16928:6;;;;;;;;;;;16921:13;;16855:87;:::o;32449:104::-;32505:13;32538:7;32531:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32449:104;:::o;34132:295::-;34247:12;:10;:12::i;:::-;34235:24;;:8;:24;;;;34227:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;34347:8;34302:18;:32;34321:12;:10;:12::i;:::-;34302:32;;;;;;;;;;;;;;;:42;34335:8;34302:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34400:8;34371:48;;34386:12;:10;:12::i;:::-;34371:48;;;34410:8;34371:48;;;;;;:::i;:::-;;;;;;;;34132:295;;:::o;35395:328::-;35570:41;35589:12;:10;:12::i;:::-;35603:7;35570:18;:41::i;:::-;35562:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35676:39;35690:4;35696:2;35700:7;35709:5;35676:13;:39::i;:::-;35395:328;;;;:::o;45039:301::-;45105:13;45131:32;:118;;;;;;;;;;;;;;;;;;;45291:18;45311:19;:8;:17;:19::i;:::-;45274:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45260:72;;;45039:301;;;:::o;43846:92::-;43896:42;43846:92;:::o;34498:164::-;34595:4;34619:18;:25;34638:5;34619:25;;;;;;;;;;;;;;;:35;34645:8;34619:35;;;;;;;;;;;;;;;;;;;;;;;;;34612:42;;34498:164;;;;:::o;17755:192::-;17086:12;:10;:12::i;:::-;17075:23;;:7;:5;:7::i;:::-;:23;;;17067:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17864:1:::1;17844:22;;:8;:22;;;;17836:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17920:19;17930:8;17920:9;:19::i;:::-;17755:192:::0;:::o;6483:157::-;6568:4;6607:25;6592:40;;;:11;:40;;;;6585:47;;6483:157;;;:::o;37233:127::-;37298:4;37350:1;37322:30;;:7;:16;37330:7;37322:16;;;;;;;;;;;;;;;;;;;;;:30;;;;37315:37;;37233:127;;;:::o;7274:98::-;7327:7;7354:10;7347:17;;7274:98;:::o;41215:174::-;41317:2;41290:15;:24;41306:7;41290:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41373:7;41369:2;41335:46;;41344:23;41359:7;41344:14;:23::i;:::-;41335:46;;;;;;;;;;;;41215:174;;:::o;37527:348::-;37620:4;37645:16;37653:7;37645;:16::i;:::-;37637:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37721:13;37737:23;37752:7;37737:14;:23::i;:::-;37721:39;;37790:5;37779:16;;:7;:16;;;:51;;;;37823:7;37799:31;;:20;37811:7;37799:11;:20::i;:::-;:31;;;37779:51;:87;;;;37834:32;37851:5;37858:7;37834:16;:32::i;:::-;37779:87;37771:96;;;37527:348;;;;:::o;40519:578::-;40678:4;40651:31;;:23;40666:7;40651:14;:23::i;:::-;:31;;;40643:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40761:1;40747:16;;:2;:16;;;;40739:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40817:39;40838:4;40844:2;40848:7;40817:20;:39::i;:::-;40921:29;40938:1;40942:7;40921:8;:29::i;:::-;40982:1;40963:9;:15;40973:4;40963:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;41011:1;40994:9;:13;41004:2;40994:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41042:2;41023:7;:16;41031:7;41023:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41081:7;41077:2;41062:27;;41071:4;41062:27;;;;;;;;;;;;40519:578;;;:::o;44166:107::-;44213:7;44240:25;:15;:23;:25::i;:::-;44233:32;;44166:107;:::o;44776:188::-;44832:10;44845:14;:12;:14::i;:::-;44832:27;;44870;:15;:25;:27::i;:::-;44908:18;44918:3;44923:2;44908:9;:18::i;:::-;44953:2;44942:14;;;;;;;;;;44821:143;44776:188;:::o;17955:173::-;18011:16;18030:6;;;;;;;;;;;18011:25;;18056:8;18047:6;;:17;;;;;;;;;;;;;;;;;;18111:8;18080:40;;18101:8;18080:40;;;;;;;;;;;;18000:128;17955:173;:::o;45553:181::-;45628:12;45646:8;:13;;45667:7;45646:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45627:52;;;45698:7;45690:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;45616:118;45553:181;;:::o;36605:315::-;36762:28;36772:4;36778:2;36782:7;36762:9;:28::i;:::-;36809:48;36832:4;36838:2;36842:7;36851:5;36809:22;:48::i;:::-;36801:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;36605:315;;;;:::o;18448:723::-;18504:13;18734:1;18725:5;:10;18721:53;;;18752:10;;;;;;;;;;;;;;;;;;;;;18721:53;18784:12;18799:5;18784:20;;18815:14;18840:78;18855:1;18847:4;:9;18840:78;;18873:8;;;;;:::i;:::-;;;;18904:2;18896:10;;;;;:::i;:::-;;;18840:78;;;18928:19;18960:6;18950:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18928:39;;18978:154;18994:1;18985:5;:10;18978:154;;19022:1;19012:11;;;;;:::i;:::-;;;19089:2;19081:5;:10;;;;:::i;:::-;19068:2;:24;;;;:::i;:::-;19055:39;;19038:6;19045;19038:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;19118:2;19109:11;;;;;:::i;:::-;;;18978:154;;;19156:6;19142:21;;;;;18448:723;;;;:::o;43325:126::-;;;;:::o;8307:114::-;8372:7;8399;:14;;;8392:21;;8307:114;;;:::o;8429:127::-;8536:1;8518:7;:14;;;:19;;;;;;;;;;;8429:127;:::o;38217:110::-;38293:26;38303:2;38307:7;38293:26;;;;;;;;;;;;:9;:26::i;:::-;38217:110;;:::o;41954:799::-;42109:4;42130:15;:2;:13;;;:15::i;:::-;42126:620;;;42182:2;42166:36;;;42203:12;:10;:12::i;:::-;42217:4;42223:7;42232:5;42166:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42162:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42425:1;42408:6;:13;:18;42404:272;;;42451:60;;;;;;;;;;:::i;:::-;;;;;;;;42404:272;42626:6;42620:13;42611:6;42607:2;42603:15;42596:38;42162:529;42299:41;;;42289:51;;;:6;:51;;;;42282:58;;;;;42126:620;42730:4;42723:11;;41954:799;;;;;;;:::o;38554:321::-;38684:18;38690:2;38694:7;38684:5;:18::i;:::-;38735:54;38766:1;38770:2;38774:7;38783:5;38735:22;:54::i;:::-;38713:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;38554:321;;;:::o;20975:387::-;21035:4;21243:12;21310:7;21298:20;21290:28;;21353:1;21346:4;:8;21339:15;;;20975:387;;;:::o;39211:382::-;39305:1;39291:16;;:2;:16;;;;39283:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39364:16;39372:7;39364;:16::i;:::-;39363:17;39355:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39426:45;39455:1;39459:2;39463:7;39426:20;:45::i;:::-;39501:1;39484:9;:13;39494:2;39484:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39532:2;39513:7;:16;39521:7;39513:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39577:7;39573:2;39552:33;;39569:1;39552:33;;;;;;;;;;;;39211:382;;:::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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:327::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:52;5144:7;5135:6;5124:9;5120:22;5100:52;:::i;:::-;5090:62;;5046:116;4842:327;;;;:::o;5175:349::-;5244:6;5293:2;5281:9;5272:7;5268:23;5264:32;5261:119;;;5299:79;;:::i;:::-;5261:119;5419:1;5444:63;5499:7;5490:6;5479:9;5475:22;5444:63;:::i;:::-;5434:73;;5390:127;5175:349;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:118::-;5952:24;5970:5;5952:24;:::i;:::-;5947:3;5940:37;5865:118;;:::o;5989:109::-;6070:21;6085:5;6070:21;:::i;:::-;6065:3;6058:34;5989:109;;:::o;6104:360::-;6190:3;6218:38;6250:5;6218:38;:::i;:::-;6272:70;6335:6;6330:3;6272:70;:::i;:::-;6265:77;;6351:52;6396:6;6391:3;6384:4;6377:5;6373:16;6351:52;:::i;:::-;6428:29;6450:6;6428:29;:::i;:::-;6423:3;6419:39;6412:46;;6194:270;6104:360;;;;:::o;6470:364::-;6558:3;6586:39;6619:5;6586:39;:::i;:::-;6641:71;6705:6;6700:3;6641:71;:::i;:::-;6634:78;;6721:52;6766:6;6761:3;6754:4;6747:5;6743:16;6721:52;:::i;:::-;6798:29;6820:6;6798:29;:::i;:::-;6793:3;6789:39;6782:46;;6562:272;6470:364;;;;:::o;6840:377::-;6946:3;6974:39;7007:5;6974:39;:::i;:::-;7029:89;7111:6;7106:3;7029:89;:::i;:::-;7022:96;;7127:52;7172:6;7167:3;7160:4;7153:5;7149:16;7127:52;:::i;:::-;7204:6;7199:3;7195:16;7188:23;;6950:267;6840:377;;;;:::o;7223:366::-;7365:3;7386:67;7450:2;7445:3;7386:67;:::i;:::-;7379:74;;7462:93;7551:3;7462:93;:::i;:::-;7580:2;7575:3;7571:12;7564:19;;7223:366;;;:::o;7595:::-;7737:3;7758:67;7822:2;7817:3;7758:67;:::i;:::-;7751:74;;7834:93;7923:3;7834:93;:::i;:::-;7952:2;7947:3;7943:12;7936:19;;7595:366;;;:::o;7967:::-;8109:3;8130:67;8194:2;8189:3;8130:67;:::i;:::-;8123:74;;8206:93;8295:3;8206:93;:::i;:::-;8324:2;8319:3;8315:12;8308:19;;7967:366;;;:::o;8339:::-;8481:3;8502:67;8566:2;8561:3;8502:67;:::i;:::-;8495:74;;8578:93;8667:3;8578:93;:::i;:::-;8696:2;8691:3;8687:12;8680:19;;8339:366;;;:::o;8711:::-;8853:3;8874:67;8938:2;8933:3;8874:67;:::i;:::-;8867:74;;8950:93;9039:3;8950:93;:::i;:::-;9068:2;9063:3;9059:12;9052:19;;8711:366;;;:::o;9083:::-;9225:3;9246:67;9310:2;9305:3;9246:67;:::i;:::-;9239:74;;9322:93;9411:3;9322:93;:::i;:::-;9440:2;9435:3;9431:12;9424:19;;9083:366;;;:::o;9455:365::-;9597:3;9618:66;9682:1;9677:3;9618:66;:::i;:::-;9611:73;;9693:93;9782:3;9693:93;:::i;:::-;9811:2;9806:3;9802:12;9795:19;;9455:365;;;:::o;9826:366::-;9968:3;9989:67;10053:2;10048:3;9989:67;:::i;:::-;9982:74;;10065:93;10154:3;10065:93;:::i;:::-;10183:2;10178:3;10174:12;10167:19;;9826:366;;;:::o;10198:::-;10340:3;10361:67;10425:2;10420:3;10361:67;:::i;:::-;10354:74;;10437:93;10526:3;10437:93;:::i;:::-;10555:2;10550:3;10546:12;10539:19;;10198:366;;;:::o;10570:::-;10712:3;10733:67;10797:2;10792:3;10733:67;:::i;:::-;10726:74;;10809:93;10898:3;10809:93;:::i;:::-;10927:2;10922:3;10918:12;10911:19;;10570:366;;;:::o;10942:::-;11084:3;11105:67;11169:2;11164:3;11105:67;:::i;:::-;11098:74;;11181:93;11270:3;11181:93;:::i;:::-;11299:2;11294:3;11290:12;11283:19;;10942:366;;;:::o;11314:::-;11456:3;11477:67;11541:2;11536:3;11477:67;:::i;:::-;11470:74;;11553:93;11642:3;11553:93;:::i;:::-;11671:2;11666:3;11662:12;11655:19;;11314:366;;;:::o;11686:365::-;11828:3;11849:66;11913:1;11908:3;11849:66;:::i;:::-;11842:73;;11924:93;12013:3;11924:93;:::i;:::-;12042:2;12037:3;12033:12;12026:19;;11686:365;;;:::o;12057:366::-;12199:3;12220:67;12284:2;12279:3;12220:67;:::i;:::-;12213:74;;12296:93;12385:3;12296:93;:::i;:::-;12414:2;12409:3;12405:12;12398:19;;12057:366;;;:::o;12429:::-;12571:3;12592:67;12656:2;12651:3;12592:67;:::i;:::-;12585:74;;12668:93;12757:3;12668:93;:::i;:::-;12786:2;12781:3;12777:12;12770:19;;12429:366;;;:::o;12801:::-;12943:3;12964:67;13028:2;13023:3;12964:67;:::i;:::-;12957:74;;13040:93;13129:3;13040:93;:::i;:::-;13158:2;13153:3;13149:12;13142:19;;12801:366;;;:::o;13173:::-;13315:3;13336:67;13400:2;13395:3;13336:67;:::i;:::-;13329:74;;13412:93;13501:3;13412:93;:::i;:::-;13530:2;13525:3;13521:12;13514:19;;13173:366;;;:::o;13545:398::-;13704:3;13725:83;13806:1;13801:3;13725:83;:::i;:::-;13718:90;;13817:93;13906:3;13817:93;:::i;:::-;13935:1;13930:3;13926:11;13919:18;;13545:398;;;:::o;13949:366::-;14091:3;14112:67;14176:2;14171:3;14112:67;:::i;:::-;14105:74;;14188:93;14277:3;14188:93;:::i;:::-;14306:2;14301:3;14297:12;14290:19;;13949:366;;;:::o;14321:::-;14463:3;14484:67;14548:2;14543:3;14484:67;:::i;:::-;14477:74;;14560:93;14649:3;14560:93;:::i;:::-;14678:2;14673:3;14669:12;14662:19;;14321:366;;;:::o;14693:118::-;14780:24;14798:5;14780:24;:::i;:::-;14775:3;14768:37;14693:118;;:::o;14817:435::-;14997:3;15019:95;15110:3;15101:6;15019:95;:::i;:::-;15012:102;;15131:95;15222:3;15213:6;15131:95;:::i;:::-;15124:102;;15243:3;15236:10;;14817:435;;;;;:::o;15258:379::-;15442:3;15464:147;15607:3;15464:147;:::i;:::-;15457:154;;15628:3;15621:10;;15258:379;;;:::o;15643:222::-;15736:4;15774:2;15763:9;15759:18;15751:26;;15787:71;15855:1;15844:9;15840:17;15831:6;15787:71;:::i;:::-;15643:222;;;;:::o;15871:640::-;16066:4;16104:3;16093:9;16089:19;16081:27;;16118:71;16186:1;16175:9;16171:17;16162:6;16118:71;:::i;:::-;16199:72;16267:2;16256:9;16252:18;16243:6;16199:72;:::i;:::-;16281;16349:2;16338:9;16334:18;16325:6;16281:72;:::i;:::-;16400:9;16394:4;16390:20;16385:2;16374:9;16370:18;16363:48;16428:76;16499:4;16490:6;16428:76;:::i;:::-;16420:84;;15871:640;;;;;;;:::o;16517:210::-;16604:4;16642:2;16631:9;16627:18;16619:26;;16655:65;16717:1;16706:9;16702:17;16693:6;16655:65;:::i;:::-;16517:210;;;;:::o;16733:313::-;16846:4;16884:2;16873:9;16869:18;16861:26;;16933:9;16927:4;16923:20;16919:1;16908:9;16904:17;16897:47;16961:78;17034:4;17025:6;16961:78;:::i;:::-;16953:86;;16733:313;;;;:::o;17052:419::-;17218:4;17256:2;17245:9;17241:18;17233:26;;17305:9;17299:4;17295:20;17291:1;17280:9;17276:17;17269:47;17333:131;17459:4;17333:131;:::i;:::-;17325:139;;17052:419;;;:::o;17477:::-;17643:4;17681:2;17670:9;17666:18;17658:26;;17730:9;17724:4;17720:20;17716:1;17705:9;17701:17;17694:47;17758:131;17884:4;17758:131;:::i;:::-;17750:139;;17477:419;;;:::o;17902:::-;18068:4;18106:2;18095:9;18091:18;18083:26;;18155:9;18149:4;18145:20;18141:1;18130:9;18126:17;18119:47;18183:131;18309:4;18183:131;:::i;:::-;18175:139;;17902:419;;;:::o;18327:::-;18493:4;18531:2;18520:9;18516:18;18508:26;;18580:9;18574:4;18570:20;18566:1;18555:9;18551:17;18544:47;18608:131;18734:4;18608:131;:::i;:::-;18600:139;;18327:419;;;:::o;18752:::-;18918:4;18956:2;18945:9;18941:18;18933:26;;19005:9;18999:4;18995:20;18991:1;18980:9;18976:17;18969:47;19033:131;19159:4;19033:131;:::i;:::-;19025:139;;18752:419;;;:::o;19177:::-;19343:4;19381:2;19370:9;19366:18;19358:26;;19430:9;19424:4;19420:20;19416:1;19405:9;19401:17;19394:47;19458:131;19584:4;19458:131;:::i;:::-;19450:139;;19177:419;;;:::o;19602:::-;19768:4;19806:2;19795:9;19791:18;19783:26;;19855:9;19849:4;19845:20;19841:1;19830:9;19826:17;19819:47;19883:131;20009:4;19883:131;:::i;:::-;19875:139;;19602:419;;;:::o;20027:::-;20193:4;20231:2;20220:9;20216:18;20208:26;;20280:9;20274:4;20270:20;20266:1;20255:9;20251:17;20244:47;20308:131;20434:4;20308:131;:::i;:::-;20300:139;;20027:419;;;:::o;20452:::-;20618:4;20656:2;20645:9;20641:18;20633:26;;20705:9;20699:4;20695:20;20691:1;20680:9;20676:17;20669:47;20733:131;20859:4;20733:131;:::i;:::-;20725:139;;20452:419;;;:::o;20877:::-;21043:4;21081:2;21070:9;21066:18;21058:26;;21130:9;21124:4;21120:20;21116:1;21105:9;21101:17;21094:47;21158:131;21284:4;21158:131;:::i;:::-;21150:139;;20877:419;;;:::o;21302:::-;21468:4;21506:2;21495:9;21491:18;21483:26;;21555:9;21549:4;21545:20;21541:1;21530:9;21526:17;21519:47;21583:131;21709:4;21583:131;:::i;:::-;21575:139;;21302:419;;;:::o;21727:::-;21893:4;21931:2;21920:9;21916:18;21908:26;;21980:9;21974:4;21970:20;21966:1;21955:9;21951:17;21944:47;22008:131;22134:4;22008:131;:::i;:::-;22000:139;;21727:419;;;:::o;22152:::-;22318:4;22356:2;22345:9;22341:18;22333:26;;22405:9;22399:4;22395:20;22391:1;22380:9;22376:17;22369:47;22433:131;22559:4;22433:131;:::i;:::-;22425:139;;22152:419;;;:::o;22577:::-;22743:4;22781:2;22770:9;22766:18;22758:26;;22830:9;22824:4;22820:20;22816:1;22805:9;22801:17;22794:47;22858:131;22984:4;22858:131;:::i;:::-;22850:139;;22577:419;;;:::o;23002:::-;23168:4;23206:2;23195:9;23191:18;23183:26;;23255:9;23249:4;23245:20;23241:1;23230:9;23226:17;23219:47;23283:131;23409:4;23283:131;:::i;:::-;23275:139;;23002:419;;;:::o;23427:::-;23593:4;23631:2;23620:9;23616:18;23608:26;;23680:9;23674:4;23670:20;23666:1;23655:9;23651:17;23644:47;23708:131;23834:4;23708:131;:::i;:::-;23700:139;;23427:419;;;:::o;23852:::-;24018:4;24056:2;24045:9;24041:18;24033:26;;24105:9;24099:4;24095:20;24091:1;24080:9;24076:17;24069:47;24133:131;24259:4;24133:131;:::i;:::-;24125:139;;23852:419;;;:::o;24277:::-;24443:4;24481:2;24470:9;24466:18;24458:26;;24530:9;24524:4;24520:20;24516:1;24505:9;24501:17;24494:47;24558:131;24684:4;24558:131;:::i;:::-;24550:139;;24277:419;;;:::o;24702:::-;24868:4;24906:2;24895:9;24891:18;24883:26;;24955:9;24949:4;24945:20;24941:1;24930:9;24926:17;24919:47;24983:131;25109:4;24983:131;:::i;:::-;24975:139;;24702:419;;;:::o;25127:222::-;25220:4;25258:2;25247:9;25243:18;25235:26;;25271:71;25339:1;25328:9;25324:17;25315:6;25271:71;:::i;:::-;25127:222;;;;:::o;25355:129::-;25389:6;25416:20;;:::i;:::-;25406:30;;25445:33;25473:4;25465:6;25445:33;:::i;:::-;25355:129;;;:::o;25490:75::-;25523:6;25556:2;25550:9;25540:19;;25490:75;:::o;25571:307::-;25632:4;25722:18;25714:6;25711:30;25708:56;;;25744:18;;:::i;:::-;25708:56;25782:29;25804:6;25782:29;:::i;:::-;25774:37;;25866:4;25860;25856:15;25848:23;;25571:307;;;:::o;25884:98::-;25935:6;25969:5;25963:12;25953:22;;25884:98;;;:::o;25988:99::-;26040:6;26074:5;26068:12;26058:22;;25988:99;;;:::o;26093:168::-;26176:11;26210:6;26205:3;26198:19;26250:4;26245:3;26241:14;26226:29;;26093:168;;;;:::o;26267:147::-;26368:11;26405:3;26390:18;;26267:147;;;;:::o;26420:169::-;26504:11;26538:6;26533:3;26526:19;26578:4;26573:3;26569:14;26554:29;;26420:169;;;;:::o;26595:148::-;26697:11;26734:3;26719:18;;26595:148;;;;:::o;26749:305::-;26789:3;26808:20;26826:1;26808:20;:::i;:::-;26803:25;;26842:20;26860:1;26842:20;:::i;:::-;26837:25;;26996:1;26928:66;26924:74;26921:1;26918:81;26915:107;;;27002:18;;:::i;:::-;26915:107;27046:1;27043;27039:9;27032:16;;26749:305;;;;:::o;27060:185::-;27100:1;27117:20;27135:1;27117:20;:::i;:::-;27112:25;;27151:20;27169:1;27151:20;:::i;:::-;27146:25;;27190:1;27180:35;;27195:18;;:::i;:::-;27180:35;27237:1;27234;27230:9;27225:14;;27060:185;;;;:::o;27251:191::-;27291:4;27311:20;27329:1;27311:20;:::i;:::-;27306:25;;27345:20;27363:1;27345:20;:::i;:::-;27340:25;;27384:1;27381;27378:8;27375:34;;;27389:18;;:::i;:::-;27375:34;27434:1;27431;27427:9;27419:17;;27251:191;;;;:::o;27448:96::-;27485:7;27514:24;27532:5;27514:24;:::i;:::-;27503:35;;27448:96;;;:::o;27550:90::-;27584:7;27627:5;27620:13;27613:21;27602:32;;27550:90;;;:::o;27646:149::-;27682:7;27722:66;27715:5;27711:78;27700:89;;27646:149;;;:::o;27801:126::-;27838:7;27878:42;27871:5;27867:54;27856:65;;27801:126;;;:::o;27933:77::-;27970:7;27999:5;27988:16;;27933:77;;;:::o;28016:154::-;28100:6;28095:3;28090;28077:30;28162:1;28153:6;28148:3;28144:16;28137:27;28016:154;;;:::o;28176:307::-;28244:1;28254:113;28268:6;28265:1;28262:13;28254:113;;;28353:1;28348:3;28344:11;28338:18;28334:1;28329:3;28325:11;28318:39;28290:2;28287:1;28283:10;28278:15;;28254:113;;;28385:6;28382:1;28379:13;28376:101;;;28465:1;28456:6;28451:3;28447:16;28440:27;28376:101;28225:258;28176:307;;;:::o;28489:320::-;28533:6;28570:1;28564:4;28560:12;28550:22;;28617:1;28611:4;28607:12;28638:18;28628:81;;28694:4;28686:6;28682:17;28672:27;;28628:81;28756:2;28748:6;28745:14;28725:18;28722:38;28719:84;;;28775:18;;:::i;:::-;28719:84;28540:269;28489:320;;;:::o;28815:281::-;28898:27;28920:4;28898:27;:::i;:::-;28890:6;28886:40;29028:6;29016:10;29013:22;28992:18;28980:10;28977:34;28974:62;28971:88;;;29039:18;;:::i;:::-;28971:88;29079:10;29075:2;29068:22;28858:238;28815:281;;:::o;29102:233::-;29141:3;29164:24;29182:5;29164:24;:::i;:::-;29155:33;;29210:66;29203:5;29200:77;29197:103;;;29280:18;;:::i;:::-;29197:103;29327:1;29320:5;29316:13;29309:20;;29102:233;;;:::o;29341:176::-;29373:1;29390:20;29408:1;29390:20;:::i;:::-;29385:25;;29424:20;29442:1;29424:20;:::i;:::-;29419:25;;29463:1;29453:35;;29468:18;;:::i;:::-;29453:35;29509:1;29506;29502:9;29497:14;;29341:176;;;;:::o;29523:180::-;29571:77;29568:1;29561:88;29668:4;29665:1;29658:15;29692:4;29689:1;29682:15;29709:180;29757:77;29754:1;29747:88;29854:4;29851:1;29844:15;29878:4;29875:1;29868:15;29895:180;29943:77;29940:1;29933:88;30040:4;30037:1;30030:15;30064:4;30061:1;30054:15;30081:180;30129:77;30126:1;30119:88;30226:4;30223:1;30216:15;30250:4;30247:1;30240:15;30267:180;30315:77;30312:1;30305:88;30412:4;30409:1;30402:15;30436:4;30433:1;30426:15;30453:117;30562:1;30559;30552:12;30576:117;30685:1;30682;30675:12;30699:117;30808:1;30805;30798:12;30822:117;30931:1;30928;30921:12;30945:102;30986:6;31037:2;31033:7;31028:2;31021:5;31017:14;31013:28;31003:38;;30945:102;;;:::o;31053:164::-;31193:16;31189:1;31181:6;31177:14;31170:40;31053:164;:::o;31223:237::-;31363:34;31359:1;31351:6;31347:14;31340:58;31432:20;31427:2;31419:6;31415:15;31408:45;31223:237;:::o;31466:225::-;31606:34;31602:1;31594:6;31590:14;31583:58;31675:8;31670:2;31662:6;31658:15;31651:33;31466:225;:::o;31697:178::-;31837:30;31833:1;31825:6;31821:14;31814:54;31697:178;:::o;31881:223::-;32021:34;32017:1;32009:6;32005:14;31998:58;32090:6;32085:2;32077:6;32073:15;32066:31;31881:223;:::o;32110:175::-;32250:27;32246:1;32238:6;32234:14;32227:51;32110:175;:::o;32291:159::-;32431:11;32427:1;32419:6;32415:14;32408:35;32291:159;:::o;32456:231::-;32596:34;32592:1;32584:6;32580:14;32573:58;32665:14;32660:2;32652:6;32648:15;32641:39;32456:231;:::o;32693:243::-;32833:34;32829:1;32821:6;32817:14;32810:58;32902:26;32897:2;32889:6;32885:15;32878:51;32693:243;:::o;32942:229::-;33082:34;33078:1;33070:6;33066:14;33059:58;33151:12;33146:2;33138:6;33134:15;33127:37;32942:229;:::o;33177:228::-;33317:34;33313:1;33305:6;33301:14;33294:58;33386:11;33381:2;33373:6;33369:15;33362:36;33177:228;:::o;33411:182::-;33551:34;33547:1;33539:6;33535:14;33528:58;33411:182;:::o;33599:158::-;33739:10;33735:1;33727:6;33723:14;33716:34;33599:158;:::o;33763:231::-;33903:34;33899:1;33891:6;33887:14;33880:58;33972:14;33967:2;33959:6;33955:15;33948:39;33763:231;:::o;34000:182::-;34140:34;34136:1;34128:6;34124:14;34117:58;34000:182;:::o;34188:228::-;34328:34;34324:1;34316:6;34312:14;34305:58;34397:11;34392:2;34384:6;34380:15;34373:36;34188:228;:::o;34422:220::-;34562:34;34558:1;34550:6;34546:14;34539:58;34631:3;34626:2;34618:6;34614:15;34607:28;34422:220;:::o;34648:114::-;;:::o;34768:166::-;34908:18;34904:1;34896:6;34892:14;34885:42;34768:166;:::o;34940:236::-;35080:34;35076:1;35068:6;35064:14;35057:58;35149:19;35144:2;35136:6;35132:15;35125:44;34940:236;:::o;35182:122::-;35255:24;35273:5;35255:24;:::i;:::-;35248:5;35245:35;35235:63;;35294:1;35291;35284:12;35235:63;35182:122;:::o;35310:116::-;35380:21;35395:5;35380:21;:::i;:::-;35373:5;35370:32;35360:60;;35416:1;35413;35406:12;35360:60;35310:116;:::o;35432:120::-;35504:23;35521:5;35504:23;:::i;:::-;35497:5;35494:34;35484:62;;35542:1;35539;35532:12;35484:62;35432:120;:::o;35558:122::-;35631:24;35649:5;35631:24;:::i;:::-;35624:5;35621:35;35611:63;;35670:1;35667;35660:12;35611:63;35558:122;:::o

Swarm Source

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