ETH Price: $2,803.13 (+1.33%)

Token

Crypto Mafia City (CMC)
 

Overview

Max Total Supply

322 CMC

Holders

142

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
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:
CryptoMafiaCity

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = '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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, 'Strings: hex length insufficient');
        return string(buffer);
    }
}

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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');

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (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');

        // solhint-disable-next-line avoid-low-level-calls
        (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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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');
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. 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 {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 {}
}

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

contract CryptoMafiaCity is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Address for address;
    using Strings for uint256;

    uint256 public constant NFT_PRICE = 45000000000000000; // 0.045 ETH
    uint public constant MAX_NFT_PURCHASE = 20;
    uint256 public MAX_SUPPLY = 10000;
    bool public saleIsActive = false;

    string private _baseURIExtended;
    mapping(uint256 => string) _tokenURIs;
    mapping(address => bool) minted;
    mapping(address => uint256) purchased;

    modifier mintOnlyOnce() {
        require(!minted[_msgSender()], 'Can only mint once');
        minted[_msgSender()] = true;
        _;
    }

    constructor() ERC721('Crypto Mafia City', 'CMC') {}

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }


    function mintMafia(uint numberOfTokens) public payable {
        require(purchased[msg.sender].add(numberOfTokens) <= MAX_NFT_PURCHASE, 'Can only mint up to 20 per address');
        require(saleIsActive, 'Sale is not active at the moment');
        require(numberOfTokens > 0, "Number of tokens can not be less than or equal to 0");
        require(totalSupply().add(numberOfTokens) <= MAX_SUPPLY, "Purchase would exceed max supply of tokens");
        require(numberOfTokens <= MAX_NFT_PURCHASE,"Can only mint up to 20 per purchase");
        require(NFT_PRICE.mul(numberOfTokens) == msg.value, "Sent ether value is incorrect");
        purchased[msg.sender] = purchased[msg.sender].add(numberOfTokens);
        for (uint i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, totalSupply());
        }
    }
    function reserveTokens(uint256 num) public onlyOwner {
        uint256 supply = totalSupply();
        uint256 i;
        for (i = 0; i < num; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIExtended;
    }

    // Sets base URI for all tokens, only able to be called by contract owner
    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIExtended = baseURI_;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFT_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_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":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintMafia","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"reserveTokens","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600b556000600c60006101000a81548160ff0219169083151502179055503480156200003257600080fd5b506040518060400160405280601181526020017f43727970746f204d6166696120436974790000000000000000000000000000008152506040518060400160405280600381526020017f434d4300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b792919062000192565b508060019080519060200190620000d092919062000192565b5050506000620000e56200018a60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002a7565b600033905090565b828054620001a09062000242565b90600052602060002090601f016020900481019282620001c4576000855562000210565b82601f10620001df57805160ff191683800117855562000210565b8280016001018555821562000210579182015b828111156200020f578251825591602001919060010190620001f2565b5b5090506200021f919062000223565b5090565b5b808211156200023e57600081600090555060010162000224565b5090565b600060028204905060018216806200025b57607f821691505b6020821081141562000272576200027162000278565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61424780620002b76000396000f3fe6080604052600436106101b75760003560e01c80636352211e116100ec578063b88d4fde1161008a578063e985e9c511610064578063e985e9c5146105f8578063eb8d244414610635578063f2fde38b14610660578063fe57869b14610689576101b7565b8063b88d4fde14610569578063c87b56dd14610592578063d031370b146105cf576101b7565b8063715018a6116100c6578063715018a6146104d35780638da5cb5b146104ea57806395d89b4114610515578063a22cb46514610540576101b7565b80636352211e1461042e578063676dd5631461046b57806370a0823114610496576101b7565b80632f745c59116101595780633ccfd60b116101335780633ccfd60b1461038857806342842e0e1461039f5780634f6ccce7146103c857806355f804b314610405576101b7565b80632f745c591461030957806332cb6b0c1461034657806334918dfd14610371576101b7565b8063081812fc11610195578063081812fc1461024f578063095ea7b31461028c57806318160ddd146102b557806323b872dd146102e0576101b7565b806301ffc9a7146101bc578063020b39cc146101f957806306fdde0314610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612db5565b6106a5565b6040516101f09190613328565b60405180910390f35b34801561020557600080fd5b5061020e61071f565b60405161021b9190613665565b60405180910390f35b34801561023057600080fd5b50610239610724565b6040516102469190613343565b60405180910390f35b34801561025b57600080fd5b5061027660048036038101906102719190612e58565b6107b6565b60405161028391906132c1565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190612d75565b61083b565b005b3480156102c157600080fd5b506102ca610953565b6040516102d79190613665565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190612c5f565b610960565b005b34801561031557600080fd5b50610330600480360381019061032b9190612d75565b6109c0565b60405161033d9190613665565b60405180910390f35b34801561035257600080fd5b5061035b610a65565b6040516103689190613665565b60405180910390f35b34801561037d57600080fd5b50610386610a6b565b005b34801561039457600080fd5b5061039d610b13565b005b3480156103ab57600080fd5b506103c660048036038101906103c19190612c5f565b610bde565b005b3480156103d457600080fd5b506103ef60048036038101906103ea9190612e58565b610bfe565b6040516103fc9190613665565b60405180910390f35b34801561041157600080fd5b5061042c60048036038101906104279190612e0f565b610c6f565b005b34801561043a57600080fd5b5061045560048036038101906104509190612e58565b610d05565b60405161046291906132c1565b60405180910390f35b34801561047757600080fd5b50610480610db7565b60405161048d9190613665565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b89190612bf2565b610dc2565b6040516104ca9190613665565b60405180910390f35b3480156104df57600080fd5b506104e8610e7a565b005b3480156104f657600080fd5b506104ff610fb7565b60405161050c91906132c1565b60405180910390f35b34801561052157600080fd5b5061052a610fe1565b6040516105379190613343565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190612d35565b611073565b005b34801561057557600080fd5b50610590600480360381019061058b9190612cb2565b6111f4565b005b34801561059e57600080fd5b506105b960048036038101906105b49190612e58565b611256565b6040516105c69190613343565b60405180910390f35b3480156105db57600080fd5b506105f660048036038101906105f19190612e58565b6113c9565b005b34801561060457600080fd5b5061061f600480360381019061061a9190612c1f565b611489565b60405161062c9190613328565b60405180910390f35b34801561064157600080fd5b5061064a61151d565b6040516106579190613328565b60405180910390f35b34801561066c57600080fd5b5061068760048036038101906106829190612bf2565b611530565b005b6106a3600480360381019061069e9190612e58565b6116dc565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107185750610717826119c8565b5b9050919050565b601481565b60606000805461073390613915565b80601f016020809104026020016040519081016040528092919081815260200182805461075f90613915565b80156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505050905090565b60006107c182611aaa565b610800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f790613565565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061084682610d05565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ae906135e5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108d6611b16565b73ffffffffffffffffffffffffffffffffffffffff1614806109055750610904816108ff611b16565b611489565b5b610944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093b906134a5565b60405180910390fd5b61094e8383611b1e565b505050565b6000600880549050905090565b61097161096b611b16565b82611bd7565b6109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a790613605565b60405180910390fd5b6109bb838383611cb5565b505050565b60006109cb83610dc2565b8210610a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a03906133a5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b610a73611b16565b73ffffffffffffffffffffffffffffffffffffffff16610a91610fb7565b73ffffffffffffffffffffffffffffffffffffffff1614610ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ade90613585565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b610b1b611b16565b73ffffffffffffffffffffffffffffffffffffffff16610b39610fb7565b73ffffffffffffffffffffffffffffffffffffffff1614610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690613585565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610bda573d6000803e3d6000fd5b5050565b610bf9838383604051806020016040528060008152506111f4565b505050565b6000610c08610953565b8210610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4090613625565b60405180910390fd5b60088281548110610c5d57610c5c613aae565b5b90600052602060002001549050919050565b610c77611b16565b73ffffffffffffffffffffffffffffffffffffffff16610c95610fb7565b73ffffffffffffffffffffffffffffffffffffffff1614610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce290613585565b60405180910390fd5b80600d9080519060200190610d01929190612a06565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5906134e5565b60405180910390fd5b80915050919050565b669fdf42f6e4800081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2a906134c5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e82611b16565b73ffffffffffffffffffffffffffffffffffffffff16610ea0610fb7565b73ffffffffffffffffffffffffffffffffffffffff1614610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed90613585565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ff090613915565b80601f016020809104026020016040519081016040528092919081815260200182805461101c90613915565b80156110695780601f1061103e57610100808354040283529160200191611069565b820191906000526020600020905b81548152906001019060200180831161104c57829003601f168201915b5050505050905090565b61107b611b16565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090613445565b60405180910390fd5b80600560006110f6611b16565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111a3611b16565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111e89190613328565b60405180910390a35050565b6112056111ff611b16565b83611bd7565b611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90613605565b60405180910390fd5b61125084848484611f11565b50505050565b606061126182611aaa565b6112a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611297906135c5565b60405180910390fd5b6000600e600084815260200190815260200160002080546112c090613915565b80601f01602080910402602001604051908101604052809291908181526020018280546112ec90613915565b80156113395780601f1061130e57610100808354040283529160200191611339565b820191906000526020600020905b81548152906001019060200180831161131c57829003601f168201915b50505050509050600061134a611f6d565b90506000815114156113605781925050506113c4565b60008251111561139557808260405160200161137d92919061329d565b604051602081830303815290604052925050506113c4565b8061139f85611fff565b6040516020016113b092919061329d565b604051602081830303815290604052925050505b919050565b6113d1611b16565b73ffffffffffffffffffffffffffffffffffffffff166113ef610fb7565b73ffffffffffffffffffffffffffffffffffffffff1614611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90613585565b60405180910390fd5b600061144f610953565b905060005b828110156114845761147133828461146c919061374a565b612160565b808061147c90613978565b915050611454565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611538611b16565b73ffffffffffffffffffffffffffffffffffffffff16611556610fb7565b73ffffffffffffffffffffffffffffffffffffffff16146115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a390613585565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611613906133e5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601461173082601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461217e90919063ffffffff16565b1115611771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176890613365565b60405180910390fd5b600c60009054906101000a900460ff166117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b790613645565b60405180910390fd5b60008111611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa90613385565b60405180910390fd5b600b5461182082611812610953565b61217e90919063ffffffff16565b1115611861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185890613505565b60405180910390fd5b60148111156118a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189c90613485565b60405180910390fd5b346118c082669fdf42f6e4800061219490919063ffffffff16565b14611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f790613525565b60405180910390fd5b61195281601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461217e90919063ffffffff16565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b818110156119c4576119b1336119ac610953565b612160565b80806119bc90613978565b915050611998565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a9357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611aa35750611aa2826121aa565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b9183610d05565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611be282611aaa565b611c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1890613465565b60405180910390fd5b6000611c2c83610d05565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c9b57508373ffffffffffffffffffffffffffffffffffffffff16611c83846107b6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cac5750611cab8185611489565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cd582610d05565b73ffffffffffffffffffffffffffffffffffffffff1614611d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d22906135a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9290613425565b60405180910390fd5b611da6838383612214565b611db1600082611b1e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e01919061382b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e58919061374a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611f1c848484611cb5565b611f2884848484612328565b611f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5e906133c5565b60405180910390fd5b50505050565b6060600d8054611f7c90613915565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa890613915565b8015611ff55780601f10611fca57610100808354040283529160200191611ff5565b820191906000526020600020905b815481529060010190602001808311611fd857829003601f168201915b5050505050905090565b60606000821415612047576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061215b565b600082905060005b6000821461207957808061206290613978565b915050600a8261207291906137a0565b915061204f565b60008167ffffffffffffffff81111561209557612094613add565b5b6040519080825280601f01601f1916602001820160405280156120c75781602001600182028036833780820191505090505b5090505b60008514612154576001826120e0919061382b565b9150600a856120ef91906139c1565b60306120fb919061374a565b60f81b81838151811061211157612110613aae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561214d91906137a0565b94506120cb565b8093505050505b919050565b61217a8282604051806020016040528060008152506124bf565b5050565b6000818361218c919061374a565b905092915050565b600081836121a291906137d1565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61221f83838361251a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122625761225d8161251f565b6122a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122a05761229f8382612568565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122e4576122df816126d5565b612323565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123225761232182826127a6565b5b5b505050565b60006123498473ffffffffffffffffffffffffffffffffffffffff16612825565b156124b2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612372611b16565b8786866040518563ffffffff1660e01b815260040161239494939291906132dc565b602060405180830381600087803b1580156123ae57600080fd5b505af19250505080156123df57506040513d601f19601f820116820180604052508101906123dc9190612de2565b60015b612462573d806000811461240f576040519150601f19603f3d011682016040523d82523d6000602084013e612414565b606091505b5060008151141561245a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612451906133c5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124b7565b600190505b949350505050565b6124c98383612838565b6124d66000848484612328565b612515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250c906133c5565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161257584610dc2565b61257f919061382b565b9050600060076000848152602001908152602001600020549050818114612664576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126e9919061382b565b905060006009600084815260200190815260200160002054905060006008838154811061271957612718613aae565b5b90600052602060002001549050806008838154811061273b5761273a613aae565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061278a57612789613a7f565b5b6001900381819060005260206000200160009055905550505050565b60006127b183610dc2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289f90613545565b60405180910390fd5b6128b181611aaa565b156128f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e890613405565b60405180910390fd5b6128fd60008383612214565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461294d919061374a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612a1290613915565b90600052602060002090601f016020900481019282612a345760008555612a7b565b82601f10612a4d57805160ff1916838001178555612a7b565b82800160010185558215612a7b579182015b82811115612a7a578251825591602001919060010190612a5f565b5b509050612a889190612a8c565b5090565b5b80821115612aa5576000816000905550600101612a8d565b5090565b6000612abc612ab7846136a5565b613680565b905082815260208101848484011115612ad857612ad7613b11565b5b612ae38482856138d3565b509392505050565b6000612afe612af9846136d6565b613680565b905082815260208101848484011115612b1a57612b19613b11565b5b612b258482856138d3565b509392505050565b600081359050612b3c816141b5565b92915050565b600081359050612b51816141cc565b92915050565b600081359050612b66816141e3565b92915050565b600081519050612b7b816141e3565b92915050565b600082601f830112612b9657612b95613b0c565b5b8135612ba6848260208601612aa9565b91505092915050565b600082601f830112612bc457612bc3613b0c565b5b8135612bd4848260208601612aeb565b91505092915050565b600081359050612bec816141fa565b92915050565b600060208284031215612c0857612c07613b1b565b5b6000612c1684828501612b2d565b91505092915050565b60008060408385031215612c3657612c35613b1b565b5b6000612c4485828601612b2d565b9250506020612c5585828601612b2d565b9150509250929050565b600080600060608486031215612c7857612c77613b1b565b5b6000612c8686828701612b2d565b9350506020612c9786828701612b2d565b9250506040612ca886828701612bdd565b9150509250925092565b60008060008060808587031215612ccc57612ccb613b1b565b5b6000612cda87828801612b2d565b9450506020612ceb87828801612b2d565b9350506040612cfc87828801612bdd565b925050606085013567ffffffffffffffff811115612d1d57612d1c613b16565b5b612d2987828801612b81565b91505092959194509250565b60008060408385031215612d4c57612d4b613b1b565b5b6000612d5a85828601612b2d565b9250506020612d6b85828601612b42565b9150509250929050565b60008060408385031215612d8c57612d8b613b1b565b5b6000612d9a85828601612b2d565b9250506020612dab85828601612bdd565b9150509250929050565b600060208284031215612dcb57612dca613b1b565b5b6000612dd984828501612b57565b91505092915050565b600060208284031215612df857612df7613b1b565b5b6000612e0684828501612b6c565b91505092915050565b600060208284031215612e2557612e24613b1b565b5b600082013567ffffffffffffffff811115612e4357612e42613b16565b5b612e4f84828501612baf565b91505092915050565b600060208284031215612e6e57612e6d613b1b565b5b6000612e7c84828501612bdd565b91505092915050565b612e8e8161385f565b82525050565b612e9d81613871565b82525050565b6000612eae82613707565b612eb8818561371d565b9350612ec88185602086016138e2565b612ed181613b20565b840191505092915050565b6000612ee782613712565b612ef1818561372e565b9350612f018185602086016138e2565b612f0a81613b20565b840191505092915050565b6000612f2082613712565b612f2a818561373f565b9350612f3a8185602086016138e2565b80840191505092915050565b6000612f5360228361372e565b9150612f5e82613b31565b604082019050919050565b6000612f7660338361372e565b9150612f8182613b80565b604082019050919050565b6000612f99602b8361372e565b9150612fa482613bcf565b604082019050919050565b6000612fbc60328361372e565b9150612fc782613c1e565b604082019050919050565b6000612fdf60268361372e565b9150612fea82613c6d565b604082019050919050565b6000613002601c8361372e565b915061300d82613cbc565b602082019050919050565b600061302560248361372e565b915061303082613ce5565b604082019050919050565b600061304860198361372e565b915061305382613d34565b602082019050919050565b600061306b602c8361372e565b915061307682613d5d565b604082019050919050565b600061308e60238361372e565b915061309982613dac565b604082019050919050565b60006130b160388361372e565b91506130bc82613dfb565b604082019050919050565b60006130d4602a8361372e565b91506130df82613e4a565b604082019050919050565b60006130f760298361372e565b915061310282613e99565b604082019050919050565b600061311a602a8361372e565b915061312582613ee8565b604082019050919050565b600061313d601d8361372e565b915061314882613f37565b602082019050919050565b600061316060208361372e565b915061316b82613f60565b602082019050919050565b6000613183602c8361372e565b915061318e82613f89565b604082019050919050565b60006131a660208361372e565b91506131b182613fd8565b602082019050919050565b60006131c960298361372e565b91506131d482614001565b604082019050919050565b60006131ec602f8361372e565b91506131f782614050565b604082019050919050565b600061320f60218361372e565b915061321a8261409f565b604082019050919050565b600061323260318361372e565b915061323d826140ee565b604082019050919050565b6000613255602c8361372e565b91506132608261413d565b604082019050919050565b600061327860208361372e565b91506132838261418c565b602082019050919050565b613297816138c9565b82525050565b60006132a98285612f15565b91506132b58284612f15565b91508190509392505050565b60006020820190506132d66000830184612e85565b92915050565b60006080820190506132f16000830187612e85565b6132fe6020830186612e85565b61330b604083018561328e565b818103606083015261331d8184612ea3565b905095945050505050565b600060208201905061333d6000830184612e94565b92915050565b6000602082019050818103600083015261335d8184612edc565b905092915050565b6000602082019050818103600083015261337e81612f46565b9050919050565b6000602082019050818103600083015261339e81612f69565b9050919050565b600060208201905081810360008301526133be81612f8c565b9050919050565b600060208201905081810360008301526133de81612faf565b9050919050565b600060208201905081810360008301526133fe81612fd2565b9050919050565b6000602082019050818103600083015261341e81612ff5565b9050919050565b6000602082019050818103600083015261343e81613018565b9050919050565b6000602082019050818103600083015261345e8161303b565b9050919050565b6000602082019050818103600083015261347e8161305e565b9050919050565b6000602082019050818103600083015261349e81613081565b9050919050565b600060208201905081810360008301526134be816130a4565b9050919050565b600060208201905081810360008301526134de816130c7565b9050919050565b600060208201905081810360008301526134fe816130ea565b9050919050565b6000602082019050818103600083015261351e8161310d565b9050919050565b6000602082019050818103600083015261353e81613130565b9050919050565b6000602082019050818103600083015261355e81613153565b9050919050565b6000602082019050818103600083015261357e81613176565b9050919050565b6000602082019050818103600083015261359e81613199565b9050919050565b600060208201905081810360008301526135be816131bc565b9050919050565b600060208201905081810360008301526135de816131df565b9050919050565b600060208201905081810360008301526135fe81613202565b9050919050565b6000602082019050818103600083015261361e81613225565b9050919050565b6000602082019050818103600083015261363e81613248565b9050919050565b6000602082019050818103600083015261365e8161326b565b9050919050565b600060208201905061367a600083018461328e565b92915050565b600061368a61369b565b90506136968282613947565b919050565b6000604051905090565b600067ffffffffffffffff8211156136c0576136bf613add565b5b6136c982613b20565b9050602081019050919050565b600067ffffffffffffffff8211156136f1576136f0613add565b5b6136fa82613b20565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613755826138c9565b9150613760836138c9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613795576137946139f2565b5b828201905092915050565b60006137ab826138c9565b91506137b6836138c9565b9250826137c6576137c5613a21565b5b828204905092915050565b60006137dc826138c9565b91506137e7836138c9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138205761381f6139f2565b5b828202905092915050565b6000613836826138c9565b9150613841836138c9565b925082821015613854576138536139f2565b5b828203905092915050565b600061386a826138a9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156139005780820151818401526020810190506138e5565b8381111561390f576000848401525b50505050565b6000600282049050600182168061392d57607f821691505b6020821081141561394157613940613a50565b5b50919050565b61395082613b20565b810181811067ffffffffffffffff8211171561396f5761396e613add565b5b80604052505050565b6000613983826138c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139b6576139b56139f2565b5b600182019050919050565b60006139cc826138c9565b91506139d7836138c9565b9250826139e7576139e6613a21565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f43616e206f6e6c79206d696e7420757020746f2032302070657220616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008201527f207468616e206f7220657175616c20746f203000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420757020746f2032302070657220707572636860008201527f6173650000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f53656e742065746865722076616c756520697320696e636f7272656374000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b6141be8161385f565b81146141c957600080fd5b50565b6141d581613871565b81146141e057600080fd5b50565b6141ec8161387d565b81146141f757600080fd5b50565b614203816138c9565b811461420e57600080fd5b5056fea26469706673582212207bda4a9bfd7fef62228f2ee8855993eb04ec16f8e938ee0094eee7d44da3ed4464736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101b75760003560e01c80636352211e116100ec578063b88d4fde1161008a578063e985e9c511610064578063e985e9c5146105f8578063eb8d244414610635578063f2fde38b14610660578063fe57869b14610689576101b7565b8063b88d4fde14610569578063c87b56dd14610592578063d031370b146105cf576101b7565b8063715018a6116100c6578063715018a6146104d35780638da5cb5b146104ea57806395d89b4114610515578063a22cb46514610540576101b7565b80636352211e1461042e578063676dd5631461046b57806370a0823114610496576101b7565b80632f745c59116101595780633ccfd60b116101335780633ccfd60b1461038857806342842e0e1461039f5780634f6ccce7146103c857806355f804b314610405576101b7565b80632f745c591461030957806332cb6b0c1461034657806334918dfd14610371576101b7565b8063081812fc11610195578063081812fc1461024f578063095ea7b31461028c57806318160ddd146102b557806323b872dd146102e0576101b7565b806301ffc9a7146101bc578063020b39cc146101f957806306fdde0314610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612db5565b6106a5565b6040516101f09190613328565b60405180910390f35b34801561020557600080fd5b5061020e61071f565b60405161021b9190613665565b60405180910390f35b34801561023057600080fd5b50610239610724565b6040516102469190613343565b60405180910390f35b34801561025b57600080fd5b5061027660048036038101906102719190612e58565b6107b6565b60405161028391906132c1565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190612d75565b61083b565b005b3480156102c157600080fd5b506102ca610953565b6040516102d79190613665565b60405180910390f35b3480156102ec57600080fd5b5061030760048036038101906103029190612c5f565b610960565b005b34801561031557600080fd5b50610330600480360381019061032b9190612d75565b6109c0565b60405161033d9190613665565b60405180910390f35b34801561035257600080fd5b5061035b610a65565b6040516103689190613665565b60405180910390f35b34801561037d57600080fd5b50610386610a6b565b005b34801561039457600080fd5b5061039d610b13565b005b3480156103ab57600080fd5b506103c660048036038101906103c19190612c5f565b610bde565b005b3480156103d457600080fd5b506103ef60048036038101906103ea9190612e58565b610bfe565b6040516103fc9190613665565b60405180910390f35b34801561041157600080fd5b5061042c60048036038101906104279190612e0f565b610c6f565b005b34801561043a57600080fd5b5061045560048036038101906104509190612e58565b610d05565b60405161046291906132c1565b60405180910390f35b34801561047757600080fd5b50610480610db7565b60405161048d9190613665565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b89190612bf2565b610dc2565b6040516104ca9190613665565b60405180910390f35b3480156104df57600080fd5b506104e8610e7a565b005b3480156104f657600080fd5b506104ff610fb7565b60405161050c91906132c1565b60405180910390f35b34801561052157600080fd5b5061052a610fe1565b6040516105379190613343565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190612d35565b611073565b005b34801561057557600080fd5b50610590600480360381019061058b9190612cb2565b6111f4565b005b34801561059e57600080fd5b506105b960048036038101906105b49190612e58565b611256565b6040516105c69190613343565b60405180910390f35b3480156105db57600080fd5b506105f660048036038101906105f19190612e58565b6113c9565b005b34801561060457600080fd5b5061061f600480360381019061061a9190612c1f565b611489565b60405161062c9190613328565b60405180910390f35b34801561064157600080fd5b5061064a61151d565b6040516106579190613328565b60405180910390f35b34801561066c57600080fd5b5061068760048036038101906106829190612bf2565b611530565b005b6106a3600480360381019061069e9190612e58565b6116dc565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107185750610717826119c8565b5b9050919050565b601481565b60606000805461073390613915565b80601f016020809104026020016040519081016040528092919081815260200182805461075f90613915565b80156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505050905090565b60006107c182611aaa565b610800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f790613565565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061084682610d05565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ae906135e5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108d6611b16565b73ffffffffffffffffffffffffffffffffffffffff1614806109055750610904816108ff611b16565b611489565b5b610944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093b906134a5565b60405180910390fd5b61094e8383611b1e565b505050565b6000600880549050905090565b61097161096b611b16565b82611bd7565b6109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a790613605565b60405180910390fd5b6109bb838383611cb5565b505050565b60006109cb83610dc2565b8210610a0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a03906133a5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b610a73611b16565b73ffffffffffffffffffffffffffffffffffffffff16610a91610fb7565b73ffffffffffffffffffffffffffffffffffffffff1614610ae7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ade90613585565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b610b1b611b16565b73ffffffffffffffffffffffffffffffffffffffff16610b39610fb7565b73ffffffffffffffffffffffffffffffffffffffff1614610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690613585565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610bda573d6000803e3d6000fd5b5050565b610bf9838383604051806020016040528060008152506111f4565b505050565b6000610c08610953565b8210610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4090613625565b60405180910390fd5b60088281548110610c5d57610c5c613aae565b5b90600052602060002001549050919050565b610c77611b16565b73ffffffffffffffffffffffffffffffffffffffff16610c95610fb7565b73ffffffffffffffffffffffffffffffffffffffff1614610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce290613585565b60405180910390fd5b80600d9080519060200190610d01929190612a06565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da5906134e5565b60405180910390fd5b80915050919050565b669fdf42f6e4800081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2a906134c5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e82611b16565b73ffffffffffffffffffffffffffffffffffffffff16610ea0610fb7565b73ffffffffffffffffffffffffffffffffffffffff1614610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed90613585565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610ff090613915565b80601f016020809104026020016040519081016040528092919081815260200182805461101c90613915565b80156110695780601f1061103e57610100808354040283529160200191611069565b820191906000526020600020905b81548152906001019060200180831161104c57829003601f168201915b5050505050905090565b61107b611b16565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090613445565b60405180910390fd5b80600560006110f6611b16565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111a3611b16565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111e89190613328565b60405180910390a35050565b6112056111ff611b16565b83611bd7565b611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90613605565b60405180910390fd5b61125084848484611f11565b50505050565b606061126182611aaa565b6112a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611297906135c5565b60405180910390fd5b6000600e600084815260200190815260200160002080546112c090613915565b80601f01602080910402602001604051908101604052809291908181526020018280546112ec90613915565b80156113395780601f1061130e57610100808354040283529160200191611339565b820191906000526020600020905b81548152906001019060200180831161131c57829003601f168201915b50505050509050600061134a611f6d565b90506000815114156113605781925050506113c4565b60008251111561139557808260405160200161137d92919061329d565b604051602081830303815290604052925050506113c4565b8061139f85611fff565b6040516020016113b092919061329d565b604051602081830303815290604052925050505b919050565b6113d1611b16565b73ffffffffffffffffffffffffffffffffffffffff166113ef610fb7565b73ffffffffffffffffffffffffffffffffffffffff1614611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90613585565b60405180910390fd5b600061144f610953565b905060005b828110156114845761147133828461146c919061374a565b612160565b808061147c90613978565b915050611454565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611538611b16565b73ffffffffffffffffffffffffffffffffffffffff16611556610fb7565b73ffffffffffffffffffffffffffffffffffffffff16146115ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a390613585565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561161c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611613906133e5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601461173082601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461217e90919063ffffffff16565b1115611771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176890613365565b60405180910390fd5b600c60009054906101000a900460ff166117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b790613645565b60405180910390fd5b60008111611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa90613385565b60405180910390fd5b600b5461182082611812610953565b61217e90919063ffffffff16565b1115611861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185890613505565b60405180910390fd5b60148111156118a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189c90613485565b60405180910390fd5b346118c082669fdf42f6e4800061219490919063ffffffff16565b14611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f790613525565b60405180910390fd5b61195281601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461217e90919063ffffffff16565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b818110156119c4576119b1336119ac610953565b612160565b80806119bc90613978565b915050611998565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a9357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611aa35750611aa2826121aa565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b9183610d05565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611be282611aaa565b611c21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1890613465565b60405180910390fd5b6000611c2c83610d05565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c9b57508373ffffffffffffffffffffffffffffffffffffffff16611c83846107b6565b73ffffffffffffffffffffffffffffffffffffffff16145b80611cac5750611cab8185611489565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cd582610d05565b73ffffffffffffffffffffffffffffffffffffffff1614611d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d22906135a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9290613425565b60405180910390fd5b611da6838383612214565b611db1600082611b1e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e01919061382b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e58919061374a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611f1c848484611cb5565b611f2884848484612328565b611f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5e906133c5565b60405180910390fd5b50505050565b6060600d8054611f7c90613915565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa890613915565b8015611ff55780601f10611fca57610100808354040283529160200191611ff5565b820191906000526020600020905b815481529060010190602001808311611fd857829003601f168201915b5050505050905090565b60606000821415612047576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061215b565b600082905060005b6000821461207957808061206290613978565b915050600a8261207291906137a0565b915061204f565b60008167ffffffffffffffff81111561209557612094613add565b5b6040519080825280601f01601f1916602001820160405280156120c75781602001600182028036833780820191505090505b5090505b60008514612154576001826120e0919061382b565b9150600a856120ef91906139c1565b60306120fb919061374a565b60f81b81838151811061211157612110613aae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561214d91906137a0565b94506120cb565b8093505050505b919050565b61217a8282604051806020016040528060008152506124bf565b5050565b6000818361218c919061374a565b905092915050565b600081836121a291906137d1565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61221f83838361251a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122625761225d8161251f565b6122a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146122a05761229f8382612568565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122e4576122df816126d5565b612323565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123225761232182826127a6565b5b5b505050565b60006123498473ffffffffffffffffffffffffffffffffffffffff16612825565b156124b2578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612372611b16565b8786866040518563ffffffff1660e01b815260040161239494939291906132dc565b602060405180830381600087803b1580156123ae57600080fd5b505af19250505080156123df57506040513d601f19601f820116820180604052508101906123dc9190612de2565b60015b612462573d806000811461240f576040519150601f19603f3d011682016040523d82523d6000602084013e612414565b606091505b5060008151141561245a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612451906133c5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124b7565b600190505b949350505050565b6124c98383612838565b6124d66000848484612328565b612515576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250c906133c5565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161257584610dc2565b61257f919061382b565b9050600060076000848152602001908152602001600020549050818114612664576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126e9919061382b565b905060006009600084815260200190815260200160002054905060006008838154811061271957612718613aae565b5b90600052602060002001549050806008838154811061273b5761273a613aae565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061278a57612789613a7f565b5b6001900381819060005260206000200160009055905550505050565b60006127b183610dc2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289f90613545565b60405180910390fd5b6128b181611aaa565b156128f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e890613405565b60405180910390fd5b6128fd60008383612214565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461294d919061374a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612a1290613915565b90600052602060002090601f016020900481019282612a345760008555612a7b565b82601f10612a4d57805160ff1916838001178555612a7b565b82800160010185558215612a7b579182015b82811115612a7a578251825591602001919060010190612a5f565b5b509050612a889190612a8c565b5090565b5b80821115612aa5576000816000905550600101612a8d565b5090565b6000612abc612ab7846136a5565b613680565b905082815260208101848484011115612ad857612ad7613b11565b5b612ae38482856138d3565b509392505050565b6000612afe612af9846136d6565b613680565b905082815260208101848484011115612b1a57612b19613b11565b5b612b258482856138d3565b509392505050565b600081359050612b3c816141b5565b92915050565b600081359050612b51816141cc565b92915050565b600081359050612b66816141e3565b92915050565b600081519050612b7b816141e3565b92915050565b600082601f830112612b9657612b95613b0c565b5b8135612ba6848260208601612aa9565b91505092915050565b600082601f830112612bc457612bc3613b0c565b5b8135612bd4848260208601612aeb565b91505092915050565b600081359050612bec816141fa565b92915050565b600060208284031215612c0857612c07613b1b565b5b6000612c1684828501612b2d565b91505092915050565b60008060408385031215612c3657612c35613b1b565b5b6000612c4485828601612b2d565b9250506020612c5585828601612b2d565b9150509250929050565b600080600060608486031215612c7857612c77613b1b565b5b6000612c8686828701612b2d565b9350506020612c9786828701612b2d565b9250506040612ca886828701612bdd565b9150509250925092565b60008060008060808587031215612ccc57612ccb613b1b565b5b6000612cda87828801612b2d565b9450506020612ceb87828801612b2d565b9350506040612cfc87828801612bdd565b925050606085013567ffffffffffffffff811115612d1d57612d1c613b16565b5b612d2987828801612b81565b91505092959194509250565b60008060408385031215612d4c57612d4b613b1b565b5b6000612d5a85828601612b2d565b9250506020612d6b85828601612b42565b9150509250929050565b60008060408385031215612d8c57612d8b613b1b565b5b6000612d9a85828601612b2d565b9250506020612dab85828601612bdd565b9150509250929050565b600060208284031215612dcb57612dca613b1b565b5b6000612dd984828501612b57565b91505092915050565b600060208284031215612df857612df7613b1b565b5b6000612e0684828501612b6c565b91505092915050565b600060208284031215612e2557612e24613b1b565b5b600082013567ffffffffffffffff811115612e4357612e42613b16565b5b612e4f84828501612baf565b91505092915050565b600060208284031215612e6e57612e6d613b1b565b5b6000612e7c84828501612bdd565b91505092915050565b612e8e8161385f565b82525050565b612e9d81613871565b82525050565b6000612eae82613707565b612eb8818561371d565b9350612ec88185602086016138e2565b612ed181613b20565b840191505092915050565b6000612ee782613712565b612ef1818561372e565b9350612f018185602086016138e2565b612f0a81613b20565b840191505092915050565b6000612f2082613712565b612f2a818561373f565b9350612f3a8185602086016138e2565b80840191505092915050565b6000612f5360228361372e565b9150612f5e82613b31565b604082019050919050565b6000612f7660338361372e565b9150612f8182613b80565b604082019050919050565b6000612f99602b8361372e565b9150612fa482613bcf565b604082019050919050565b6000612fbc60328361372e565b9150612fc782613c1e565b604082019050919050565b6000612fdf60268361372e565b9150612fea82613c6d565b604082019050919050565b6000613002601c8361372e565b915061300d82613cbc565b602082019050919050565b600061302560248361372e565b915061303082613ce5565b604082019050919050565b600061304860198361372e565b915061305382613d34565b602082019050919050565b600061306b602c8361372e565b915061307682613d5d565b604082019050919050565b600061308e60238361372e565b915061309982613dac565b604082019050919050565b60006130b160388361372e565b91506130bc82613dfb565b604082019050919050565b60006130d4602a8361372e565b91506130df82613e4a565b604082019050919050565b60006130f760298361372e565b915061310282613e99565b604082019050919050565b600061311a602a8361372e565b915061312582613ee8565b604082019050919050565b600061313d601d8361372e565b915061314882613f37565b602082019050919050565b600061316060208361372e565b915061316b82613f60565b602082019050919050565b6000613183602c8361372e565b915061318e82613f89565b604082019050919050565b60006131a660208361372e565b91506131b182613fd8565b602082019050919050565b60006131c960298361372e565b91506131d482614001565b604082019050919050565b60006131ec602f8361372e565b91506131f782614050565b604082019050919050565b600061320f60218361372e565b915061321a8261409f565b604082019050919050565b600061323260318361372e565b915061323d826140ee565b604082019050919050565b6000613255602c8361372e565b91506132608261413d565b604082019050919050565b600061327860208361372e565b91506132838261418c565b602082019050919050565b613297816138c9565b82525050565b60006132a98285612f15565b91506132b58284612f15565b91508190509392505050565b60006020820190506132d66000830184612e85565b92915050565b60006080820190506132f16000830187612e85565b6132fe6020830186612e85565b61330b604083018561328e565b818103606083015261331d8184612ea3565b905095945050505050565b600060208201905061333d6000830184612e94565b92915050565b6000602082019050818103600083015261335d8184612edc565b905092915050565b6000602082019050818103600083015261337e81612f46565b9050919050565b6000602082019050818103600083015261339e81612f69565b9050919050565b600060208201905081810360008301526133be81612f8c565b9050919050565b600060208201905081810360008301526133de81612faf565b9050919050565b600060208201905081810360008301526133fe81612fd2565b9050919050565b6000602082019050818103600083015261341e81612ff5565b9050919050565b6000602082019050818103600083015261343e81613018565b9050919050565b6000602082019050818103600083015261345e8161303b565b9050919050565b6000602082019050818103600083015261347e8161305e565b9050919050565b6000602082019050818103600083015261349e81613081565b9050919050565b600060208201905081810360008301526134be816130a4565b9050919050565b600060208201905081810360008301526134de816130c7565b9050919050565b600060208201905081810360008301526134fe816130ea565b9050919050565b6000602082019050818103600083015261351e8161310d565b9050919050565b6000602082019050818103600083015261353e81613130565b9050919050565b6000602082019050818103600083015261355e81613153565b9050919050565b6000602082019050818103600083015261357e81613176565b9050919050565b6000602082019050818103600083015261359e81613199565b9050919050565b600060208201905081810360008301526135be816131bc565b9050919050565b600060208201905081810360008301526135de816131df565b9050919050565b600060208201905081810360008301526135fe81613202565b9050919050565b6000602082019050818103600083015261361e81613225565b9050919050565b6000602082019050818103600083015261363e81613248565b9050919050565b6000602082019050818103600083015261365e8161326b565b9050919050565b600060208201905061367a600083018461328e565b92915050565b600061368a61369b565b90506136968282613947565b919050565b6000604051905090565b600067ffffffffffffffff8211156136c0576136bf613add565b5b6136c982613b20565b9050602081019050919050565b600067ffffffffffffffff8211156136f1576136f0613add565b5b6136fa82613b20565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613755826138c9565b9150613760836138c9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613795576137946139f2565b5b828201905092915050565b60006137ab826138c9565b91506137b6836138c9565b9250826137c6576137c5613a21565b5b828204905092915050565b60006137dc826138c9565b91506137e7836138c9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138205761381f6139f2565b5b828202905092915050565b6000613836826138c9565b9150613841836138c9565b925082821015613854576138536139f2565b5b828203905092915050565b600061386a826138a9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156139005780820151818401526020810190506138e5565b8381111561390f576000848401525b50505050565b6000600282049050600182168061392d57607f821691505b6020821081141561394157613940613a50565b5b50919050565b61395082613b20565b810181811067ffffffffffffffff8211171561396f5761396e613add565b5b80604052505050565b6000613983826138c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139b6576139b56139f2565b5b600182019050919050565b60006139cc826138c9565b91506139d7836138c9565b9250826139e7576139e6613a21565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f43616e206f6e6c79206d696e7420757020746f2032302070657220616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008201527f207468616e206f7220657175616c20746f203000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43616e206f6e6c79206d696e7420757020746f2032302070657220707572636860008201527f6173650000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f53656e742065746865722076616c756520697320696e636f7272656374000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b6141be8161385f565b81146141c957600080fd5b50565b6141d581613871565b81146141e057600080fd5b50565b6141ec8161387d565b81146141f757600080fd5b50565b614203816138c9565b811461420e57600080fd5b5056fea26469706673582212207bda4a9bfd7fef62228f2ee8855993eb04ec16f8e938ee0094eee7d44da3ed4464736f6c63430008070033

Deployed Bytecode Sourcemap

49748:3174:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43573:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49981:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31551:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32999:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32522:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44213:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33889:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43881:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50030:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50489:89;;;;;;;;;;;;;:::i;:::-;;50586:143;;;;;;;;;;;;;:::i;:::-;;34299:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44403:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52009:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31245:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49908:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30975:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28798:148;;;;;;;;;;;;;:::i;:::-;;28147:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31720:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33292:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34555:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52126:793;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51579:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33658:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50070:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29101:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50739:834;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43573:224;43675:4;43714:35;43699:50;;;:11;:50;;;;:90;;;;43753:36;43777:11;43753:23;:36::i;:::-;43699:90;43692:97;;43573:224;;;:::o;49981:42::-;50021:2;49981:42;:::o;31551:100::-;31605:13;31638:5;31631:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31551:100;:::o;32999:221::-;33075:7;33103:16;33111:7;33103;:16::i;:::-;33095:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33188:15;:24;33204:7;33188:24;;;;;;;;;;;;;;;;;;;;;33181:31;;32999:221;;;:::o;32522:411::-;32603:13;32619:23;32634:7;32619:14;:23::i;:::-;32603:39;;32667:5;32661:11;;:2;:11;;;;32653:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32761:5;32745:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32770:37;32787:5;32794:12;:10;:12::i;:::-;32770:16;:37::i;:::-;32745:62;32723:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;32904:21;32913:2;32917:7;32904:8;:21::i;:::-;32592:341;32522:411;;:::o;44213:113::-;44274:7;44301:10;:17;;;;44294:24;;44213:113;:::o;33889:339::-;34084:41;34103:12;:10;:12::i;:::-;34117:7;34084:18;:41::i;:::-;34076:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34192:28;34202:4;34208:2;34212:7;34192:9;:28::i;:::-;33889:339;;;:::o;43881:256::-;43978:7;44014:23;44031:5;44014:16;:23::i;:::-;44006:5;:31;43998:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;44103:12;:19;44116:5;44103:19;;;;;;;;;;;;;;;:26;44123:5;44103:26;;;;;;;;;;;;44096:33;;43881:256;;;;:::o;50030:33::-;;;;:::o;50489:89::-;28378:12;:10;:12::i;:::-;28367:23;;:7;:5;:7::i;:::-;:23;;;28359:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50558:12:::1;;;;;;;;;;;50557:13;50542:12;;:28;;;;;;;;;;;;;;;;;;50489:89::o:0;50586:143::-;28378:12;:10;:12::i;:::-;28367:23;;:7;:5;:7::i;:::-;:23;;;28359:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50634:15:::1;50652:21;50634:39;;50692:10;50684:28;;:37;50713:7;50684:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50623:106;50586:143::o:0;34299:185::-;34437:39;34454:4;34460:2;34464:7;34437:39;;;;;;;;;;;;:16;:39::i;:::-;34299:185;;;:::o;44403:233::-;44478:7;44514:30;:28;:30::i;:::-;44506:5;:38;44498:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44611:10;44622:5;44611:17;;;;;;;;:::i;:::-;;;;;;;;;;44604:24;;44403:233;;;:::o;52009:109::-;28378:12;:10;:12::i;:::-;28367:23;;:7;:5;:7::i;:::-;:23;;;28359:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52102:8:::1;52083:16;:27;;;;;;;;;;;;:::i;:::-;;52009:109:::0;:::o;31245:239::-;31317:7;31337:13;31353:7;:16;31361:7;31353:16;;;;;;;;;;;;;;;;;;;;;31337:32;;31405:1;31388:19;;:5;:19;;;;31380:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31471:5;31464:12;;;31245:239;;;:::o;49908:53::-;49944:17;49908:53;:::o;30975:208::-;31047:7;31092:1;31075:19;;:5;:19;;;;31067:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31159:9;:16;31169:5;31159:16;;;;;;;;;;;;;;;;31152:23;;30975:208;;;:::o;28798:148::-;28378:12;:10;:12::i;:::-;28367:23;;:7;:5;:7::i;:::-;:23;;;28359:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28905:1:::1;28868:40;;28889:6;;;;;;;;;;;28868:40;;;;;;;;;;;;28936:1;28919:6;;:19;;;;;;;;;;;;;;;;;;28798:148::o:0;28147:87::-;28193:7;28220:6;;;;;;;;;;;28213:13;;28147:87;:::o;31720:104::-;31776:13;31809:7;31802:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31720:104;:::o;33292:295::-;33407:12;:10;:12::i;:::-;33395:24;;:8;:24;;;;33387:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33507:8;33462:18;:32;33481:12;:10;:12::i;:::-;33462:32;;;;;;;;;;;;;;;:42;33495:8;33462:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33560:8;33531:48;;33546:12;:10;:12::i;:::-;33531:48;;;33570:8;33531:48;;;;;;:::i;:::-;;;;;;;;33292:295;;:::o;34555:328::-;34730:41;34749:12;:10;:12::i;:::-;34763:7;34730:18;:41::i;:::-;34722:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34836:39;34850:4;34856:2;34860:7;34869:5;34836:13;:39::i;:::-;34555:328;;;;:::o;52126:793::-;52199:13;52233:16;52241:7;52233;:16::i;:::-;52225:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52314:23;52340:10;:19;52351:7;52340:19;;;;;;;;;;;52314:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52370:18;52391:10;:8;:10::i;:::-;52370:31;;52499:1;52483:4;52477:18;:23;52473:72;;;52524:9;52517:16;;;;;;52473:72;52675:1;52655:9;52649:23;:27;52645:108;;;52724:4;52730:9;52707:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52693:48;;;;;;52645:108;52885:4;52891:18;:7;:16;:18::i;:::-;52868:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52854:57;;;;52126:793;;;;:::o;51579:218::-;28378:12;:10;:12::i;:::-;28367:23;;:7;:5;:7::i;:::-;:23;;;28359:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51643:14:::1;51660:13;:11;:13::i;:::-;51643:30;;51684:9;51704:86;51720:3;51716:1;:7;51704:86;;;51745:33;51755:10;51776:1;51767:6;:10;;;;:::i;:::-;51745:9;:33::i;:::-;51725:3;;;;;:::i;:::-;;;;51704:86;;;51632:165;;51579:218:::0;:::o;33658:164::-;33755:4;33779:18;:25;33798:5;33779:25;;;;;;;;;;;;;;;:35;33805:8;33779:35;;;;;;;;;;;;;;;;;;;;;;;;;33772:42;;33658:164;;;;:::o;50070:32::-;;;;;;;;;;;;;:::o;29101:244::-;28378:12;:10;:12::i;:::-;28367:23;;:7;:5;:7::i;:::-;:23;;;28359:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29210:1:::1;29190:22;;:8;:22;;;;29182:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29300:8;29271:38;;29292:6;;;;;;;;;;;29271:38;;;;;;;;;;;;29329:8;29320:6;;:17;;;;;;;;;;;;;;;;;;29101:244:::0;:::o;50739:834::-;50021:2;50813:41;50839:14;50813:9;:21;50823:10;50813:21;;;;;;;;;;;;;;;;:25;;:41;;;;:::i;:::-;:61;;50805:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;50932:12;;;;;;;;;;;50924:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;51017:1;51000:14;:18;50992:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;51130:10;;51093:33;51111:14;51093:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;51085:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;50021:2;51206:14;:34;;51198:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51331:9;51298:29;51312:14;49944:17;51298:13;;:29;;;;:::i;:::-;:42;51290:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;51409:41;51435:14;51409:9;:21;51419:10;51409:21;;;;;;;;;;;;;;;;:25;;:41;;;;:::i;:::-;51385:9;:21;51395:10;51385:21;;;;;;;;;;;;;;;:65;;;;51466:6;51461:105;51482:14;51478:1;:18;51461:105;;;51518:36;51528:10;51540:13;:11;:13::i;:::-;51518:9;:36::i;:::-;51498:3;;;;;:::i;:::-;;;;51461:105;;;;50739:834;:::o;30606:305::-;30708:4;30760:25;30745:40;;;:11;:40;;;;:105;;;;30817:33;30802:48;;;:11;:48;;;;30745:105;:158;;;;30867:36;30891:11;30867:23;:36::i;:::-;30745:158;30725:178;;30606:305;;;:::o;36393:127::-;36458:4;36510:1;36482:30;;:7;:16;36490:7;36482:16;;;;;;;;;;;;;;;;;;;;;:30;;;;36475:37;;36393:127;;;:::o;26765:98::-;26818:7;26845:10;26838:17;;26765:98;:::o;40375:174::-;40477:2;40450:15;:24;40466:7;40450:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40533:7;40529:2;40495:46;;40504:23;40519:7;40504:14;:23::i;:::-;40495:46;;;;;;;;;;;;40375:174;;:::o;36687:348::-;36780:4;36805:16;36813:7;36805;:16::i;:::-;36797:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36881:13;36897:23;36912:7;36897:14;:23::i;:::-;36881:39;;36950:5;36939:16;;:7;:16;;;:51;;;;36983:7;36959:31;;:20;36971:7;36959:11;:20::i;:::-;:31;;;36939:51;:87;;;;36994:32;37011:5;37018:7;36994:16;:32::i;:::-;36939:87;36931:96;;;36687:348;;;;:::o;39679:578::-;39838:4;39811:31;;:23;39826:7;39811:14;:23::i;:::-;:31;;;39803:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39921:1;39907:16;;:2;:16;;;;39899:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39977:39;39998:4;40004:2;40008:7;39977:20;:39::i;:::-;40081:29;40098:1;40102:7;40081:8;:29::i;:::-;40142:1;40123:9;:15;40133:4;40123:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40171:1;40154:9;:13;40164:2;40154:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40202:2;40183:7;:16;40191:7;40183:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40241:7;40237:2;40222:27;;40231:4;40222:27;;;;;;;;;;;;39679:578;;;:::o;35765:315::-;35922:28;35932:4;35938:2;35942:7;35922:9;:28::i;:::-;35969:48;35992:4;35998:2;36002:7;36011:5;35969:22;:48::i;:::-;35961:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35765:315;;;;:::o;51805:117::-;51865:13;51898:16;51891:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51805:117;:::o;7404:723::-;7460:13;7690:1;7681:5;:10;7677:53;;;7708:10;;;;;;;;;;;;;;;;;;;;;7677:53;7740:12;7755:5;7740:20;;7771:14;7796:78;7811:1;7803:4;:9;7796:78;;7829:8;;;;;:::i;:::-;;;;7860:2;7852:10;;;;;:::i;:::-;;;7796:78;;;7884:19;7916:6;7906:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7884:39;;7934:154;7950:1;7941:5;:10;7934:154;;7978:1;7968:11;;;;;:::i;:::-;;;8045:2;8037:5;:10;;;;:::i;:::-;8024:2;:24;;;;:::i;:::-;8011:39;;7994:6;8001;7994:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8074:2;8065:11;;;;;:::i;:::-;;;7934:154;;;8112:6;8098:21;;;;;7404:723;;;;:::o;37377:110::-;37453:26;37463:2;37467:7;37453:26;;;;;;;;;;;;:9;:26::i;:::-;37377:110;;:::o;2763:98::-;2821:7;2852:1;2848;:5;;;;:::i;:::-;2841:12;;2763:98;;;;:::o;3501:::-;3559:7;3590:1;3586;:5;;;;:::i;:::-;3579:12;;3501:98;;;;:::o;19751:157::-;19836:4;19875:25;19860:40;;;:11;:40;;;;19853:47;;19751:157;;;:::o;45249:589::-;45393:45;45420:4;45426:2;45430:7;45393:26;:45::i;:::-;45471:1;45455:18;;:4;:18;;;45451:187;;;45490:40;45522:7;45490:31;:40::i;:::-;45451:187;;;45560:2;45552:10;;:4;:10;;;45548:90;;45579:47;45612:4;45618:7;45579:32;:47::i;:::-;45548:90;45451:187;45666:1;45652:16;;:2;:16;;;45648:183;;;45685:45;45722:7;45685:36;:45::i;:::-;45648:183;;;45758:4;45752:10;;:2;:10;;;45748:83;;45779:40;45807:2;45811:7;45779:27;:40::i;:::-;45748:83;45648:183;45249:589;;;:::o;41114:872::-;41269:4;41290:15;:2;:13;;;:15::i;:::-;41286:693;;;41342:2;41326:36;;;41363:12;:10;:12::i;:::-;41377:4;41383:7;41392:5;41326:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41322:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41589:1;41572:6;:13;:18;41568:341;;;41615:60;;;;;;;;;;:::i;:::-;;;;;;;;41568:341;41859:6;41853:13;41844:6;41840:2;41836:15;41829:38;41322:602;41459:45;;;41449:55;;;:6;:55;;;;41442:62;;;;;41286:693;41963:4;41956:11;;41114:872;;;;;;;:::o;37714:321::-;37844:18;37850:2;37854:7;37844:5;:18::i;:::-;37895:54;37926:1;37930:2;37934:7;37943:5;37895:22;:54::i;:::-;37873:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;37714:321;;;:::o;42599:126::-;;;;:::o;46561:164::-;46665:10;:17;;;;46638:15;:24;46654:7;46638:24;;;;;;;;;;;:44;;;;46693:10;46709:7;46693:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46561:164;:::o;47352:988::-;47618:22;47668:1;47643:22;47660:4;47643:16;:22::i;:::-;:26;;;;:::i;:::-;47618:51;;47680:18;47701:17;:26;47719:7;47701:26;;;;;;;;;;;;47680:47;;47848:14;47834:10;:28;47830:328;;47879:19;47901:12;:18;47914:4;47901:18;;;;;;;;;;;;;;;:34;47920:14;47901:34;;;;;;;;;;;;47879:56;;47985:11;47952:12;:18;47965:4;47952:18;;;;;;;;;;;;;;;:30;47971:10;47952:30;;;;;;;;;;;:44;;;;48102:10;48069:17;:30;48087:11;48069:30;;;;;;;;;;;:43;;;;47864:294;47830:328;48254:17;:26;48272:7;48254:26;;;;;;;;;;;48247:33;;;48298:12;:18;48311:4;48298:18;;;;;;;;;;;;;;;:34;48317:14;48298:34;;;;;;;;;;;48291:41;;;47433:907;;47352:988;;:::o;48635:1079::-;48888:22;48933:1;48913:10;:17;;;;:21;;;;:::i;:::-;48888:46;;48945:18;48966:15;:24;48982:7;48966:24;;;;;;;;;;;;48945:45;;49317:19;49339:10;49350:14;49339:26;;;;;;;;:::i;:::-;;;;;;;;;;49317:48;;49403:11;49378:10;49389;49378:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;49514:10;49483:15;:28;49499:11;49483:28;;;;;;;;;;;:41;;;;49655:15;:24;49671:7;49655:24;;;;;;;;;;;49648:31;;;49690:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48706:1008;;;48635:1079;:::o;46139:221::-;46224:14;46241:20;46258:2;46241:16;:20::i;:::-;46224:37;;46299:7;46272:12;:16;46285:2;46272:16;;;;;;;;;;;;;;;:24;46289:6;46272:24;;;;;;;;;;;:34;;;;46346:6;46317:17;:26;46335:7;46317:26;;;;;;;;;;;:35;;;;46213:147;46139:221;;:::o;9867:444::-;9927:4;10135:12;10259:7;10247:20;10239:28;;10302:1;10295:4;:8;10288:15;;;9867:444;;;:::o;38371:382::-;38465:1;38451:16;;:2;:16;;;;38443:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38524:16;38532:7;38524;:16::i;:::-;38523:17;38515:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38586:45;38615:1;38619:2;38623:7;38586:20;:45::i;:::-;38661:1;38644:9;:13;38654:2;38644:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38692:2;38673:7;:16;38681:7;38673:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38737:7;38733:2;38712:33;;38729:1;38712:33;;;;;;;;;;;;38371:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:109::-;7363:21;7378:5;7363:21;:::i;:::-;7358:3;7351:34;7282:109;;:::o;7397:360::-;7483:3;7511:38;7543:5;7511:38;:::i;:::-;7565:70;7628:6;7623:3;7565:70;:::i;:::-;7558:77;;7644:52;7689:6;7684:3;7677:4;7670:5;7666:16;7644:52;:::i;:::-;7721:29;7743:6;7721:29;:::i;:::-;7716:3;7712:39;7705:46;;7487:270;7397:360;;;;:::o;7763:364::-;7851:3;7879:39;7912:5;7879:39;:::i;:::-;7934:71;7998:6;7993:3;7934:71;:::i;:::-;7927:78;;8014:52;8059:6;8054:3;8047:4;8040:5;8036:16;8014:52;:::i;:::-;8091:29;8113:6;8091:29;:::i;:::-;8086:3;8082:39;8075:46;;7855:272;7763:364;;;;:::o;8133:377::-;8239:3;8267:39;8300:5;8267:39;:::i;:::-;8322:89;8404:6;8399:3;8322:89;:::i;:::-;8315:96;;8420:52;8465:6;8460:3;8453:4;8446:5;8442:16;8420:52;:::i;:::-;8497:6;8492:3;8488:16;8481:23;;8243:267;8133:377;;;;:::o;8516:366::-;8658:3;8679:67;8743:2;8738:3;8679:67;:::i;:::-;8672:74;;8755:93;8844:3;8755:93;:::i;:::-;8873:2;8868:3;8864:12;8857:19;;8516:366;;;:::o;8888:::-;9030:3;9051:67;9115:2;9110:3;9051:67;:::i;:::-;9044:74;;9127:93;9216:3;9127:93;:::i;:::-;9245:2;9240:3;9236:12;9229:19;;8888:366;;;:::o;9260:::-;9402:3;9423:67;9487:2;9482:3;9423:67;:::i;:::-;9416:74;;9499:93;9588:3;9499:93;:::i;:::-;9617:2;9612:3;9608:12;9601:19;;9260:366;;;:::o;9632:::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:::-;10146:3;10167:67;10231:2;10226:3;10167:67;:::i;:::-;10160:74;;10243:93;10332:3;10243:93;:::i;:::-;10361:2;10356:3;10352:12;10345:19;;10004:366;;;:::o;10376:::-;10518:3;10539:67;10603:2;10598:3;10539:67;:::i;:::-;10532:74;;10615:93;10704:3;10615:93;:::i;:::-;10733:2;10728:3;10724:12;10717:19;;10376:366;;;:::o;10748:::-;10890:3;10911:67;10975:2;10970:3;10911:67;:::i;:::-;10904:74;;10987:93;11076:3;10987:93;:::i;:::-;11105:2;11100:3;11096:12;11089:19;;10748:366;;;:::o;11120:::-;11262:3;11283:67;11347:2;11342:3;11283:67;:::i;:::-;11276:74;;11359:93;11448:3;11359:93;:::i;:::-;11477:2;11472:3;11468:12;11461:19;;11120:366;;;:::o;11492:::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11492:366;;;:::o;11864:::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;11864:366;;;:::o;12236:::-;12378:3;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12475:93;12564:3;12475:93;:::i;:::-;12593:2;12588:3;12584:12;12577:19;;12236:366;;;:::o;12608:::-;12750:3;12771:67;12835:2;12830:3;12771:67;:::i;:::-;12764:74;;12847:93;12936:3;12847:93;:::i;:::-;12965:2;12960:3;12956:12;12949:19;;12608:366;;;:::o;12980:::-;13122:3;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13219:93;13308:3;13219:93;:::i;:::-;13337:2;13332:3;13328:12;13321:19;;12980:366;;;:::o;13352:::-;13494:3;13515:67;13579:2;13574:3;13515:67;:::i;:::-;13508:74;;13591:93;13680:3;13591:93;:::i;:::-;13709:2;13704:3;13700:12;13693:19;;13352:366;;;:::o;13724:::-;13866:3;13887:67;13951:2;13946:3;13887:67;:::i;:::-;13880:74;;13963:93;14052:3;13963:93;:::i;:::-;14081:2;14076:3;14072:12;14065:19;;13724:366;;;:::o;14096:::-;14238:3;14259:67;14323:2;14318:3;14259:67;:::i;:::-;14252:74;;14335:93;14424:3;14335:93;:::i;:::-;14453:2;14448:3;14444:12;14437:19;;14096:366;;;:::o;14468:::-;14610:3;14631:67;14695:2;14690:3;14631:67;:::i;:::-;14624:74;;14707:93;14796:3;14707:93;:::i;:::-;14825:2;14820:3;14816:12;14809:19;;14468:366;;;:::o;14840:::-;14982:3;15003:67;15067:2;15062:3;15003:67;:::i;:::-;14996:74;;15079:93;15168:3;15079:93;:::i;:::-;15197:2;15192:3;15188:12;15181:19;;14840:366;;;:::o;15212:::-;15354:3;15375:67;15439:2;15434:3;15375:67;:::i;:::-;15368:74;;15451:93;15540:3;15451:93;:::i;:::-;15569:2;15564:3;15560:12;15553:19;;15212:366;;;:::o;15584:::-;15726:3;15747:67;15811:2;15806:3;15747:67;:::i;:::-;15740:74;;15823:93;15912:3;15823:93;:::i;:::-;15941:2;15936:3;15932:12;15925:19;;15584:366;;;:::o;15956:::-;16098:3;16119:67;16183:2;16178:3;16119:67;:::i;:::-;16112:74;;16195:93;16284:3;16195:93;:::i;:::-;16313:2;16308:3;16304:12;16297:19;;15956:366;;;:::o;16328:::-;16470:3;16491:67;16555:2;16550:3;16491:67;:::i;:::-;16484:74;;16567:93;16656:3;16567:93;:::i;:::-;16685:2;16680:3;16676:12;16669:19;;16328:366;;;:::o;16700:::-;16842:3;16863:67;16927:2;16922:3;16863:67;:::i;:::-;16856:74;;16939:93;17028:3;16939:93;:::i;:::-;17057:2;17052:3;17048:12;17041:19;;16700:366;;;:::o;17072:::-;17214:3;17235:67;17299:2;17294:3;17235:67;:::i;:::-;17228:74;;17311:93;17400:3;17311:93;:::i;:::-;17429:2;17424:3;17420:12;17413:19;;17072:366;;;:::o;17444:118::-;17531:24;17549:5;17531:24;:::i;:::-;17526:3;17519:37;17444:118;;:::o;17568:435::-;17748:3;17770:95;17861:3;17852:6;17770:95;:::i;:::-;17763:102;;17882:95;17973:3;17964:6;17882:95;:::i;:::-;17875:102;;17994:3;17987:10;;17568:435;;;;;:::o;18009:222::-;18102:4;18140:2;18129:9;18125:18;18117:26;;18153:71;18221:1;18210:9;18206:17;18197:6;18153:71;:::i;:::-;18009:222;;;;:::o;18237:640::-;18432:4;18470:3;18459:9;18455:19;18447:27;;18484:71;18552:1;18541:9;18537:17;18528:6;18484:71;:::i;:::-;18565:72;18633:2;18622:9;18618:18;18609:6;18565:72;:::i;:::-;18647;18715:2;18704:9;18700:18;18691:6;18647:72;:::i;:::-;18766:9;18760:4;18756:20;18751:2;18740:9;18736:18;18729:48;18794:76;18865:4;18856:6;18794:76;:::i;:::-;18786:84;;18237:640;;;;;;;:::o;18883:210::-;18970:4;19008:2;18997:9;18993:18;18985:26;;19021:65;19083:1;19072:9;19068:17;19059:6;19021:65;:::i;:::-;18883:210;;;;:::o;19099:313::-;19212:4;19250:2;19239:9;19235:18;19227:26;;19299:9;19293:4;19289:20;19285:1;19274:9;19270:17;19263:47;19327:78;19400:4;19391:6;19327:78;:::i;:::-;19319:86;;19099:313;;;;:::o;19418:419::-;19584:4;19622:2;19611:9;19607:18;19599:26;;19671:9;19665:4;19661:20;19657:1;19646:9;19642:17;19635:47;19699:131;19825:4;19699:131;:::i;:::-;19691:139;;19418:419;;;:::o;19843:::-;20009:4;20047:2;20036:9;20032:18;20024:26;;20096:9;20090:4;20086:20;20082:1;20071:9;20067:17;20060:47;20124:131;20250:4;20124:131;:::i;:::-;20116:139;;19843:419;;;:::o;20268:::-;20434:4;20472:2;20461:9;20457:18;20449:26;;20521:9;20515:4;20511:20;20507:1;20496:9;20492:17;20485:47;20549:131;20675:4;20549:131;:::i;:::-;20541:139;;20268:419;;;:::o;20693:::-;20859:4;20897:2;20886:9;20882:18;20874:26;;20946:9;20940:4;20936:20;20932:1;20921:9;20917:17;20910:47;20974:131;21100:4;20974:131;:::i;:::-;20966:139;;20693:419;;;:::o;21118:::-;21284:4;21322:2;21311:9;21307:18;21299:26;;21371:9;21365:4;21361:20;21357:1;21346:9;21342:17;21335:47;21399:131;21525:4;21399:131;:::i;:::-;21391:139;;21118:419;;;:::o;21543:::-;21709:4;21747:2;21736:9;21732:18;21724:26;;21796:9;21790:4;21786:20;21782:1;21771:9;21767:17;21760:47;21824:131;21950:4;21824:131;:::i;:::-;21816:139;;21543:419;;;:::o;21968:::-;22134:4;22172:2;22161:9;22157:18;22149:26;;22221:9;22215:4;22211:20;22207:1;22196:9;22192:17;22185:47;22249:131;22375:4;22249:131;:::i;:::-;22241:139;;21968:419;;;:::o;22393:::-;22559:4;22597:2;22586:9;22582:18;22574:26;;22646:9;22640:4;22636:20;22632:1;22621:9;22617:17;22610:47;22674:131;22800:4;22674:131;:::i;:::-;22666:139;;22393:419;;;:::o;22818:::-;22984:4;23022:2;23011:9;23007:18;22999:26;;23071:9;23065:4;23061:20;23057:1;23046:9;23042:17;23035:47;23099:131;23225:4;23099:131;:::i;:::-;23091:139;;22818:419;;;:::o;23243:::-;23409:4;23447:2;23436:9;23432:18;23424:26;;23496:9;23490:4;23486:20;23482:1;23471:9;23467:17;23460:47;23524:131;23650:4;23524:131;:::i;:::-;23516:139;;23243:419;;;:::o;23668:::-;23834:4;23872:2;23861:9;23857:18;23849:26;;23921:9;23915:4;23911:20;23907:1;23896:9;23892:17;23885:47;23949:131;24075:4;23949:131;:::i;:::-;23941:139;;23668:419;;;:::o;24093:::-;24259:4;24297:2;24286:9;24282:18;24274:26;;24346:9;24340:4;24336:20;24332:1;24321:9;24317:17;24310:47;24374:131;24500:4;24374:131;:::i;:::-;24366:139;;24093:419;;;:::o;24518:::-;24684:4;24722:2;24711:9;24707:18;24699:26;;24771:9;24765:4;24761:20;24757:1;24746:9;24742:17;24735:47;24799:131;24925:4;24799:131;:::i;:::-;24791:139;;24518:419;;;:::o;24943:::-;25109:4;25147:2;25136:9;25132:18;25124:26;;25196:9;25190:4;25186:20;25182:1;25171:9;25167:17;25160:47;25224:131;25350:4;25224:131;:::i;:::-;25216:139;;24943:419;;;:::o;25368:::-;25534:4;25572:2;25561:9;25557:18;25549:26;;25621:9;25615:4;25611:20;25607:1;25596:9;25592:17;25585:47;25649:131;25775:4;25649:131;:::i;:::-;25641:139;;25368:419;;;:::o;25793:::-;25959:4;25997:2;25986:9;25982:18;25974:26;;26046:9;26040:4;26036:20;26032:1;26021:9;26017:17;26010:47;26074:131;26200:4;26074:131;:::i;:::-;26066:139;;25793:419;;;:::o;26218:::-;26384:4;26422:2;26411:9;26407:18;26399:26;;26471:9;26465:4;26461:20;26457:1;26446:9;26442:17;26435:47;26499:131;26625:4;26499:131;:::i;:::-;26491:139;;26218:419;;;:::o;26643:::-;26809:4;26847:2;26836:9;26832:18;26824:26;;26896:9;26890:4;26886:20;26882:1;26871:9;26867:17;26860:47;26924:131;27050:4;26924:131;:::i;:::-;26916:139;;26643:419;;;:::o;27068:::-;27234:4;27272:2;27261:9;27257:18;27249:26;;27321:9;27315:4;27311:20;27307:1;27296:9;27292:17;27285:47;27349:131;27475:4;27349:131;:::i;:::-;27341:139;;27068:419;;;:::o;27493:::-;27659:4;27697:2;27686:9;27682:18;27674:26;;27746:9;27740:4;27736:20;27732:1;27721:9;27717:17;27710:47;27774:131;27900:4;27774:131;:::i;:::-;27766:139;;27493:419;;;:::o;27918:::-;28084:4;28122:2;28111:9;28107:18;28099:26;;28171:9;28165:4;28161:20;28157:1;28146:9;28142:17;28135:47;28199:131;28325:4;28199:131;:::i;:::-;28191:139;;27918:419;;;:::o;28343:::-;28509:4;28547:2;28536:9;28532:18;28524:26;;28596:9;28590:4;28586:20;28582:1;28571:9;28567:17;28560:47;28624:131;28750:4;28624:131;:::i;:::-;28616:139;;28343:419;;;:::o;28768:::-;28934:4;28972:2;28961:9;28957:18;28949:26;;29021:9;29015:4;29011:20;29007:1;28996:9;28992:17;28985:47;29049:131;29175:4;29049:131;:::i;:::-;29041:139;;28768:419;;;:::o;29193:::-;29359:4;29397:2;29386:9;29382:18;29374:26;;29446:9;29440:4;29436:20;29432:1;29421:9;29417:17;29410:47;29474:131;29600:4;29474:131;:::i;:::-;29466:139;;29193:419;;;:::o;29618:222::-;29711:4;29749:2;29738:9;29734:18;29726:26;;29762:71;29830:1;29819:9;29815:17;29806:6;29762:71;:::i;:::-;29618:222;;;;:::o;29846:129::-;29880:6;29907:20;;:::i;:::-;29897:30;;29936:33;29964:4;29956:6;29936:33;:::i;:::-;29846:129;;;:::o;29981:75::-;30014:6;30047:2;30041:9;30031:19;;29981:75;:::o;30062:307::-;30123:4;30213:18;30205:6;30202:30;30199:56;;;30235:18;;:::i;:::-;30199:56;30273:29;30295:6;30273:29;:::i;:::-;30265:37;;30357:4;30351;30347:15;30339:23;;30062:307;;;:::o;30375:308::-;30437:4;30527:18;30519:6;30516:30;30513:56;;;30549:18;;:::i;:::-;30513:56;30587:29;30609:6;30587:29;:::i;:::-;30579:37;;30671:4;30665;30661:15;30653:23;;30375:308;;;:::o;30689:98::-;30740:6;30774:5;30768:12;30758:22;;30689:98;;;:::o;30793:99::-;30845:6;30879:5;30873:12;30863:22;;30793:99;;;:::o;30898:168::-;30981:11;31015:6;31010:3;31003:19;31055:4;31050:3;31046:14;31031:29;;30898:168;;;;:::o;31072:169::-;31156:11;31190:6;31185:3;31178:19;31230:4;31225:3;31221:14;31206:29;;31072:169;;;;:::o;31247:148::-;31349:11;31386:3;31371:18;;31247:148;;;;:::o;31401:305::-;31441:3;31460:20;31478:1;31460:20;:::i;:::-;31455:25;;31494:20;31512:1;31494:20;:::i;:::-;31489:25;;31648:1;31580:66;31576:74;31573:1;31570:81;31567:107;;;31654:18;;:::i;:::-;31567:107;31698:1;31695;31691:9;31684:16;;31401:305;;;;:::o;31712:185::-;31752:1;31769:20;31787:1;31769:20;:::i;:::-;31764:25;;31803:20;31821:1;31803:20;:::i;:::-;31798:25;;31842:1;31832:35;;31847:18;;:::i;:::-;31832:35;31889:1;31886;31882:9;31877:14;;31712:185;;;;:::o;31903:348::-;31943:7;31966:20;31984:1;31966:20;:::i;:::-;31961:25;;32000:20;32018:1;32000:20;:::i;:::-;31995:25;;32188:1;32120:66;32116:74;32113:1;32110:81;32105:1;32098:9;32091:17;32087:105;32084:131;;;32195:18;;:::i;:::-;32084:131;32243:1;32240;32236:9;32225:20;;31903:348;;;;:::o;32257:191::-;32297:4;32317:20;32335:1;32317:20;:::i;:::-;32312:25;;32351:20;32369:1;32351:20;:::i;:::-;32346:25;;32390:1;32387;32384:8;32381:34;;;32395:18;;:::i;:::-;32381:34;32440:1;32437;32433:9;32425:17;;32257:191;;;;:::o;32454:96::-;32491:7;32520:24;32538:5;32520:24;:::i;:::-;32509:35;;32454:96;;;:::o;32556:90::-;32590:7;32633:5;32626:13;32619:21;32608:32;;32556:90;;;:::o;32652:149::-;32688:7;32728:66;32721:5;32717:78;32706:89;;32652:149;;;:::o;32807:126::-;32844:7;32884:42;32877:5;32873:54;32862:65;;32807:126;;;:::o;32939:77::-;32976:7;33005:5;32994:16;;32939:77;;;:::o;33022:154::-;33106:6;33101:3;33096;33083:30;33168:1;33159:6;33154:3;33150:16;33143:27;33022:154;;;:::o;33182:307::-;33250:1;33260:113;33274:6;33271:1;33268:13;33260:113;;;33359:1;33354:3;33350:11;33344:18;33340:1;33335:3;33331:11;33324:39;33296:2;33293:1;33289:10;33284:15;;33260:113;;;33391:6;33388:1;33385:13;33382:101;;;33471:1;33462:6;33457:3;33453:16;33446:27;33382:101;33231:258;33182:307;;;:::o;33495:320::-;33539:6;33576:1;33570:4;33566:12;33556:22;;33623:1;33617:4;33613:12;33644:18;33634:81;;33700:4;33692:6;33688:17;33678:27;;33634:81;33762:2;33754:6;33751:14;33731:18;33728:38;33725:84;;;33781:18;;:::i;:::-;33725:84;33546:269;33495:320;;;:::o;33821:281::-;33904:27;33926:4;33904:27;:::i;:::-;33896:6;33892:40;34034:6;34022:10;34019:22;33998:18;33986:10;33983:34;33980:62;33977:88;;;34045:18;;:::i;:::-;33977:88;34085:10;34081:2;34074:22;33864:238;33821:281;;:::o;34108:233::-;34147:3;34170:24;34188:5;34170:24;:::i;:::-;34161:33;;34216:66;34209:5;34206:77;34203:103;;;34286:18;;:::i;:::-;34203:103;34333:1;34326:5;34322:13;34315:20;;34108:233;;;:::o;34347:176::-;34379:1;34396:20;34414:1;34396:20;:::i;:::-;34391:25;;34430:20;34448:1;34430:20;:::i;:::-;34425:25;;34469:1;34459:35;;34474:18;;:::i;:::-;34459:35;34515:1;34512;34508:9;34503:14;;34347:176;;;;:::o;34529:180::-;34577:77;34574:1;34567:88;34674:4;34671:1;34664:15;34698:4;34695:1;34688:15;34715:180;34763:77;34760:1;34753:88;34860:4;34857:1;34850:15;34884:4;34881:1;34874:15;34901:180;34949:77;34946:1;34939:88;35046:4;35043:1;35036:15;35070:4;35067:1;35060:15;35087:180;35135:77;35132:1;35125:88;35232:4;35229:1;35222:15;35256:4;35253:1;35246:15;35273:180;35321:77;35318:1;35311:88;35418:4;35415:1;35408:15;35442:4;35439:1;35432:15;35459:180;35507:77;35504:1;35497:88;35604:4;35601:1;35594:15;35628:4;35625:1;35618:15;35645:117;35754:1;35751;35744:12;35768:117;35877:1;35874;35867:12;35891:117;36000:1;35997;35990:12;36014:117;36123:1;36120;36113:12;36137:102;36178:6;36229:2;36225:7;36220:2;36213:5;36209:14;36205:28;36195:38;;36137:102;;;:::o;36245:221::-;36385:34;36381:1;36373:6;36369:14;36362:58;36454:4;36449:2;36441:6;36437:15;36430:29;36245:221;:::o;36472:238::-;36612:34;36608:1;36600:6;36596:14;36589:58;36681:21;36676:2;36668:6;36664:15;36657:46;36472:238;:::o;36716:230::-;36856:34;36852:1;36844:6;36840:14;36833:58;36925:13;36920:2;36912:6;36908:15;36901:38;36716:230;:::o;36952:237::-;37092:34;37088:1;37080:6;37076:14;37069:58;37161:20;37156:2;37148:6;37144:15;37137:45;36952:237;:::o;37195:225::-;37335:34;37331:1;37323:6;37319:14;37312:58;37404:8;37399:2;37391:6;37387:15;37380:33;37195:225;:::o;37426:178::-;37566:30;37562:1;37554:6;37550:14;37543:54;37426:178;:::o;37610:223::-;37750:34;37746:1;37738:6;37734:14;37727:58;37819:6;37814:2;37806:6;37802:15;37795:31;37610:223;:::o;37839:175::-;37979:27;37975:1;37967:6;37963:14;37956:51;37839:175;:::o;38020:231::-;38160:34;38156:1;38148:6;38144:14;38137:58;38229:14;38224:2;38216:6;38212:15;38205:39;38020:231;:::o;38257:222::-;38397:34;38393:1;38385:6;38381:14;38374:58;38466:5;38461:2;38453:6;38449:15;38442:30;38257:222;:::o;38485:243::-;38625:34;38621:1;38613:6;38609:14;38602:58;38694:26;38689:2;38681:6;38677:15;38670:51;38485:243;:::o;38734:229::-;38874:34;38870:1;38862:6;38858:14;38851:58;38943:12;38938:2;38930:6;38926:15;38919:37;38734:229;:::o;38969:228::-;39109:34;39105:1;39097:6;39093:14;39086:58;39178:11;39173:2;39165:6;39161:15;39154:36;38969:228;:::o;39203:229::-;39343:34;39339:1;39331:6;39327:14;39320:58;39412:12;39407:2;39399:6;39395:15;39388:37;39203:229;:::o;39438:179::-;39578:31;39574:1;39566:6;39562:14;39555:55;39438:179;:::o;39623:182::-;39763:34;39759:1;39751:6;39747:14;39740:58;39623:182;:::o;39811:231::-;39951:34;39947:1;39939:6;39935:14;39928:58;40020:14;40015:2;40007:6;40003:15;39996:39;39811:231;:::o;40048:182::-;40188:34;40184:1;40176:6;40172:14;40165:58;40048:182;:::o;40236:228::-;40376:34;40372:1;40364:6;40360:14;40353:58;40445:11;40440:2;40432:6;40428:15;40421:36;40236:228;:::o;40470:234::-;40610:34;40606:1;40598:6;40594:14;40587:58;40679:17;40674:2;40666:6;40662:15;40655:42;40470:234;:::o;40710:220::-;40850:34;40846:1;40838:6;40834:14;40827:58;40919:3;40914:2;40906:6;40902:15;40895:28;40710:220;:::o;40936:236::-;41076:34;41072:1;41064:6;41060:14;41053:58;41145:19;41140:2;41132:6;41128:15;41121:44;40936:236;:::o;41178:231::-;41318:34;41314:1;41306:6;41302:14;41295:58;41387:14;41382:2;41374:6;41370:15;41363:39;41178:231;:::o;41415:182::-;41555:34;41551:1;41543:6;41539:14;41532:58;41415:182;:::o;41603:122::-;41676:24;41694:5;41676:24;:::i;:::-;41669:5;41666:35;41656:63;;41715:1;41712;41705:12;41656:63;41603:122;:::o;41731:116::-;41801:21;41816:5;41801:21;:::i;:::-;41794:5;41791:32;41781:60;;41837:1;41834;41827:12;41781:60;41731:116;:::o;41853:120::-;41925:23;41942:5;41925:23;:::i;:::-;41918:5;41915:34;41905:62;;41963:1;41960;41953:12;41905:62;41853:120;:::o;41979:122::-;42052:24;42070:5;42052:24;:::i;:::-;42045:5;42042:35;42032:63;;42091:1;42088;42081:12;42032:63;41979:122;:::o

Swarm Source

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