ETH Price: $3,180.83 (+2.66%)

Token

Pheudalz (PHEUDALZ)
 

Overview

Max Total Supply

4,444 PHEUDALZ

Holders

717

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
41 PHEUDALZ
0xfFC5fDcba6450D68948737299789Ad6575143d4a
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Pheudalz

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-24
*/

// 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/Strings.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



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/Address.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



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/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.2;




contract Pheudalz is ERC721, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
    string _baseUri;
    string _contractUri;
    
    uint public constant MAX_SUPPLY = 4444;
    uint public price = 0.015 ether;
    uint public maxFreeMint = 888;
    uint public maxFreeMintPerWallet = 14;
    bool public isSalesActive = false;
    
    mapping(address => uint) public addressToFreeMinted;

    constructor() ERC721("Pheudalz", "PHEUDALZ") {
        _contractUri = "ipfs://QmPSKstHNuDDUndBh9dygDy64K6VvEtNoCZ6EhGpyFTvMK";
    }

    function _baseURI() internal view override returns (string memory) {
        return _baseUri;
    }
    
    function freeMint() external {
        require(isSalesActive, "sale is not active");
        require(totalSupply() < maxFreeMint, "theres no free mints remaining");
        require(addressToFreeMinted[msg.sender] < maxFreeMintPerWallet, "caller already minted for free");
        
        addressToFreeMinted[msg.sender]++;
        safeMint(msg.sender);
    }
    
    function mint(uint quantity) external payable {
        require(isSalesActive, "sale is not active");
        require(quantity <= 44, "max mints per transaction exceeded");
        require(totalSupply() + quantity <= MAX_SUPPLY, "sold out");
        require(msg.value >= price * quantity, "ether send is under price");
        
        for (uint i = 0; i < quantity; i++) {
            safeMint(msg.sender);
        }
    }

    function safeMint(address to) internal {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
    }
    
    function totalSupply() public view returns (uint) {
        return _tokenIdCounter.current();
    }
    
    function contractURI() public view returns (string memory) {
        return _contractUri;
    }
    
    function setBaseURI(string memory newBaseURI) external onlyOwner {
        _baseUri = newBaseURI;
    }
    
    function setContractURI(string memory newContractURI) external onlyOwner {
        _contractUri = newContractURI;
    }
    
    function toggleSales() external onlyOwner {
        isSalesActive = !isSalesActive;
    }
    
    function setPrice(uint newPrice) external onlyOwner {
        price = newPrice;
    }
    
    function withdrawAll() external onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToFreeMinted","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":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","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":[],"name":"isSalesActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","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":[],"name":"toggleSales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266354a6ba7a18000600a55610378600b55600e600c556000600d60006101000a81548160ff0219169083151502179055503480156200004257600080fd5b506040518060400160405280600881526020017f5068657564616c7a0000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f5048455544414c5a0000000000000000000000000000000000000000000000008152508160009080519060200190620000c792919062000209565b508060019080519060200190620000e092919062000209565b50505062000103620000f76200013b60201b60201c565b6200014360201b60201c565b60405180606001604052806035815260200162003deb60359139600990805190602001906200013492919062000209565b506200031e565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021790620002b9565b90600052602060002090601f0160209004810192826200023b576000855562000287565b82601f106200025657805160ff191683800117855562000287565b8280016001018555821562000287579182015b828111156200028657825182559160200191906001019062000269565b5b5090506200029691906200029a565b5090565b5b80821115620002b55760008160009055506001016200029b565b5090565b60006002820490506001821680620002d257607f821691505b60208210811415620002e957620002e8620002ef565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613abd806200032e6000396000f3fe6080604052600436106101d85760003560e01c8063853828b611610102578063a591252d11610095578063dbd30ae011610064578063dbd30ae014610677578063e8a3d4851461068e578063e985e9c5146106b9578063f2fde38b146106f6576101d8565b8063a591252d146105bb578063b88d4fde146105e6578063c87b56dd1461060f578063daa81cdd1461064c576101d8565b806395d89b41116100d157806395d89b4114610520578063a035b1fe1461054b578063a0712d6814610576578063a22cb46514610592576101d8565b8063853828b61461048c5780638da5cb5b146104a357806391b7f5ed146104ce578063938e3d7b146104f7576101d8565b806342842e0e1161017a57806370a082311161014957806370a08231146103d0578063715018a61461040d5780637fc4618914610424578063845bb3bb14610461576101d8565b806342842e0e1461032a57806355f804b3146103535780635b70ea9f1461037c5780636352211e14610393576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d657806332cb6b0c146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612847565b61071f565b6040516102119190612d60565b60405180910390f35b34801561022657600080fd5b5061022f610801565b60405161023c9190612d7b565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906128da565b610893565b6040516102799190612cf9565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a4919061280b565b610918565b005b3480156102b757600080fd5b506102c0610a30565b6040516102cd919061305d565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190612705565b610a41565b005b34801561030b57600080fd5b50610314610aa1565b604051610321919061305d565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190612705565b610aa7565b005b34801561035f57600080fd5b5061037a60048036038101906103759190612899565b610ac7565b005b34801561038857600080fd5b50610391610b5d565b005b34801561039f57600080fd5b506103ba60048036038101906103b591906128da565b610cda565b6040516103c79190612cf9565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f291906126a0565b610d8c565b604051610404919061305d565b60405180910390f35b34801561041957600080fd5b50610422610e44565b005b34801561043057600080fd5b5061044b600480360381019061044691906126a0565b610ecc565b604051610458919061305d565b60405180910390f35b34801561046d57600080fd5b50610476610ee4565b604051610483919061305d565b60405180910390f35b34801561049857600080fd5b506104a1610eea565b005b3480156104af57600080fd5b506104b8610fa6565b6040516104c59190612cf9565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f091906128da565b610fd0565b005b34801561050357600080fd5b5061051e60048036038101906105199190612899565b611056565b005b34801561052c57600080fd5b506105356110ec565b6040516105429190612d7b565b60405180910390f35b34801561055757600080fd5b5061056061117e565b60405161056d919061305d565b60405180910390f35b610590600480360381019061058b91906128da565b611184565b005b34801561059e57600080fd5b506105b960048036038101906105b491906127cf565b6112e9565b005b3480156105c757600080fd5b506105d061146a565b6040516105dd919061305d565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190612754565b611470565b005b34801561061b57600080fd5b50610636600480360381019061063191906128da565b6114d2565b6040516106439190612d7b565b60405180910390f35b34801561065857600080fd5b50610661611579565b60405161066e9190612d60565b60405180910390f35b34801561068357600080fd5b5061068c61158c565b005b34801561069a57600080fd5b506106a3611634565b6040516106b09190612d7b565b60405180910390f35b3480156106c557600080fd5b506106e060048036038101906106db91906126c9565b6116c6565b6040516106ed9190612d60565b60405180910390f35b34801561070257600080fd5b5061071d600480360381019061071891906126a0565b61175a565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107fa57506107f982611852565b5b9050919050565b6060600080546108109061330d565b80601f016020809104026020016040519081016040528092919081815260200182805461083c9061330d565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b5050505050905090565b600061089e826118bc565b6108dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d490612f7d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092382610cda565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098b90612ffd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b3611928565b73ffffffffffffffffffffffffffffffffffffffff1614806109e257506109e1816109dc611928565b6116c6565b5b610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1890612ebd565b60405180910390fd5b610a2b8383611930565b505050565b6000610a3c60076119e9565b905090565b610a52610a4c611928565b826119f7565b610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a889061303d565b60405180910390fd5b610a9c838383611ad5565b505050565b61115c81565b610ac283838360405180602001604052806000815250611470565b505050565b610acf611928565b73ffffffffffffffffffffffffffffffffffffffff16610aed610fa6565b73ffffffffffffffffffffffffffffffffffffffff1614610b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3a90612f9d565b60405180910390fd5b8060089080519060200190610b599291906124c4565b5050565b600d60009054906101000a900460ff16610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba390612e9d565b60405180910390fd5b600b54610bb7610a30565b10610bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bee90612dfd565b60405180910390fd5b600c54600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c719061301d565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610cca90613370565b9190505550610cd833611d31565b565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a90612f1d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df490612efd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e4c611928565b73ffffffffffffffffffffffffffffffffffffffff16610e6a610fa6565b73ffffffffffffffffffffffffffffffffffffffff1614610ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb790612f9d565b60405180910390fd5b610eca6000611d57565b565b600e6020528060005260406000206000915090505481565b600c5481565b610ef2611928565b73ffffffffffffffffffffffffffffffffffffffff16610f10610fa6565b73ffffffffffffffffffffffffffffffffffffffff1614610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90612f9d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610fa457600080fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610fd8611928565b73ffffffffffffffffffffffffffffffffffffffff16610ff6610fa6565b73ffffffffffffffffffffffffffffffffffffffff161461104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104390612f9d565b60405180910390fd5b80600a8190555050565b61105e611928565b73ffffffffffffffffffffffffffffffffffffffff1661107c610fa6565b73ffffffffffffffffffffffffffffffffffffffff16146110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990612f9d565b60405180910390fd5b80600990805190602001906110e89291906124c4565b5050565b6060600180546110fb9061330d565b80601f01602080910402602001604051908101604052809291908181526020018280546111279061330d565b80156111745780601f1061114957610100808354040283529160200191611174565b820191906000526020600020905b81548152906001019060200180831161115757829003601f168201915b5050505050905090565b600a5481565b600d60009054906101000a900460ff166111d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ca90612e9d565b60405180910390fd5b602c811115611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90612f5d565b60405180910390fd5b61115c81611223610a30565b61122d9190613142565b111561126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126590612e7d565b60405180910390fd5b80600a5461127c91906131c9565b3410156112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b590612edd565b60405180910390fd5b60005b818110156112e5576112d233611d31565b80806112dd90613370565b9150506112c1565b5050565b6112f1611928565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135690612e3d565b60405180910390fd5b806005600061136c611928565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611419611928565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161145e9190612d60565b60405180910390a35050565b600b5481565b61148161147b611928565b836119f7565b6114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b79061303d565b60405180910390fd5b6114cc84848484611e1d565b50505050565b60606114dd826118bc565b61151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390612fdd565b60405180910390fd5b6000611526611e79565b905060008151116115465760405180602001604052806000815250611571565b8061155084611f0b565b604051602001611561929190612cd5565b6040516020818303038152906040525b915050919050565b600d60009054906101000a900460ff1681565b611594611928565b73ffffffffffffffffffffffffffffffffffffffff166115b2610fa6565b73ffffffffffffffffffffffffffffffffffffffff1614611608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ff90612f9d565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6060600980546116439061330d565b80601f016020809104026020016040519081016040528092919081815260200182805461166f9061330d565b80156116bc5780601f10611691576101008083540402835291602001916116bc565b820191906000526020600020905b81548152906001019060200180831161169f57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611762611928565b73ffffffffffffffffffffffffffffffffffffffff16611780610fa6565b73ffffffffffffffffffffffffffffffffffffffff16146117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90612f9d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90612dbd565b60405180910390fd5b61184f81611d57565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119a383610cda565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611a02826118bc565b611a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3890612e5d565b60405180910390fd5b6000611a4c83610cda565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611abb57508373ffffffffffffffffffffffffffffffffffffffff16611aa384610893565b73ffffffffffffffffffffffffffffffffffffffff16145b80611acc5750611acb81856116c6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611af582610cda565b73ffffffffffffffffffffffffffffffffffffffff1614611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4290612fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb290612e1d565b60405180910390fd5b611bc68383836120b8565b611bd1600082611930565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c219190613223565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c789190613142565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000611d3d60076119e9565b9050611d4960076120bd565b611d5382826120d3565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e28848484611ad5565b611e34848484846120f1565b611e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6a90612d9d565b60405180910390fd5b50505050565b606060088054611e889061330d565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb49061330d565b8015611f015780601f10611ed657610100808354040283529160200191611f01565b820191906000526020600020905b815481529060010190602001808311611ee457829003601f168201915b5050505050905090565b60606000821415611f53576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120b3565b600082905060005b60008214611f85578080611f6e90613370565b915050600a82611f7e9190613198565b9150611f5b565b60008167ffffffffffffffff811115611fc7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ff95781602001600182028036833780820191505090505b5090505b600085146120ac576001826120129190613223565b9150600a8561202191906133b9565b603061202d9190613142565b60f81b818381518110612069577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120a59190613198565b9450611ffd565b8093505050505b919050565b505050565b6001816000016000828254019250508190555050565b6120ed828260405180602001604052806000815250612288565b5050565b60006121128473ffffffffffffffffffffffffffffffffffffffff166122e3565b1561227b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261213b611928565b8786866040518563ffffffff1660e01b815260040161215d9493929190612d14565b602060405180830381600087803b15801561217757600080fd5b505af19250505080156121a857506040513d601f19601f820116820180604052508101906121a59190612870565b60015b61222b573d80600081146121d8576040519150601f19603f3d011682016040523d82523d6000602084013e6121dd565b606091505b50600081511415612223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221a90612d9d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612280565b600190505b949350505050565b61229283836122f6565b61229f60008484846120f1565b6122de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d590612d9d565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235d90612f3d565b60405180910390fd5b61236f816118bc565b156123af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a690612ddd565b60405180910390fd5b6123bb600083836120b8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461240b9190613142565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546124d09061330d565b90600052602060002090601f0160209004810192826124f25760008555612539565b82601f1061250b57805160ff1916838001178555612539565b82800160010185558215612539579182015b8281111561253857825182559160200191906001019061251d565b5b509050612546919061254a565b5090565b5b8082111561256357600081600090555060010161254b565b5090565b600061257a6125758461309d565b613078565b90508281526020810184848401111561259257600080fd5b61259d8482856132cb565b509392505050565b60006125b86125b3846130ce565b613078565b9050828152602081018484840111156125d057600080fd5b6125db8482856132cb565b509392505050565b6000813590506125f281613a2b565b92915050565b60008135905061260781613a42565b92915050565b60008135905061261c81613a59565b92915050565b60008151905061263181613a59565b92915050565b600082601f83011261264857600080fd5b8135612658848260208601612567565b91505092915050565b600082601f83011261267257600080fd5b81356126828482602086016125a5565b91505092915050565b60008135905061269a81613a70565b92915050565b6000602082840312156126b257600080fd5b60006126c0848285016125e3565b91505092915050565b600080604083850312156126dc57600080fd5b60006126ea858286016125e3565b92505060206126fb858286016125e3565b9150509250929050565b60008060006060848603121561271a57600080fd5b6000612728868287016125e3565b9350506020612739868287016125e3565b925050604061274a8682870161268b565b9150509250925092565b6000806000806080858703121561276a57600080fd5b6000612778878288016125e3565b9450506020612789878288016125e3565b935050604061279a8782880161268b565b925050606085013567ffffffffffffffff8111156127b757600080fd5b6127c387828801612637565b91505092959194509250565b600080604083850312156127e257600080fd5b60006127f0858286016125e3565b9250506020612801858286016125f8565b9150509250929050565b6000806040838503121561281e57600080fd5b600061282c858286016125e3565b925050602061283d8582860161268b565b9150509250929050565b60006020828403121561285957600080fd5b60006128678482850161260d565b91505092915050565b60006020828403121561288257600080fd5b600061289084828501612622565b91505092915050565b6000602082840312156128ab57600080fd5b600082013567ffffffffffffffff8111156128c557600080fd5b6128d184828501612661565b91505092915050565b6000602082840312156128ec57600080fd5b60006128fa8482850161268b565b91505092915050565b61290c81613257565b82525050565b61291b81613269565b82525050565b600061292c826130ff565b6129368185613115565b93506129468185602086016132da565b61294f816134a6565b840191505092915050565b60006129658261310a565b61296f8185613126565b935061297f8185602086016132da565b612988816134a6565b840191505092915050565b600061299e8261310a565b6129a88185613137565b93506129b88185602086016132da565b80840191505092915050565b60006129d1603283613126565b91506129dc826134b7565b604082019050919050565b60006129f4602683613126565b91506129ff82613506565b604082019050919050565b6000612a17601c83613126565b9150612a2282613555565b602082019050919050565b6000612a3a601e83613126565b9150612a458261357e565b602082019050919050565b6000612a5d602483613126565b9150612a68826135a7565b604082019050919050565b6000612a80601983613126565b9150612a8b826135f6565b602082019050919050565b6000612aa3602c83613126565b9150612aae8261361f565b604082019050919050565b6000612ac6600883613126565b9150612ad18261366e565b602082019050919050565b6000612ae9601283613126565b9150612af482613697565b602082019050919050565b6000612b0c603883613126565b9150612b17826136c0565b604082019050919050565b6000612b2f601983613126565b9150612b3a8261370f565b602082019050919050565b6000612b52602a83613126565b9150612b5d82613738565b604082019050919050565b6000612b75602983613126565b9150612b8082613787565b604082019050919050565b6000612b98602083613126565b9150612ba3826137d6565b602082019050919050565b6000612bbb602283613126565b9150612bc6826137ff565b604082019050919050565b6000612bde602c83613126565b9150612be98261384e565b604082019050919050565b6000612c01602083613126565b9150612c0c8261389d565b602082019050919050565b6000612c24602983613126565b9150612c2f826138c6565b604082019050919050565b6000612c47602f83613126565b9150612c5282613915565b604082019050919050565b6000612c6a602183613126565b9150612c7582613964565b604082019050919050565b6000612c8d601e83613126565b9150612c98826139b3565b602082019050919050565b6000612cb0603183613126565b9150612cbb826139dc565b604082019050919050565b612ccf816132c1565b82525050565b6000612ce18285612993565b9150612ced8284612993565b91508190509392505050565b6000602082019050612d0e6000830184612903565b92915050565b6000608082019050612d296000830187612903565b612d366020830186612903565b612d436040830185612cc6565b8181036060830152612d558184612921565b905095945050505050565b6000602082019050612d756000830184612912565b92915050565b60006020820190508181036000830152612d95818461295a565b905092915050565b60006020820190508181036000830152612db6816129c4565b9050919050565b60006020820190508181036000830152612dd6816129e7565b9050919050565b60006020820190508181036000830152612df681612a0a565b9050919050565b60006020820190508181036000830152612e1681612a2d565b9050919050565b60006020820190508181036000830152612e3681612a50565b9050919050565b60006020820190508181036000830152612e5681612a73565b9050919050565b60006020820190508181036000830152612e7681612a96565b9050919050565b60006020820190508181036000830152612e9681612ab9565b9050919050565b60006020820190508181036000830152612eb681612adc565b9050919050565b60006020820190508181036000830152612ed681612aff565b9050919050565b60006020820190508181036000830152612ef681612b22565b9050919050565b60006020820190508181036000830152612f1681612b45565b9050919050565b60006020820190508181036000830152612f3681612b68565b9050919050565b60006020820190508181036000830152612f5681612b8b565b9050919050565b60006020820190508181036000830152612f7681612bae565b9050919050565b60006020820190508181036000830152612f9681612bd1565b9050919050565b60006020820190508181036000830152612fb681612bf4565b9050919050565b60006020820190508181036000830152612fd681612c17565b9050919050565b60006020820190508181036000830152612ff681612c3a565b9050919050565b6000602082019050818103600083015261301681612c5d565b9050919050565b6000602082019050818103600083015261303681612c80565b9050919050565b6000602082019050818103600083015261305681612ca3565b9050919050565b60006020820190506130726000830184612cc6565b92915050565b6000613082613093565b905061308e828261333f565b919050565b6000604051905090565b600067ffffffffffffffff8211156130b8576130b7613477565b5b6130c1826134a6565b9050602081019050919050565b600067ffffffffffffffff8211156130e9576130e8613477565b5b6130f2826134a6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061314d826132c1565b9150613158836132c1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561318d5761318c6133ea565b5b828201905092915050565b60006131a3826132c1565b91506131ae836132c1565b9250826131be576131bd613419565b5b828204905092915050565b60006131d4826132c1565b91506131df836132c1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613218576132176133ea565b5b828202905092915050565b600061322e826132c1565b9150613239836132c1565b92508282101561324c5761324b6133ea565b5b828203905092915050565b6000613262826132a1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156132f85780820151818401526020810190506132dd565b83811115613307576000848401525b50505050565b6000600282049050600182168061332557607f821691505b6020821081141561333957613338613448565b5b50919050565b613348826134a6565b810181811067ffffffffffffffff8211171561336757613366613477565b5b80604052505050565b600061337b826132c1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133ae576133ad6133ea565b5b600182019050919050565b60006133c4826132c1565b91506133cf836132c1565b9250826133df576133de613419565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f746865726573206e6f2066726565206d696e74732072656d61696e696e670000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f73616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f65746865722073656e6420697320756e64657220707269636500000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f6d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f63616c6c657220616c7265616479206d696e74656420666f7220667265650000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b613a3481613257565b8114613a3f57600080fd5b50565b613a4b81613269565b8114613a5657600080fd5b50565b613a6281613275565b8114613a6d57600080fd5b50565b613a79816132c1565b8114613a8457600080fd5b5056fea2646970667358221220d623a989a793f7d73f10c5a688db287002da091bb1ff9c0cc645c2d142484d0f64736f6c63430008020033697066733a2f2f516d50534b7374484e754444556e64426839647967447936344b36567645744e6f435a3645684770794654764d4b

Deployed Bytecode

0x6080604052600436106101d85760003560e01c8063853828b611610102578063a591252d11610095578063dbd30ae011610064578063dbd30ae014610677578063e8a3d4851461068e578063e985e9c5146106b9578063f2fde38b146106f6576101d8565b8063a591252d146105bb578063b88d4fde146105e6578063c87b56dd1461060f578063daa81cdd1461064c576101d8565b806395d89b41116100d157806395d89b4114610520578063a035b1fe1461054b578063a0712d6814610576578063a22cb46514610592576101d8565b8063853828b61461048c5780638da5cb5b146104a357806391b7f5ed146104ce578063938e3d7b146104f7576101d8565b806342842e0e1161017a57806370a082311161014957806370a08231146103d0578063715018a61461040d5780637fc4618914610424578063845bb3bb14610461576101d8565b806342842e0e1461032a57806355f804b3146103535780635b70ea9f1461037c5780636352211e14610393576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d657806332cb6b0c146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612847565b61071f565b6040516102119190612d60565b60405180910390f35b34801561022657600080fd5b5061022f610801565b60405161023c9190612d7b565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906128da565b610893565b6040516102799190612cf9565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a4919061280b565b610918565b005b3480156102b757600080fd5b506102c0610a30565b6040516102cd919061305d565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190612705565b610a41565b005b34801561030b57600080fd5b50610314610aa1565b604051610321919061305d565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190612705565b610aa7565b005b34801561035f57600080fd5b5061037a60048036038101906103759190612899565b610ac7565b005b34801561038857600080fd5b50610391610b5d565b005b34801561039f57600080fd5b506103ba60048036038101906103b591906128da565b610cda565b6040516103c79190612cf9565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f291906126a0565b610d8c565b604051610404919061305d565b60405180910390f35b34801561041957600080fd5b50610422610e44565b005b34801561043057600080fd5b5061044b600480360381019061044691906126a0565b610ecc565b604051610458919061305d565b60405180910390f35b34801561046d57600080fd5b50610476610ee4565b604051610483919061305d565b60405180910390f35b34801561049857600080fd5b506104a1610eea565b005b3480156104af57600080fd5b506104b8610fa6565b6040516104c59190612cf9565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f091906128da565b610fd0565b005b34801561050357600080fd5b5061051e60048036038101906105199190612899565b611056565b005b34801561052c57600080fd5b506105356110ec565b6040516105429190612d7b565b60405180910390f35b34801561055757600080fd5b5061056061117e565b60405161056d919061305d565b60405180910390f35b610590600480360381019061058b91906128da565b611184565b005b34801561059e57600080fd5b506105b960048036038101906105b491906127cf565b6112e9565b005b3480156105c757600080fd5b506105d061146a565b6040516105dd919061305d565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190612754565b611470565b005b34801561061b57600080fd5b50610636600480360381019061063191906128da565b6114d2565b6040516106439190612d7b565b60405180910390f35b34801561065857600080fd5b50610661611579565b60405161066e9190612d60565b60405180910390f35b34801561068357600080fd5b5061068c61158c565b005b34801561069a57600080fd5b506106a3611634565b6040516106b09190612d7b565b60405180910390f35b3480156106c557600080fd5b506106e060048036038101906106db91906126c9565b6116c6565b6040516106ed9190612d60565b60405180910390f35b34801561070257600080fd5b5061071d600480360381019061071891906126a0565b61175a565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107fa57506107f982611852565b5b9050919050565b6060600080546108109061330d565b80601f016020809104026020016040519081016040528092919081815260200182805461083c9061330d565b80156108895780601f1061085e57610100808354040283529160200191610889565b820191906000526020600020905b81548152906001019060200180831161086c57829003601f168201915b5050505050905090565b600061089e826118bc565b6108dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d490612f7d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092382610cda565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098b90612ffd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b3611928565b73ffffffffffffffffffffffffffffffffffffffff1614806109e257506109e1816109dc611928565b6116c6565b5b610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1890612ebd565b60405180910390fd5b610a2b8383611930565b505050565b6000610a3c60076119e9565b905090565b610a52610a4c611928565b826119f7565b610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a889061303d565b60405180910390fd5b610a9c838383611ad5565b505050565b61115c81565b610ac283838360405180602001604052806000815250611470565b505050565b610acf611928565b73ffffffffffffffffffffffffffffffffffffffff16610aed610fa6565b73ffffffffffffffffffffffffffffffffffffffff1614610b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3a90612f9d565b60405180910390fd5b8060089080519060200190610b599291906124c4565b5050565b600d60009054906101000a900460ff16610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba390612e9d565b60405180910390fd5b600b54610bb7610a30565b10610bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bee90612dfd565b60405180910390fd5b600c54600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610c7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c719061301d565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610cca90613370565b9190505550610cd833611d31565b565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7a90612f1d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df490612efd565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e4c611928565b73ffffffffffffffffffffffffffffffffffffffff16610e6a610fa6565b73ffffffffffffffffffffffffffffffffffffffff1614610ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb790612f9d565b60405180910390fd5b610eca6000611d57565b565b600e6020528060005260406000206000915090505481565b600c5481565b610ef2611928565b73ffffffffffffffffffffffffffffffffffffffff16610f10610fa6565b73ffffffffffffffffffffffffffffffffffffffff1614610f66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5d90612f9d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610fa457600080fd5b565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610fd8611928565b73ffffffffffffffffffffffffffffffffffffffff16610ff6610fa6565b73ffffffffffffffffffffffffffffffffffffffff161461104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104390612f9d565b60405180910390fd5b80600a8190555050565b61105e611928565b73ffffffffffffffffffffffffffffffffffffffff1661107c610fa6565b73ffffffffffffffffffffffffffffffffffffffff16146110d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c990612f9d565b60405180910390fd5b80600990805190602001906110e89291906124c4565b5050565b6060600180546110fb9061330d565b80601f01602080910402602001604051908101604052809291908181526020018280546111279061330d565b80156111745780601f1061114957610100808354040283529160200191611174565b820191906000526020600020905b81548152906001019060200180831161115757829003601f168201915b5050505050905090565b600a5481565b600d60009054906101000a900460ff166111d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ca90612e9d565b60405180910390fd5b602c811115611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e90612f5d565b60405180910390fd5b61115c81611223610a30565b61122d9190613142565b111561126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126590612e7d565b60405180910390fd5b80600a5461127c91906131c9565b3410156112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b590612edd565b60405180910390fd5b60005b818110156112e5576112d233611d31565b80806112dd90613370565b9150506112c1565b5050565b6112f1611928565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135690612e3d565b60405180910390fd5b806005600061136c611928565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611419611928565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161145e9190612d60565b60405180910390a35050565b600b5481565b61148161147b611928565b836119f7565b6114c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b79061303d565b60405180910390fd5b6114cc84848484611e1d565b50505050565b60606114dd826118bc565b61151c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151390612fdd565b60405180910390fd5b6000611526611e79565b905060008151116115465760405180602001604052806000815250611571565b8061155084611f0b565b604051602001611561929190612cd5565b6040516020818303038152906040525b915050919050565b600d60009054906101000a900460ff1681565b611594611928565b73ffffffffffffffffffffffffffffffffffffffff166115b2610fa6565b73ffffffffffffffffffffffffffffffffffffffff1614611608576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ff90612f9d565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6060600980546116439061330d565b80601f016020809104026020016040519081016040528092919081815260200182805461166f9061330d565b80156116bc5780601f10611691576101008083540402835291602001916116bc565b820191906000526020600020905b81548152906001019060200180831161169f57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611762611928565b73ffffffffffffffffffffffffffffffffffffffff16611780610fa6565b73ffffffffffffffffffffffffffffffffffffffff16146117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90612f9d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90612dbd565b60405180910390fd5b61184f81611d57565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119a383610cda565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611a02826118bc565b611a41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3890612e5d565b60405180910390fd5b6000611a4c83610cda565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611abb57508373ffffffffffffffffffffffffffffffffffffffff16611aa384610893565b73ffffffffffffffffffffffffffffffffffffffff16145b80611acc5750611acb81856116c6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611af582610cda565b73ffffffffffffffffffffffffffffffffffffffff1614611b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4290612fbd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb290612e1d565b60405180910390fd5b611bc68383836120b8565b611bd1600082611930565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c219190613223565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c789190613142565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000611d3d60076119e9565b9050611d4960076120bd565b611d5382826120d3565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e28848484611ad5565b611e34848484846120f1565b611e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6a90612d9d565b60405180910390fd5b50505050565b606060088054611e889061330d565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb49061330d565b8015611f015780601f10611ed657610100808354040283529160200191611f01565b820191906000526020600020905b815481529060010190602001808311611ee457829003601f168201915b5050505050905090565b60606000821415611f53576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120b3565b600082905060005b60008214611f85578080611f6e90613370565b915050600a82611f7e9190613198565b9150611f5b565b60008167ffffffffffffffff811115611fc7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ff95781602001600182028036833780820191505090505b5090505b600085146120ac576001826120129190613223565b9150600a8561202191906133b9565b603061202d9190613142565b60f81b818381518110612069577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120a59190613198565b9450611ffd565b8093505050505b919050565b505050565b6001816000016000828254019250508190555050565b6120ed828260405180602001604052806000815250612288565b5050565b60006121128473ffffffffffffffffffffffffffffffffffffffff166122e3565b1561227b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261213b611928565b8786866040518563ffffffff1660e01b815260040161215d9493929190612d14565b602060405180830381600087803b15801561217757600080fd5b505af19250505080156121a857506040513d601f19601f820116820180604052508101906121a59190612870565b60015b61222b573d80600081146121d8576040519150601f19603f3d011682016040523d82523d6000602084013e6121dd565b606091505b50600081511415612223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221a90612d9d565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612280565b600190505b949350505050565b61229283836122f6565b61229f60008484846120f1565b6122de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d590612d9d565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235d90612f3d565b60405180910390fd5b61236f816118bc565b156123af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a690612ddd565b60405180910390fd5b6123bb600083836120b8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461240b9190613142565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546124d09061330d565b90600052602060002090601f0160209004810192826124f25760008555612539565b82601f1061250b57805160ff1916838001178555612539565b82800160010185558215612539579182015b8281111561253857825182559160200191906001019061251d565b5b509050612546919061254a565b5090565b5b8082111561256357600081600090555060010161254b565b5090565b600061257a6125758461309d565b613078565b90508281526020810184848401111561259257600080fd5b61259d8482856132cb565b509392505050565b60006125b86125b3846130ce565b613078565b9050828152602081018484840111156125d057600080fd5b6125db8482856132cb565b509392505050565b6000813590506125f281613a2b565b92915050565b60008135905061260781613a42565b92915050565b60008135905061261c81613a59565b92915050565b60008151905061263181613a59565b92915050565b600082601f83011261264857600080fd5b8135612658848260208601612567565b91505092915050565b600082601f83011261267257600080fd5b81356126828482602086016125a5565b91505092915050565b60008135905061269a81613a70565b92915050565b6000602082840312156126b257600080fd5b60006126c0848285016125e3565b91505092915050565b600080604083850312156126dc57600080fd5b60006126ea858286016125e3565b92505060206126fb858286016125e3565b9150509250929050565b60008060006060848603121561271a57600080fd5b6000612728868287016125e3565b9350506020612739868287016125e3565b925050604061274a8682870161268b565b9150509250925092565b6000806000806080858703121561276a57600080fd5b6000612778878288016125e3565b9450506020612789878288016125e3565b935050604061279a8782880161268b565b925050606085013567ffffffffffffffff8111156127b757600080fd5b6127c387828801612637565b91505092959194509250565b600080604083850312156127e257600080fd5b60006127f0858286016125e3565b9250506020612801858286016125f8565b9150509250929050565b6000806040838503121561281e57600080fd5b600061282c858286016125e3565b925050602061283d8582860161268b565b9150509250929050565b60006020828403121561285957600080fd5b60006128678482850161260d565b91505092915050565b60006020828403121561288257600080fd5b600061289084828501612622565b91505092915050565b6000602082840312156128ab57600080fd5b600082013567ffffffffffffffff8111156128c557600080fd5b6128d184828501612661565b91505092915050565b6000602082840312156128ec57600080fd5b60006128fa8482850161268b565b91505092915050565b61290c81613257565b82525050565b61291b81613269565b82525050565b600061292c826130ff565b6129368185613115565b93506129468185602086016132da565b61294f816134a6565b840191505092915050565b60006129658261310a565b61296f8185613126565b935061297f8185602086016132da565b612988816134a6565b840191505092915050565b600061299e8261310a565b6129a88185613137565b93506129b88185602086016132da565b80840191505092915050565b60006129d1603283613126565b91506129dc826134b7565b604082019050919050565b60006129f4602683613126565b91506129ff82613506565b604082019050919050565b6000612a17601c83613126565b9150612a2282613555565b602082019050919050565b6000612a3a601e83613126565b9150612a458261357e565b602082019050919050565b6000612a5d602483613126565b9150612a68826135a7565b604082019050919050565b6000612a80601983613126565b9150612a8b826135f6565b602082019050919050565b6000612aa3602c83613126565b9150612aae8261361f565b604082019050919050565b6000612ac6600883613126565b9150612ad18261366e565b602082019050919050565b6000612ae9601283613126565b9150612af482613697565b602082019050919050565b6000612b0c603883613126565b9150612b17826136c0565b604082019050919050565b6000612b2f601983613126565b9150612b3a8261370f565b602082019050919050565b6000612b52602a83613126565b9150612b5d82613738565b604082019050919050565b6000612b75602983613126565b9150612b8082613787565b604082019050919050565b6000612b98602083613126565b9150612ba3826137d6565b602082019050919050565b6000612bbb602283613126565b9150612bc6826137ff565b604082019050919050565b6000612bde602c83613126565b9150612be98261384e565b604082019050919050565b6000612c01602083613126565b9150612c0c8261389d565b602082019050919050565b6000612c24602983613126565b9150612c2f826138c6565b604082019050919050565b6000612c47602f83613126565b9150612c5282613915565b604082019050919050565b6000612c6a602183613126565b9150612c7582613964565b604082019050919050565b6000612c8d601e83613126565b9150612c98826139b3565b602082019050919050565b6000612cb0603183613126565b9150612cbb826139dc565b604082019050919050565b612ccf816132c1565b82525050565b6000612ce18285612993565b9150612ced8284612993565b91508190509392505050565b6000602082019050612d0e6000830184612903565b92915050565b6000608082019050612d296000830187612903565b612d366020830186612903565b612d436040830185612cc6565b8181036060830152612d558184612921565b905095945050505050565b6000602082019050612d756000830184612912565b92915050565b60006020820190508181036000830152612d95818461295a565b905092915050565b60006020820190508181036000830152612db6816129c4565b9050919050565b60006020820190508181036000830152612dd6816129e7565b9050919050565b60006020820190508181036000830152612df681612a0a565b9050919050565b60006020820190508181036000830152612e1681612a2d565b9050919050565b60006020820190508181036000830152612e3681612a50565b9050919050565b60006020820190508181036000830152612e5681612a73565b9050919050565b60006020820190508181036000830152612e7681612a96565b9050919050565b60006020820190508181036000830152612e9681612ab9565b9050919050565b60006020820190508181036000830152612eb681612adc565b9050919050565b60006020820190508181036000830152612ed681612aff565b9050919050565b60006020820190508181036000830152612ef681612b22565b9050919050565b60006020820190508181036000830152612f1681612b45565b9050919050565b60006020820190508181036000830152612f3681612b68565b9050919050565b60006020820190508181036000830152612f5681612b8b565b9050919050565b60006020820190508181036000830152612f7681612bae565b9050919050565b60006020820190508181036000830152612f9681612bd1565b9050919050565b60006020820190508181036000830152612fb681612bf4565b9050919050565b60006020820190508181036000830152612fd681612c17565b9050919050565b60006020820190508181036000830152612ff681612c3a565b9050919050565b6000602082019050818103600083015261301681612c5d565b9050919050565b6000602082019050818103600083015261303681612c80565b9050919050565b6000602082019050818103600083015261305681612ca3565b9050919050565b60006020820190506130726000830184612cc6565b92915050565b6000613082613093565b905061308e828261333f565b919050565b6000604051905090565b600067ffffffffffffffff8211156130b8576130b7613477565b5b6130c1826134a6565b9050602081019050919050565b600067ffffffffffffffff8211156130e9576130e8613477565b5b6130f2826134a6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061314d826132c1565b9150613158836132c1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561318d5761318c6133ea565b5b828201905092915050565b60006131a3826132c1565b91506131ae836132c1565b9250826131be576131bd613419565b5b828204905092915050565b60006131d4826132c1565b91506131df836132c1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613218576132176133ea565b5b828202905092915050565b600061322e826132c1565b9150613239836132c1565b92508282101561324c5761324b6133ea565b5b828203905092915050565b6000613262826132a1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156132f85780820151818401526020810190506132dd565b83811115613307576000848401525b50505050565b6000600282049050600182168061332557607f821691505b6020821081141561333957613338613448565b5b50919050565b613348826134a6565b810181811067ffffffffffffffff8211171561336757613366613477565b5b80604052505050565b600061337b826132c1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156133ae576133ad6133ea565b5b600182019050919050565b60006133c4826132c1565b91506133cf836132c1565b9250826133df576133de613419565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f746865726573206e6f2066726565206d696e74732072656d61696e696e670000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f73616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f65746865722073656e6420697320756e64657220707269636500000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f6d6178206d696e747320706572207472616e73616374696f6e2065786365656460008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f63616c6c657220616c7265616479206d696e74656420666f7220667265650000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b613a3481613257565b8114613a3f57600080fd5b50565b613a4b81613269565b8114613a5657600080fd5b50565b613a6281613275565b8114613a6d57600080fd5b50565b613a79816132c1565b8114613a8457600080fd5b5056fea2646970667358221220d623a989a793f7d73f10c5a688db287002da091bb1ff9c0cc645c2d142484d0f64736f6c63430008020033

Deployed Bytecode Sourcemap

36522:2509:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24333:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25278:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26837:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26360:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38237:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27727:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36711:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28137:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38459:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37235:366;;;;;;;;;;;;;:::i;:::-;;24972:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24702:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5968:94;;;;;;;;;;;;;:::i;:::-;;36920:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36830:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38911:117;;;;;;;;;;;;;:::i;:::-;;5317:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38812;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38576:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25447:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36756:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37613:432;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27130:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36794:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28393:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25622:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36874:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38709:91;;;;;;;;;;;;;:::i;:::-;;38350:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27496:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6217:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24333:305;24435:4;24487:25;24472:40;;;:11;:40;;;;:105;;;;24544:33;24529:48;;;:11;:48;;;;24472:105;:158;;;;24594:36;24618:11;24594:23;:36::i;:::-;24472:158;24452:178;;24333:305;;;:::o;25278:100::-;25332:13;25365:5;25358:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25278:100;:::o;26837:221::-;26913:7;26941:16;26949:7;26941;:16::i;:::-;26933:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27026:15;:24;27042:7;27026:24;;;;;;;;;;;;;;;;;;;;;27019:31;;26837:221;;;:::o;26360:411::-;26441:13;26457:23;26472:7;26457:14;:23::i;:::-;26441:39;;26505:5;26499:11;;:2;:11;;;;26491:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26599:5;26583:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26608:37;26625:5;26632:12;:10;:12::i;:::-;26608:16;:37::i;:::-;26583:62;26561:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26742:21;26751:2;26755:7;26742:8;:21::i;:::-;26360:411;;;:::o;38237:101::-;38281:4;38305:25;:15;:23;:25::i;:::-;38298:32;;38237:101;:::o;27727:339::-;27922:41;27941:12;:10;:12::i;:::-;27955:7;27922:18;:41::i;:::-;27914:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28030:28;28040:4;28046:2;28050:7;28030:9;:28::i;:::-;27727:339;;;:::o;36711:38::-;36745:4;36711:38;:::o;28137:185::-;28275:39;28292:4;28298:2;28302:7;28275:39;;;;;;;;;;;;:16;:39::i;:::-;28137:185;;;:::o;38459:105::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38546:10:::1;38535:8;:21;;;;;;;;;;;;:::i;:::-;;38459:105:::0;:::o;37235:366::-;37283:13;;;;;;;;;;;37275:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;37354:11;;37338:13;:11;:13::i;:::-;:27;37330:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;37453:20;;37419:19;:31;37439:10;37419:31;;;;;;;;;;;;;;;;:54;37411:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;37529:19;:31;37549:10;37529:31;;;;;;;;;;;;;;;;:33;;;;;;;;;:::i;:::-;;;;;;37573:20;37582:10;37573:8;:20::i;:::-;37235:366::o;24972:239::-;25044:7;25064:13;25080:7;:16;25088:7;25080:16;;;;;;;;;;;;;;;;;;;;;25064:32;;25132:1;25115:19;;:5;:19;;;;25107:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25198:5;25191:12;;;24972:239;;;:::o;24702:208::-;24774:7;24819:1;24802:19;;:5;:19;;;;24794:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24886:9;:16;24896:5;24886:16;;;;;;;;;;;;;;;;24879:23;;24702:208;;;:::o;5968:94::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6033:21:::1;6051:1;6033:9;:21::i;:::-;5968:94::o:0;36920:51::-;;;;;;;;;;;;;;;;;:::o;36830:37::-;;;;:::o;38911:117::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38980:10:::1;38972:24;;:47;38997:21;38972:47;;;;;;;;;;;;;;;;;;;;;;;38964:56;;;::::0;::::1;;38911:117::o:0;5317:87::-;5363:7;5390:6;;;;;;;;;;;5383:13;;5317:87;:::o;38812:::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38883:8:::1;38875:5;:16;;;;38812:87:::0;:::o;38576:121::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38675:14:::1;38660:12;:29;;;;;;;;;;;;:::i;:::-;;38576:121:::0;:::o;25447:104::-;25503:13;25536:7;25529:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25447:104;:::o;36756:31::-;;;;:::o;37613:432::-;37678:13;;;;;;;;;;;37670:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;37745:2;37733:8;:14;;37725:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36745:4;37821:8;37805:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;37797:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;37896:8;37888:5;;:16;;;;:::i;:::-;37875:9;:29;;37867:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37960:6;37955:83;37976:8;37972:1;:12;37955:83;;;38006:20;38015:10;38006:8;:20::i;:::-;37986:3;;;;;:::i;:::-;;;;37955:83;;;;37613:432;:::o;27130:295::-;27245:12;:10;:12::i;:::-;27233:24;;:8;:24;;;;27225:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27345:8;27300:18;:32;27319:12;:10;:12::i;:::-;27300:32;;;;;;;;;;;;;;;:42;27333:8;27300:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27398:8;27369:48;;27384:12;:10;:12::i;:::-;27369:48;;;27408:8;27369:48;;;;;;:::i;:::-;;;;;;;;27130:295;;:::o;36794:29::-;;;;:::o;28393:328::-;28568:41;28587:12;:10;:12::i;:::-;28601:7;28568:18;:41::i;:::-;28560:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28674:39;28688:4;28694:2;28698:7;28707:5;28674:13;:39::i;:::-;28393:328;;;;:::o;25622:334::-;25695:13;25729:16;25737:7;25729;:16::i;:::-;25721:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25810:21;25834:10;:8;:10::i;:::-;25810:34;;25886:1;25868:7;25862:21;:25;:86;;;;;;;;;;;;;;;;;25914:7;25923:18;:7;:16;:18::i;:::-;25897:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25862:86;25855:93;;;25622:334;;;:::o;36874:33::-;;;;;;;;;;;;;:::o;38709:91::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38779:13:::1;;;;;;;;;;;38778:14;38762:13;;:30;;;;;;;;;;;;;;;;;;38709:91::o:0;38350:97::-;38394:13;38427:12;38420:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38350:97;:::o;27496:164::-;27593:4;27617:18;:25;27636:5;27617:25;;;;;;;;;;;;;;;:35;27643:8;27617:35;;;;;;;;;;;;;;;;;;;;;;;;;27610:42;;27496:164;;;;:::o;6217:192::-;5548:12;:10;:12::i;:::-;5537:23;;:7;:5;:7::i;:::-;:23;;;5529:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6326:1:::1;6306:22;;:8;:22;;;;6298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6382:19;6392:8;6382:9;:19::i;:::-;6217:192:::0;:::o;17303:157::-;17388:4;17427:25;17412:40;;;:11;:40;;;;17405:47;;17303:157;;;:::o;30231:127::-;30296:4;30348:1;30320:30;;:7;:16;30328:7;30320:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30313:37;;30231:127;;;:::o;4105:98::-;4158:7;4185:10;4178:17;;4105:98;:::o;34213:174::-;34315:2;34288:15;:24;34304:7;34288:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34371:7;34367:2;34333:46;;34342:23;34357:7;34342:14;:23::i;:::-;34333:46;;;;;;;;;;;;34213:174;;:::o;817:114::-;882:7;909;:14;;;902:21;;817:114;;;:::o;30525:348::-;30618:4;30643:16;30651:7;30643;:16::i;:::-;30635:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30719:13;30735:23;30750:7;30735:14;:23::i;:::-;30719:39;;30788:5;30777:16;;:7;:16;;;:51;;;;30821:7;30797:31;;:20;30809:7;30797:11;:20::i;:::-;:31;;;30777:51;:87;;;;30832:32;30849:5;30856:7;30832:16;:32::i;:::-;30777:87;30769:96;;;30525:348;;;;:::o;33517:578::-;33676:4;33649:31;;:23;33664:7;33649:14;:23::i;:::-;:31;;;33641:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33759:1;33745:16;;:2;:16;;;;33737:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33815:39;33836:4;33842:2;33846:7;33815:20;:39::i;:::-;33919:29;33936:1;33940:7;33919:8;:29::i;:::-;33980:1;33961:9;:15;33971:4;33961:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34009:1;33992:9;:13;34002:2;33992:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34040:2;34021:7;:16;34029:7;34021:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34079:7;34075:2;34060:27;;34069:4;34060:27;;;;;;;;;;;;33517:578;;;:::o;38053:172::-;38103:15;38121:25;:15;:23;:25::i;:::-;38103:43;;38157:27;:15;:25;:27::i;:::-;38195:22;38205:2;38209:7;38195:9;:22::i;:::-;38053:172;;:::o;6417:173::-;6473:16;6492:6;;;;;;;;;;;6473:25;;6518:8;6509:6;;:17;;;;;;;;;;;;;;;;;;6573:8;6542:40;;6563:8;6542:40;;;;;;;;;;;;6417:173;;:::o;29603:315::-;29760:28;29770:4;29776:2;29780:7;29760:9;:28::i;:::-;29807:48;29830:4;29836:2;29840:7;29849:5;29807:22;:48::i;:::-;29799:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29603:315;;;;:::o;37122:101::-;37174:13;37207:8;37200:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37122:101;:::o;1721:723::-;1777:13;2007:1;1998:5;:10;1994:53;;;2025:10;;;;;;;;;;;;;;;;;;;;;1994:53;2057:12;2072:5;2057:20;;2088:14;2113:78;2128:1;2120:4;:9;2113:78;;2146:8;;;;;:::i;:::-;;;;2177:2;2169:10;;;;;:::i;:::-;;;2113:78;;;2201:19;2233:6;2223:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2201:39;;2251:154;2267:1;2258:5;:10;2251:154;;2295:1;2285:11;;;;;:::i;:::-;;;2362:2;2354:5;:10;;;;:::i;:::-;2341:2;:24;;;;:::i;:::-;2328:39;;2311:6;2318;2311:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;2391:2;2382:11;;;;;:::i;:::-;;;2251:154;;;2429:6;2415:21;;;;;1721:723;;;;:::o;36323:126::-;;;;:::o;939:127::-;1046:1;1028:7;:14;;;:19;;;;;;;;;;;939:127;:::o;31215:110::-;31291:26;31301:2;31305:7;31291:26;;;;;;;;;;;;:9;:26::i;:::-;31215:110;;:::o;34952:799::-;35107:4;35128:15;:2;:13;;;:15::i;:::-;35124:620;;;35180:2;35164:36;;;35201:12;:10;:12::i;:::-;35215:4;35221:7;35230:5;35164:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35160:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35423:1;35406:6;:13;:18;35402:272;;;35449:60;;;;;;;;;;:::i;:::-;;;;;;;;35402:272;35624:6;35618:13;35609:6;35605:2;35601:15;35594:38;35160:529;35297:41;;;35287:51;;;:6;:51;;;;35280:58;;;;;35124:620;35728:4;35721:11;;34952:799;;;;;;;:::o;31552:321::-;31682:18;31688:2;31692:7;31682:5;:18::i;:::-;31733:54;31764:1;31768:2;31772:7;31781:5;31733:22;:54::i;:::-;31711:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31552:321;;;:::o;7363:387::-;7423:4;7631:12;7698:7;7686:20;7678:28;;7741:1;7734:4;:8;7727:15;;;7363:387;;;:::o;32209:382::-;32303:1;32289:16;;:2;:16;;;;32281:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32362:16;32370:7;32362;:16::i;:::-;32361:17;32353:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32424:45;32453:1;32457:2;32461:7;32424:20;:45::i;:::-;32499:1;32482:9;:13;32492:2;32482:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32530:2;32511:7;:16;32519:7;32511:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32575:7;32571:2;32550:33;;32567:1;32550:33;;;;;;;;;;;;32209:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;;;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;;;;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;;;;;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;;;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;;;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:118::-;6173:24;6191:5;6173:24;:::i;:::-;6168:3;6161:37;6151:53;;:::o;6210:109::-;6291:21;6306:5;6291:21;:::i;:::-;6286:3;6279:34;6269:50;;:::o;6325:360::-;;6439:38;6471:5;6439:38;:::i;:::-;6493:70;6556:6;6551:3;6493:70;:::i;:::-;6486:77;;6572:52;6617:6;6612:3;6605:4;6598:5;6594:16;6572:52;:::i;:::-;6649:29;6671:6;6649:29;:::i;:::-;6644:3;6640:39;6633:46;;6415:270;;;;;:::o;6691:364::-;;6807:39;6840:5;6807:39;:::i;:::-;6862:71;6926:6;6921:3;6862:71;:::i;:::-;6855:78;;6942:52;6987:6;6982:3;6975:4;6968:5;6964:16;6942:52;:::i;:::-;7019:29;7041:6;7019:29;:::i;:::-;7014:3;7010:39;7003:46;;6783:272;;;;;:::o;7061:377::-;;7195:39;7228:5;7195:39;:::i;:::-;7250:89;7332:6;7327:3;7250:89;:::i;:::-;7243:96;;7348:52;7393:6;7388:3;7381:4;7374:5;7370:16;7348:52;:::i;:::-;7425:6;7420:3;7416:16;7409:23;;7171:267;;;;;:::o;7444:366::-;;7607:67;7671:2;7666:3;7607:67;:::i;:::-;7600:74;;7683:93;7772:3;7683:93;:::i;:::-;7801:2;7796:3;7792:12;7785:19;;7590:220;;;:::o;7816:366::-;;7979:67;8043:2;8038:3;7979:67;:::i;:::-;7972:74;;8055:93;8144:3;8055:93;:::i;:::-;8173:2;8168:3;8164:12;8157:19;;7962:220;;;:::o;8188:366::-;;8351:67;8415:2;8410:3;8351:67;:::i;:::-;8344:74;;8427:93;8516:3;8427:93;:::i;:::-;8545:2;8540:3;8536:12;8529:19;;8334:220;;;:::o;8560:366::-;;8723:67;8787:2;8782:3;8723:67;:::i;:::-;8716:74;;8799:93;8888:3;8799:93;:::i;:::-;8917:2;8912:3;8908:12;8901:19;;8706:220;;;:::o;8932:366::-;;9095:67;9159:2;9154:3;9095:67;:::i;:::-;9088:74;;9171:93;9260:3;9171:93;:::i;:::-;9289:2;9284:3;9280:12;9273:19;;9078:220;;;:::o;9304:366::-;;9467:67;9531:2;9526:3;9467:67;:::i;:::-;9460:74;;9543:93;9632:3;9543:93;:::i;:::-;9661:2;9656:3;9652:12;9645:19;;9450:220;;;:::o;9676:366::-;;9839:67;9903:2;9898:3;9839:67;:::i;:::-;9832:74;;9915:93;10004:3;9915:93;:::i;:::-;10033:2;10028:3;10024:12;10017:19;;9822:220;;;:::o;10048:365::-;;10211:66;10275:1;10270:3;10211:66;:::i;:::-;10204:73;;10286:93;10375:3;10286:93;:::i;:::-;10404:2;10399:3;10395:12;10388:19;;10194:219;;;:::o;10419:366::-;;10582:67;10646:2;10641:3;10582:67;:::i;:::-;10575:74;;10658:93;10747:3;10658:93;:::i;:::-;10776:2;10771:3;10767:12;10760:19;;10565:220;;;:::o;10791:366::-;;10954:67;11018:2;11013:3;10954:67;:::i;:::-;10947:74;;11030:93;11119:3;11030:93;:::i;:::-;11148:2;11143:3;11139:12;11132:19;;10937:220;;;:::o;11163:366::-;;11326:67;11390:2;11385:3;11326:67;:::i;:::-;11319:74;;11402:93;11491:3;11402:93;:::i;:::-;11520:2;11515:3;11511:12;11504:19;;11309:220;;;:::o;11535:366::-;;11698:67;11762:2;11757:3;11698:67;:::i;:::-;11691:74;;11774:93;11863:3;11774:93;:::i;:::-;11892:2;11887:3;11883:12;11876:19;;11681:220;;;:::o;11907:366::-;;12070:67;12134:2;12129:3;12070:67;:::i;:::-;12063:74;;12146:93;12235:3;12146:93;:::i;:::-;12264:2;12259:3;12255:12;12248:19;;12053:220;;;:::o;12279:366::-;;12442:67;12506:2;12501:3;12442:67;:::i;:::-;12435:74;;12518:93;12607:3;12518:93;:::i;:::-;12636:2;12631:3;12627:12;12620:19;;12425:220;;;:::o;12651:366::-;;12814:67;12878:2;12873:3;12814:67;:::i;:::-;12807:74;;12890:93;12979:3;12890:93;:::i;:::-;13008:2;13003:3;12999:12;12992:19;;12797:220;;;:::o;13023:366::-;;13186:67;13250:2;13245:3;13186:67;:::i;:::-;13179:74;;13262:93;13351:3;13262:93;:::i;:::-;13380:2;13375:3;13371:12;13364:19;;13169:220;;;:::o;13395:366::-;;13558:67;13622:2;13617:3;13558:67;:::i;:::-;13551:74;;13634:93;13723:3;13634:93;:::i;:::-;13752:2;13747:3;13743:12;13736:19;;13541:220;;;:::o;13767:366::-;;13930:67;13994:2;13989:3;13930:67;:::i;:::-;13923:74;;14006:93;14095:3;14006:93;:::i;:::-;14124:2;14119:3;14115:12;14108:19;;13913:220;;;:::o;14139:366::-;;14302:67;14366:2;14361:3;14302:67;:::i;:::-;14295:74;;14378:93;14467:3;14378:93;:::i;:::-;14496:2;14491:3;14487:12;14480:19;;14285:220;;;:::o;14511:366::-;;14674:67;14738:2;14733:3;14674:67;:::i;:::-;14667:74;;14750:93;14839:3;14750:93;:::i;:::-;14868:2;14863:3;14859:12;14852:19;;14657:220;;;:::o;14883:366::-;;15046:67;15110:2;15105:3;15046:67;:::i;:::-;15039:74;;15122:93;15211:3;15122:93;:::i;:::-;15240:2;15235:3;15231:12;15224:19;;15029:220;;;:::o;15255:366::-;;15418:67;15482:2;15477:3;15418:67;:::i;:::-;15411:74;;15494:93;15583:3;15494:93;:::i;:::-;15612:2;15607:3;15603:12;15596:19;;15401:220;;;:::o;15627:118::-;15714:24;15732:5;15714:24;:::i;:::-;15709:3;15702:37;15692:53;;:::o;15751:435::-;;15953:95;16044:3;16035:6;15953:95;:::i;:::-;15946:102;;16065:95;16156:3;16147:6;16065:95;:::i;:::-;16058:102;;16177:3;16170:10;;15935:251;;;;;:::o;16192:222::-;;16323:2;16312:9;16308:18;16300:26;;16336:71;16404:1;16393:9;16389:17;16380:6;16336:71;:::i;:::-;16290:124;;;;:::o;16420:640::-;;16653:3;16642:9;16638:19;16630:27;;16667:71;16735:1;16724:9;16720:17;16711:6;16667:71;:::i;:::-;16748:72;16816:2;16805:9;16801:18;16792:6;16748:72;:::i;:::-;16830;16898:2;16887:9;16883:18;16874:6;16830:72;:::i;:::-;16949:9;16943:4;16939:20;16934:2;16923:9;16919:18;16912:48;16977:76;17048:4;17039:6;16977:76;:::i;:::-;16969:84;;16620:440;;;;;;;:::o;17066:210::-;;17191:2;17180:9;17176:18;17168:26;;17204:65;17266:1;17255:9;17251:17;17242:6;17204:65;:::i;:::-;17158:118;;;;:::o;17282:313::-;;17433:2;17422:9;17418:18;17410:26;;17482:9;17476:4;17472:20;17468:1;17457:9;17453:17;17446:47;17510:78;17583:4;17574:6;17510:78;:::i;:::-;17502:86;;17400:195;;;;:::o;17601:419::-;;17805:2;17794:9;17790:18;17782:26;;17854:9;17848:4;17844:20;17840:1;17829:9;17825:17;17818:47;17882:131;18008:4;17882:131;:::i;:::-;17874:139;;17772:248;;;:::o;18026:419::-;;18230:2;18219:9;18215:18;18207:26;;18279:9;18273:4;18269:20;18265:1;18254:9;18250:17;18243:47;18307:131;18433:4;18307:131;:::i;:::-;18299:139;;18197:248;;;:::o;18451:419::-;;18655:2;18644:9;18640:18;18632:26;;18704:9;18698:4;18694:20;18690:1;18679:9;18675:17;18668:47;18732:131;18858:4;18732:131;:::i;:::-;18724:139;;18622:248;;;:::o;18876:419::-;;19080:2;19069:9;19065:18;19057:26;;19129:9;19123:4;19119:20;19115:1;19104:9;19100:17;19093:47;19157:131;19283:4;19157:131;:::i;:::-;19149:139;;19047:248;;;:::o;19301:419::-;;19505:2;19494:9;19490:18;19482:26;;19554:9;19548:4;19544:20;19540:1;19529:9;19525:17;19518:47;19582:131;19708:4;19582:131;:::i;:::-;19574:139;;19472:248;;;:::o;19726:419::-;;19930:2;19919:9;19915:18;19907:26;;19979:9;19973:4;19969:20;19965:1;19954:9;19950:17;19943:47;20007:131;20133:4;20007:131;:::i;:::-;19999:139;;19897:248;;;:::o;20151:419::-;;20355:2;20344:9;20340:18;20332:26;;20404:9;20398:4;20394:20;20390:1;20379:9;20375:17;20368:47;20432:131;20558:4;20432:131;:::i;:::-;20424:139;;20322:248;;;:::o;20576:419::-;;20780:2;20769:9;20765:18;20757:26;;20829:9;20823:4;20819:20;20815:1;20804:9;20800:17;20793:47;20857:131;20983:4;20857:131;:::i;:::-;20849:139;;20747:248;;;:::o;21001:419::-;;21205:2;21194:9;21190:18;21182:26;;21254:9;21248:4;21244:20;21240:1;21229:9;21225:17;21218:47;21282:131;21408:4;21282:131;:::i;:::-;21274:139;;21172:248;;;:::o;21426:419::-;;21630:2;21619:9;21615:18;21607:26;;21679:9;21673:4;21669:20;21665:1;21654:9;21650:17;21643:47;21707:131;21833:4;21707:131;:::i;:::-;21699:139;;21597:248;;;:::o;21851:419::-;;22055:2;22044:9;22040:18;22032:26;;22104:9;22098:4;22094:20;22090:1;22079:9;22075:17;22068:47;22132:131;22258:4;22132:131;:::i;:::-;22124:139;;22022:248;;;:::o;22276:419::-;;22480:2;22469:9;22465:18;22457:26;;22529:9;22523:4;22519:20;22515:1;22504:9;22500:17;22493:47;22557:131;22683:4;22557:131;:::i;:::-;22549:139;;22447:248;;;:::o;22701:419::-;;22905:2;22894:9;22890:18;22882:26;;22954:9;22948:4;22944:20;22940:1;22929:9;22925:17;22918:47;22982:131;23108:4;22982:131;:::i;:::-;22974:139;;22872:248;;;:::o;23126:419::-;;23330:2;23319:9;23315:18;23307:26;;23379:9;23373:4;23369:20;23365:1;23354:9;23350:17;23343:47;23407:131;23533:4;23407:131;:::i;:::-;23399:139;;23297:248;;;:::o;23551:419::-;;23755:2;23744:9;23740:18;23732:26;;23804:9;23798:4;23794:20;23790:1;23779:9;23775:17;23768:47;23832:131;23958:4;23832:131;:::i;:::-;23824:139;;23722:248;;;:::o;23976:419::-;;24180:2;24169:9;24165:18;24157:26;;24229:9;24223:4;24219:20;24215:1;24204:9;24200:17;24193:47;24257:131;24383:4;24257:131;:::i;:::-;24249:139;;24147:248;;;:::o;24401:419::-;;24605:2;24594:9;24590:18;24582:26;;24654:9;24648:4;24644:20;24640:1;24629:9;24625:17;24618:47;24682:131;24808:4;24682:131;:::i;:::-;24674:139;;24572:248;;;:::o;24826:419::-;;25030:2;25019:9;25015:18;25007:26;;25079:9;25073:4;25069:20;25065:1;25054:9;25050:17;25043:47;25107:131;25233:4;25107:131;:::i;:::-;25099:139;;24997:248;;;:::o;25251:419::-;;25455:2;25444:9;25440:18;25432:26;;25504:9;25498:4;25494:20;25490:1;25479:9;25475:17;25468:47;25532:131;25658:4;25532:131;:::i;:::-;25524:139;;25422:248;;;:::o;25676:419::-;;25880:2;25869:9;25865:18;25857:26;;25929:9;25923:4;25919:20;25915:1;25904:9;25900:17;25893:47;25957:131;26083:4;25957:131;:::i;:::-;25949:139;;25847:248;;;:::o;26101:419::-;;26305:2;26294:9;26290:18;26282:26;;26354:9;26348:4;26344:20;26340:1;26329:9;26325:17;26318:47;26382:131;26508:4;26382:131;:::i;:::-;26374:139;;26272:248;;;:::o;26526:419::-;;26730:2;26719:9;26715:18;26707:26;;26779:9;26773:4;26769:20;26765:1;26754:9;26750:17;26743:47;26807:131;26933:4;26807:131;:::i;:::-;26799:139;;26697:248;;;:::o;26951:222::-;;27082:2;27071:9;27067:18;27059:26;;27095:71;27163:1;27152:9;27148:17;27139:6;27095:71;:::i;:::-;27049:124;;;;:::o;27179:129::-;;27240:20;;:::i;:::-;27230:30;;27269:33;27297:4;27289:6;27269:33;:::i;:::-;27220:88;;;:::o;27314:75::-;;27380:2;27374:9;27364:19;;27354:35;:::o;27395:307::-;;27546:18;27538:6;27535:30;27532:2;;;27568:18;;:::i;:::-;27532:2;27606:29;27628:6;27606:29;:::i;:::-;27598:37;;27690:4;27684;27680:15;27672:23;;27461:241;;;:::o;27708:308::-;;27860:18;27852:6;27849:30;27846:2;;;27882:18;;:::i;:::-;27846:2;27920:29;27942:6;27920:29;:::i;:::-;27912:37;;28004:4;27998;27994:15;27986:23;;27775:241;;;:::o;28022:98::-;;28107:5;28101:12;28091:22;;28080:40;;;:::o;28126:99::-;;28212:5;28206:12;28196:22;;28185:40;;;:::o;28231:168::-;;28348:6;28343:3;28336:19;28388:4;28383:3;28379:14;28364:29;;28326:73;;;;:::o;28405:169::-;;28523:6;28518:3;28511:19;28563:4;28558:3;28554:14;28539:29;;28501:73;;;;:::o;28580:148::-;;28719:3;28704:18;;28694:34;;;;:::o;28734:305::-;;28793:20;28811:1;28793:20;:::i;:::-;28788:25;;28827:20;28845:1;28827:20;:::i;:::-;28822:25;;28981:1;28913:66;28909:74;28906:1;28903:81;28900:2;;;28987:18;;:::i;:::-;28900:2;29031:1;29028;29024:9;29017:16;;28778:261;;;;:::o;29045:185::-;;29102:20;29120:1;29102:20;:::i;:::-;29097:25;;29136:20;29154:1;29136:20;:::i;:::-;29131:25;;29175:1;29165:2;;29180:18;;:::i;:::-;29165:2;29222:1;29219;29215:9;29210:14;;29087:143;;;;:::o;29236:348::-;;29299:20;29317:1;29299:20;:::i;:::-;29294:25;;29333:20;29351:1;29333:20;:::i;:::-;29328:25;;29521:1;29453:66;29449:74;29446:1;29443:81;29438:1;29431:9;29424:17;29420:105;29417:2;;;29528:18;;:::i;:::-;29417:2;29576:1;29573;29569:9;29558:20;;29284:300;;;;:::o;29590:191::-;;29650:20;29668:1;29650:20;:::i;:::-;29645:25;;29684:20;29702:1;29684:20;:::i;:::-;29679:25;;29723:1;29720;29717:8;29714:2;;;29728:18;;:::i;:::-;29714:2;29773:1;29770;29766:9;29758:17;;29635:146;;;;:::o;29787:96::-;;29853:24;29871:5;29853:24;:::i;:::-;29842:35;;29832:51;;;:::o;29889:90::-;;29966:5;29959:13;29952:21;29941:32;;29931:48;;;:::o;29985:149::-;;30061:66;30054:5;30050:78;30039:89;;30029:105;;;:::o;30140:126::-;;30217:42;30210:5;30206:54;30195:65;;30185:81;;;:::o;30272:77::-;;30338:5;30327:16;;30317:32;;;:::o;30355:154::-;30439:6;30434:3;30429;30416:30;30501:1;30492:6;30487:3;30483:16;30476:27;30406:103;;;:::o;30515:307::-;30583:1;30593:113;30607:6;30604:1;30601:13;30593:113;;;30692:1;30687:3;30683:11;30677:18;30673:1;30668:3;30664:11;30657:39;30629:2;30626:1;30622:10;30617:15;;30593:113;;;30724:6;30721:1;30718:13;30715:2;;;30804:1;30795:6;30790:3;30786:16;30779:27;30715:2;30564:258;;;;:::o;30828:320::-;;30909:1;30903:4;30899:12;30889:22;;30956:1;30950:4;30946:12;30977:18;30967:2;;31033:4;31025:6;31021:17;31011:27;;30967:2;31095;31087:6;31084:14;31064:18;31061:38;31058:2;;;31114:18;;:::i;:::-;31058:2;30879:269;;;;:::o;31154:281::-;31237:27;31259:4;31237:27;:::i;:::-;31229:6;31225:40;31367:6;31355:10;31352:22;31331:18;31319:10;31316:34;31313:62;31310:2;;;31378:18;;:::i;:::-;31310:2;31418:10;31414:2;31407:22;31197:238;;;:::o;31441:233::-;;31503:24;31521:5;31503:24;:::i;:::-;31494:33;;31549:66;31542:5;31539:77;31536:2;;;31619:18;;:::i;:::-;31536:2;31666:1;31659:5;31655:13;31648:20;;31484:190;;;:::o;31680:176::-;;31729:20;31747:1;31729:20;:::i;:::-;31724:25;;31763:20;31781:1;31763:20;:::i;:::-;31758:25;;31802:1;31792:2;;31807:18;;:::i;:::-;31792:2;31848:1;31845;31841:9;31836:14;;31714:142;;;;:::o;31862:180::-;31910:77;31907:1;31900:88;32007:4;32004:1;31997:15;32031:4;32028:1;32021:15;32048:180;32096:77;32093:1;32086:88;32193:4;32190:1;32183:15;32217:4;32214:1;32207:15;32234:180;32282:77;32279:1;32272:88;32379:4;32376:1;32369:15;32403:4;32400:1;32393:15;32420:180;32468:77;32465:1;32458:88;32565:4;32562:1;32555:15;32589:4;32586:1;32579:15;32606:102;;32698:2;32694:7;32689:2;32682:5;32678:14;32674:28;32664:38;;32654:54;;;:::o;32714:237::-;32854:34;32850:1;32842:6;32838:14;32831:58;32923:20;32918:2;32910:6;32906:15;32899:45;32820:131;:::o;32957:225::-;33097:34;33093:1;33085:6;33081:14;33074:58;33166:8;33161:2;33153:6;33149:15;33142:33;33063:119;:::o;33188:178::-;33328:30;33324:1;33316:6;33312:14;33305:54;33294:72;:::o;33372:180::-;33512:32;33508:1;33500:6;33496:14;33489:56;33478:74;:::o;33558:223::-;33698:34;33694:1;33686:6;33682:14;33675:58;33767:6;33762:2;33754:6;33750:15;33743:31;33664:117;:::o;33787:175::-;33927:27;33923:1;33915:6;33911:14;33904:51;33893:69;:::o;33968:231::-;34108:34;34104:1;34096:6;34092:14;34085:58;34177:14;34172:2;34164:6;34160:15;34153:39;34074:125;:::o;34205:158::-;34345:10;34341:1;34333:6;34329:14;34322:34;34311:52;:::o;34369:168::-;34509:20;34505:1;34497:6;34493:14;34486:44;34475:62;:::o;34543:243::-;34683:34;34679:1;34671:6;34667:14;34660:58;34752:26;34747:2;34739:6;34735:15;34728:51;34649:137;:::o;34792:175::-;34932:27;34928:1;34920:6;34916:14;34909:51;34898:69;:::o;34973:229::-;35113:34;35109:1;35101:6;35097:14;35090:58;35182:12;35177:2;35169:6;35165:15;35158:37;35079:123;:::o;35208:228::-;35348:34;35344:1;35336:6;35332:14;35325:58;35417:11;35412:2;35404:6;35400:15;35393:36;35314:122;:::o;35442:182::-;35582:34;35578:1;35570:6;35566:14;35559:58;35548:76;:::o;35630:221::-;35770:34;35766:1;35758:6;35754:14;35747:58;35839:4;35834:2;35826:6;35822:15;35815:29;35736:115;:::o;35857:231::-;35997:34;35993:1;35985:6;35981:14;35974:58;36066:14;36061:2;36053:6;36049:15;36042:39;35963:125;:::o;36094:182::-;36234:34;36230:1;36222:6;36218:14;36211:58;36200:76;:::o;36282:228::-;36422:34;36418:1;36410:6;36406:14;36399:58;36491:11;36486:2;36478:6;36474:15;36467:36;36388:122;:::o;36516:234::-;36656:34;36652:1;36644:6;36640:14;36633:58;36725:17;36720:2;36712:6;36708:15;36701:42;36622:128;:::o;36756:220::-;36896:34;36892:1;36884:6;36880:14;36873:58;36965:3;36960:2;36952:6;36948:15;36941:28;36862:114;:::o;36982:180::-;37122:32;37118:1;37110:6;37106:14;37099:56;37088:74;:::o;37168:236::-;37308:34;37304:1;37296:6;37292:14;37285:58;37377:19;37372:2;37364:6;37360:15;37353:44;37274:130;:::o;37410:122::-;37483:24;37501:5;37483:24;:::i;:::-;37476:5;37473:35;37463:2;;37522:1;37519;37512:12;37463:2;37453:79;:::o;37538:116::-;37608:21;37623:5;37608:21;:::i;:::-;37601:5;37598:32;37588:2;;37644:1;37641;37634:12;37588:2;37578:76;:::o;37660:120::-;37732:23;37749:5;37732:23;:::i;:::-;37725:5;37722:34;37712:2;;37770:1;37767;37760:12;37712:2;37702:78;:::o;37786:122::-;37859:24;37877:5;37859:24;:::i;:::-;37852:5;37849:35;37839:2;;37898:1;37895;37888:12;37839:2;37829:79;:::o

Swarm Source

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