ETH Price: $3,163.78 (+1.40%)
Gas: 1 Gwei

Token

Empty Curses (MTCRS)
 

Overview

Max Total Supply

222 MTCRS

Holders

59

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MTCRS
0x505920cf689dc11bc0fb6013c4d0ec5c59ebb7c1
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:
CurseWords

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-02
*/

/**
 *Submitted for verification at Etherscan.io on 2021-08-27
*/

// SPDX-License-Identifier: MIT

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);
}






/**
 * @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;
}




/**
 * @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);
    }
}




/*
 * @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;
    }
}









/**
 * @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);
    }
}





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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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














/**
 * @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);
}







/**
 * @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);
}





/**
 * @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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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);
            }
        }
    }
}









/**
 * @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;
    }
}


/**
 * @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(to).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 {}
}







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

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

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


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

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

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

    function uint2str(uint256 _i) pure returns (string memory str) {
      if (_i == 0) {
        return "0";
      }
      uint256 j = _i;
      uint256 length;
      while (j != 0) {
        length++;
        j /= 10;
      }
      bytes memory bstr = new bytes(length);
      uint256 k = length;
      j = _i;
      while (j != 0) {
        bstr[--k] = bytes1(uint8(48 + j % 10));
        j /= 10;
      }
      str = string(bstr);
    }


// if you're reading this fuck you, 69
contract CurseWords is ERC721Enumerable, ReentrancyGuard, Ownable {
    // from: https://github.com/GNSPS/solidity-bytes-utils/blob/master/contracts/BytesLib.sol 
    function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {
        require(_start + 1 >= _start, "toUint8_overflow");
        require(_bytes.length >= _start + 1 , "toUint8_outOfBounds");
        uint8 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x1), _start))
        }

        return tempUint;
    }
    
    uint256 public constant MINT_PRICE = 4269000000000000; //0.004269 ETH, guess i'll give it to you if you can ctrl-f
    
    string private mainKey = "CURSE";
    string private auxKey = "AUXCURSE";

    
    string [] private rarity = [
        "base",
        "modified",
        "rare",
        "hurtful base",
        "hurtful modified"
    ];

    string[][] private curseSuiteTM = [
        // base words
        [
            string("fuck"),
            string("shit"),
            string("piss"),
            string("ass"),
            string("bitch"),
            string("cunt"),
            string("dick")
        ],
        // modified words
        [
            string("motherfucker"),
            string("shithead"),
            string("piss baby"),
            string("asshole"),
            string("bad bitch"),
            string("cuntface"),
            string("dickhead")
        ],
        // rare words
        [        
            string("bad dude"),
            string("not nice!"),
            string("say sorry"),
            string("you made me cry"),
            string("i want to puke"),
            string("thot we were frnieds :("),
            string("please say sike")
        ],
        // hurtful base words
        [
            string("you fuck"),
            string("shit!"),
            string("piss off!"),
            string("you ass"),
            string("you bitch"),
            string("you cunt"),
            string("you dick")
        ],
        // hurtful modified words
        [
            string("you motherfucker"),
            string("you shithead"),
            string("you piss baby"),
            string("you asshole"),
            string("you bad bitch"),
            string("you cuntface"),
            string("you dickhead")
        ]
    ];

    string[] private colors = [
        "EF476F",
        "FFD166",
        "06D6A0",
        "118AB2",
        "073B4C"
    ];
    
    string[] private backgroundColors = [
        "000000",
        "000000",
        "000000",
        "000000",
        "ffffff",
        "ffffff",
        "6c70ad",
        "aba3a6"
    ];
    
    string[] private sizes = [
        "42",
        "42",
        "42",
        "42",
        "69",
        "69",
        "69",
        "69",
        "71",
        "88",
        "100",
        "420"
    ];
    
    string[] private auxSizes = [
        "500",
        "25",
        "25",
        "25",
        "16",
        "16",
        "16",
        "16",
        "14",
        "12",
        "5"
    ];
    
    string[] private fonts = [
        "arial",
        "serif",
        "sans-serif",
        "cursive",
        "fantasy",
        "fantasy",
        "monospace"
    ];
    
    string[] private fontMods = [
        "normal",
        "normal",
        "normal",
        "normal",
        "normal",
        "italic"
    ];

    string private rarestCurseWord = "*****"; // so rare you can't have it bby sowwy :'(
    
    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }
    
    function getCurseWord(uint256 tokenId) public view returns (string memory) {
        return multipluck(tokenId, mainKey, curseSuiteTM);
    }

    function getAuxCurseWord(uint256 tokenId) public view returns (string memory) {
        return multipluck(tokenId, auxKey, curseSuiteTM);
    }

    function getPrimaryColor(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "COLOR", colors);
    }

    function getAuxColor(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "AUXCOLOR", colors);
    }
    
    function getPrimarySize(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "SIZE", sizes);
    }
    
    function getAuxSize(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "AUXSIZE", auxSizes);
    }
    
    function getPrimaryFont(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "FONT", fonts);
    }
    
    function getAuxFont(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "AUXFONT", fonts);
    }
    
    function getPrimaryFontModifier(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "AUXFONT", fontMods);
    }
    
    function getPrimaryWordRarity(uint256 tokenId) public view returns (string memory) {
        uint8 index = getAssholeRankingResults(tokenId, mainKey);
        return rarity[index];
    }
    
    function getAuxWordRarity(uint256 tokenId) public view returns (string memory) {
        uint8 index = getAssholeRankingResults(tokenId, auxKey);
        return rarity[index];
    }
    
    function getBackgroundColor(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "BCOLOR", backgroundColors);
    }
    
    // teehee
    function getAssholeRankingResults(uint256 tokenId, string memory keyPrefix) private pure returns (uint8) {
        uint256 assholeRanking = random(string(abi.encodePacked(keyPrefix, toString(tokenId)))) % 100;
        uint8 index = 0; 
        if (assholeRanking > 96) {
            index = 2;
        } else if (assholeRanking > 88) {
            index = 1;
        }
        
        if (index == 2) {
            return index;
        }

        if ((random(string(abi.encodePacked(keyPrefix, toString(tokenId)))) % 100) > 69) {
            index = index + 3;
        }
        return index;
    }
    
    function multipluck(uint256 tokenId, string memory keyPrefix, string[][] memory multiArr) internal pure returns (string memory) {
        uint8 index = getAssholeRankingResults(tokenId, keyPrefix);
        return pluck(tokenId, keyPrefix, multiArr[index]);
    }

    function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArr) internal pure returns (string memory) {
        string memory output = sourceArr[random(string(abi.encodePacked(keyPrefix, toString(tokenId)))) % sourceArr.length];
        return output;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        string[6] memory parts;

        // bruh
        uint256 seed = random(string(abi.encodePacked("69forever", tokenId)));
        uint256 randomishX = seed % 69;
        uint256 randomishY = seed % 300 + 40;
        uint256 randomishAuxX = seed % 42 + 30;
        uint256 randomishAuxY = seed % 150 + 70;

        parts[0] = string(abi.encodePacked(
            '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: #',
            getPrimaryColor(tokenId),
            "; font-family: ",
            getPrimaryFont(tokenId),
            "; font-style: ",
            getPrimaryFontModifier(tokenId),
            "; font-size: ",
            getPrimarySize(tokenId),
            "px; } .aux{fill: #",
            getAuxColor(tokenId),
            '; font-family: '
        ));
        
        parts[1] = string(abi.encodePacked(
            getAuxFont(tokenId),
            '; font-size: ',
            getAuxSize(tokenId),
            'px}</style><rect width="100%" height="100%" fill="#',
            getBackgroundColor(tokenId),
            '" />',
            '<text x="', 
            uint2str(randomishX), 
            '" y="',
            uint2str(randomishY),
            '" class="base">'));

        parts[2] = getCurseWord(tokenId);

        parts[3] = string(abi.encodePacked('</text><text x="', uint2str(randomishAuxX), '" y="', uint2str(randomishAuxY), '" class="aux">'));

        parts[4] = getAuxCurseWord(tokenId);

        parts[5] = '</text></svg>';
        
        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5]));
        
        // intentionally left font out for funsies ;)
        string memory metadataStart = string(abi.encodePacked(
            '"attributes": [{"trait_type": "Primary Word", "value": "', 
            getCurseWord(tokenId), 
            '"}, {"trait_type": "Auxilliary Word", "value": "',
            getAuxCurseWord(tokenId),
            '"}, {"trait_type": "Primary Word Size", "value": "',
            getPrimarySize(tokenId),
            '"}, {"trait_type": "Auxilliary Word Size", "value": "',
            getAuxSize(tokenId)));
        string memory metadata = string(abi.encodePacked(
            metadataStart,
            '"}, {"trait_type": "Primary Word Rarity", "value": "',
            getPrimaryWordRarity(tokenId),
            '"}, {"trait_type": "Auxilliary Word Rarity", "value": "',
            getAuxWordRarity(tokenId),
            '"}, {"trait_type": "Background Color", "value": "',
            getBackgroundColor(tokenId),
            '"}], '));
        string memory json = Base64.encode(bytes(string(abi.encodePacked(
            '{"name": "Empty Curse #', 
            toString(tokenId), 
            '", "description": "Empty Curse #', 
            toString(tokenId), 
            '", "description": "Empty Curses (for Assholes) are randomly generated, minimally artistic curse words generated on-chain. They do nothing... right? BTW did I mention this is all generated on-chain? Look at the contract. I know you nerds love that shit.", ', 
            metadata, 
            '"image": "data:image/svg+xml;base64,', 
            Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function claimFreeEmptyCurse(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 3369, "Token ID invalid");
        require(tokenId != 888, "888 is banned lmfao nerd!");
        require(tokenId != 420, "420 is also banned we don't smoke here this is a christian smart contract!!1! lmfao nerd!");
        _safeMint(_msgSender(), tokenId);
    }
    
    // .004269 to mint 3369-4199, coders get the alpha nerd followers get the finger
    function claimPaidEmptyCurse(uint256 tokenId) public nonReentrant payable {
        require(tokenId > 3368 && tokenId < 4200, "Token ID invalid");
        require(msg.value >= MINT_PRICE, "Payment too low, try .004269");
        _safeMint(_msgSender(), tokenId);
    }
    
    function whatDoesThisDo(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 4199 && tokenId < 4269, "Token ID invalid");
        _safeMint(owner(), tokenId);
    }
    
    function daBagz() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
    
    function overload() public nonReentrant onlyOwner {
        // owner tokens can't be minted by randos
        for (uint i = 3528 ; i < 3596 ; i++) {
            if (!_exists(i)) {
                _safeMint(owner(), i);
            }
        }
        _safeMint(owner(), 420);
    }
    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    
    constructor() ERC721("Empty Curses", "MTCRS") Ownable() {}
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

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":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimFreeEmptyCurse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimPaidEmptyCurse","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"daBagz","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getAuxColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAuxCurseWord","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAuxFont","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAuxSize","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAuxWordRarity","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBackgroundColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCurseWord","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPrimaryColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPrimaryFont","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPrimaryFontModifier","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPrimarySize","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPrimaryWordRarity","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"overload","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"whatDoesThisDo","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526005608081905264435552534560d81b60a09081526200002891600c919062000ecb565b5060408051808201909152600880825267415558435552534560c01b60209092019182526200005a91600d9162000ecb565b506040805160e081018252600460a08201818152636261736560e01b60c084015282528251808401845260088152671b5bd91a599a595960c21b6020828101919091528084019190915283518085018552918252637261726560e01b828201528284019190915282518084018452600c81526b6875727466756c206261736560a01b8183015260608301528251808401909352601083526f1a1d5c9d199d5b081b5bd91a599a595960821b9083015260808101919091526200012190600e90600562000f5a565b506040518060a001604052806040518060e00160405280604051806040016040528060048152602001636675636b60e01b8152508152602001604051806040016040528060048152602001631cda1a5d60e21b8152508152602001604051806040016040528060048152602001637069737360e01b81525081526020016040518060400160405280600381526020016261737360e81b8152508152602001604051806040016040528060058152602001640c4d2e8c6d60db1b81525081526020016040518060400160405280600481526020016318dd5b9d60e21b8152508152602001604051806040016040528060048152602001636469636b60e01b81525081525081526020016040518060e001604052806040518060400160405280600c81526020016b36b7ba3432b9333ab1b5b2b960a11b8152508152602001604051806040016040528060088152602001671cda1a5d1a19585960c21b81525081526020016040518060400160405280600981526020016870697373206261627960b81b815250815260200160405180604001604052806007815260200166617373686f6c6560c81b8152508152602001604051806040016040528060098152602001680c4c2c840c4d2e8c6d60bb1b81525081526020016040518060400160405280600881526020016763756e746661636560c01b815250815260200160405180604001604052806008815260200167191a58dada19585960c21b81525081525081526020016040518060e0016040528060405180604001604052806008815260200167626164206475646560c01b8152508152602001604051806040016040528060098152602001686e6f74206e6963652160b81b81525081526020016040518060400160405280600981526020016873617920736f72727960b81b81525081526020016040518060400160405280600f81526020016e796f75206d616465206d652063727960881b81525081526020016040518060400160405280600e81526020016d692077616e7420746f2070756b6560901b81525081526020016040518060400160405280601781526020017f74686f7420776520776572652066726e69656473203a2800000000000000000081525081526020016040518060400160405280600f81526020016e706c65617365207361792073696b6560881b81525081525081526020016040518060e0016040528060405180604001604052806008815260200167796f75206675636b60c01b815250815260200160405180604001604052806005815260200164736869742160d81b81525081526020016040518060400160405280600981526020016870697373206f66662160b81b815250815260200160405180604001604052806007815260200166796f752061737360c81b8152508152602001604051806040016040528060098152602001680f2deea40c4d2e8c6d60bb1b8152508152602001604051806040016040528060088152602001671e5bdd4818dd5b9d60c21b815250815260200160405180604001604052806008815260200167796f75206469636b60c01b81525081525081526020016040518060e001604052806040518060400160405280601081526020016f3cb7ba9036b7ba3432b9333ab1b5b2b960811b81525081526020016040518060400160405280600c81526020016b1e5bdd481cda1a5d1a19585960a21b81525081526020016040518060400160405280600d81526020016c796f752070697373206261627960981b81525081526020016040518060400160405280600b81526020016a796f7520617373686f6c6560a81b81525081526020016040518060400160405280600d81526020016c0f2deea40c4c2c840c4d2e8c6d609b1b81525081526020016040518060400160405280600c81526020016b796f752063756e746661636560a01b81525081526020016040518060400160405280600c81526020016b1e5bdd48191a58dada19585960a21b815250815250815250600f906005620006e892919062000fba565b506040805160e081018252600660a082018181526522a31a1b9b2360d11b60c084015282528251808401845281815265232322189b1b60d11b60208281019190915280840191909152835180850185528281526503036443641360d41b8183015283850152835180850185528281526518989c20a11960d11b81830152606084015283518085019094529083526530373342344360d01b9083015260808101919091526200079b90601090600562000f5a565b506040518061010001604052806040518060400160405280600681526020016503030303030360d41b81525081526020016040518060400160405280600681526020016503030303030360d41b81525081526020016040518060400160405280600681526020016503030303030360d41b81525081526020016040518060400160405280600681526020016503030303030360d41b81525081526020016040518060400160405280600681526020016533333333333360d11b81525081526020016040518060400160405280600681526020016533333333333360d11b8152508152602001604051806040016040528060068152602001650d98cdcc185960d21b81525081526020016040518060400160405280600681526020016530b13099b09b60d11b8152508152506011906008620008d892919062001014565b50604051806101800160405280604051806040016040528060028152602001611a1960f11b8152508152602001604051806040016040528060028152602001611a1960f11b8152508152602001604051806040016040528060028152602001611a1960f11b8152508152602001604051806040016040528060028152602001611a1960f11b815250815260200160405180604001604052806002815260200161363960f01b815250815260200160405180604001604052806002815260200161363960f01b815250815260200160405180604001604052806002815260200161363960f01b815250815260200160405180604001604052806002815260200161363960f01b815250815260200160405180604001604052806002815260200161373160f01b815250815260200160405180604001604052806002815260200161070760f31b81525081526020016040518060400160405280600381526020016203130360ec1b81525081526020016040518060400160405280600381526020016203432360ec1b815250815250601290600c62000a7792919062001066565b50604080516101a081018252600361016082019081526203530360ec1b610180830152815281518083018352600280825261323560f01b6020838101829052808501939093528451808601865282815280840182905284860152845180860186528281528084019190915260608401528351808501855281815261189b60f11b81840181905260808501919091528451808601865282815280840182905260a08501528451808601865282815280840182905260c0850152845180860186528281528084019190915260e084015283518085018552818152610c4d60f21b818401526101008401528351808501855290815261189960f11b81830152610120830152825180840190935260018352603560f81b9083015261014081019190915262000ba790601390600b620010b8565b506040518060e0016040528060405180604001604052806005815260200164185c9a585b60da1b81525081526020016040518060400160405280600581526020016439b2b934b360d91b81525081526020016040518060400160405280600a81526020016939b0b73996b9b2b934b360b11b8152508152602001604051806040016040528060078152602001666375727369766560c81b81525081526020016040518060400160405280600781526020016666616e7461737960c81b81525081526020016040518060400160405280600781526020016666616e7461737960c81b8152508152602001604051806040016040528060098152602001686d6f6e6f737061636560b81b815250815250601490600762000cc79291906200110a565b506040518060c00160405280604051806040016040528060068152602001651b9bdc9b585b60d21b8152508152602001604051806040016040528060068152602001651b9bdc9b585b60d21b8152508152602001604051806040016040528060068152602001651b9bdc9b585b60d21b8152508152602001604051806040016040528060068152602001651b9bdc9b585b60d21b8152508152602001604051806040016040528060068152602001651b9bdc9b585b60d21b8152508152602001604051806040016040528060068152602001656974616c696360d01b815250815250601590600662000dbb9291906200115c565b5060408051808201909152600580825264151515151560d91b602090920191825262000dea9160169162000ecb565b5034801562000df857600080fd5b50604080518082018252600c81526b456d7074792043757273657360a01b6020808301918252835180850190945260058452644d5443525360d81b90840152815191929162000e4a9160009162000ecb565b50805162000e6090600190602084019062000ecb565b50506001600a555062000e733362000e79565b620012a6565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000ed99062001269565b90600052602060002090601f01602090048101928262000efd576000855562000f48565b82601f1062000f1857805160ff191683800117855562000f48565b8280016001018555821562000f48579182015b8281111562000f4857825182559160200191906001019062000f2b565b5062000f56929150620011ae565b5090565b82805482825590600052602060002090810192821562000fac579160200282015b8281111562000fac578251805162000f9b91849160209091019062000ecb565b509160200191906001019062000f7b565b5062000f56929150620011c5565b82805482825590600052602060002090810192821562001006579160200282015b828111156200100657825162000ff590839060076200110a565b509160200191906001019062000fdb565b5062000f56929150620011e6565b82805482825590600052602060002090810192821562000fac579160200282015b8281111562000fac57825180516200105591849160209091019062000ecb565b509160200191906001019062001035565b82805482825590600052602060002090810192821562000fac579160200282015b8281111562000fac5782518051620010a791849160209091019062000ecb565b509160200191906001019062001087565b82805482825590600052602060002090810192821562000fac579160200282015b8281111562000fac5782518051620010f991849160209091019062000ecb565b5091602001919060010190620010d9565b82805482825590600052602060002090810192821562000fac579160200282015b8281111562000fac57825180516200114b91849160209091019062000ecb565b50916020019190600101906200112b565b82805482825590600052602060002090810192821562000fac579160200282015b8281111562000fac57825180516200119d91849160209091019062000ecb565b50916020019190600101906200117d565b5b8082111562000f565760008155600101620011af565b8082111562000f56576000620011dc828262001207565b50600101620011c5565b8082111562000f56576000620011fd828262001249565b50600101620011e6565b508054620012159062001269565b6000825580601f1062001226575050565b601f016020900490600052602060002090810190620012469190620011ae565b50565b5080546000825590600052602060002090810190620012469190620011c5565b600181811c908216806200127e57607f821691505b60208210811415620012a057634e487b7160e01b600052602260045260246000fd5b50919050565b613d6080620012b66000396000f3fe60806040526004361061021a5760003560e01c8063870e2b5b11610123578063b743bd41116100ab578063cb6f001e1161006f578063cb6f001e1461060f578063debcca421461062f578063e985e9c51461064f578063eb270e0714610698578063f2fde38b146106b857600080fd5b8063b743bd4114610574578063b88d4fde14610594578063c002d23d146105b4578063c6b3a936146105cf578063c87b56dd146105ef57600080fd5b8063985fa747116100f2578063985fa747146104ec5780639ba7522e1461050c5780639e4d36e014610521578063a04ed64014610534578063a22cb4651461055457600080fd5b8063870e2b5b146104795780638da5cb5b1461049957806391f18780146104b757806395d89b41146104d757600080fd5b80634671059f116101a657806366dd98081161017557806366dd9808146103ef5780636a8d41e41461040457806370a082311461042457806370a2135114610444578063715018a61461046457600080fd5b80634671059f1461036f5780634d70b6751461038f5780634f6ccce7146103af5780636352211e146103cf57600080fd5b806318160ddd116101ed57806318160ddd146102d057806323b872dd146102ef5780632f745c591461030f57806341a2059d1461032f57806342842e0e1461034f57600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a36600461305f565b6106d8565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b50610269610703565b60405161024b91906139e6565b34801561028257600080fd5b50610296610291366004613099565b610795565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102ce6102c9366004613035565b61082f565b005b3480156102dc57600080fd5b506008545b60405190815260200161024b565b3480156102fb57600080fd5b506102ce61030a366004612ee1565b610945565b34801561031b57600080fd5b506102e161032a366004613035565b610976565b34801561033b57600080fd5b506102ce61034a366004613099565b610a0c565b34801561035b57600080fd5b506102ce61036a366004612ee1565b610aaf565b34801561037b57600080fd5b5061026961038a366004613099565b610aca565b34801561039b57600080fd5b506102696103aa366004613099565b610bc6565b3480156103bb57600080fd5b506102e16103ca366004613099565b610d75565b3480156103db57600080fd5b506102966103ea366004613099565b610e08565b3480156103fb57600080fd5b506102ce610e7f565b34801561041057600080fd5b5061026961041f366004613099565b610edc565b34801561043057600080fd5b506102e161043f366004612e8c565b610fd1565b34801561045057600080fd5b5061026961045f366004613099565b611058565b34801561047057600080fd5b506102ce6111fe565b34801561048557600080fd5b506102ce610494366004613099565b611234565b3480156104a557600080fd5b50600b546001600160a01b0316610296565b3480156104c357600080fd5b506102696104d2366004613099565b611381565b3480156104e357600080fd5b50610269611475565b3480156104f857600080fd5b50610269610507366004613099565b611484565b34801561051857600080fd5b506102ce611576565b6102ce61052f366004613099565b61163e565b34801561054057600080fd5b5061026961054f366004613099565b6116eb565b34801561056057600080fd5b506102ce61056f366004612ff9565b6117dc565b34801561058057600080fd5b5061026961058f366004613099565b6118a1565b3480156105a057600080fd5b506102ce6105af366004612f1d565b611995565b3480156105c057600080fd5b506102e1660f2aa2048bd00081565b3480156105db57600080fd5b506102696105ea366004613099565b6119cd565b3480156105fb57600080fd5b5061026961060a366004613099565b611ac1565b34801561061b57600080fd5b5061026961062a366004613099565b611dd7565b34801561063b57600080fd5b5061026961064a366004613099565b611f22565b34801561065b57600080fd5b5061023f61066a366004612eae565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106a457600080fd5b506102696106b3366004613099565b611f37565b3480156106c457600080fd5b506102ce6106d3366004612e8c565b612028565b60006001600160e01b0319821663780e9d6360e01b14806106fd57506106fd826120c3565b92915050565b60606000805461071290613bfc565b80601f016020809104026020016040519081016040528092919081815260200182805461073e90613bfc565b801561078b5780601f106107605761010080835404028352916020019161078b565b820191906000526020600020905b81548152906001019060200180831161076e57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108135760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061083a82610e08565b9050806001600160a01b0316836001600160a01b031614156108a85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161080a565b336001600160a01b03821614806108c457506108c4813361066a565b6109365760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161080a565b6109408383612113565b505050565b61094f3382612181565b61096b5760405162461bcd60e51b815260040161080a90613aaa565b610940838383612278565b600061098183610fd1565b82106109e35760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161080a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a541415610a2f5760405162461bcd60e51b815260040161080a90613afb565b6002600a55600b546001600160a01b03163314610a5e5760405162461bcd60e51b815260040161080a90613a4b565b61106781118015610a7057506110ad81105b610a8c5760405162461bcd60e51b815260040161080a90613a80565b610aa7610aa1600b546001600160a01b031690565b82612423565b506001600a55565b61094083838360405180602001604052806000815250611995565b60606106fd82604051806040016040528060068152602001652121a7a627a960d11b8152506011805480602002602001604051908101604052809291908181526020016000905b82821015610bbd578382906000526020600020018054610b3090613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5c90613bfc565b8015610ba95780601f10610b7e57610100808354040283529160200191610ba9565b820191906000526020600020905b815481529060010190602001808311610b8c57829003601f168201915b505050505081526020019060010190610b11565b5050505061243d565b60606106fd82600d8054610bd990613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0590613bfc565b8015610c525780601f10610c2757610100808354040283529160200191610c52565b820191906000526020600020905b815481529060010190602001808311610c3557829003601f168201915b5050505050600f805480602002602001604051908101604052809291908181526020016000905b82821015610d6c57838290600052602060002001805480602002602001604051908101604052809291908181526020016000905b82821015610d59578382906000526020600020018054610ccc90613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf890613bfc565b8015610d455780601f10610d1a57610100808354040283529160200191610d45565b820191906000526020600020905b815481529060010190602001808311610d2857829003601f168201915b505050505081526020019060010190610cad565b5050505081526020019060010190610c79565b50505050612491565b6000610d8060085490565b8210610de35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161080a565b60088281548110610df657610df6613ca8565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806106fd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161080a565b600b546001600160a01b03163314610ea95760405162461bcd60e51b815260040161080a90613a4b565b6040514790339082156108fc029083906000818181858888f19350505050158015610ed8573d6000803e3d6000fd5b5050565b60606106fd826040518060400160405280600881526020016720aaac21a7a627a960c11b8152506010805480602002602001604051908101604052809291908181526020016000905b82821015610bbd578382906000526020600020018054610f4490613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7090613bfc565b8015610fbd5780601f10610f9257610100808354040283529160200191610fbd565b820191906000526020600020905b815481529060010190602001808311610fa057829003601f168201915b505050505081526020019060010190610f25565b60006001600160a01b03821661103c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161080a565b506001600160a01b031660009081526003602052604090205490565b60606106fd82600c805461106b90613bfc565b80601f016020809104026020016040519081016040528092919081815260200182805461109790613bfc565b80156110e45780601f106110b9576101008083540402835291602001916110e4565b820191906000526020600020905b8154815290600101906020018083116110c757829003601f168201915b5050505050600f805480602002602001604051908101604052809291908181526020016000905b82821015610d6c57838290600052602060002001805480602002602001604051908101604052809291908181526020016000905b828210156111eb57838290600052602060002001805461115e90613bfc565b80601f016020809104026020016040519081016040528092919081815260200182805461118a90613bfc565b80156111d75780601f106111ac576101008083540402835291602001916111d7565b820191906000526020600020905b8154815290600101906020018083116111ba57829003601f168201915b50505050508152602001906001019061113f565b505050508152602001906001019061110b565b600b546001600160a01b031633146112285760405162461bcd60e51b815260040161080a90613a4b565b61123260006124d1565b565b6002600a5414156112575760405162461bcd60e51b815260040161080a90613afb565b6002600a55801580159061126c5750610d2981105b6112885760405162461bcd60e51b815260040161080a90613a80565b8061037814156112da5760405162461bcd60e51b815260206004820152601960248201527f3838382069732062616e6e6564206c6d66616f206e6572642100000000000000604482015260640161080a565b806101a414156113785760405162461bcd60e51b815260206004820152605960248201527f34323020697320616c736f2062616e6e656420776520646f6e277420736d6f6b60448201527f652068657265207468697320697320612063687269737469616e20736d61727460648201527f20636f6e747261637421213121206c6d66616f206e6572642100000000000000608482015260a40161080a565b610aa733610aa1565b60606106fd826040518060400160405280600781526020016641555853495a4560c81b8152506013805480602002602001604051908101604052809291908181526020016000905b82821015610bbd5783829060005260206000200180546113e890613bfc565b80601f016020809104026020016040519081016040528092919081815260200182805461141490613bfc565b80156114615780601f1061143657610100808354040283529160200191611461565b820191906000526020600020905b81548152906001019060200180831161144457829003601f168201915b5050505050815260200190600101906113c9565b60606001805461071290613bfc565b60606106fd826040518060400160405280600581526020016421a7a627a960d91b8152506010805480602002602001604051908101604052809291908181526020016000905b82821015610bbd5783829060005260206000200180546114e990613bfc565b80601f016020809104026020016040519081016040528092919081815260200182805461151590613bfc565b80156115625780601f1061153757610100808354040283529160200191611562565b820191906000526020600020905b81548152906001019060200180831161154557829003601f168201915b5050505050815260200190600101906114ca565b6002600a5414156115995760405162461bcd60e51b815260040161080a90613afb565b6002600a55600b546001600160a01b031633146115c85760405162461bcd60e51b815260040161080a90613a4b565b610dc85b610e0c811015611619576000818152600260205260409020546001600160a01b031661160757611607610aa1600b546001600160a01b031690565b8061161181613c37565b9150506115cc565b5061163761162f600b546001600160a01b031690565b6101a4612423565b6001600a55565b6002600a5414156116615760405162461bcd60e51b815260040161080a90613afb565b6002600a55610d2881118015611678575061106881105b6116945760405162461bcd60e51b815260040161080a90613a80565b660f2aa2048bd0003410156113785760405162461bcd60e51b815260206004820152601c60248201527f5061796d656e7420746f6f206c6f772c20747279202e30303432363900000000604482015260640161080a565b60606106fd826040518060400160405280600481526020016353495a4560e01b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015610bbd57838290600052602060002001805461174f90613bfc565b80601f016020809104026020016040519081016040528092919081815260200182805461177b90613bfc565b80156117c85780601f1061179d576101008083540402835291602001916117c8565b820191906000526020600020905b8154815290600101906020018083116117ab57829003601f168201915b505050505081526020019060010190611730565b6001600160a01b0382163314156118355760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161080a565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60606106fd82604051806040016040528060078152602001661055561193d39560ca1b8152506014805480602002602001604051908101604052809291908181526020016000905b82821015610bbd57838290600052602060002001805461190890613bfc565b80601f016020809104026020016040519081016040528092919081815260200182805461193490613bfc565b80156119815780601f1061195657610100808354040283529160200191611981565b820191906000526020600020905b81548152906001019060200180831161196457829003601f168201915b5050505050815260200190600101906118e9565b61199f3383612181565b6119bb5760405162461bcd60e51b815260040161080a90613aaa565b6119c784848484612523565b50505050565b60606106fd82604051806040016040528060078152602001661055561193d39560ca1b8152506015805480602002602001604051908101604052809291908181526020016000905b82821015610bbd578382906000526020600020018054611a3490613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6090613bfc565b8015611aad5780601f10611a8257610100808354040283529160200191611aad565b820191906000526020600020905b815481529060010190602001808311611a9057829003601f168201915b505050505081526020019060010190611a15565b6060611acb612e49565b604051681b1cb337b932bb32b960b91b602082015260298101849052600090611b06906049015b604051602081830303815290604052612556565b90506000611b15604583613c52565b90506000611b2561012c84613c52565b611b30906028613b32565b90506000611b3f602a85613c52565b611b4a90601e613b32565b90506000611b59609686613c52565b611b64906046613b32565b9050611b6f88611484565b611b7889611f37565b611b818a6119cd565b611b8a8b6116eb565b611b938c610edc565b604051602001611ba79594939291906135e6565b60408051808303601f190181529190528652611bc2886118a1565b611bcb89611381565b611bd48a610aca565b611bdd87612587565b611be687612587565b604051602001611bfa95949392919061330a565b60408051808303601f190181529190526020870152611c1888611058565b6040870152611c2682612587565b611c2f82612587565b604051602001611c4092919061356e565b60408051808303601f190181529190526060870152611c5e88610bc6565b60808701908152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b60208083019190915260a08a018290528951818b0151848c015160608d015196519551600097611cbf9794969395929490939092909101613145565b60405160208183030381529060405290506000611cdb8a611058565b611ce48b610bc6565b611ced8c6116eb565b611cf68d611381565b604051602001611d099493929190613421565b6040516020818303038152906040529050600081611d268c611dd7565b611d2f8d611f22565b611d388e610aca565b604051602001611d4b94939291906131c4565b60405160208183030381529060405290506000611da4611d6a8d612690565b611d738e612690565b84611d7d8861278e565b604051602001611d90949392919061375e565b60405160208183030381529060405261278e565b905080604051602001611db79190613964565b60408051601f198184030181529190529c9b505050505050505050505050565b60606000611e6f83600c8054611dec90613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1890613bfc565b8015611e655780601f10611e3a57610100808354040283529160200191611e65565b820191906000526020600020905b815481529060010190602001808311611e4857829003601f168201915b50505050506128f4565b9050600e8160ff1681548110611e8757611e87613ca8565b906000526020600020018054611e9c90613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec890613bfc565b8015611f155780601f10611eea57610100808354040283529160200191611f15565b820191906000526020600020905b815481529060010190602001808311611ef857829003601f168201915b5050505050915050919050565b60606000611e6f83600d8054611dec90613bfc565b60606106fd82604051806040016040528060048152602001631193d39560e21b8152506014805480602002602001604051908101604052809291908181526020016000905b82821015610bbd578382906000526020600020018054611f9b90613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc790613bfc565b80156120145780601f10611fe957610100808354040283529160200191612014565b820191906000526020600020905b815481529060010190602001808311611ff757829003601f168201915b505050505081526020019060010190611f7c565b600b546001600160a01b031633146120525760405162461bcd60e51b815260040161080a90613a4b565b6001600160a01b0381166120b75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080a565b6120c0816124d1565b50565b60006001600160e01b031982166380ac58cd60e01b14806120f457506001600160e01b03198216635b5e139f60e01b145b806106fd57506301ffc9a760e01b6001600160e01b03198316146106fd565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061214882610e08565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166121fa5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161080a565b600061220583610e08565b9050806001600160a01b0316846001600160a01b031614806122405750836001600160a01b031661223584610795565b6001600160a01b0316145b8061227057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661228b82610e08565b6001600160a01b0316146122f35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161080a565b6001600160a01b0382166123555760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161080a565b612360838383612973565b61236b600082612113565b6001600160a01b0383166000908152600360205260408120805460019290612394908490613ba2565b90915550506001600160a01b03821660009081526003602052604081208054600192906123c2908490613b32565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610ed8828260405180602001604052806000815250612a2b565b606060008283516124628661245189612690565b604051602001611af2929190613116565b61246c9190613c52565b8151811061247c5761247c613ca8565b60200260200101519050809150509392505050565b6060600061249f85856128f4565b90506124c88585858460ff16815181106124bb576124bb613ca8565b602002602001015161243d565b95945050505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61252e848484612278565b61253a84848484612a5e565b6119c75760405162461bcd60e51b815260040161080a906139f9565b60008160405160200161256991906130fa565b60408051601f19818403018152919052805160209091012092915050565b6060816125ab5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125d557806125bf81613c37565b91506125ce9050600a83613b6f565b91506125af565b60008167ffffffffffffffff8111156125f0576125f0613cbe565b6040519080825280601f01601f19166020018201604052801561261a576020820181803683370190505b508593509050815b831561268757612633600a85613c52565b61263e906030613b32565b60f81b8261264b83613be5565b9250828151811061265e5761265e613ca8565b60200101906001600160f81b031916908160001a905350612680600a85613b6f565b9350612622565b50949350505050565b6060816126b45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126de57806126c881613c37565b91506126d79050600a83613b6f565b91506126b8565b60008167ffffffffffffffff8111156126f9576126f9613cbe565b6040519080825280601f01601f191660200182016040528015612723576020820181803683370190505b5090505b841561227057612738600183613ba2565b9150612745600a86613c52565b612750906030613b32565b60f81b81838151811061276557612765613ca8565b60200101906001600160f81b031916908160001a905350612787600a86613b6f565b9450612727565b8051606090806127ae575050604080516020810190915260008152919050565b600060036127bd836002613b32565b6127c79190613b6f565b6127d2906004613b83565b905060006127e1826020613b32565b67ffffffffffffffff8111156127f9576127f9613cbe565b6040519080825280601f01601f191660200182016040528015612823576020820181803683370190505b5090506000604051806060016040528060408152602001613ceb604091399050600181016020830160005b868110156128af576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b83526004909201910161284e565b5060038606600181146128c957600281146128da576128e6565b613d3d60f01b6001198301526128e6565b603d60f81b6000198301525b505050918152949350505050565b60008060646129068461245187612690565b6129109190613c52565b90506000606082111561292557506002612932565b6058821115612932575060015b8060ff16600214156129475791506106fd9050565b604560646129588661245189612690565b6129629190613c52565b1115612270576124c8816003613b4a565b6001600160a01b0383166129ce576129c981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6129f1565b816001600160a01b0316836001600160a01b0316146129f1576129f18382612b6b565b6001600160a01b038216612a085761094081612c08565b826001600160a01b0316826001600160a01b031614610940576109408282612cb7565b612a358383612cfb565b612a426000848484612a5e565b6109405760405162461bcd60e51b815260040161080a906139f9565b60006001600160a01b0384163b15612b6057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612aa29033908990889088906004016139a9565b602060405180830381600087803b158015612abc57600080fd5b505af1925050508015612aec575060408051601f3d908101601f19168201909252612ae99181019061307c565b60015b612b46573d808015612b1a576040519150601f19603f3d011682016040523d82523d6000602084013e612b1f565b606091505b508051612b3e5760405162461bcd60e51b815260040161080a906139f9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612270565b506001949350505050565b60006001612b7884610fd1565b612b829190613ba2565b600083815260076020526040902054909150808214612bd5576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612c1a90600190613ba2565b60008381526009602052604081205460088054939450909284908110612c4257612c42613ca8565b906000526020600020015490508060088381548110612c6357612c63613ca8565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612c9b57612c9b613c92565b6001900381819060005260206000200160009055905550505050565b6000612cc283610fd1565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612d515760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161080a565b6000818152600260205260409020546001600160a01b031615612db65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161080a565b612dc260008383612973565b6001600160a01b0382166000908152600360205260408120805460019290612deb908490613b32565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518060c001604052806006905b6060815260200190600190039081612e585790505090565b80356001600160a01b0381168114612e8757600080fd5b919050565b600060208284031215612e9e57600080fd5b612ea782612e70565b9392505050565b60008060408385031215612ec157600080fd5b612eca83612e70565b9150612ed860208401612e70565b90509250929050565b600080600060608486031215612ef657600080fd5b612eff84612e70565b9250612f0d60208501612e70565b9150604084013590509250925092565b60008060008060808587031215612f3357600080fd5b612f3c85612e70565b9350612f4a60208601612e70565b925060408501359150606085013567ffffffffffffffff80821115612f6e57600080fd5b818701915087601f830112612f8257600080fd5b813581811115612f9457612f94613cbe565b604051601f8201601f19908116603f01168101908382118183101715612fbc57612fbc613cbe565b816040528281528a6020848701011115612fd557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561300c57600080fd5b61301583612e70565b91506020830135801515811461302a57600080fd5b809150509250929050565b6000806040838503121561304857600080fd5b61305183612e70565b946020939093013593505050565b60006020828403121561307157600080fd5b8135612ea781613cd4565b60006020828403121561308e57600080fd5b8151612ea781613cd4565b6000602082840312156130ab57600080fd5b5035919050565b600081518084526130ca816020860160208601613bb9565b601f01601f19169290920160200192915050565b600081516130f0818560208601613bb9565b9290920192915050565b6000825161310c818460208701613bb9565b9190910192915050565b60008351613128818460208801613bb9565b83519083019061313c818360208801613bb9565b01949350505050565b6000875160206131588285838d01613bb9565b88519184019161316b8184848d01613bb9565b885192019161317d8184848c01613bb9565b875192019161318f8184848b01613bb9565b86519201916131a18184848a01613bb9565b85519201916131b38184848901613bb9565b919091019998505050505050505050565b600085516131d6818460208a01613bb9565b80830190507f227d2c207b2274726169745f74797065223a20225072696d61727920576f7264815273102930b934ba3c911610113b30b63ab2911d101160611b6020820152855161322e816034840160208a01613bb9565b7f227d2c207b2274726169745f74797065223a2022417578696c6c696172792057603492909101918201527f6f726420526172697479222c202276616c7565223a20220000000000000000006054820152845161329281606b840160208901613bb9565b7f227d2c207b2274726169745f74797065223a20224261636b67726f756e642043606b92909101918201527037b637b9111610113b30b63ab2911d101160791b608b82015283516132ea81609c840160208801613bb9565b640113eae96160dd1b609c929091019182015260a1019695505050505050565b6000865161331c818460208b01613bb9565b6c01d903337b73a16b9b4bd329d1609d1b908301908152865161334681600d840160208b01613bb9565b7f70787d3c2f7374796c653e3c726563742077696474683d223130302522206865600d929091019182015272696768743d2231303025222066696c6c3d222360681b602d82015285516133a0816040840160208a01613bb9565b631110179f60e11b60409290910191820152681e3a32bc3a103c1e9160b91b604482015284516133d781604d840160208901613bb9565b6411103c9e9160d91b604d92909101918201526134156133fa60528301866130de565b6e111031b630b9b99e913130b9b2911f60891b8152600f0190565b98975050505050505050565b7f2261747472696275746573223a205b7b2274726169745f74797065223a20225081527f72696d61727920576f7264222c202276616c7565223a2022000000000000000060208201526000855161347f816038850160208a01613bb9565b7f227d2c207b2274726169745f74797065223a2022417578696c6c69617279205760389184019182018190526f37b932111610113b30b63ab2911d101160811b605883015286516134d7816068850160208b01613bb9565b7f227d2c207b2274726169745f74797065223a20225072696d61727920576f726460689390910192830152711029b4bd32911610113b30b63ab2911d101160711b6088830152855161353081609a850160208a01613bb9565b609a9201918201527437b9321029b4bd32911610113b30b63ab2911d101160591b60ba82015261356360cf8201856130de565b979650505050505050565b6f1e17ba32bc3a1f1e3a32bc3a103c1e9160811b8152825160009061359a816010850160208801613bb9565b6411103c9e9160d91b60109184019182015283516135bf816015840160208801613bb9565b6d111031b630b9b99e9130babc111f60911b60159290910191820152602301949350505050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f6e594d696e206d656574222076696577426f783d22302030203335302033353060408201527f223e3c7374796c653e2e62617365207b2066696c6c3a20230000000000000000606082015260008651613690816078850160208b01613bb9565b6e01d903337b73a16b330b6b4b63c9d1608d1b60789184019182015286516136bf816087840160208b01613bb9565b6d01d903337b73a16b9ba3cb6329d160951b6087929091019182015285516136ee816095840160208a01613bb9565b6c01d903337b73a16b9b4bd329d1609d1b6095929091019182015261341561374361373d61371f60a28501896130de565b7170783b207d202e6175787b66696c6c3a202360701b815260120190565b866130de565b6e01d903337b73a16b330b6b4b63c9d1608d1b8152600f0190565b7f7b226e616d65223a2022456d7074792043757273652023000000000000000000815260008551613796816017850160208a01613bb9565b7f222c20226465736372697074696f6e223a2022456d707479204375727365202360179184019182015285516137d3816037840160208a01613bb9565b7f222c20226465736372697074696f6e223a2022456d7074792043757273657320603792909101918201527f28666f7220417373686f6c657329206172652072616e646f6d6c792067656e6560578201527f72617465642c206d696e696d616c6c792061727469737469632063757273652060778201527f776f7264732067656e657261746564206f6e2d636861696e2e2054686579206460978201527f6f206e6f7468696e672e2e2e2072696768743f20425457206469642049206d6560b78201527f6e74696f6e207468697320697320616c6c2067656e657261746564206f6e2d6360d78201527f6861696e3f204c6f6f6b2061742074686520636f6e74726163742e2049206b6e60f78201527f6f7720796f75206e65726473206c6f7665207468617420736869742e222c200061011782015261356361395661373d6139206101368501896130de565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b626173815263194d8d0b60e21b602082015260240190565b61227d60f01b815260020190565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161399c81601d850160208701613bb9565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906139dc908301846130b2565b9695505050505050565b602081526000612ea760208301846130b2565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115613b4557613b45613c66565b500190565b600060ff821660ff84168060ff03821115613b6757613b67613c66565b019392505050565b600082613b7e57613b7e613c7c565b500490565b6000816000190483118215151615613b9d57613b9d613c66565b500290565b600082821015613bb457613bb4613c66565b500390565b60005b83811015613bd4578181015183820152602001613bbc565b838111156119c75750506000910152565b600081613bf457613bf4613c66565b506000190190565b600181811c90821680613c1057607f821691505b60208210811415613c3157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613c4b57613c4b613c66565b5060010190565b600082613c6157613c61613c7c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146120c057600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122050bb25c68d1cd4ad6fd4e814198cc63435166bba46ae6c824ca20baa19f71d9064736f6c63430008070033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c8063870e2b5b11610123578063b743bd41116100ab578063cb6f001e1161006f578063cb6f001e1461060f578063debcca421461062f578063e985e9c51461064f578063eb270e0714610698578063f2fde38b146106b857600080fd5b8063b743bd4114610574578063b88d4fde14610594578063c002d23d146105b4578063c6b3a936146105cf578063c87b56dd146105ef57600080fd5b8063985fa747116100f2578063985fa747146104ec5780639ba7522e1461050c5780639e4d36e014610521578063a04ed64014610534578063a22cb4651461055457600080fd5b8063870e2b5b146104795780638da5cb5b1461049957806391f18780146104b757806395d89b41146104d757600080fd5b80634671059f116101a657806366dd98081161017557806366dd9808146103ef5780636a8d41e41461040457806370a082311461042457806370a2135114610444578063715018a61461046457600080fd5b80634671059f1461036f5780634d70b6751461038f5780634f6ccce7146103af5780636352211e146103cf57600080fd5b806318160ddd116101ed57806318160ddd146102d057806323b872dd146102ef5780632f745c591461030f57806341a2059d1461032f57806342842e0e1461034f57600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a36600461305f565b6106d8565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b50610269610703565b60405161024b91906139e6565b34801561028257600080fd5b50610296610291366004613099565b610795565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102ce6102c9366004613035565b61082f565b005b3480156102dc57600080fd5b506008545b60405190815260200161024b565b3480156102fb57600080fd5b506102ce61030a366004612ee1565b610945565b34801561031b57600080fd5b506102e161032a366004613035565b610976565b34801561033b57600080fd5b506102ce61034a366004613099565b610a0c565b34801561035b57600080fd5b506102ce61036a366004612ee1565b610aaf565b34801561037b57600080fd5b5061026961038a366004613099565b610aca565b34801561039b57600080fd5b506102696103aa366004613099565b610bc6565b3480156103bb57600080fd5b506102e16103ca366004613099565b610d75565b3480156103db57600080fd5b506102966103ea366004613099565b610e08565b3480156103fb57600080fd5b506102ce610e7f565b34801561041057600080fd5b5061026961041f366004613099565b610edc565b34801561043057600080fd5b506102e161043f366004612e8c565b610fd1565b34801561045057600080fd5b5061026961045f366004613099565b611058565b34801561047057600080fd5b506102ce6111fe565b34801561048557600080fd5b506102ce610494366004613099565b611234565b3480156104a557600080fd5b50600b546001600160a01b0316610296565b3480156104c357600080fd5b506102696104d2366004613099565b611381565b3480156104e357600080fd5b50610269611475565b3480156104f857600080fd5b50610269610507366004613099565b611484565b34801561051857600080fd5b506102ce611576565b6102ce61052f366004613099565b61163e565b34801561054057600080fd5b5061026961054f366004613099565b6116eb565b34801561056057600080fd5b506102ce61056f366004612ff9565b6117dc565b34801561058057600080fd5b5061026961058f366004613099565b6118a1565b3480156105a057600080fd5b506102ce6105af366004612f1d565b611995565b3480156105c057600080fd5b506102e1660f2aa2048bd00081565b3480156105db57600080fd5b506102696105ea366004613099565b6119cd565b3480156105fb57600080fd5b5061026961060a366004613099565b611ac1565b34801561061b57600080fd5b5061026961062a366004613099565b611dd7565b34801561063b57600080fd5b5061026961064a366004613099565b611f22565b34801561065b57600080fd5b5061023f61066a366004612eae565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106a457600080fd5b506102696106b3366004613099565b611f37565b3480156106c457600080fd5b506102ce6106d3366004612e8c565b612028565b60006001600160e01b0319821663780e9d6360e01b14806106fd57506106fd826120c3565b92915050565b60606000805461071290613bfc565b80601f016020809104026020016040519081016040528092919081815260200182805461073e90613bfc565b801561078b5780601f106107605761010080835404028352916020019161078b565b820191906000526020600020905b81548152906001019060200180831161076e57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108135760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061083a82610e08565b9050806001600160a01b0316836001600160a01b031614156108a85760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161080a565b336001600160a01b03821614806108c457506108c4813361066a565b6109365760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161080a565b6109408383612113565b505050565b61094f3382612181565b61096b5760405162461bcd60e51b815260040161080a90613aaa565b610940838383612278565b600061098183610fd1565b82106109e35760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161080a565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a541415610a2f5760405162461bcd60e51b815260040161080a90613afb565b6002600a55600b546001600160a01b03163314610a5e5760405162461bcd60e51b815260040161080a90613a4b565b61106781118015610a7057506110ad81105b610a8c5760405162461bcd60e51b815260040161080a90613a80565b610aa7610aa1600b546001600160a01b031690565b82612423565b506001600a55565b61094083838360405180602001604052806000815250611995565b60606106fd82604051806040016040528060068152602001652121a7a627a960d11b8152506011805480602002602001604051908101604052809291908181526020016000905b82821015610bbd578382906000526020600020018054610b3090613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5c90613bfc565b8015610ba95780601f10610b7e57610100808354040283529160200191610ba9565b820191906000526020600020905b815481529060010190602001808311610b8c57829003601f168201915b505050505081526020019060010190610b11565b5050505061243d565b60606106fd82600d8054610bd990613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0590613bfc565b8015610c525780601f10610c2757610100808354040283529160200191610c52565b820191906000526020600020905b815481529060010190602001808311610c3557829003601f168201915b5050505050600f805480602002602001604051908101604052809291908181526020016000905b82821015610d6c57838290600052602060002001805480602002602001604051908101604052809291908181526020016000905b82821015610d59578382906000526020600020018054610ccc90613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf890613bfc565b8015610d455780601f10610d1a57610100808354040283529160200191610d45565b820191906000526020600020905b815481529060010190602001808311610d2857829003601f168201915b505050505081526020019060010190610cad565b5050505081526020019060010190610c79565b50505050612491565b6000610d8060085490565b8210610de35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161080a565b60088281548110610df657610df6613ca8565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806106fd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161080a565b600b546001600160a01b03163314610ea95760405162461bcd60e51b815260040161080a90613a4b565b6040514790339082156108fc029083906000818181858888f19350505050158015610ed8573d6000803e3d6000fd5b5050565b60606106fd826040518060400160405280600881526020016720aaac21a7a627a960c11b8152506010805480602002602001604051908101604052809291908181526020016000905b82821015610bbd578382906000526020600020018054610f4490613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7090613bfc565b8015610fbd5780601f10610f9257610100808354040283529160200191610fbd565b820191906000526020600020905b815481529060010190602001808311610fa057829003601f168201915b505050505081526020019060010190610f25565b60006001600160a01b03821661103c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161080a565b506001600160a01b031660009081526003602052604090205490565b60606106fd82600c805461106b90613bfc565b80601f016020809104026020016040519081016040528092919081815260200182805461109790613bfc565b80156110e45780601f106110b9576101008083540402835291602001916110e4565b820191906000526020600020905b8154815290600101906020018083116110c757829003601f168201915b5050505050600f805480602002602001604051908101604052809291908181526020016000905b82821015610d6c57838290600052602060002001805480602002602001604051908101604052809291908181526020016000905b828210156111eb57838290600052602060002001805461115e90613bfc565b80601f016020809104026020016040519081016040528092919081815260200182805461118a90613bfc565b80156111d75780601f106111ac576101008083540402835291602001916111d7565b820191906000526020600020905b8154815290600101906020018083116111ba57829003601f168201915b50505050508152602001906001019061113f565b505050508152602001906001019061110b565b600b546001600160a01b031633146112285760405162461bcd60e51b815260040161080a90613a4b565b61123260006124d1565b565b6002600a5414156112575760405162461bcd60e51b815260040161080a90613afb565b6002600a55801580159061126c5750610d2981105b6112885760405162461bcd60e51b815260040161080a90613a80565b8061037814156112da5760405162461bcd60e51b815260206004820152601960248201527f3838382069732062616e6e6564206c6d66616f206e6572642100000000000000604482015260640161080a565b806101a414156113785760405162461bcd60e51b815260206004820152605960248201527f34323020697320616c736f2062616e6e656420776520646f6e277420736d6f6b60448201527f652068657265207468697320697320612063687269737469616e20736d61727460648201527f20636f6e747261637421213121206c6d66616f206e6572642100000000000000608482015260a40161080a565b610aa733610aa1565b60606106fd826040518060400160405280600781526020016641555853495a4560c81b8152506013805480602002602001604051908101604052809291908181526020016000905b82821015610bbd5783829060005260206000200180546113e890613bfc565b80601f016020809104026020016040519081016040528092919081815260200182805461141490613bfc565b80156114615780601f1061143657610100808354040283529160200191611461565b820191906000526020600020905b81548152906001019060200180831161144457829003601f168201915b5050505050815260200190600101906113c9565b60606001805461071290613bfc565b60606106fd826040518060400160405280600581526020016421a7a627a960d91b8152506010805480602002602001604051908101604052809291908181526020016000905b82821015610bbd5783829060005260206000200180546114e990613bfc565b80601f016020809104026020016040519081016040528092919081815260200182805461151590613bfc565b80156115625780601f1061153757610100808354040283529160200191611562565b820191906000526020600020905b81548152906001019060200180831161154557829003601f168201915b5050505050815260200190600101906114ca565b6002600a5414156115995760405162461bcd60e51b815260040161080a90613afb565b6002600a55600b546001600160a01b031633146115c85760405162461bcd60e51b815260040161080a90613a4b565b610dc85b610e0c811015611619576000818152600260205260409020546001600160a01b031661160757611607610aa1600b546001600160a01b031690565b8061161181613c37565b9150506115cc565b5061163761162f600b546001600160a01b031690565b6101a4612423565b6001600a55565b6002600a5414156116615760405162461bcd60e51b815260040161080a90613afb565b6002600a55610d2881118015611678575061106881105b6116945760405162461bcd60e51b815260040161080a90613a80565b660f2aa2048bd0003410156113785760405162461bcd60e51b815260206004820152601c60248201527f5061796d656e7420746f6f206c6f772c20747279202e30303432363900000000604482015260640161080a565b60606106fd826040518060400160405280600481526020016353495a4560e01b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015610bbd57838290600052602060002001805461174f90613bfc565b80601f016020809104026020016040519081016040528092919081815260200182805461177b90613bfc565b80156117c85780601f1061179d576101008083540402835291602001916117c8565b820191906000526020600020905b8154815290600101906020018083116117ab57829003601f168201915b505050505081526020019060010190611730565b6001600160a01b0382163314156118355760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161080a565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60606106fd82604051806040016040528060078152602001661055561193d39560ca1b8152506014805480602002602001604051908101604052809291908181526020016000905b82821015610bbd57838290600052602060002001805461190890613bfc565b80601f016020809104026020016040519081016040528092919081815260200182805461193490613bfc565b80156119815780601f1061195657610100808354040283529160200191611981565b820191906000526020600020905b81548152906001019060200180831161196457829003601f168201915b5050505050815260200190600101906118e9565b61199f3383612181565b6119bb5760405162461bcd60e51b815260040161080a90613aaa565b6119c784848484612523565b50505050565b60606106fd82604051806040016040528060078152602001661055561193d39560ca1b8152506015805480602002602001604051908101604052809291908181526020016000905b82821015610bbd578382906000526020600020018054611a3490613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6090613bfc565b8015611aad5780601f10611a8257610100808354040283529160200191611aad565b820191906000526020600020905b815481529060010190602001808311611a9057829003601f168201915b505050505081526020019060010190611a15565b6060611acb612e49565b604051681b1cb337b932bb32b960b91b602082015260298101849052600090611b06906049015b604051602081830303815290604052612556565b90506000611b15604583613c52565b90506000611b2561012c84613c52565b611b30906028613b32565b90506000611b3f602a85613c52565b611b4a90601e613b32565b90506000611b59609686613c52565b611b64906046613b32565b9050611b6f88611484565b611b7889611f37565b611b818a6119cd565b611b8a8b6116eb565b611b938c610edc565b604051602001611ba79594939291906135e6565b60408051808303601f190181529190528652611bc2886118a1565b611bcb89611381565b611bd48a610aca565b611bdd87612587565b611be687612587565b604051602001611bfa95949392919061330a565b60408051808303601f190181529190526020870152611c1888611058565b6040870152611c2682612587565b611c2f82612587565b604051602001611c4092919061356e565b60408051808303601f190181529190526060870152611c5e88610bc6565b60808701908152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b60208083019190915260a08a018290528951818b0151848c015160608d015196519551600097611cbf9794969395929490939092909101613145565b60405160208183030381529060405290506000611cdb8a611058565b611ce48b610bc6565b611ced8c6116eb565b611cf68d611381565b604051602001611d099493929190613421565b6040516020818303038152906040529050600081611d268c611dd7565b611d2f8d611f22565b611d388e610aca565b604051602001611d4b94939291906131c4565b60405160208183030381529060405290506000611da4611d6a8d612690565b611d738e612690565b84611d7d8861278e565b604051602001611d90949392919061375e565b60405160208183030381529060405261278e565b905080604051602001611db79190613964565b60408051601f198184030181529190529c9b505050505050505050505050565b60606000611e6f83600c8054611dec90613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1890613bfc565b8015611e655780601f10611e3a57610100808354040283529160200191611e65565b820191906000526020600020905b815481529060010190602001808311611e4857829003601f168201915b50505050506128f4565b9050600e8160ff1681548110611e8757611e87613ca8565b906000526020600020018054611e9c90613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec890613bfc565b8015611f155780601f10611eea57610100808354040283529160200191611f15565b820191906000526020600020905b815481529060010190602001808311611ef857829003601f168201915b5050505050915050919050565b60606000611e6f83600d8054611dec90613bfc565b60606106fd82604051806040016040528060048152602001631193d39560e21b8152506014805480602002602001604051908101604052809291908181526020016000905b82821015610bbd578382906000526020600020018054611f9b90613bfc565b80601f0160208091040260200160405190810160405280929190818152602001828054611fc790613bfc565b80156120145780601f10611fe957610100808354040283529160200191612014565b820191906000526020600020905b815481529060010190602001808311611ff757829003601f168201915b505050505081526020019060010190611f7c565b600b546001600160a01b031633146120525760405162461bcd60e51b815260040161080a90613a4b565b6001600160a01b0381166120b75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080a565b6120c0816124d1565b50565b60006001600160e01b031982166380ac58cd60e01b14806120f457506001600160e01b03198216635b5e139f60e01b145b806106fd57506301ffc9a760e01b6001600160e01b03198316146106fd565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061214882610e08565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166121fa5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161080a565b600061220583610e08565b9050806001600160a01b0316846001600160a01b031614806122405750836001600160a01b031661223584610795565b6001600160a01b0316145b8061227057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661228b82610e08565b6001600160a01b0316146122f35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161080a565b6001600160a01b0382166123555760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161080a565b612360838383612973565b61236b600082612113565b6001600160a01b0383166000908152600360205260408120805460019290612394908490613ba2565b90915550506001600160a01b03821660009081526003602052604081208054600192906123c2908490613b32565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610ed8828260405180602001604052806000815250612a2b565b606060008283516124628661245189612690565b604051602001611af2929190613116565b61246c9190613c52565b8151811061247c5761247c613ca8565b60200260200101519050809150509392505050565b6060600061249f85856128f4565b90506124c88585858460ff16815181106124bb576124bb613ca8565b602002602001015161243d565b95945050505050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61252e848484612278565b61253a84848484612a5e565b6119c75760405162461bcd60e51b815260040161080a906139f9565b60008160405160200161256991906130fa565b60408051601f19818403018152919052805160209091012092915050565b6060816125ab5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125d557806125bf81613c37565b91506125ce9050600a83613b6f565b91506125af565b60008167ffffffffffffffff8111156125f0576125f0613cbe565b6040519080825280601f01601f19166020018201604052801561261a576020820181803683370190505b508593509050815b831561268757612633600a85613c52565b61263e906030613b32565b60f81b8261264b83613be5565b9250828151811061265e5761265e613ca8565b60200101906001600160f81b031916908160001a905350612680600a85613b6f565b9350612622565b50949350505050565b6060816126b45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126de57806126c881613c37565b91506126d79050600a83613b6f565b91506126b8565b60008167ffffffffffffffff8111156126f9576126f9613cbe565b6040519080825280601f01601f191660200182016040528015612723576020820181803683370190505b5090505b841561227057612738600183613ba2565b9150612745600a86613c52565b612750906030613b32565b60f81b81838151811061276557612765613ca8565b60200101906001600160f81b031916908160001a905350612787600a86613b6f565b9450612727565b8051606090806127ae575050604080516020810190915260008152919050565b600060036127bd836002613b32565b6127c79190613b6f565b6127d2906004613b83565b905060006127e1826020613b32565b67ffffffffffffffff8111156127f9576127f9613cbe565b6040519080825280601f01601f191660200182016040528015612823576020820181803683370190505b5090506000604051806060016040528060408152602001613ceb604091399050600181016020830160005b868110156128af576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b83526004909201910161284e565b5060038606600181146128c957600281146128da576128e6565b613d3d60f01b6001198301526128e6565b603d60f81b6000198301525b505050918152949350505050565b60008060646129068461245187612690565b6129109190613c52565b90506000606082111561292557506002612932565b6058821115612932575060015b8060ff16600214156129475791506106fd9050565b604560646129588661245189612690565b6129629190613c52565b1115612270576124c8816003613b4a565b6001600160a01b0383166129ce576129c981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6129f1565b816001600160a01b0316836001600160a01b0316146129f1576129f18382612b6b565b6001600160a01b038216612a085761094081612c08565b826001600160a01b0316826001600160a01b031614610940576109408282612cb7565b612a358383612cfb565b612a426000848484612a5e565b6109405760405162461bcd60e51b815260040161080a906139f9565b60006001600160a01b0384163b15612b6057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612aa29033908990889088906004016139a9565b602060405180830381600087803b158015612abc57600080fd5b505af1925050508015612aec575060408051601f3d908101601f19168201909252612ae99181019061307c565b60015b612b46573d808015612b1a576040519150601f19603f3d011682016040523d82523d6000602084013e612b1f565b606091505b508051612b3e5760405162461bcd60e51b815260040161080a906139f9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612270565b506001949350505050565b60006001612b7884610fd1565b612b829190613ba2565b600083815260076020526040902054909150808214612bd5576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612c1a90600190613ba2565b60008381526009602052604081205460088054939450909284908110612c4257612c42613ca8565b906000526020600020015490508060088381548110612c6357612c63613ca8565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612c9b57612c9b613c92565b6001900381819060005260206000200160009055905550505050565b6000612cc283610fd1565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612d515760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161080a565b6000818152600260205260409020546001600160a01b031615612db65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161080a565b612dc260008383612973565b6001600160a01b0382166000908152600360205260408120805460019290612deb908490613b32565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6040518060c001604052806006905b6060815260200190600190039081612e585790505090565b80356001600160a01b0381168114612e8757600080fd5b919050565b600060208284031215612e9e57600080fd5b612ea782612e70565b9392505050565b60008060408385031215612ec157600080fd5b612eca83612e70565b9150612ed860208401612e70565b90509250929050565b600080600060608486031215612ef657600080fd5b612eff84612e70565b9250612f0d60208501612e70565b9150604084013590509250925092565b60008060008060808587031215612f3357600080fd5b612f3c85612e70565b9350612f4a60208601612e70565b925060408501359150606085013567ffffffffffffffff80821115612f6e57600080fd5b818701915087601f830112612f8257600080fd5b813581811115612f9457612f94613cbe565b604051601f8201601f19908116603f01168101908382118183101715612fbc57612fbc613cbe565b816040528281528a6020848701011115612fd557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561300c57600080fd5b61301583612e70565b91506020830135801515811461302a57600080fd5b809150509250929050565b6000806040838503121561304857600080fd5b61305183612e70565b946020939093013593505050565b60006020828403121561307157600080fd5b8135612ea781613cd4565b60006020828403121561308e57600080fd5b8151612ea781613cd4565b6000602082840312156130ab57600080fd5b5035919050565b600081518084526130ca816020860160208601613bb9565b601f01601f19169290920160200192915050565b600081516130f0818560208601613bb9565b9290920192915050565b6000825161310c818460208701613bb9565b9190910192915050565b60008351613128818460208801613bb9565b83519083019061313c818360208801613bb9565b01949350505050565b6000875160206131588285838d01613bb9565b88519184019161316b8184848d01613bb9565b885192019161317d8184848c01613bb9565b875192019161318f8184848b01613bb9565b86519201916131a18184848a01613bb9565b85519201916131b38184848901613bb9565b919091019998505050505050505050565b600085516131d6818460208a01613bb9565b80830190507f227d2c207b2274726169745f74797065223a20225072696d61727920576f7264815273102930b934ba3c911610113b30b63ab2911d101160611b6020820152855161322e816034840160208a01613bb9565b7f227d2c207b2274726169745f74797065223a2022417578696c6c696172792057603492909101918201527f6f726420526172697479222c202276616c7565223a20220000000000000000006054820152845161329281606b840160208901613bb9565b7f227d2c207b2274726169745f74797065223a20224261636b67726f756e642043606b92909101918201527037b637b9111610113b30b63ab2911d101160791b608b82015283516132ea81609c840160208801613bb9565b640113eae96160dd1b609c929091019182015260a1019695505050505050565b6000865161331c818460208b01613bb9565b6c01d903337b73a16b9b4bd329d1609d1b908301908152865161334681600d840160208b01613bb9565b7f70787d3c2f7374796c653e3c726563742077696474683d223130302522206865600d929091019182015272696768743d2231303025222066696c6c3d222360681b602d82015285516133a0816040840160208a01613bb9565b631110179f60e11b60409290910191820152681e3a32bc3a103c1e9160b91b604482015284516133d781604d840160208901613bb9565b6411103c9e9160d91b604d92909101918201526134156133fa60528301866130de565b6e111031b630b9b99e913130b9b2911f60891b8152600f0190565b98975050505050505050565b7f2261747472696275746573223a205b7b2274726169745f74797065223a20225081527f72696d61727920576f7264222c202276616c7565223a2022000000000000000060208201526000855161347f816038850160208a01613bb9565b7f227d2c207b2274726169745f74797065223a2022417578696c6c69617279205760389184019182018190526f37b932111610113b30b63ab2911d101160811b605883015286516134d7816068850160208b01613bb9565b7f227d2c207b2274726169745f74797065223a20225072696d61727920576f726460689390910192830152711029b4bd32911610113b30b63ab2911d101160711b6088830152855161353081609a850160208a01613bb9565b609a9201918201527437b9321029b4bd32911610113b30b63ab2911d101160591b60ba82015261356360cf8201856130de565b979650505050505050565b6f1e17ba32bc3a1f1e3a32bc3a103c1e9160811b8152825160009061359a816010850160208801613bb9565b6411103c9e9160d91b60109184019182015283516135bf816015840160208801613bb9565b6d111031b630b9b99e9130babc111f60911b60159290910191820152602301949350505050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f73766722207072657365727665417370656374526174696f3d22784d6960208201527f6e594d696e206d656574222076696577426f783d22302030203335302033353060408201527f223e3c7374796c653e2e62617365207b2066696c6c3a20230000000000000000606082015260008651613690816078850160208b01613bb9565b6e01d903337b73a16b330b6b4b63c9d1608d1b60789184019182015286516136bf816087840160208b01613bb9565b6d01d903337b73a16b9ba3cb6329d160951b6087929091019182015285516136ee816095840160208a01613bb9565b6c01d903337b73a16b9b4bd329d1609d1b6095929091019182015261341561374361373d61371f60a28501896130de565b7170783b207d202e6175787b66696c6c3a202360701b815260120190565b866130de565b6e01d903337b73a16b330b6b4b63c9d1608d1b8152600f0190565b7f7b226e616d65223a2022456d7074792043757273652023000000000000000000815260008551613796816017850160208a01613bb9565b7f222c20226465736372697074696f6e223a2022456d707479204375727365202360179184019182015285516137d3816037840160208a01613bb9565b7f222c20226465736372697074696f6e223a2022456d7074792043757273657320603792909101918201527f28666f7220417373686f6c657329206172652072616e646f6d6c792067656e6560578201527f72617465642c206d696e696d616c6c792061727469737469632063757273652060778201527f776f7264732067656e657261746564206f6e2d636861696e2e2054686579206460978201527f6f206e6f7468696e672e2e2e2072696768743f20425457206469642049206d6560b78201527f6e74696f6e207468697320697320616c6c2067656e657261746564206f6e2d6360d78201527f6861696e3f204c6f6f6b2061742074686520636f6e74726163742e2049206b6e60f78201527f6f7720796f75206e65726473206c6f7665207468617420736869742e222c200061011782015261356361395661373d6139206101368501896130de565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b626173815263194d8d0b60e21b602082015260240190565b61227d60f01b815260020190565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161399c81601d850160208701613bb9565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906139dc908301846130b2565b9695505050505050565b602081526000612ea760208301846130b2565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115613b4557613b45613c66565b500190565b600060ff821660ff84168060ff03821115613b6757613b67613c66565b019392505050565b600082613b7e57613b7e613c7c565b500490565b6000816000190483118215151615613b9d57613b9d613c66565b500290565b600082821015613bb457613bb4613c66565b500390565b60005b83811015613bd4578181015183820152602001613bbc565b838111156119c75750506000910152565b600081613bf457613bf4613c66565b506000190190565b600181811c90821680613c1057607f821691505b60208210811415613c3157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613c4b57613c4b613c66565b5060010190565b600082613c6157613c61613c7c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146120c057600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122050bb25c68d1cd4ad6fd4e814198cc63435166bba46ae6c824ca20baa19f71d9064736f6c63430008070033

Deployed Bytecode Sourcemap

45073:12647:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38421:224;;;;;;;;;;-1:-1:-1;38421:224:0;;;;;:::i;:::-;;:::i;:::-;;;19107:14:1;;19100:22;19082:41;;19070:2;19055:18;38421:224:0;;;;;;;;25535:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27094:221::-;;;;;;;;;;-1:-1:-1;27094:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;18405:32:1;;;18387:51;;18375:2;18360:18;27094:221:0;18241:203:1;26617:411:0;;;;;;;;;;-1:-1:-1;26617:411:0;;;;;:::i;:::-;;:::i;:::-;;39061:113;;;;;;;;;;-1:-1:-1;39149:10:0;:17;39061:113;;;28209:25:1;;;28197:2;28182:18;39061:113:0;28063:177:1;27984:339:0;;;;;;;;;;-1:-1:-1;27984:339:0;;;;;:::i;:::-;;:::i;38729:256::-;;;;;;;;;;-1:-1:-1;38729:256:0;;;;;:::i;:::-;;:::i;56280:189::-;;;;;;;;;;-1:-1:-1;56280:189:0;;;;;:::i;:::-;;:::i;28394:185::-;;;;;;;;;;-1:-1:-1;28394:185:0;;;;;:::i;:::-;;:::i;50602:149::-;;;;;;;;;;-1:-1:-1;50602:149:0;;;;;:::i;:::-;;:::i;49028:145::-;;;;;;;;;;-1:-1:-1;49028:145:0;;;;;:::i;:::-;;:::i;39251:233::-;;;;;;;;;;-1:-1:-1;39251:233:0;;;;;:::i;:::-;;:::i;25229:239::-;;;;;;;;;;-1:-1:-1;25229:239:0;;;;;:::i;:::-;;:::i;56481:138::-;;;;;;;;;;;;;:::i;49324:134::-;;;;;;;;;;-1:-1:-1;49324:134:0;;;;;:::i;:::-;;:::i;24959:208::-;;;;;;;;;;-1:-1:-1;24959:208:0;;;;;:::i;:::-;;:::i;48877:143::-;;;;;;;;;;-1:-1:-1;48877:143:0;;;;;:::i;:::-;;:::i;9927:94::-;;;;;;;;;;;;;:::i;55522:376::-;;;;;;;;;;-1:-1:-1;55522:376:0;;;;;:::i;:::-;;:::i;9276:87::-;;;;;;;;;;-1:-1:-1;9349:6:0;;-1:-1:-1;;;;;9349:6:0;9276:87;;49614:134;;;;;;;;;;-1:-1:-1;49614:134:0;;;;;:::i;:::-;;:::i;25704:104::-;;;;;;;;;;;;;:::i;49181:135::-;;;;;;;;;;-1:-1:-1;49181:135:0;;;;;:::i;:::-;;:::i;56631:289::-;;;;;;;;;;;;;:::i;55996:272::-;;;;;;:::i;:::-;;:::i;49470:132::-;;;;;;;;;;-1:-1:-1;49470:132:0;;;;;:::i;:::-;;:::i;27387:295::-;;;;;;;;;;-1:-1:-1;27387:295:0;;;;;:::i;:::-;;:::i;49904:131::-;;;;;;;;;;-1:-1:-1;49904:131:0;;;;;:::i;:::-;;:::i;28650:328::-;;;;;;;;;;-1:-1:-1;28650:328:0;;;;;:::i;:::-;;:::i;45625:53::-;;;;;;;;;;;;45662:16;45625:53;;50047:146;;;;;;;;;;-1:-1:-1;50047:146:0;;;;;:::i;:::-;;:::i;51968:3546::-;;;;;;;;;;-1:-1:-1;51968:3546:0;;;;;:::i;:::-;;:::i;50205:189::-;;;;;;;;;;-1:-1:-1;50205:189:0;;;;;:::i;:::-;;:::i;50406:184::-;;;;;;;;;;-1:-1:-1;50406:184:0;;;;;:::i;:::-;;:::i;27753:164::-;;;;;;;;;;-1:-1:-1;27753:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27874:25:0;;;27850:4;27874:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27753:164;49760:132;;;;;;;;;;-1:-1:-1;49760:132:0;;;;;:::i;:::-;;:::i;10176:192::-;;;;;;;;;;-1:-1:-1;10176:192:0;;;;;:::i;:::-;;:::i;38421:224::-;38523:4;-1:-1:-1;;;;;;38547:50:0;;-1:-1:-1;;;38547:50:0;;:90;;;38601:36;38625:11;38601:23;:36::i;:::-;38540:97;38421:224;-1:-1:-1;;38421:224:0:o;25535:100::-;25589:13;25622:5;25615:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25535:100;:::o;27094:221::-;27170:7;30577:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30577:16:0;27190:73;;;;-1:-1:-1;;;27190:73:0;;25143:2:1;27190:73:0;;;25125:21:1;25182:2;25162:18;;;25155:30;25221:34;25201:18;;;25194:62;-1:-1:-1;;;25272:18:1;;;25265:42;25324:19;;27190:73:0;;;;;;;;;-1:-1:-1;27283:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27283:24:0;;27094:221::o;26617:411::-;26698:13;26714:23;26729:7;26714:14;:23::i;:::-;26698:39;;26762:5;-1:-1:-1;;;;;26756:11:0;:2;-1:-1:-1;;;;;26756:11:0;;;26748:57;;;;-1:-1:-1;;;26748:57:0;;26672:2:1;26748:57:0;;;26654:21:1;26711:2;26691:18;;;26684:30;26750:34;26730:18;;;26723:62;-1:-1:-1;;;26801:18:1;;;26794:31;26842:19;;26748:57:0;26470:397:1;26748:57:0;8216:10;-1:-1:-1;;;;;26840:21:0;;;;:62;;-1:-1:-1;26865:37:0;26882:5;8216:10;27753:164;:::i;26865:37::-;26818:168;;;;-1:-1:-1;;;26818:168:0;;23038:2:1;26818:168:0;;;23020:21:1;23077:2;23057:18;;;23050:30;23116:34;23096:18;;;23089:62;23187:26;23167:18;;;23160:54;23231:19;;26818:168:0;22836:420:1;26818:168:0;26999:21;27008:2;27012:7;26999:8;:21::i;:::-;26687:341;26617:411;;:::o;27984:339::-;28179:41;8216:10;28212:7;28179:18;:41::i;:::-;28171:103;;;;-1:-1:-1;;;28171:103:0;;;;;;;:::i;:::-;28287:28;28297:4;28303:2;28307:7;28287:9;:28::i;38729:256::-;38826:7;38862:23;38879:5;38862:16;:23::i;:::-;38854:5;:31;38846:87;;;;-1:-1:-1;;;38846:87:0;;19914:2:1;38846:87:0;;;19896:21:1;19953:2;19933:18;;;19926:30;19992:34;19972:18;;;19965:62;-1:-1:-1;;;20043:18:1;;;20036:41;20094:19;;38846:87:0;19712:407:1;38846:87:0;-1:-1:-1;;;;;;38951:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38729:256::o;56280:189::-;12215:1;12811:7;;:19;;12803:63;;;;-1:-1:-1;;;12803:63:0;;;;;;;:::i;:::-;12215:1;12944:7;:18;9349:6;;-1:-1:-1;;;;;9349:6:0;8216:10;9496:23:::1;9488:68;;;;-1:-1:-1::0;;;9488:68:0::1;;;;;;;:::i;:::-;56380:4:::2;56370:7;:14;:32;;;;;56398:4;56388:7;:14;56370:32;56362:61;;;;-1:-1:-1::0;;;56362:61:0::2;;;;;;;:::i;:::-;56434:27;56444:7;9349:6:::0;;-1:-1:-1;;;;;9349:6:0;;9276:87;56444:7:::2;56453;56434:9;:27::i;:::-;-1:-1:-1::0;12171:1:0;13123:7;:22;56280:189::o;28394:185::-;28532:39;28549:4;28555:2;28559:7;28532:39;;;;;;;;;;;;:16;:39::i;50602:149::-;50668:13;50701:42;50707:7;50701:42;;;;;;;;;;;;;-1:-1:-1;;;50701:42:0;;;50726:16;50701:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:42::i;49028:145::-;49091:13;49124:41;49135:7;49144:6;49124:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49152:12;49124:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;:41::i;39251:233::-;39326:7;39362:30;39149:10;:17;;39061:113;39362:30;39354:5;:38;39346:95;;;;-1:-1:-1;;;39346:95:0;;27492:2:1;39346:95:0;;;27474:21:1;27531:2;27511:18;;;27504:30;27570:34;27550:18;;;27543:62;-1:-1:-1;;;27621:18:1;;;27614:42;27673:19;;39346:95:0;27290:408:1;39346:95:0;39459:10;39470:5;39459:17;;;;;;;;:::i;:::-;;;;;;;;;39452:24;;39251:233;;;:::o;25229:239::-;25301:7;25337:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25337:16:0;25372:19;25364:73;;;;-1:-1:-1;;;25364:73:0;;23874:2:1;25364:73:0;;;23856:21:1;23913:2;23893:18;;;23886:30;23952:34;23932:18;;;23925:62;-1:-1:-1;;;24003:18:1;;;23996:39;24052:19;;25364:73:0;23672:405:1;56481:138:0;9349:6;;-1:-1:-1;;;;;9349:6:0;8216:10;9496:23;9488:68;;;;-1:-1:-1;;;9488:68:0;;;;;;;:::i;:::-;56574:37:::1;::::0;56542:21:::1;::::0;56582:10:::1;::::0;56574:37;::::1;;;::::0;56542:21;;56527:12:::1;56574:37:::0;56527:12;56574:37;56542:21;56582:10;56574:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;56516:103;56481:138::o:0;49324:134::-;49383:13;49416:34;49422:7;49416:34;;;;;;;;;;;;;-1:-1:-1;;;49416:34:0;;;49443:6;49416:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24959:208;25031:7;-1:-1:-1;;;;;25059:19:0;;25051:74;;;;-1:-1:-1;;;25051:74:0;;23463:2:1;25051:74:0;;;23445:21:1;23502:2;23482:18;;;23475:30;23541:34;23521:18;;;23514:62;-1:-1:-1;;;23592:18:1;;;23585:40;23642:19;;25051:74:0;23261:406:1;25051:74:0;-1:-1:-1;;;;;;25143:16:0;;;;;:9;:16;;;;;;;24959:208::o;48877:143::-;48937:13;48970:42;48981:7;48990;48970:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48999:12;48970:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9927:94;9349:6;;-1:-1:-1;;;;;9349:6:0;8216:10;9496:23;9488:68;;;;-1:-1:-1;;;9488:68:0;;;;;;;:::i;:::-;9992:21:::1;10010:1;9992:9;:21::i;:::-;9927:94::o:0;55522:376::-;12215:1;12811:7;;:19;;12803:63;;;;-1:-1:-1;;;12803:63:0;;;;;;;:::i;:::-;12215:1;12944:7;:18;55607:11;;;;;:29:::1;;;55632:4;55622:7;:14;55607:29;55599:58;;;;-1:-1:-1::0;;;55599:58:0::1;;;;;;;:::i;:::-;55676:7;55687:3;55676:14;;55668:52;;;::::0;-1:-1:-1;;;55668:52:0;;19560:2:1;55668:52:0::1;::::0;::::1;19542:21:1::0;19599:2;19579:18;;;19572:30;19638:27;19618:18;;;19611:55;19683:18;;55668:52:0::1;19358:349:1::0;55668:52:0::1;55739:7;55750:3;55739:14;;55731:116;;;::::0;-1:-1:-1;;;55731:116:0;;24284:2:1;55731:116:0::1;::::0;::::1;24266:21:1::0;24323:2;24303:18;;;24296:30;24362:34;24342:18;;;24335:62;24433:34;24413:18;;;24406:62;24505:27;24484:19;;;24477:56;24550:19;;55731:116:0::1;24082:493:1::0;55731:116:0::1;55858:32;8216:10:::0;55868:12:::1;8136:98:::0;49614:134;49672:13;49705:35;49711:7;49705:35;;;;;;;;;;;;;-1:-1:-1;;;49705:35:0;;;49731:8;49705:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25704:104;25760:13;25793:7;25786:14;;;;;:::i;49181:135::-;49244:13;49277:31;49283:7;49277:31;;;;;;;;;;;;;-1:-1:-1;;;49277:31:0;;;49301:6;49277:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56631:289;12215:1;12811:7;;:19;;12803:63;;;;-1:-1:-1;;;12803:63:0;;;;;;;:::i;:::-;12215:1;12944:7;:18;9349:6;;-1:-1:-1;;;;;9349:6:0;8216:10;9496:23:::1;9488:68;;;;-1:-1:-1::0;;;9488:68:0::1;;;;;;;:::i;:::-;56757:4:::2;56743:136;56768:4;56764:1;:8;56743:136;;;30553:4:::0;30577:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30577:16:0;56795:73:::2;;56831:21;56841:7;9349:6:::0;;-1:-1:-1;;;;;9349:6:0;;9276:87;56831:21:::2;56775:3:::0;::::2;::::0;::::2;:::i;:::-;;;;56743:136;;;;56889:23;56899:7;9349:6:::0;;-1:-1:-1;;;;;9349:6:0;;9276:87;56899:7:::2;56908:3;56889:9;:23::i;:::-;12171:1:::0;13123:7;:22;56631:289::o;55996:272::-;12215:1;12811:7;;:19;;12803:63;;;;-1:-1:-1;;;12803:63:0;;;;;;;:::i;:::-;12215:1;12944:7;:18;56099:4:::1;56089:14:::0;::::1;:32:::0;::::1;;;;56117:4;56107:7;:14;56089:32;56081:61;;;;-1:-1:-1::0;;;56081:61:0::1;;;;;;;:::i;:::-;45662:16;56161:9;:23;;56153:64;;;::::0;-1:-1:-1;;;56153:64:0;;22681:2:1;56153:64:0::1;::::0;::::1;22663:21:1::0;22720:2;22700:18;;;22693:30;22759;22739:18;;;22732:58;22807:18;;56153:64:0::1;22479:352:1::0;49470:132:0;49532:13;49565:29;49571:7;49565:29;;;;;;;;;;;;;-1:-1:-1;;;49565:29:0;;;49588:5;49565:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27387:295;-1:-1:-1;;;;;27490:24:0;;8216:10;27490:24;;27482:62;;;;-1:-1:-1;;;27482:62:0;;21914:2:1;27482:62:0;;;21896:21:1;21953:2;21933:18;;;21926:30;21992:27;21972:18;;;21965:55;22037:18;;27482:62:0;21712:349:1;27482:62:0;8216:10;27557:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27557:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;27557:53:0;;;;;;;;;;27626:48;;19082:41:1;;;27557:42:0;;8216:10;27626:48;;19055:18:1;27626:48:0;;;;;;;27387:295;;:::o;49904:131::-;49962:13;49995:32;50001:7;49995:32;;;;;;;;;;;;;-1:-1:-1;;;49995:32:0;;;50021:5;49995:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28650:328;28825:41;8216:10;28858:7;28825:18;:41::i;:::-;28817:103;;;;-1:-1:-1;;;28817:103:0;;;;;;;:::i;:::-;28931:39;28945:4;28951:2;28955:7;28964:5;28931:13;:39::i;:::-;28650:328;;;;:::o;50047:146::-;50117:13;50150:35;50156:7;50150:35;;;;;;;;;;;;;-1:-1:-1;;;50150:35:0;;;50176:8;50150:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51968:3546;52033:13;52059:22;;:::i;:::-;52140:38;;-1:-1:-1;;;52140:38:0;;;12647:24:1;12687:11;;;12680:27;;;52111:12:0;;52126:54;;12723:12:1;;52140:38:0;;;;;;;;;;;;;52126:6;:54::i;:::-;52111:69;-1:-1:-1;52191:18:0;52212:9;52219:2;52111:69;52212:9;:::i;:::-;52191:30;-1:-1:-1;52232:18:0;52253:10;52260:3;52253:4;:10;:::i;:::-;:15;;52266:2;52253:15;:::i;:::-;52232:36;-1:-1:-1;52279:21:0;52303:9;52310:2;52303:4;:9;:::i;:::-;:14;;52315:2;52303:14;:::i;:::-;52279:38;-1:-1:-1;52328:21:0;52352:10;52359:3;52352:4;:10;:::i;:::-;:15;;52365:2;52352:15;:::i;:::-;52328:39;;52566:24;52582:7;52566:15;:24::i;:::-;52637:23;52652:7;52637:14;:23::i;:::-;52706:31;52729:7;52706:22;:31::i;:::-;52782:23;52797:7;52782:14;:23::i;:::-;52855:20;52867:7;52855:11;:20::i;:::-;52398:520;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;52398:520:0;;;;;;52380:539;;52989:19;53000:7;52989:10;:19::i;:::-;53053;53064:7;53053:10;:19::i;:::-;53155:27;53174:7;53155:18;:27::i;:::-;53245:20;53254:10;53245:8;:20::i;:::-;53303;53312:10;53303:8;:20::i;:::-;52958:398;;;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;52958:398:0;;;;;;52940:8;;;:417;53381:21;53394:7;53381:12;:21::i;:::-;53370:8;;;:32;53470:23;53479:13;53470:8;:23::i;:::-;53504;53513:13;53504:8;:23::i;:::-;53433:113;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;53433:113:0;;;;;;53415:8;;;:132;53571:24;53587:7;53571:15;:24::i;:::-;53560:8;;;:35;;;53608:26;;;;;;;;;;;-1:-1:-1;;;53560:8:0;53608:26;;;;;;;:8;;;:26;;;53702:8;;53712;;;;-1:-1:-1;;;53722:8:0;53732;;;;53742;;53685:76;;-1:-1:-1;;53685:76:0;;53702:8;;53712;;53722;;53732;;53742;;53608:26;;53685:76;;:::i;:::-;;;;;;;;;;;;;53655:107;;53838:27;53980:21;53993:7;53980:12;:21::i;:::-;54082:24;54098:7;54082:15;:24::i;:::-;54188:23;54203:7;54188:14;:23::i;:::-;54296:19;54307:7;54296:10;:19::i;:::-;53875:441;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53838:479;;54328:22;54391:13;54488:29;54509:7;54488:20;:29::i;:::-;54604:25;54621:7;54604:16;:25::i;:::-;54710:27;54729:7;54710:18;:27::i;:::-;54360:400;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54328:433;;54772:18;54793:604;54892:17;54901:7;54892:8;:17::i;:::-;54975;54984:7;54975:8;:17::i;:::-;55281:8;55359:28;55379:6;55359:13;:28::i;:::-;54820:574;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54793:13;:604::i;:::-;54772:625;;55474:4;55424:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;55424:55:0;;;;;;;;;;51968:3546;-1:-1:-1;;;;;;;;;;;;51968:3546:0:o;50205:189::-;50273:13;50299:11;50313:42;50338:7;50347;50313:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:24;:42::i;:::-;50299:56;;50373:6;50380:5;50373:13;;;;;;;;;;:::i;:::-;;;;;;;;50366:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50205:189;;;:::o;50406:184::-;50470:13;50496:11;50510:41;50535:7;50544:6;50510:41;;;;;:::i;49760:132::-;49822:13;49855:29;49861:7;49855:29;;;;;;;;;;;;;-1:-1:-1;;;49855:29:0;;;49878:5;49855:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10176:192;9349:6;;-1:-1:-1;;;;;9349:6:0;8216:10;9496:23;9488:68;;;;-1:-1:-1;;;9488:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10265:22:0;::::1;10257:73;;;::::0;-1:-1:-1;;;10257:73:0;;20745:2:1;10257:73:0::1;::::0;::::1;20727:21:1::0;20784:2;20764:18;;;20757:30;20823:34;20803:18;;;20796:62;-1:-1:-1;;;20874:18:1;;;20867:36;20920:19;;10257:73:0::1;20543:402:1::0;10257:73:0::1;10341:19;10351:8;10341:9;:19::i;:::-;10176:192:::0;:::o;24590:305::-;24692:4;-1:-1:-1;;;;;;24729:40:0;;-1:-1:-1;;;24729:40:0;;:105;;-1:-1:-1;;;;;;;24786:48:0;;-1:-1:-1;;;24786:48:0;24729:105;:158;;;-1:-1:-1;;;;;;;;;;23306:40:0;;;24851:36;23197:157;34470:174;34545:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34545:29:0;-1:-1:-1;;;;;34545:29:0;;;;;;;;:24;;34599:23;34545:24;34599:14;:23::i;:::-;-1:-1:-1;;;;;34590:46:0;;;;;;;;;;;34470:174;;:::o;30782:348::-;30875:4;30577:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30577:16:0;30892:73;;;;-1:-1:-1;;;30892:73:0;;22268:2:1;30892:73:0;;;22250:21:1;22307:2;22287:18;;;22280:30;22346:34;22326:18;;;22319:62;-1:-1:-1;;;22397:18:1;;;22390:42;22449:19;;30892:73:0;22066:408:1;30892:73:0;30976:13;30992:23;31007:7;30992:14;:23::i;:::-;30976:39;;31045:5;-1:-1:-1;;;;;31034:16:0;:7;-1:-1:-1;;;;;31034:16:0;;:51;;;;31078:7;-1:-1:-1;;;;;31054:31:0;:20;31066:7;31054:11;:20::i;:::-;-1:-1:-1;;;;;31054:31:0;;31034:51;:87;;;-1:-1:-1;;;;;;27874:25:0;;;27850:4;27874:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31089:32;31026:96;30782:348;-1:-1:-1;;;;30782:348:0:o;33774:578::-;33933:4;-1:-1:-1;;;;;33906:31:0;:23;33921:7;33906:14;:23::i;:::-;-1:-1:-1;;;;;33906:31:0;;33898:85;;;;-1:-1:-1;;;33898:85:0;;26262:2:1;33898:85:0;;;26244:21:1;26301:2;26281:18;;;26274:30;26340:34;26320:18;;;26313:62;-1:-1:-1;;;26391:18:1;;;26384:39;26440:19;;33898:85:0;26060:405:1;33898:85:0;-1:-1:-1;;;;;34002:16:0;;33994:65;;;;-1:-1:-1;;;33994:65:0;;21509:2:1;33994:65:0;;;21491:21:1;21548:2;21528:18;;;21521:30;21587:34;21567:18;;;21560:62;-1:-1:-1;;;21638:18:1;;;21631:34;21682:19;;33994:65:0;21307:400:1;33994:65:0;34072:39;34093:4;34099:2;34103:7;34072:20;:39::i;:::-;34176:29;34193:1;34197:7;34176:8;:29::i;:::-;-1:-1:-1;;;;;34218:15:0;;;;;;:9;:15;;;;;:20;;34237:1;;34218:15;:20;;34237:1;;34218:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34249:13:0;;;;;;:9;:13;;;;;:18;;34266:1;;34249:13;:18;;34266:1;;34249:18;:::i;:::-;;;;-1:-1:-1;;34278:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34278:21:0;-1:-1:-1;;;;;34278:21:0;;;;;;;;;34317:27;;34278:16;;34317:27;;;;;;;33774:578;;;:::o;31472:110::-;31548:26;31558:2;31562:7;31548:26;;;;;;;;;;;;:9;:26::i;51680:280::-;51787:13;51813:20;51836:9;51911;:16;51846:62;51877:9;51888:17;51897:7;51888:8;:17::i;:::-;51860:46;;;;;;;;;:::i;51846:62::-;:81;;;;:::i;:::-;51836:92;;;;;;;;:::i;:::-;;;;;;;51813:115;;51946:6;51939:13;;;51680:280;;;;;:::o;51407:265::-;51520:13;51546:11;51560:44;51585:7;51594:9;51560:24;:44::i;:::-;51546:58;;51622:42;51628:7;51637:9;51648:8;51657:5;51648:15;;;;;;;;;;:::i;:::-;;;;;;;51622:5;:42::i;:::-;51615:49;51407:265;-1:-1:-1;;;;;51407:265:0:o;10376:173::-;10451:6;;;-1:-1:-1;;;;;10468:17:0;;;-1:-1:-1;;;;;;10468:17:0;;;;;;;10501:40;;10451:6;;;10468:17;10451:6;;10501:40;;10432:16;;10501:40;10421:128;10376:173;:::o;29860:315::-;30017:28;30027:4;30033:2;30037:7;30017:9;:28::i;:::-;30064:48;30087:4;30093:2;30097:7;30106:5;30064:22;:48::i;:::-;30056:111;;;;-1:-1:-1;;;30056:111:0;;;;;;;:::i;48727:138::-;48787:7;48849:5;48832:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;48832:23:0;;;;;;;;;48822:34;;48832:23;48822:34;;;;;48727:138;-1:-1:-1;;48727:138:0:o;44573:454::-;44617:17;44649:7;44645:44;;-1:-1:-1;;44669:10:0;;;;;;;;;;;;-1:-1:-1;;;44669:10:0;;;;;44573:454::o;44645:44::-;44709:2;44697:9;44743:62;44750:6;;44743:62;;44769:8;;;;:::i;:::-;;-1:-1:-1;44788:7:0;;-1:-1:-1;44793:2:0;44788:7;;:::i;:::-;;;44743:62;;;44813:17;44843:6;44833:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44833:17:0;-1:-1:-1;44890:2:0;;-1:-1:-1;44813:37:0;-1:-1:-1;44871:6:0;44901:92;44908:6;;44901:92;;44957:6;44961:2;44957:1;:6;:::i;:::-;44952:11;;:2;:11;:::i;:::-;44939:26;;44927:4;44932:3;;;:::i;:::-;;;;44927:9;;;;;;;;:::i;:::-;;;;:38;-1:-1:-1;;;;;44927:38:0;;;;;;;;-1:-1:-1;44976:7:0;44981:2;44976:7;;:::i;:::-;;;44901:92;;;-1:-1:-1;45014:4:0;44573:454;-1:-1:-1;;;;44573:454:0:o;56932:715::-;56988:13;57201:10;57197:53;;-1:-1:-1;;57228:10:0;;;;;;;;;;;;-1:-1:-1;;;57228:10:0;;;;;56932:715::o;57197:53::-;57275:5;57260:12;57316:78;57323:9;;57316:78;;57349:8;;;;:::i;:::-;;-1:-1:-1;57372:10:0;;-1:-1:-1;57380:2:0;57372:10;;:::i;:::-;;;57316:78;;;57404:19;57436:6;57426:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57426:17:0;;57404:39;;57454:154;57461:10;;57454:154;;57488:11;57498:1;57488:11;;:::i;:::-;;-1:-1:-1;57557:10:0;57565:2;57557:5;:10;:::i;:::-;57544:24;;:2;:24;:::i;:::-;57531:39;;57514:6;57521;57514:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;57514:56:0;;;;;;;;-1:-1:-1;57585:11:0;57594:2;57585:11;;:::i;:::-;;;57454:154;;58071:1607;58169:11;;58129:13;;58195:8;58191:23;;-1:-1:-1;;58205:9:0;;;;;;;;;-1:-1:-1;58205:9:0;;;58071:1607;-1:-1:-1;58071:1607:0:o;58191:23::-;58266:18;58304:1;58293:7;:3;58299:1;58293:7;:::i;:::-;58292:13;;;;:::i;:::-;58287:19;;:1;:19;:::i;:::-;58266:40;-1:-1:-1;58364:19:0;58396:15;58266:40;58409:2;58396:15;:::i;:::-;58386:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58386:26:0;;58364:48;;58425:18;58446:5;;;;;;;;;;;;;;;;;58425:26;;58515:1;58508:5;58504:13;58560:2;58552:6;58548:15;58611:1;58579:777;58634:3;58631:1;58628:10;58579:777;;;58689:1;58732:12;;;;;58726:19;58827:4;58815:2;58811:14;;;;;58793:40;;58787:47;58936:2;58932:14;;;58928:25;;58914:40;;58908:47;59065:1;59061:13;;;59057:24;;59043:39;;59037:46;59185:16;;;;59171:31;;59165:38;58863:1;58859:11;;;58957:4;58904:58;;;58895:68;58988:11;;59033:57;;;59024:67;;;;59116:11;;59161:49;;59152:59;59240:3;59236:13;59269:22;;59339:1;59324:17;;;;58682:9;58579:777;;;58583:44;59388:1;59383:3;59379:11;59409:1;59404:84;;;;59507:1;59502:82;;;;59372:212;;59404:84;-1:-1:-1;;;;;59437:17:0;;59430:43;59404:84;;59502:82;-1:-1:-1;;;;;59535:17:0;;59528:41;59372:212;-1:-1:-1;;;59600:26:0;;;59607:6;58071:1607;-1:-1:-1;;;;58071:1607:0:o;50778:617::-;50876:5;50894:22;50984:3;50919:62;50950:9;50961:17;50970:7;50961:8;:17::i;50919:62::-;:68;;;;:::i;:::-;50894:93;;50998:11;51046:2;51029:14;:19;51025:128;;;-1:-1:-1;51073:1:0;51025:128;;;51113:2;51096:14;:19;51092:61;;;-1:-1:-1;51140:1:0;51092:61;51177:5;:10;;51186:1;51177:10;51173:55;;;51211:5;-1:-1:-1;51204:12:0;;-1:-1:-1;51204:12:0;51173:55;51317:2;51310:3;51245:62;51276:9;51287:17;51296:7;51287:8;:17::i;51245:62::-;:68;;;;:::i;:::-;51244:75;51240:125;;;51344:9;:5;51352:1;51344:9;:::i;40097:589::-;-1:-1:-1;;;;;40303:18:0;;40299:187;;40338:40;40370:7;41513:10;:17;;41486:24;;;;:15;:24;;;;;:44;;;41541:24;;;;;;;;;;;;41409:164;40338:40;40299:187;;;40408:2;-1:-1:-1;;;;;40400:10:0;:4;-1:-1:-1;;;;;40400:10:0;;40396:90;;40427:47;40460:4;40466:7;40427:32;:47::i;:::-;-1:-1:-1;;;;;40500:16:0;;40496:183;;40533:45;40570:7;40533:36;:45::i;40496:183::-;40606:4;-1:-1:-1;;;;;40600:10:0;:2;-1:-1:-1;;;;;40600:10:0;;40596:83;;40627:40;40655:2;40659:7;40627:27;:40::i;31809:321::-;31939:18;31945:2;31949:7;31939:5;:18::i;:::-;31990:54;32021:1;32025:2;32029:7;32038:5;31990:22;:54::i;:::-;31968:154;;;;-1:-1:-1;;;31968:154:0;;;;;;;:::i;35209:803::-;35364:4;-1:-1:-1;;;;;35385:13:0;;15692:20;15740:8;35381:624;;35421:72;;-1:-1:-1;;;35421:72:0;;-1:-1:-1;;;;;35421:36:0;;;;;:72;;8216:10;;35472:4;;35478:7;;35487:5;;35421:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35421:72:0;;;;;;;;-1:-1:-1;;35421:72:0;;;;;;;;;;;;:::i;:::-;;;35417:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35667:13:0;;35663:272;;35710:60;;-1:-1:-1;;;35710:60:0;;;;;;;:::i;35663:272::-;35885:6;35879:13;35870:6;35866:2;35862:15;35855:38;35417:533;-1:-1:-1;;;;;;35544:55:0;-1:-1:-1;;;35544:55:0;;-1:-1:-1;35537:62:0;;35381:624;-1:-1:-1;35989:4:0;35209:803;;;;;;:::o;42200:988::-;42466:22;42516:1;42491:22;42508:4;42491:16;:22::i;:::-;:26;;;;:::i;:::-;42528:18;42549:26;;;:17;:26;;;;;;42466:51;;-1:-1:-1;42682:28:0;;;42678:328;;-1:-1:-1;;;;;42749:18:0;;42727:19;42749:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42800:30;;;;;;:44;;;42917:30;;:17;:30;;;;;:43;;;42678:328;-1:-1:-1;43102:26:0;;;;:17;:26;;;;;;;;43095:33;;;-1:-1:-1;;;;;43146:18:0;;;;;:12;:18;;;;;:34;;;;;;;43139:41;42200:988::o;43483:1079::-;43761:10;:17;43736:22;;43761:21;;43781:1;;43761:21;:::i;:::-;43793:18;43814:24;;;:15;:24;;;;;;44187:10;:26;;43736:46;;-1:-1:-1;43814:24:0;;43736:46;;44187:26;;;;;;:::i;:::-;;;;;;;;;44165:48;;44251:11;44226:10;44237;44226:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;44331:28;;;:15;:28;;;;;;;:41;;;44503:24;;;;;44496:31;44538:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43554:1008;;;43483:1079;:::o;40987:221::-;41072:14;41089:20;41106:2;41089:16;:20::i;:::-;-1:-1:-1;;;;;41120:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41165:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40987:221:0:o;32466:382::-;-1:-1:-1;;;;;32546:16:0;;32538:61;;;;-1:-1:-1;;;32538:61:0;;24782:2:1;32538:61:0;;;24764:21:1;;;24801:18;;;24794:30;24860:34;24840:18;;;24833:62;24912:18;;32538:61:0;24580:356:1;32538:61:0;30553:4;30577:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30577:16:0;:30;32610:58;;;;-1:-1:-1;;;32610:58:0;;21152:2:1;32610:58:0;;;21134:21:1;21191:2;21171:18;;;21164:30;21230;21210:18;;;21203:58;21278:18;;32610:58:0;20950:352:1;32610:58:0;32681:45;32710:1;32714:2;32718:7;32681:20;:45::i;:::-;-1:-1:-1;;;;;32739:13:0;;;;;;:9;:13;;;;;:18;;32756:1;;32739:13;:18;;32756:1;;32739:18;:::i;:::-;;;;-1:-1:-1;;32768:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32768:21:0;-1:-1:-1;;;;;32768:21:0;;;;;;;;32807:33;;32768:16;;;32807:33;;32768:16;;32807:33;32466:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:347::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2415:5;2408:13;2401:21;2394:5;2391:32;2381:60;;2437:1;2434;2427:12;2381:60;2460:5;2450:15;;;2124:347;;;;;:::o;2476:254::-;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;2644:29;2663:9;2644:29;:::i;:::-;2634:39;2720:2;2705:18;;;;2692:32;;-1:-1:-1;;;2476:254:1:o;2735:245::-;2793:6;2846:2;2834:9;2825:7;2821:23;2817:32;2814:52;;;2862:1;2859;2852:12;2814:52;2901:9;2888:23;2920:30;2944:5;2920:30;:::i;2985:249::-;3054:6;3107:2;3095:9;3086:7;3082:23;3078:32;3075:52;;;3123:1;3120;3113:12;3075:52;3155:9;3149:16;3174:30;3198:5;3174:30;:::i;3239:180::-;3298:6;3351:2;3339:9;3330:7;3326:23;3322:32;3319:52;;;3367:1;3364;3357:12;3319:52;-1:-1:-1;3390:23:1;;3239:180;-1:-1:-1;3239:180:1:o;3424:257::-;3465:3;3503:5;3497:12;3530:6;3525:3;3518:19;3546:63;3602:6;3595:4;3590:3;3586:14;3579:4;3572:5;3568:16;3546:63;:::i;:::-;3663:2;3642:15;-1:-1:-1;;3638:29:1;3629:39;;;;3670:4;3625:50;;3424:257;-1:-1:-1;;3424:257:1:o;3686:185::-;3728:3;3766:5;3760:12;3781:52;3826:6;3821:3;3814:4;3807:5;3803:16;3781:52;:::i;:::-;3849:16;;;;;3686:185;-1:-1:-1;;3686:185:1:o;4651:276::-;4782:3;4820:6;4814:13;4836:53;4882:6;4877:3;4870:4;4862:6;4858:17;4836:53;:::i;:::-;4905:16;;;;;4651:276;-1:-1:-1;;4651:276:1:o;4932:470::-;5111:3;5149:6;5143:13;5165:53;5211:6;5206:3;5199:4;5191:6;5187:17;5165:53;:::i;:::-;5281:13;;5240:16;;;;5303:57;5281:13;5240:16;5337:4;5325:17;;5303:57;:::i;:::-;5376:20;;4932:470;-1:-1:-1;;;;4932:470:1:o;5407:1257::-;5778:3;5816:6;5810:13;5842:4;5855:51;5899:6;5894:3;5889:2;5881:6;5877:15;5855:51;:::i;:::-;5969:13;;5928:16;;;;5991:55;5969:13;5928:16;6013:15;;;5991:55;:::i;:::-;6113:13;;6068:20;;;6135:55;6113:13;6068:20;6157:15;;;6135:55;:::i;:::-;6257:13;;6212:20;;;6279:55;6257:13;6212:20;6301:15;;;6279:55;:::i;:::-;6401:13;;6356:20;;;6423:55;6401:13;6356:20;6445:15;;;6423:55;:::i;:::-;6545:13;;6500:20;;;6567:55;6545:13;6500:20;6589:15;;;6567:55;:::i;:::-;6638:20;;;;;5407:1257;-1:-1:-1;;;;;;;;;5407:1257:1:o;6669:1899::-;7348:3;7386:6;7380:13;7402:53;7448:6;7443:3;7436:4;7428:6;7424:17;7402:53;:::i;:::-;7486:6;7481:3;7477:16;7464:29;;7516:66;7509:5;7502:81;7625:42;7621:2;7617:51;7610:4;7603:5;7599:16;7592:77;7700:6;7694:13;7716:66;7773:8;7768:2;7761:5;7757:14;7750:4;7742:6;7738:17;7716:66;:::i;:::-;7850;7845:2;7801:20;;;;7837:11;;;7830:87;7946:66;7941:2;7933:11;;7926:87;8038:13;;8060:64;8038:13;8109:3;8101:12;;8094:4;8082:17;;8060:64;:::i;:::-;8190:66;8184:3;8143:17;;;;8176:12;;;8169:88;-1:-1:-1;;;8281:3:1;8273:12;;8266:68;8359:13;;8381:64;8359:13;8430:3;8422:12;;8415:4;8403:17;;8381:64;:::i;:::-;-1:-1:-1;;;8505:3:1;8464:17;;;;8497:12;;;8490:44;8558:3;8550:12;;6669:1899;-1:-1:-1;;;;;;6669:1899:1:o;8573:1986::-;9502:3;9540:6;9534:13;9556:53;9602:6;9597:3;9590:4;9582:6;9578:17;9556:53;:::i;:::-;-1:-1:-1;;;9631:16:1;;;9656:30;;;9711:13;;9733:66;9711:13;9785:2;9774:14;;9767:4;9755:17;;9733:66;:::i;:::-;9867;9862:2;9818:20;;;;9854:11;;;9847:87;-1:-1:-1;;;9958:2:1;9950:11;;9943:71;10039:13;;10061:63;10039:13;10110:2;10102:11;;10095:4;10083:17;;10061:63;:::i;:::-;-1:-1:-1;;;10184:2:1;10143:17;;;;10176:11;;;10169:41;-1:-1:-1;;;10234:2:1;10226:11;;10219:51;10295:13;;10317:63;10295:13;10366:2;10358:11;;10351:4;10339:17;;10317:63;:::i;:::-;-1:-1:-1;;;10440:2:1;10399:17;;;;10432:11;;;10425:43;10484:69;10514:38;10548:2;10540:11;;10532:6;10514:38;:::i;:::-;-1:-1:-1;;;4557:55:1;;4637:2;4628:12;;4492:154;10484:69;10477:76;8573:1986;-1:-1:-1;;;;;;;;8573:1986:1:o;10564:1848::-;11273:66;11268:3;11261:79;11370:66;11365:2;11360:3;11356:12;11349:88;11243:3;11466:6;11460:13;11482:60;11535:6;11530:2;11525:3;11521:12;11516:2;11508:6;11504:15;11482:60;:::i;:::-;11596:66;11686:2;11561:16;;;11678:11;;;11671:23;;;-1:-1:-1;;;11718:2:1;11710:11;;11703:65;11793:13;;11815:62;11793:13;11862:3;11854:12;;11849:2;11837:15;;11815:62;:::i;:::-;11943:66;11937:3;11896:17;;;;11929:12;;;11922:88;-1:-1:-1;;;12034:3:1;12026:12;;12019:70;12114:13;;12136:62;12114:13;12183:3;12175:12;;12170:2;12158:15;;12136:62;:::i;:::-;12258:3;12217:17;;12250:12;;;12243:24;-1:-1:-1;;;12291:3:1;12283:12;;12276:75;12367:39;12401:3;12393:12;;12385:6;12367:39;:::i;:::-;12360:46;10564:1848;-1:-1:-1;;;;;;;10564:1848:1:o;12746:1000::-;-1:-1:-1;;;13246:57:1;;13326:13;;13228:3;;13348:62;13326:13;13398:2;13389:12;;13382:4;13370:17;;13348:62;:::i;:::-;-1:-1:-1;;;13469:2:1;13429:16;;;13461:11;;;13454:43;13522:13;;13544:63;13522:13;13593:2;13585:11;;13578:4;13566:17;;13544:63;:::i;:::-;-1:-1:-1;;;13667:2:1;13626:17;;;;13659:11;;;13652:61;13737:2;13729:11;;12746:1000;-1:-1:-1;;;;12746:1000:1:o;13751:2034::-;14710:66;14705:3;14698:79;14807:66;14802:2;14797:3;14793:12;14786:88;14904:66;14899:2;14894:3;14890:12;14883:88;15001:66;14996:2;14991:3;14987:12;14980:88;14680:3;15097:6;15091:13;15113:61;15167:6;15161:3;15156;15152:13;15147:2;15139:6;15135:15;15113:61;:::i;:::-;-1:-1:-1;;;15233:3:1;15193:16;;;15225:12;;;15218:39;15282:13;;15304:62;15282:13;15351:3;15343:12;;15338:2;15326:15;;15304:62;:::i;:::-;-1:-1:-1;;;15426:3:1;15385:17;;;;15418:12;;;15411:38;15474:13;;15496:62;15474:13;15543:3;15535:12;;15530:2;15518:15;;15496:62;:::i;:::-;-1:-1:-1;;;15618:3:1;15577:17;;;;15610:12;;;15603:37;15656:123;15686:92;15712:65;15737:39;15771:3;15763:12;;15755:6;15737:39;:::i;:::-;-1:-1:-1;;;4286:33:1;;4344:2;4335:12;;4226:127;15712:65;15704:6;15686:92;:::i;:::-;-1:-1:-1;;;4423:30:1;;4478:2;4469:12;;4358:129;15790:1993;16600:66;16595:3;16588:79;16570:3;16696:6;16690:13;16712:62;16767:6;16762:2;16757:3;16753:12;16746:4;16738:6;16734:17;16712:62;:::i;:::-;16838:66;16833:2;16793:16;;;16825:11;;;16818:87;16930:13;;16952:63;16930:13;17001:2;16993:11;;16986:4;16974:17;;16952:63;:::i;:::-;17080:66;17075:2;17034:17;;;;17067:11;;;17060:87;17176:34;17171:2;17163:11;;17156:55;17241:34;17235:3;17227:12;;17220:56;17306:34;17300:3;17292:12;;17285:56;17371:34;17365:3;17357:12;;17350:56;17436:34;17430:3;17422:12;;17415:56;17501:34;17495:3;17487:12;;17480:56;17566:66;17560:3;17552:12;;17545:88;17649:128;17679:97;17705:70;17735:39;17769:3;17761:12;;17753:6;17735:39;:::i;:::-;3953:66;3941:79;;-1:-1:-1;;;4045:2:1;4036:12;;4029:28;4082:2;4073:12;;3876:215;17679:97;-1:-1:-1;;;4161:27:1;;4213:1;4204:11;;4096:125;17788:448;18050:31;18045:3;18038:44;18020:3;18111:6;18105:13;18127:62;18182:6;18177:2;18172:3;18168:12;18161:4;18153:6;18149:17;18127:62;:::i;:::-;18209:16;;;;18227:2;18205:25;;17788:448;-1:-1:-1;;17788:448:1:o;18449:488::-;-1:-1:-1;;;;;18718:15:1;;;18700:34;;18770:15;;18765:2;18750:18;;18743:43;18817:2;18802:18;;18795:34;;;18865:3;18860:2;18845:18;;18838:31;;;18643:4;;18886:45;;18911:19;;18903:6;18886:45;:::i;:::-;18878:53;18449:488;-1:-1:-1;;;;;;18449:488:1:o;19134:219::-;19283:2;19272:9;19265:21;19246:4;19303:44;19343:2;19332:9;19328:18;19320:6;19303:44;:::i;20124:414::-;20326:2;20308:21;;;20365:2;20345:18;;;20338:30;20404:34;20399:2;20384:18;;20377:62;-1:-1:-1;;;20470:2:1;20455:18;;20448:48;20528:3;20513:19;;20124:414::o;25354:356::-;25556:2;25538:21;;;25575:18;;;25568:30;25634:34;25629:2;25614:18;;25607:62;25701:2;25686:18;;25354:356::o;25715:340::-;25917:2;25899:21;;;25956:2;25936:18;;;25929:30;-1:-1:-1;;;25990:2:1;25975:18;;25968:46;26046:2;26031:18;;25715:340::o;26872:413::-;27074:2;27056:21;;;27113:2;27093:18;;;27086:30;27152:34;27147:2;27132:18;;27125:62;-1:-1:-1;;;27218:2:1;27203:18;;27196:47;27275:3;27260:19;;26872:413::o;27703:355::-;27905:2;27887:21;;;27944:2;27924:18;;;27917:30;27983:33;27978:2;27963:18;;27956:61;28049:2;28034:18;;27703:355::o;28245:128::-;28285:3;28316:1;28312:6;28309:1;28306:13;28303:39;;;28322:18;;:::i;:::-;-1:-1:-1;28358:9:1;;28245:128::o;28378:204::-;28416:3;28452:4;28449:1;28445:12;28484:4;28481:1;28477:12;28519:3;28513:4;28509:14;28504:3;28501:23;28498:49;;;28527:18;;:::i;:::-;28563:13;;28378:204;-1:-1:-1;;;28378:204:1:o;28587:120::-;28627:1;28653;28643:35;;28658:18;;:::i;:::-;-1:-1:-1;28692:9:1;;28587:120::o;28712:168::-;28752:7;28818:1;28814;28810:6;28806:14;28803:1;28800:21;28795:1;28788:9;28781:17;28777:45;28774:71;;;28825:18;;:::i;:::-;-1:-1:-1;28865:9:1;;28712:168::o;28885:125::-;28925:4;28953:1;28950;28947:8;28944:34;;;28958:18;;:::i;:::-;-1:-1:-1;28995:9:1;;28885:125::o;29015:258::-;29087:1;29097:113;29111:6;29108:1;29105:13;29097:113;;;29187:11;;;29181:18;29168:11;;;29161:39;29133:2;29126:10;29097:113;;;29228:6;29225:1;29222:13;29219:48;;;-1:-1:-1;;29263:1:1;29245:16;;29238:27;29015:258::o;29278:136::-;29317:3;29345:5;29335:39;;29354:18;;:::i;:::-;-1:-1:-1;;;29390:18:1;;29278:136::o;29419:380::-;29498:1;29494:12;;;;29541;;;29562:61;;29616:4;29608:6;29604:17;29594:27;;29562:61;29669:2;29661:6;29658:14;29638:18;29635:38;29632:161;;;29715:10;29710:3;29706:20;29703:1;29696:31;29750:4;29747:1;29740:15;29778:4;29775:1;29768:15;29632:161;;29419:380;;;:::o;29804:135::-;29843:3;-1:-1:-1;;29864:17:1;;29861:43;;;29884:18;;:::i;:::-;-1:-1:-1;29931:1:1;29920:13;;29804:135::o;29944:112::-;29976:1;30002;29992:35;;30007:18;;:::i;:::-;-1:-1:-1;30041:9:1;;29944:112::o;30061:127::-;30122:10;30117:3;30113:20;30110:1;30103:31;30153:4;30150:1;30143:15;30177:4;30174:1;30167:15;30193:127;30254:10;30249:3;30245:20;30242:1;30235:31;30285:4;30282:1;30275:15;30309:4;30306:1;30299:15;30325:127;30386:10;30381:3;30377:20;30374:1;30367:31;30417:4;30414:1;30407:15;30441:4;30438:1;30431:15;30457:127;30518:10;30513:3;30509:20;30506:1;30499:31;30549:4;30546:1;30539:15;30573:4;30570:1;30563:15;30589:127;30650:10;30645:3;30641:20;30638:1;30631:31;30681:4;30678:1;30671:15;30705:4;30702:1;30695:15;30721:131;-1:-1:-1;;;;;;30795:32:1;;30785:43;;30775:71;;30842:1;30839;30832:12

Swarm Source

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