ETH Price: $3,709.88 (+2.28%)
 

Overview

Max Total Supply

100 NARWHALS

Holders

38

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 NARWHALS
0x2dB05b32Abd04636EA523ae495F2e71d15462903
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:
FrostyNarwhals

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
//Audited and Edited by Haithem SaferICO Telegram: @SFI_admin

pragma solidity 0.8.13;

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



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

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

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

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

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

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

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

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

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

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

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

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

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




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

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




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

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

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

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



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

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

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



/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

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

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




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

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

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

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

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


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











error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        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 TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

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

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




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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol




/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: contracts/FrostyNFT.sol





contract FrostyNarwhals is ERC721A, Ownable {
    using SafeMath for uint256;

    uint256 public maxFrostyNarwhalsMintPerWallet = 4;

    mapping(address => uint256) public mintedRecord;

    uint256 public MAX_NARWHALS = 4004;

    uint256 public price = 0.03 ether;

    bool public saleIsActive = false;

    bool public whitelistSaleIsActive = false;

    address public companyWallet;
    bytes32 public merkleRoot;
    string internal baseUri;

    constructor(address _companyWallet)
        ERC721A("Frosty Narwhals", "NARWHALS")
    {
        companyWallet = _companyWallet;
        _mint(msg.sender,40);

    }

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

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }


    function changeMaxFrostyNarwhalsMintPerWallet(uint256 newNum) public onlyOwner{
        maxFrostyNarwhalsMintPerWallet = newNum;
    }
    
    function setBaseURI(string memory uri) public onlyOwner {
        baseUri = uri;
    }

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

    function setMerkleRoot(bytes32 root) public onlyOwner {
        merkleRoot = root;
    }

    /*
     * Pause sale if active, make active if paused
     */
    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    /*
     * Pause sale if active, make active if paused
     */
    function flipWhitelistSaleIsActive() public onlyOwner {
        whitelistSaleIsActive = !whitelistSaleIsActive;
    }

    function isWhitelisted(address addr, bytes32[] calldata _merkleProof)
        public
        view
        returns (bool)
    {
        bytes32 leaf = keccak256(abi.encodePacked(addr));
        return MerkleProof.verify(_merkleProof, merkleRoot, leaf);
    }

    function publicMint(uint256 numberOfTokens) public payable {
        require(numberOfTokens > 0, "Invalid Token Number");
        require(
            !whitelistSaleIsActive,
            "Whitelist Sale Must Not Be Active To Mint FrostyNarwhals"
        );
        require(saleIsActive, "Sale Must Be Active To Mint FrostyNarwhals");
        require(
            mintedRecord[msg.sender].add(numberOfTokens) <=
                maxFrostyNarwhalsMintPerWallet,
            "Mint Exceeds Maximum Per Wallet"
        );
        uint256 paymentAmount = numberOfTokens.mul(price);
        require(msg.value >= paymentAmount, "Ether Value Sent Is Not Correct");
        _mint(msg.sender, numberOfTokens);
        mintedRecord[msg.sender] = mintedRecord[msg.sender].add(numberOfTokens);
        payable(companyWallet).transfer(address(this).balance);
    }

    function whitelistMint(
        uint256 numberOfTokens,
        bytes32[] calldata _merkleProof
    ) public payable {
        require(numberOfTokens > 0, "Invalid Token Number");
        require( isWhitelisted(msg.sender, _merkleProof), "You Are Not Whitelisted" );
        require(!saleIsActive, "Public Sale Must Not Be Active To Mint FrostyNarwhals");
        require(
            whitelistSaleIsActive,
            "Whitelist Sale Must Be Active To Mint FrostyNarwhals"
        );
        require(
            mintedRecord[msg.sender].add(numberOfTokens) <=
                maxFrostyNarwhalsMintPerWallet,
            "Mint Exceeds Maximum Per Wallet"
        );
        uint256 paymentAmount = numberOfTokens.mul(price);
        require(msg.value >= paymentAmount, "Ether Value Sent Is Not Correct");
        _mint(msg.sender, numberOfTokens);
        mintedRecord[msg.sender] = mintedRecord[msg.sender].add(numberOfTokens);
        payable(companyWallet).transfer(address(this).balance);
    }

    function _mint(address _to, uint256 quantity) internal {
        require(
            totalSupply().add(quantity) <= MAX_NARWHALS,
            "Mint Would Exceed Maximum Supply"
        );

        _safeMint(_to, quantity);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_companyWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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_NARWHALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"changeMaxFrostyNarwhalsMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"companyWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistSaleIsActive","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":"address","name":"addr","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFrostyNarwhalsMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedRecord","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526004600955610fa4600b55666a94d74f430000600c556000600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055503480156200005d57600080fd5b5060405162004fb538038062004fb5833981810160405281019062000083919062000a26565b6040518060400160405280600f81526020017f46726f737479204e61727768616c7300000000000000000000000000000000008152506040518060400160405280600881526020017f4e41525748414c530000000000000000000000000000000000000000000000008152508160029080519060200190620001079291906200090c565b508060039080519060200190620001209291906200090c565b5062000131620001b460201b60201c565b6000819055505050620001596200014d620001b960201b60201c565b620001c160201b60201c565b80600d60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001ad3360286200028760201b60201c565b5062000d7e565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600b54620002b3826200029f6200030d60201b60201c565b6200032c60201b62001ccd1790919060201c565b1115620002f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002ee9062000ab9565b60405180910390fd5b6200030982826200034460201b60201c565b5050565b60006200031f620001b460201b60201c565b6001546000540303905090565b600081836200033c919062000b14565b905092915050565b620003668282604051806020016040528060008152506200036a60201b60201c565b5050565b6200037f83838360016200038460201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603620003f1576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084036200042c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200044160008683876200077c60201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015620006195750620006188773ffffffffffffffffffffffffffffffffffffffff166200078260201b62001ce31760201c565b5b15620006eb575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620006976000888480600101955088620007a560201b60201c565b620006ce576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80820362000620578260005414620006e557600080fd5b62000757565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203620006ec575b8160008190555050506200077560008683876200090660201b60201c565b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620007d3620001b960201b60201c565b8786866040518563ffffffff1660e01b8152600401620007f7949392919062000c37565b6020604051808303816000875af19250505080156200083657506040513d601f19601f8201168201806040525081019062000833919062000ce8565b60015b620008b3573d806000811462000869576040519150601f19603f3d011682016040523d82523d6000602084013e6200086e565b606091505b506000815103620008ab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b8280546200091a9062000d49565b90600052602060002090601f0160209004810192826200093e57600085556200098a565b82601f106200095957805160ff19168380011785556200098a565b828001600101855582156200098a579182015b82811115620009895782518255916020019190600101906200096c565b5b5090506200099991906200099d565b5090565b5b80821115620009b85760008160009055506001016200099e565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009ee82620009c1565b9050919050565b62000a0081620009e1565b811462000a0c57600080fd5b50565b60008151905062000a2081620009f5565b92915050565b60006020828403121562000a3f5762000a3e620009bc565b5b600062000a4f8482850162000a0f565b91505092915050565b600082825260208201905092915050565b7f4d696e7420576f756c6420457863656564204d6178696d756d20537570706c79600082015250565b600062000aa160208362000a58565b915062000aae8262000a69565b602082019050919050565b6000602082019050818103600083015262000ad48162000a92565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000b218262000adb565b915062000b2e8362000adb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b665762000b6562000ae5565b5b828201905092915050565b62000b7c81620009e1565b82525050565b62000b8d8162000adb565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000bcf57808201518184015260208101905062000bb2565b8381111562000bdf576000848401525b50505050565b6000601f19601f8301169050919050565b600062000c038262000b93565b62000c0f818562000b9e565b935062000c2181856020860162000baf565b62000c2c8162000be5565b840191505092915050565b600060808201905062000c4e600083018762000b71565b62000c5d602083018662000b71565b62000c6c604083018562000b82565b818103606083015262000c80818462000bf6565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000cc28162000c8b565b811462000cce57600080fd5b50565b60008151905062000ce28162000cb7565b92915050565b60006020828403121562000d015762000d00620009bc565b5b600062000d118482850162000cd1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d6257607f821691505b60208210810362000d785762000d7762000d1a565b5b50919050565b6142278062000d8e6000396000f3fe6080604052600436106102045760003560e01c80636352211e11610118578063a035b1fe116100a0578063c87b56dd1161006f578063c87b56dd1461070e578063d2cab0561461074b578063e985e9c514610767578063eb8d2444146107a4578063f2fde38b146107cf57610204565b8063a035b1fe14610654578063a22cb4651461067f578063b88d4fde146106a8578063bdeed7e3146106d157610204565b80638da5cb5b116100e75780638da5cb5b1461058157806391b7f5ed146105ac57806392db778c146105d557806395d89b411461060057806396937ea11461062b57610204565b80636352211e146104c757806370a0823114610504578063715018a6146105415780637cb647591461055857610204565b806323b872dd1161019b5780633ccfd60b1161016a5780633ccfd60b146103f657806342842e0e1461040d5780634b3b8c4a1461043657806355f804b3146104615780635a23dd991461048a57610204565b806323b872dd1461036f5780632db11544146103985780632eb4a7ab146103b457806334918dfd146103df57610204565b8063095ea7b3116101d7578063095ea7b3146102c557806310b5454d146102ee57806318160ddd146103195780631ec32d151461034457610204565b806301ffc9a71461020957806306fdde03146102465780630760199014610271578063081812fc14610288575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613080565b6107f8565b60405161023d91906130c8565b60405180910390f35b34801561025257600080fd5b5061025b6108da565b604051610268919061317c565b60405180910390f35b34801561027d57600080fd5b5061028661096c565b005b34801561029457600080fd5b506102af60048036038101906102aa91906131d4565b610a14565b6040516102bc9190613242565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e79190613289565b610a90565b005b3480156102fa57600080fd5b50610303610b9a565b60405161031091906130c8565b60405180910390f35b34801561032557600080fd5b5061032e610bad565b60405161033b91906132d8565b60405180910390f35b34801561035057600080fd5b50610359610bc4565b6040516103669190613242565b60405180910390f35b34801561037b57600080fd5b50610396600480360381019061039191906132f3565b610bea565b005b6103b260048036038101906103ad91906131d4565b610bfa565b005b3480156103c057600080fd5b506103c9610eda565b6040516103d6919061335f565b60405180910390f35b3480156103eb57600080fd5b506103f4610ee0565b005b34801561040257600080fd5b5061040b610f88565b005b34801561041957600080fd5b50610434600480360381019061042f91906132f3565b611053565b005b34801561044257600080fd5b5061044b611073565b60405161045891906132d8565b60405180910390f35b34801561046d57600080fd5b50610488600480360381019061048391906134af565b611079565b005b34801561049657600080fd5b506104b160048036038101906104ac9190613558565b61110f565b6040516104be91906130c8565b60405180910390f35b3480156104d357600080fd5b506104ee60048036038101906104e991906131d4565b611193565b6040516104fb9190613242565b60405180910390f35b34801561051057600080fd5b5061052b600480360381019061052691906135b8565b6111a9565b60405161053891906132d8565b60405180910390f35b34801561054d57600080fd5b50610556611278565b005b34801561056457600080fd5b5061057f600480360381019061057a9190613611565b611300565b005b34801561058d57600080fd5b50610596611386565b6040516105a39190613242565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce91906131d4565b6113b0565b005b3480156105e157600080fd5b506105ea611436565b6040516105f791906132d8565b60405180910390f35b34801561060c57600080fd5b5061061561143c565b604051610622919061317c565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d91906131d4565b6114ce565b005b34801561066057600080fd5b50610669611554565b60405161067691906132d8565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a1919061366a565b61155a565b005b3480156106b457600080fd5b506106cf60048036038101906106ca919061374b565b6116d1565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906135b8565b61174d565b60405161070591906132d8565b60405180910390f35b34801561071a57600080fd5b50610735600480360381019061073091906131d4565b611765565b604051610742919061317c565b60405180910390f35b610765600480360381019061076091906137ce565b611803565b005b34801561077357600080fd5b5061078e6004803603810190610789919061382e565b611b2f565b60405161079b91906130c8565b60405180910390f35b3480156107b057600080fd5b506107b9611bc3565b6040516107c691906130c8565b60405180910390f35b3480156107db57600080fd5b506107f660048036038101906107f191906135b8565b611bd6565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108d357506108d282611d06565b5b9050919050565b6060600280546108e99061389d565b80601f01602080910402602001604051908101604052809291908181526020018280546109159061389d565b80156109625780601f1061093757610100808354040283529160200191610962565b820191906000526020600020905b81548152906001019060200180831161094557829003601f168201915b5050505050905090565b610974611d70565b73ffffffffffffffffffffffffffffffffffffffff16610992611386565b73ffffffffffffffffffffffffffffffffffffffff16146109e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109df9061391a565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b6000610a1f82611d78565b610a55576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9b82611193565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b02576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b21611d70565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b535750610b5181610b4c611d70565b611b2f565b155b15610b8a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b95838383611dc6565b505050565b600d60019054906101000a900460ff1681565b6000610bb7611e78565b6001546000540303905090565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610bf5838383611e7d565b505050565b60008111610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3490613986565b60405180910390fd5b600d60019054906101000a900460ff1615610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8490613a18565b60405180910390fd5b600d60009054906101000a900460ff16610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd390613aaa565b60405180910390fd5b600954610d3182600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ccd90919063ffffffff16565b1115610d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6990613b16565b60405180910390fd5b6000610d89600c548361236c90919063ffffffff16565b905080341015610dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc590613b82565b60405180910390fd5b610dd83383612382565b610e2a82600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ccd90919063ffffffff16565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ed5573d6000803e3d6000fd5b505050565b600e5481565b610ee8611d70565b73ffffffffffffffffffffffffffffffffffffffff16610f06611386565b73ffffffffffffffffffffffffffffffffffffffff1614610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f539061391a565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610f90611d70565b73ffffffffffffffffffffffffffffffffffffffff16610fae611386565b73ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb9061391a565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561104f573d6000803e3d6000fd5b5050565b61106e838383604051806020016040528060008152506116d1565b505050565b600b5481565b611081611d70565b73ffffffffffffffffffffffffffffffffffffffff1661109f611386565b73ffffffffffffffffffffffffffffffffffffffff16146110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ec9061391a565b60405180910390fd5b80600f908051906020019061110b929190612f2e565b5050565b600080846040516020016111239190613bea565b604051602081830303815290604052805190602001209050611189848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e54836123ee565b9150509392505050565b600061119e82612405565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611210576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611280611d70565b73ffffffffffffffffffffffffffffffffffffffff1661129e611386565b73ffffffffffffffffffffffffffffffffffffffff16146112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb9061391a565b60405180910390fd5b6112fe6000612694565b565b611308611d70565b73ffffffffffffffffffffffffffffffffffffffff16611326611386565b73ffffffffffffffffffffffffffffffffffffffff161461137c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113739061391a565b60405180910390fd5b80600e8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113b8611d70565b73ffffffffffffffffffffffffffffffffffffffff166113d6611386565b73ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114239061391a565b60405180910390fd5b80600c8190555050565b60095481565b60606003805461144b9061389d565b80601f01602080910402602001604051908101604052809291908181526020018280546114779061389d565b80156114c45780601f10611499576101008083540402835291602001916114c4565b820191906000526020600020905b8154815290600101906020018083116114a757829003601f168201915b5050505050905090565b6114d6611d70565b73ffffffffffffffffffffffffffffffffffffffff166114f4611386565b73ffffffffffffffffffffffffffffffffffffffff161461154a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115419061391a565b60405180910390fd5b8060098190555050565b600c5481565b611562611d70565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115c6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115d3611d70565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611680611d70565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116c591906130c8565b60405180910390a35050565b6116dc848484611e7d565b6116fb8373ffffffffffffffffffffffffffffffffffffffff16611ce3565b8015611710575061170e8484848461275a565b155b15611747576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600a6020528060005260406000206000915090505481565b606061177082611d78565b6117a6576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117b06128aa565b905060008151036117d057604051806020016040528060008152506117fb565b806117da8461293c565b6040516020016117eb929190613c41565b6040516020818303038152906040525b915050919050565b60008311611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90613986565b60405180910390fd5b61185133838361110f565b611890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188790613cb1565b60405180910390fd5b600d60009054906101000a900460ff16156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790613d43565b60405180910390fd5b600d60019054906101000a900460ff1661192f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192690613dd5565b60405180910390fd5b60095461198484600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ccd90919063ffffffff16565b11156119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90613b16565b60405180910390fd5b60006119dc600c548561236c90919063ffffffff16565b905080341015611a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1890613b82565b60405180910390fd5b611a2b3385612382565b611a7d84600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ccd90919063ffffffff16565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611b28573d6000803e3d6000fd5b5050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b611bde611d70565b73ffffffffffffffffffffffffffffffffffffffff16611bfc611386565b73ffffffffffffffffffffffffffffffffffffffff1614611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c499061391a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb890613e67565b60405180910390fd5b611cca81612694565b50565b60008183611cdb9190613eb6565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081611d83611e78565b11158015611d92575060005482105b8015611dbf575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611e8882612405565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611eaf611d70565b73ffffffffffffffffffffffffffffffffffffffff161480611ee25750611ee18260000151611edc611d70565b611b2f565b5b80611f275750611ef0611d70565b73ffffffffffffffffffffffffffffffffffffffff16611f0f84610a14565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611f60576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611fc9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361202f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61203c8585856001612a9c565b61204c6000848460000151611dc6565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036122fc576000548110156122fb5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123658585856001612aa2565b5050505050565b6000818361237a9190613f0c565b905092915050565b600b5461239f82612391610bad565b611ccd90919063ffffffff16565b11156123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d790613fb2565b60405180910390fd5b6123ea8282612aa8565b5050565b6000826123fb8584612ac6565b1490509392505050565b61240d612fb4565b60008290508061241b611e78565b1115801561242a575060005481105b1561265d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161265b57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461253f57809250505061268f565b5b60011561265a57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461265557809250505061268f565b612540565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612780611d70565b8786866040518563ffffffff1660e01b81526004016127a29493929190614027565b6020604051808303816000875af19250505080156127de57506040513d601f19601f820116820180604052508101906127db9190614088565b60015b612857573d806000811461280e576040519150601f19603f3d011682016040523d82523d6000602084013e612813565b606091505b50600081510361284f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f80546128b99061389d565b80601f01602080910402602001604051908101604052809291908181526020018280546128e59061389d565b80156129325780601f1061290757610100808354040283529160200191612932565b820191906000526020600020905b81548152906001019060200180831161291557829003601f168201915b5050505050905090565b606060008203612983576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a97565b600082905060005b600082146129b557808061299e906140b5565b915050600a826129ae919061412c565b915061298b565b60008167ffffffffffffffff8111156129d1576129d0613384565b5b6040519080825280601f01601f191660200182016040528015612a035781602001600182028036833780820191505090505b5090505b60008514612a9057600182612a1c919061415d565b9150600a85612a2b9190614191565b6030612a379190613eb6565b60f81b818381518110612a4d57612a4c6141c2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a89919061412c565b9450612a07565b8093505050505b919050565b50505050565b50505050565b612ac2828260405180602001604052806000815250612b3b565b5050565b60008082905060005b8451811015612b30576000858281518110612aed57612aec6141c2565b5b60200260200101519050808311612b0f57612b088382612b4d565b9250612b1c565b612b198184612b4d565b92505b508080612b28906140b5565b915050612acf565b508091505092915050565b612b488383836001612b64565b505050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612bd0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612c0a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c176000868387612a9c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612de15750612de08773ffffffffffffffffffffffffffffffffffffffff16611ce3565b5b15612ea6575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e56600088848060010195508861275a565b612e8c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612de7578260005414612ea157600080fd5b612f11565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612ea7575b816000819055505050612f276000868387612aa2565b5050505050565b828054612f3a9061389d565b90600052602060002090601f016020900481019282612f5c5760008555612fa3565b82601f10612f7557805160ff1916838001178555612fa3565b82800160010185558215612fa3579182015b82811115612fa2578251825591602001919060010190612f87565b5b509050612fb09190612ff7565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613010576000816000905550600101612ff8565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61305d81613028565b811461306857600080fd5b50565b60008135905061307a81613054565b92915050565b6000602082840312156130965761309561301e565b5b60006130a48482850161306b565b91505092915050565b60008115159050919050565b6130c2816130ad565b82525050565b60006020820190506130dd60008301846130b9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561311d578082015181840152602081019050613102565b8381111561312c576000848401525b50505050565b6000601f19601f8301169050919050565b600061314e826130e3565b61315881856130ee565b93506131688185602086016130ff565b61317181613132565b840191505092915050565b600060208201905081810360008301526131968184613143565b905092915050565b6000819050919050565b6131b18161319e565b81146131bc57600080fd5b50565b6000813590506131ce816131a8565b92915050565b6000602082840312156131ea576131e961301e565b5b60006131f8848285016131bf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061322c82613201565b9050919050565b61323c81613221565b82525050565b60006020820190506132576000830184613233565b92915050565b61326681613221565b811461327157600080fd5b50565b6000813590506132838161325d565b92915050565b600080604083850312156132a05761329f61301e565b5b60006132ae85828601613274565b92505060206132bf858286016131bf565b9150509250929050565b6132d28161319e565b82525050565b60006020820190506132ed60008301846132c9565b92915050565b60008060006060848603121561330c5761330b61301e565b5b600061331a86828701613274565b935050602061332b86828701613274565b925050604061333c868287016131bf565b9150509250925092565b6000819050919050565b61335981613346565b82525050565b60006020820190506133746000830184613350565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133bc82613132565b810181811067ffffffffffffffff821117156133db576133da613384565b5b80604052505050565b60006133ee613014565b90506133fa82826133b3565b919050565b600067ffffffffffffffff82111561341a57613419613384565b5b61342382613132565b9050602081019050919050565b82818337600083830152505050565b600061345261344d846133ff565b6133e4565b90508281526020810184848401111561346e5761346d61337f565b5b613479848285613430565b509392505050565b600082601f8301126134965761349561337a565b5b81356134a684826020860161343f565b91505092915050565b6000602082840312156134c5576134c461301e565b5b600082013567ffffffffffffffff8111156134e3576134e2613023565b5b6134ef84828501613481565b91505092915050565b600080fd5b600080fd5b60008083601f8401126135185761351761337a565b5b8235905067ffffffffffffffff811115613535576135346134f8565b5b602083019150836020820283011115613551576135506134fd565b5b9250929050565b6000806000604084860312156135715761357061301e565b5b600061357f86828701613274565b935050602084013567ffffffffffffffff8111156135a05761359f613023565b5b6135ac86828701613502565b92509250509250925092565b6000602082840312156135ce576135cd61301e565b5b60006135dc84828501613274565b91505092915050565b6135ee81613346565b81146135f957600080fd5b50565b60008135905061360b816135e5565b92915050565b6000602082840312156136275761362661301e565b5b6000613635848285016135fc565b91505092915050565b613647816130ad565b811461365257600080fd5b50565b6000813590506136648161363e565b92915050565b600080604083850312156136815761368061301e565b5b600061368f85828601613274565b92505060206136a085828601613655565b9150509250929050565b600067ffffffffffffffff8211156136c5576136c4613384565b5b6136ce82613132565b9050602081019050919050565b60006136ee6136e9846136aa565b6133e4565b90508281526020810184848401111561370a5761370961337f565b5b613715848285613430565b509392505050565b600082601f8301126137325761373161337a565b5b81356137428482602086016136db565b91505092915050565b600080600080608085870312156137655761376461301e565b5b600061377387828801613274565b945050602061378487828801613274565b9350506040613795878288016131bf565b925050606085013567ffffffffffffffff8111156137b6576137b5613023565b5b6137c28782880161371d565b91505092959194509250565b6000806000604084860312156137e7576137e661301e565b5b60006137f5868287016131bf565b935050602084013567ffffffffffffffff81111561381657613815613023565b5b61382286828701613502565b92509250509250925092565b600080604083850312156138455761384461301e565b5b600061385385828601613274565b925050602061386485828601613274565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806138b557607f821691505b6020821081036138c8576138c761386e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139046020836130ee565b915061390f826138ce565b602082019050919050565b60006020820190508181036000830152613933816138f7565b9050919050565b7f496e76616c696420546f6b656e204e756d626572000000000000000000000000600082015250565b60006139706014836130ee565b915061397b8261393a565b602082019050919050565b6000602082019050818103600083015261399f81613963565b9050919050565b7f57686974656c6973742053616c65204d757374204e6f7420426520416374697660008201527f6520546f204d696e742046726f7374794e61727768616c730000000000000000602082015250565b6000613a026038836130ee565b9150613a0d826139a6565b604082019050919050565b60006020820190508181036000830152613a31816139f5565b9050919050565b7f53616c65204d7573742042652041637469766520546f204d696e742046726f7360008201527f74794e61727768616c7300000000000000000000000000000000000000000000602082015250565b6000613a94602a836130ee565b9150613a9f82613a38565b604082019050919050565b60006020820190508181036000830152613ac381613a87565b9050919050565b7f4d696e742045786365656473204d6178696d756d205065722057616c6c657400600082015250565b6000613b00601f836130ee565b9150613b0b82613aca565b602082019050919050565b60006020820190508181036000830152613b2f81613af3565b9050919050565b7f45746865722056616c75652053656e74204973204e6f7420436f727265637400600082015250565b6000613b6c601f836130ee565b9150613b7782613b36565b602082019050919050565b60006020820190508181036000830152613b9b81613b5f565b9050919050565b60008160601b9050919050565b6000613bba82613ba2565b9050919050565b6000613bcc82613baf565b9050919050565b613be4613bdf82613221565b613bc1565b82525050565b6000613bf68284613bd3565b60148201915081905092915050565b600081905092915050565b6000613c1b826130e3565b613c258185613c05565b9350613c358185602086016130ff565b80840191505092915050565b6000613c4d8285613c10565b9150613c598284613c10565b91508190509392505050565b7f596f7520417265204e6f742057686974656c6973746564000000000000000000600082015250565b6000613c9b6017836130ee565b9150613ca682613c65565b602082019050919050565b60006020820190508181036000830152613cca81613c8e565b9050919050565b7f5075626c69632053616c65204d757374204e6f7420426520416374697665205460008201527f6f204d696e742046726f7374794e61727768616c730000000000000000000000602082015250565b6000613d2d6035836130ee565b9150613d3882613cd1565b604082019050919050565b60006020820190508181036000830152613d5c81613d20565b9050919050565b7f57686974656c6973742053616c65204d7573742042652041637469766520546f60008201527f204d696e742046726f7374794e61727768616c73000000000000000000000000602082015250565b6000613dbf6034836130ee565b9150613dca82613d63565b604082019050919050565b60006020820190508181036000830152613dee81613db2565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e516026836130ee565b9150613e5c82613df5565b604082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ec18261319e565b9150613ecc8361319e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f0157613f00613e87565b5b828201905092915050565b6000613f178261319e565b9150613f228361319e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f5b57613f5a613e87565b5b828202905092915050565b7f4d696e7420576f756c6420457863656564204d6178696d756d20537570706c79600082015250565b6000613f9c6020836130ee565b9150613fa782613f66565b602082019050919050565b60006020820190508181036000830152613fcb81613f8f565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613ff982613fd2565b6140038185613fdd565b93506140138185602086016130ff565b61401c81613132565b840191505092915050565b600060808201905061403c6000830187613233565b6140496020830186613233565b61405660408301856132c9565b81810360608301526140688184613fee565b905095945050505050565b60008151905061408281613054565b92915050565b60006020828403121561409e5761409d61301e565b5b60006140ac84828501614073565b91505092915050565b60006140c08261319e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140f2576140f1613e87565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006141378261319e565b91506141428361319e565b925082614152576141516140fd565b5b828204905092915050565b60006141688261319e565b91506141738361319e565b92508282101561418657614185613e87565b5b828203905092915050565b600061419c8261319e565b91506141a78361319e565b9250826141b7576141b66140fd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212205a87aa6670e82e3a67e22a600ff5d74172a41be6e4abbe30142bee1d17f9245864736f6c634300080d0033000000000000000000000000cfdb63e22f4e7efa77766480c6f54edf450e60a1

Deployed Bytecode

0x6080604052600436106102045760003560e01c80636352211e11610118578063a035b1fe116100a0578063c87b56dd1161006f578063c87b56dd1461070e578063d2cab0561461074b578063e985e9c514610767578063eb8d2444146107a4578063f2fde38b146107cf57610204565b8063a035b1fe14610654578063a22cb4651461067f578063b88d4fde146106a8578063bdeed7e3146106d157610204565b80638da5cb5b116100e75780638da5cb5b1461058157806391b7f5ed146105ac57806392db778c146105d557806395d89b411461060057806396937ea11461062b57610204565b80636352211e146104c757806370a0823114610504578063715018a6146105415780637cb647591461055857610204565b806323b872dd1161019b5780633ccfd60b1161016a5780633ccfd60b146103f657806342842e0e1461040d5780634b3b8c4a1461043657806355f804b3146104615780635a23dd991461048a57610204565b806323b872dd1461036f5780632db11544146103985780632eb4a7ab146103b457806334918dfd146103df57610204565b8063095ea7b3116101d7578063095ea7b3146102c557806310b5454d146102ee57806318160ddd146103195780631ec32d151461034457610204565b806301ffc9a71461020957806306fdde03146102465780630760199014610271578063081812fc14610288575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613080565b6107f8565b60405161023d91906130c8565b60405180910390f35b34801561025257600080fd5b5061025b6108da565b604051610268919061317c565b60405180910390f35b34801561027d57600080fd5b5061028661096c565b005b34801561029457600080fd5b506102af60048036038101906102aa91906131d4565b610a14565b6040516102bc9190613242565b60405180910390f35b3480156102d157600080fd5b506102ec60048036038101906102e79190613289565b610a90565b005b3480156102fa57600080fd5b50610303610b9a565b60405161031091906130c8565b60405180910390f35b34801561032557600080fd5b5061032e610bad565b60405161033b91906132d8565b60405180910390f35b34801561035057600080fd5b50610359610bc4565b6040516103669190613242565b60405180910390f35b34801561037b57600080fd5b50610396600480360381019061039191906132f3565b610bea565b005b6103b260048036038101906103ad91906131d4565b610bfa565b005b3480156103c057600080fd5b506103c9610eda565b6040516103d6919061335f565b60405180910390f35b3480156103eb57600080fd5b506103f4610ee0565b005b34801561040257600080fd5b5061040b610f88565b005b34801561041957600080fd5b50610434600480360381019061042f91906132f3565b611053565b005b34801561044257600080fd5b5061044b611073565b60405161045891906132d8565b60405180910390f35b34801561046d57600080fd5b50610488600480360381019061048391906134af565b611079565b005b34801561049657600080fd5b506104b160048036038101906104ac9190613558565b61110f565b6040516104be91906130c8565b60405180910390f35b3480156104d357600080fd5b506104ee60048036038101906104e991906131d4565b611193565b6040516104fb9190613242565b60405180910390f35b34801561051057600080fd5b5061052b600480360381019061052691906135b8565b6111a9565b60405161053891906132d8565b60405180910390f35b34801561054d57600080fd5b50610556611278565b005b34801561056457600080fd5b5061057f600480360381019061057a9190613611565b611300565b005b34801561058d57600080fd5b50610596611386565b6040516105a39190613242565b60405180910390f35b3480156105b857600080fd5b506105d360048036038101906105ce91906131d4565b6113b0565b005b3480156105e157600080fd5b506105ea611436565b6040516105f791906132d8565b60405180910390f35b34801561060c57600080fd5b5061061561143c565b604051610622919061317c565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d91906131d4565b6114ce565b005b34801561066057600080fd5b50610669611554565b60405161067691906132d8565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a1919061366a565b61155a565b005b3480156106b457600080fd5b506106cf60048036038101906106ca919061374b565b6116d1565b005b3480156106dd57600080fd5b506106f860048036038101906106f391906135b8565b61174d565b60405161070591906132d8565b60405180910390f35b34801561071a57600080fd5b50610735600480360381019061073091906131d4565b611765565b604051610742919061317c565b60405180910390f35b610765600480360381019061076091906137ce565b611803565b005b34801561077357600080fd5b5061078e6004803603810190610789919061382e565b611b2f565b60405161079b91906130c8565b60405180910390f35b3480156107b057600080fd5b506107b9611bc3565b6040516107c691906130c8565b60405180910390f35b3480156107db57600080fd5b506107f660048036038101906107f191906135b8565b611bd6565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108c357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108d357506108d282611d06565b5b9050919050565b6060600280546108e99061389d565b80601f01602080910402602001604051908101604052809291908181526020018280546109159061389d565b80156109625780601f1061093757610100808354040283529160200191610962565b820191906000526020600020905b81548152906001019060200180831161094557829003601f168201915b5050505050905090565b610974611d70565b73ffffffffffffffffffffffffffffffffffffffff16610992611386565b73ffffffffffffffffffffffffffffffffffffffff16146109e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109df9061391a565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b6000610a1f82611d78565b610a55576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9b82611193565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b02576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b21611d70565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b535750610b5181610b4c611d70565b611b2f565b155b15610b8a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b95838383611dc6565b505050565b600d60019054906101000a900460ff1681565b6000610bb7611e78565b6001546000540303905090565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610bf5838383611e7d565b505050565b60008111610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3490613986565b60405180910390fd5b600d60019054906101000a900460ff1615610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8490613a18565b60405180910390fd5b600d60009054906101000a900460ff16610cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd390613aaa565b60405180910390fd5b600954610d3182600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ccd90919063ffffffff16565b1115610d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6990613b16565b60405180910390fd5b6000610d89600c548361236c90919063ffffffff16565b905080341015610dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc590613b82565b60405180910390fd5b610dd83383612382565b610e2a82600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ccd90919063ffffffff16565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ed5573d6000803e3d6000fd5b505050565b600e5481565b610ee8611d70565b73ffffffffffffffffffffffffffffffffffffffff16610f06611386565b73ffffffffffffffffffffffffffffffffffffffff1614610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f539061391a565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610f90611d70565b73ffffffffffffffffffffffffffffffffffffffff16610fae611386565b73ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb9061391a565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561104f573d6000803e3d6000fd5b5050565b61106e838383604051806020016040528060008152506116d1565b505050565b600b5481565b611081611d70565b73ffffffffffffffffffffffffffffffffffffffff1661109f611386565b73ffffffffffffffffffffffffffffffffffffffff16146110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ec9061391a565b60405180910390fd5b80600f908051906020019061110b929190612f2e565b5050565b600080846040516020016111239190613bea565b604051602081830303815290604052805190602001209050611189848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e54836123ee565b9150509392505050565b600061119e82612405565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611210576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611280611d70565b73ffffffffffffffffffffffffffffffffffffffff1661129e611386565b73ffffffffffffffffffffffffffffffffffffffff16146112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb9061391a565b60405180910390fd5b6112fe6000612694565b565b611308611d70565b73ffffffffffffffffffffffffffffffffffffffff16611326611386565b73ffffffffffffffffffffffffffffffffffffffff161461137c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113739061391a565b60405180910390fd5b80600e8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113b8611d70565b73ffffffffffffffffffffffffffffffffffffffff166113d6611386565b73ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114239061391a565b60405180910390fd5b80600c8190555050565b60095481565b60606003805461144b9061389d565b80601f01602080910402602001604051908101604052809291908181526020018280546114779061389d565b80156114c45780601f10611499576101008083540402835291602001916114c4565b820191906000526020600020905b8154815290600101906020018083116114a757829003601f168201915b5050505050905090565b6114d6611d70565b73ffffffffffffffffffffffffffffffffffffffff166114f4611386565b73ffffffffffffffffffffffffffffffffffffffff161461154a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115419061391a565b60405180910390fd5b8060098190555050565b600c5481565b611562611d70565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115c6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115d3611d70565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611680611d70565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116c591906130c8565b60405180910390a35050565b6116dc848484611e7d565b6116fb8373ffffffffffffffffffffffffffffffffffffffff16611ce3565b8015611710575061170e8484848461275a565b155b15611747576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600a6020528060005260406000206000915090505481565b606061177082611d78565b6117a6576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117b06128aa565b905060008151036117d057604051806020016040528060008152506117fb565b806117da8461293c565b6040516020016117eb929190613c41565b6040516020818303038152906040525b915050919050565b60008311611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90613986565b60405180910390fd5b61185133838361110f565b611890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188790613cb1565b60405180910390fd5b600d60009054906101000a900460ff16156118e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d790613d43565b60405180910390fd5b600d60019054906101000a900460ff1661192f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192690613dd5565b60405180910390fd5b60095461198484600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ccd90919063ffffffff16565b11156119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90613b16565b60405180910390fd5b60006119dc600c548561236c90919063ffffffff16565b905080341015611a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1890613b82565b60405180910390fd5b611a2b3385612382565b611a7d84600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ccd90919063ffffffff16565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611b28573d6000803e3d6000fd5b5050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b611bde611d70565b73ffffffffffffffffffffffffffffffffffffffff16611bfc611386565b73ffffffffffffffffffffffffffffffffffffffff1614611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c499061391a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb890613e67565b60405180910390fd5b611cca81612694565b50565b60008183611cdb9190613eb6565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081611d83611e78565b11158015611d92575060005482105b8015611dbf575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611e8882612405565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611eaf611d70565b73ffffffffffffffffffffffffffffffffffffffff161480611ee25750611ee18260000151611edc611d70565b611b2f565b5b80611f275750611ef0611d70565b73ffffffffffffffffffffffffffffffffffffffff16611f0f84610a14565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611f60576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611fc9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361202f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61203c8585856001612a9c565b61204c6000848460000151611dc6565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036122fc576000548110156122fb5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123658585856001612aa2565b5050505050565b6000818361237a9190613f0c565b905092915050565b600b5461239f82612391610bad565b611ccd90919063ffffffff16565b11156123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d790613fb2565b60405180910390fd5b6123ea8282612aa8565b5050565b6000826123fb8584612ac6565b1490509392505050565b61240d612fb4565b60008290508061241b611e78565b1115801561242a575060005481105b1561265d576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161265b57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461253f57809250505061268f565b5b60011561265a57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461265557809250505061268f565b612540565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612780611d70565b8786866040518563ffffffff1660e01b81526004016127a29493929190614027565b6020604051808303816000875af19250505080156127de57506040513d601f19601f820116820180604052508101906127db9190614088565b60015b612857573d806000811461280e576040519150601f19603f3d011682016040523d82523d6000602084013e612813565b606091505b50600081510361284f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f80546128b99061389d565b80601f01602080910402602001604051908101604052809291908181526020018280546128e59061389d565b80156129325780601f1061290757610100808354040283529160200191612932565b820191906000526020600020905b81548152906001019060200180831161291557829003601f168201915b5050505050905090565b606060008203612983576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a97565b600082905060005b600082146129b557808061299e906140b5565b915050600a826129ae919061412c565b915061298b565b60008167ffffffffffffffff8111156129d1576129d0613384565b5b6040519080825280601f01601f191660200182016040528015612a035781602001600182028036833780820191505090505b5090505b60008514612a9057600182612a1c919061415d565b9150600a85612a2b9190614191565b6030612a379190613eb6565b60f81b818381518110612a4d57612a4c6141c2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a89919061412c565b9450612a07565b8093505050505b919050565b50505050565b50505050565b612ac2828260405180602001604052806000815250612b3b565b5050565b60008082905060005b8451811015612b30576000858281518110612aed57612aec6141c2565b5b60200260200101519050808311612b0f57612b088382612b4d565b9250612b1c565b612b198184612b4d565b92505b508080612b28906140b5565b915050612acf565b508091505092915050565b612b488383836001612b64565b505050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612bd0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612c0a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c176000868387612a9c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612de15750612de08773ffffffffffffffffffffffffffffffffffffffff16611ce3565b5b15612ea6575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e56600088848060010195508861275a565b612e8c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203612de7578260005414612ea157600080fd5b612f11565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203612ea7575b816000819055505050612f276000868387612aa2565b5050505050565b828054612f3a9061389d565b90600052602060002090601f016020900481019282612f5c5760008555612fa3565b82601f10612f7557805160ff1916838001178555612fa3565b82800160010185558215612fa3579182015b82811115612fa2578251825591602001919060010190612f87565b5b509050612fb09190612ff7565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613010576000816000905550600101612ff8565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61305d81613028565b811461306857600080fd5b50565b60008135905061307a81613054565b92915050565b6000602082840312156130965761309561301e565b5b60006130a48482850161306b565b91505092915050565b60008115159050919050565b6130c2816130ad565b82525050565b60006020820190506130dd60008301846130b9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561311d578082015181840152602081019050613102565b8381111561312c576000848401525b50505050565b6000601f19601f8301169050919050565b600061314e826130e3565b61315881856130ee565b93506131688185602086016130ff565b61317181613132565b840191505092915050565b600060208201905081810360008301526131968184613143565b905092915050565b6000819050919050565b6131b18161319e565b81146131bc57600080fd5b50565b6000813590506131ce816131a8565b92915050565b6000602082840312156131ea576131e961301e565b5b60006131f8848285016131bf565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061322c82613201565b9050919050565b61323c81613221565b82525050565b60006020820190506132576000830184613233565b92915050565b61326681613221565b811461327157600080fd5b50565b6000813590506132838161325d565b92915050565b600080604083850312156132a05761329f61301e565b5b60006132ae85828601613274565b92505060206132bf858286016131bf565b9150509250929050565b6132d28161319e565b82525050565b60006020820190506132ed60008301846132c9565b92915050565b60008060006060848603121561330c5761330b61301e565b5b600061331a86828701613274565b935050602061332b86828701613274565b925050604061333c868287016131bf565b9150509250925092565b6000819050919050565b61335981613346565b82525050565b60006020820190506133746000830184613350565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133bc82613132565b810181811067ffffffffffffffff821117156133db576133da613384565b5b80604052505050565b60006133ee613014565b90506133fa82826133b3565b919050565b600067ffffffffffffffff82111561341a57613419613384565b5b61342382613132565b9050602081019050919050565b82818337600083830152505050565b600061345261344d846133ff565b6133e4565b90508281526020810184848401111561346e5761346d61337f565b5b613479848285613430565b509392505050565b600082601f8301126134965761349561337a565b5b81356134a684826020860161343f565b91505092915050565b6000602082840312156134c5576134c461301e565b5b600082013567ffffffffffffffff8111156134e3576134e2613023565b5b6134ef84828501613481565b91505092915050565b600080fd5b600080fd5b60008083601f8401126135185761351761337a565b5b8235905067ffffffffffffffff811115613535576135346134f8565b5b602083019150836020820283011115613551576135506134fd565b5b9250929050565b6000806000604084860312156135715761357061301e565b5b600061357f86828701613274565b935050602084013567ffffffffffffffff8111156135a05761359f613023565b5b6135ac86828701613502565b92509250509250925092565b6000602082840312156135ce576135cd61301e565b5b60006135dc84828501613274565b91505092915050565b6135ee81613346565b81146135f957600080fd5b50565b60008135905061360b816135e5565b92915050565b6000602082840312156136275761362661301e565b5b6000613635848285016135fc565b91505092915050565b613647816130ad565b811461365257600080fd5b50565b6000813590506136648161363e565b92915050565b600080604083850312156136815761368061301e565b5b600061368f85828601613274565b92505060206136a085828601613655565b9150509250929050565b600067ffffffffffffffff8211156136c5576136c4613384565b5b6136ce82613132565b9050602081019050919050565b60006136ee6136e9846136aa565b6133e4565b90508281526020810184848401111561370a5761370961337f565b5b613715848285613430565b509392505050565b600082601f8301126137325761373161337a565b5b81356137428482602086016136db565b91505092915050565b600080600080608085870312156137655761376461301e565b5b600061377387828801613274565b945050602061378487828801613274565b9350506040613795878288016131bf565b925050606085013567ffffffffffffffff8111156137b6576137b5613023565b5b6137c28782880161371d565b91505092959194509250565b6000806000604084860312156137e7576137e661301e565b5b60006137f5868287016131bf565b935050602084013567ffffffffffffffff81111561381657613815613023565b5b61382286828701613502565b92509250509250925092565b600080604083850312156138455761384461301e565b5b600061385385828601613274565b925050602061386485828601613274565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806138b557607f821691505b6020821081036138c8576138c761386e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139046020836130ee565b915061390f826138ce565b602082019050919050565b60006020820190508181036000830152613933816138f7565b9050919050565b7f496e76616c696420546f6b656e204e756d626572000000000000000000000000600082015250565b60006139706014836130ee565b915061397b8261393a565b602082019050919050565b6000602082019050818103600083015261399f81613963565b9050919050565b7f57686974656c6973742053616c65204d757374204e6f7420426520416374697660008201527f6520546f204d696e742046726f7374794e61727768616c730000000000000000602082015250565b6000613a026038836130ee565b9150613a0d826139a6565b604082019050919050565b60006020820190508181036000830152613a31816139f5565b9050919050565b7f53616c65204d7573742042652041637469766520546f204d696e742046726f7360008201527f74794e61727768616c7300000000000000000000000000000000000000000000602082015250565b6000613a94602a836130ee565b9150613a9f82613a38565b604082019050919050565b60006020820190508181036000830152613ac381613a87565b9050919050565b7f4d696e742045786365656473204d6178696d756d205065722057616c6c657400600082015250565b6000613b00601f836130ee565b9150613b0b82613aca565b602082019050919050565b60006020820190508181036000830152613b2f81613af3565b9050919050565b7f45746865722056616c75652053656e74204973204e6f7420436f727265637400600082015250565b6000613b6c601f836130ee565b9150613b7782613b36565b602082019050919050565b60006020820190508181036000830152613b9b81613b5f565b9050919050565b60008160601b9050919050565b6000613bba82613ba2565b9050919050565b6000613bcc82613baf565b9050919050565b613be4613bdf82613221565b613bc1565b82525050565b6000613bf68284613bd3565b60148201915081905092915050565b600081905092915050565b6000613c1b826130e3565b613c258185613c05565b9350613c358185602086016130ff565b80840191505092915050565b6000613c4d8285613c10565b9150613c598284613c10565b91508190509392505050565b7f596f7520417265204e6f742057686974656c6973746564000000000000000000600082015250565b6000613c9b6017836130ee565b9150613ca682613c65565b602082019050919050565b60006020820190508181036000830152613cca81613c8e565b9050919050565b7f5075626c69632053616c65204d757374204e6f7420426520416374697665205460008201527f6f204d696e742046726f7374794e61727768616c730000000000000000000000602082015250565b6000613d2d6035836130ee565b9150613d3882613cd1565b604082019050919050565b60006020820190508181036000830152613d5c81613d20565b9050919050565b7f57686974656c6973742053616c65204d7573742042652041637469766520546f60008201527f204d696e742046726f7374794e61727768616c73000000000000000000000000602082015250565b6000613dbf6034836130ee565b9150613dca82613d63565b604082019050919050565b60006020820190508181036000830152613dee81613db2565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e516026836130ee565b9150613e5c82613df5565b604082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ec18261319e565b9150613ecc8361319e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f0157613f00613e87565b5b828201905092915050565b6000613f178261319e565b9150613f228361319e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f5b57613f5a613e87565b5b828202905092915050565b7f4d696e7420576f756c6420457863656564204d6178696d756d20537570706c79600082015250565b6000613f9c6020836130ee565b9150613fa782613f66565b602082019050919050565b60006020820190508181036000830152613fcb81613f8f565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613ff982613fd2565b6140038185613fdd565b93506140138185602086016130ff565b61401c81613132565b840191505092915050565b600060808201905061403c6000830187613233565b6140496020830186613233565b61405660408301856132c9565b81810360608301526140688184613fee565b905095945050505050565b60008151905061408281613054565b92915050565b60006020828403121561409e5761409d61301e565b5b60006140ac84828501614073565b91505092915050565b60006140c08261319e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140f2576140f1613e87565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006141378261319e565b91506141428361319e565b925082614152576141516140fd565b5b828204905092915050565b60006141688261319e565b91506141738361319e565b92508282101561418657614185613e87565b5b828203905092915050565b600061419c8261319e565b91506141a78361319e565b9250826141b7576141b66140fd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212205a87aa6670e82e3a67e22a600ff5d74172a41be6e4abbe30142bee1d17f9245864736f6c634300080d0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000cfdb63e22f4e7efa77766480c6f54edf450e60a1

-----Decoded View---------------
Arg [0] : _companyWallet (address): 0xcFDB63E22F4E7EFa77766480c6f54eDF450E60a1

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000cfdb63e22f4e7efa77766480c6f54edf450e60a1


Deployed Bytecode Sourcemap

53949:4136:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24778:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28163:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55545:119;;;;;;;;;;;;;:::i;:::-;;29666:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29229:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54275:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24027:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54325:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30523:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55944:865;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54360:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55379:89;;;;;;;;;;;;;:::i;:::-;;54603:143;;;;;;;;;;;;;:::i;:::-;;30764:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54149:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55000:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55672:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27972:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25147:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43872:103;;;;;;;;;;;;;:::i;:::-;;55212:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43221:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54754:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54035:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28332:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54852:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54192:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29942:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31020:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54093:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28507:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56817:1021;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30292:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54234:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44130:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24778:305;24880:4;24932:25;24917:40;;;:11;:40;;;;:105;;;;24989:33;24974:48;;;:11;:48;;;;24917:105;:158;;;;25039:36;25063:11;25039:23;:36::i;:::-;24917:158;24897:178;;24778:305;;;:::o;28163:100::-;28217:13;28250:5;28243:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28163:100;:::o;55545:119::-;43452:12;:10;:12::i;:::-;43441:23;;:7;:5;:7::i;:::-;:23;;;43433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55635:21:::1;;;;;;;;;;;55634:22;55610:21;;:46;;;;;;;;;;;;;;;;;;55545:119::o:0;29666:204::-;29734:7;29759:16;29767:7;29759;:16::i;:::-;29754:64;;29784:34;;;;;;;;;;;;;;29754:64;29838:15;:24;29854:7;29838:24;;;;;;;;;;;;;;;;;;;;;29831:31;;29666:204;;;:::o;29229:371::-;29302:13;29318:24;29334:7;29318:15;:24::i;:::-;29302:40;;29363:5;29357:11;;:2;:11;;;29353:48;;29377:24;;;;;;;;;;;;;;29353:48;29434:5;29418:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;29444:37;29461:5;29468:12;:10;:12::i;:::-;29444:16;:37::i;:::-;29443:38;29418:63;29414:138;;;29505:35;;;;;;;;;;;;;;29414:138;29564:28;29573:2;29577:7;29586:5;29564:8;:28::i;:::-;29291:309;29229:371;;:::o;54275:41::-;;;;;;;;;;;;;:::o;24027:303::-;24071:7;24296:15;:13;:15::i;:::-;24281:12;;24265:13;;:28;:46;24258:53;;24027:303;:::o;54325:28::-;;;;;;;;;;;;;:::o;30523:170::-;30657:28;30667:4;30673:2;30677:7;30657:9;:28::i;:::-;30523:170;;;:::o;55944:865::-;56039:1;56022:14;:18;56014:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;56099:21;;;;;;;;;;;56098:22;56076:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;56223:12;;;;;;;;;;;56215:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;56380:30;;56315:44;56344:14;56315:12;:24;56328:10;56315:24;;;;;;;;;;;;;;;;:28;;:44;;;;:::i;:::-;:95;;56293:176;;;;;;;;;;;;:::i;:::-;;;;;;;;;56480:21;56504:25;56523:5;;56504:14;:18;;:25;;;;:::i;:::-;56480:49;;56561:13;56548:9;:26;;56540:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;56621:33;56627:10;56639:14;56621:5;:33::i;:::-;56692:44;56721:14;56692:12;:24;56705:10;56692:24;;;;;;;;;;;;;;;;:28;;:44;;;;:::i;:::-;56665:12;:24;56678:10;56665:24;;;;;;;;;;;;;;;:71;;;;56755:13;;;;;;;;;;;56747:31;;:54;56779:21;56747:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56003:806;55944:865;:::o;54360:25::-;;;;:::o;55379:89::-;43452:12;:10;:12::i;:::-;43441:23;;:7;:5;:7::i;:::-;:23;;;43433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55448:12:::1;;;;;;;;;;;55447:13;55432:12;;:28;;;;;;;;;;;;;;;;;;55379:89::o:0;54603:143::-;43452:12;:10;:12::i;:::-;43441:23;;:7;:5;:7::i;:::-;:23;;;43433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54651:15:::1;54669:21;54651:39;;54709:10;54701:28;;:37;54730:7;54701:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;54640:106;54603:143::o:0;30764:185::-;30902:39;30919:4;30925:2;30929:7;30902:39;;;;;;;;;;;;:16;:39::i;:::-;30764:185;;;:::o;54149:34::-;;;;:::o;55000:88::-;43452:12;:10;:12::i;:::-;43441:23;;:7;:5;:7::i;:::-;:23;;;43433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55077:3:::1;55067:7;:13;;;;;;;;;;;;:::i;:::-;;55000:88:::0;:::o;55672:264::-;55790:4;55812:12;55854:4;55837:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;55827:33;;;;;;55812:48;;55878:50;55897:12;;55878:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55911:10;;55923:4;55878:18;:50::i;:::-;55871:57;;;55672:264;;;;;:::o;27972:124::-;28036:7;28063:20;28075:7;28063:11;:20::i;:::-;:25;;;28056:32;;27972:124;;;:::o;25147:206::-;25211:7;25252:1;25235:19;;:5;:19;;;25231:60;;25263:28;;;;;;;;;;;;;;25231:60;25317:12;:19;25330:5;25317:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25309:36;;25302:43;;25147:206;;;:::o;43872:103::-;43452:12;:10;:12::i;:::-;43441:23;;:7;:5;:7::i;:::-;:23;;;43433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43937:30:::1;43964:1;43937:18;:30::i;:::-;43872:103::o:0;55212:90::-;43452:12;:10;:12::i;:::-;43441:23;;:7;:5;:7::i;:::-;:23;;;43433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55290:4:::1;55277:10;:17;;;;55212:90:::0;:::o;43221:87::-;43267:7;43294:6;;;;;;;;;;;43287:13;;43221:87;:::o;54754:88::-;43452:12;:10;:12::i;:::-;43441:23;;:7;:5;:7::i;:::-;:23;;;43433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54826:8:::1;54818:5;:16;;;;54754:88:::0;:::o;54035:49::-;;;;:::o;28332:104::-;28388:13;28421:7;28414:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28332:104;:::o;54852:136::-;43452:12;:10;:12::i;:::-;43441:23;;:7;:5;:7::i;:::-;:23;;;43433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54974:6:::1;54941:30;:39;;;;54852:136:::0;:::o;54192:33::-;;;;:::o;29942:279::-;30045:12;:10;:12::i;:::-;30033:24;;:8;:24;;;30029:54;;30066:17;;;;;;;;;;;;;;30029:54;30141:8;30096:18;:32;30115:12;:10;:12::i;:::-;30096:32;;;;;;;;;;;;;;;:42;30129:8;30096:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30194:8;30165:48;;30180:12;:10;:12::i;:::-;30165:48;;;30204:8;30165:48;;;;;;:::i;:::-;;;;;;;;29942:279;;:::o;31020:369::-;31187:28;31197:4;31203:2;31207:7;31187:9;:28::i;:::-;31230:15;:2;:13;;;:15::i;:::-;:76;;;;;31250:56;31281:4;31287:2;31291:7;31300:5;31250:30;:56::i;:::-;31249:57;31230:76;31226:156;;;31330:40;;;;;;;;;;;;;;31226:156;31020:369;;;;:::o;54093:47::-;;;;;;;;;;;;;;;;;:::o;28507:318::-;28580:13;28611:16;28619:7;28611;:16::i;:::-;28606:59;;28636:29;;;;;;;;;;;;;;28606:59;28678:21;28702:10;:8;:10::i;:::-;28678:34;;28755:1;28736:7;28730:21;:26;:87;;;;;;;;;;;;;;;;;28783:7;28792:18;:7;:16;:18::i;:::-;28766:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28730:87;28723:94;;;28507:318;;;:::o;56817:1021::-;56973:1;56956:14;:18;56948:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;57019:39;57033:10;57045:12;;57019:13;:39::i;:::-;57010:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;57107:12;;;;;;;;;;;57106:13;57098:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;57210:21;;;;;;;;;;;57188:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;57409:30;;57344:44;57373:14;57344:12;:24;57357:10;57344:24;;;;;;;;;;;;;;;;:28;;:44;;;;:::i;:::-;:95;;57322:176;;;;;;;;;;;;:::i;:::-;;;;;;;;;57509:21;57533:25;57552:5;;57533:14;:18;;:25;;;;:::i;:::-;57509:49;;57590:13;57577:9;:26;;57569:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;57650:33;57656:10;57668:14;57650:5;:33::i;:::-;57721:44;57750:14;57721:12;:24;57734:10;57721:24;;;;;;;;;;;;;;;;:28;;:44;;;;:::i;:::-;57694:12;:24;57707:10;57694:24;;;;;;;;;;;;;;;:71;;;;57784:13;;;;;;;;;;;57776:31;;:54;57808:21;57776:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56937:901;56817:1021;;;:::o;30292:164::-;30389:4;30413:18;:25;30432:5;30413:25;;;;;;;;;;;;;;;:35;30439:8;30413:35;;;;;;;;;;;;;;;;;;;;;;;;;30406:42;;30292:164;;;;:::o;54234:32::-;;;;;;;;;;;;;:::o;44130:201::-;43452:12;:10;:12::i;:::-;43441:23;;:7;:5;:7::i;:::-;:23;;;43433:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44239:1:::1;44219:22;;:8;:22;;::::0;44211:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;44295:28;44314:8;44295:18;:28::i;:::-;44130:201:::0;:::o;47462:98::-;47520:7;47551:1;47547;:5;;;;:::i;:::-;47540:12;;47462:98;;;;:::o;9388:326::-;9448:4;9705:1;9683:7;:19;;;:23;9676:30;;9388:326;;;:::o;20217:157::-;20302:4;20341:25;20326:40;;;:11;:40;;;;20319:47;;20217:157;;;:::o;17258:98::-;17311:7;17338:10;17331:17;;17258:98;:::o;31644:187::-;31701:4;31744:7;31725:15;:13;:15::i;:::-;:26;;:53;;;;;31765:13;;31755:7;:23;31725:53;:98;;;;;31796:11;:20;31808:7;31796:20;;;;;;;;;;;:27;;;;;;;;;;;;31795:28;31725:98;31718:105;;31644:187;;;:::o;39255:196::-;39397:2;39370:15;:24;39386:7;39370:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39435:7;39431:2;39415:28;;39424:5;39415:28;;;;;;;;;;;;39255:196;;;:::o;23751:92::-;23807:7;23751:92;:::o;34757:2112::-;34872:35;34910:20;34922:7;34910:11;:20::i;:::-;34872:58;;34943:22;34985:13;:18;;;34969:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;35020:50;35037:13;:18;;;35057:12;:10;:12::i;:::-;35020:16;:50::i;:::-;34969:101;:154;;;;35111:12;:10;:12::i;:::-;35087:36;;:20;35099:7;35087:11;:20::i;:::-;:36;;;34969:154;34943:181;;35142:17;35137:66;;35168:35;;;;;;;;;;;;;;35137:66;35240:4;35218:26;;:13;:18;;;:26;;;35214:67;;35253:28;;;;;;;;;;;;;;35214:67;35310:1;35296:16;;:2;:16;;;35292:52;;35321:23;;;;;;;;;;;;;;35292:52;35357:43;35379:4;35385:2;35389:7;35398:1;35357:21;:43::i;:::-;35465:49;35482:1;35486:7;35495:13;:18;;;35465:8;:49::i;:::-;35840:1;35810:12;:18;35823:4;35810:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35884:1;35856:12;:16;35869:2;35856:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35930:2;35902:11;:20;35914:7;35902:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;35992:15;35947:11;:20;35959:7;35947:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;36260:19;36292:1;36282:7;:11;36260:33;;36353:1;36312:43;;:11;:24;36324:11;36312:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;36308:445;;36537:13;;36523:11;:27;36519:219;;;36607:13;:18;;;36575:11;:24;36587:11;36575:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;36690:13;:28;;;36648:11;:24;36660:11;36648:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;36519:219;36308:445;35785:979;36800:7;36796:2;36781:27;;36790:4;36781:27;;;;;;;;;;;;36819:42;36840:4;36846:2;36850:7;36859:1;36819:20;:42::i;:::-;34861:2008;;34757:2112;;;:::o;48200:98::-;48258:7;48289:1;48285;:5;;;;:::i;:::-;48278:12;;48200:98;;;;:::o;57846:236::-;57965:12;;57934:27;57952:8;57934:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:43;;57912:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;58050:24;58060:3;58065:8;58050:9;:24::i;:::-;57846:236;;:::o;52439:190::-;52564:4;52617;52588:25;52601:5;52608:4;52588:12;:25::i;:::-;:33;52581:40;;52439:190;;;;;:::o;26802:1108::-;26863:21;;:::i;:::-;26897:12;26912:7;26897:22;;26980:4;26961:15;:13;:15::i;:::-;:23;;:47;;;;;26995:13;;26988:4;:20;26961:47;26957:886;;;27029:31;27063:11;:17;27075:4;27063:17;;;;;;;;;;;27029:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27104:9;:16;;;27099:729;;27175:1;27149:28;;:9;:14;;;:28;;;27145:101;;27213:9;27206:16;;;;;;27145:101;27548:261;27555:4;27548:261;;;27588:6;;;;;;;;27633:11;:17;27645:4;27633:17;;;;;;;;;;;27621:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27707:1;27681:28;;:9;:14;;;:28;;;27677:109;;27749:9;27742:16;;;;;;27677:109;27548:261;;;27099:729;27010:833;26957:886;27871:31;;;;;;;;;;;;;;26802:1108;;;;:::o;44491:191::-;44565:16;44584:6;;;;;;;;;;;44565:25;;44610:8;44601:6;;:17;;;;;;;;;;;;;;;;;;44665:8;44634:40;;44655:8;44634:40;;;;;;;;;;;;44554:128;44491:191;:::o;39943:667::-;40106:4;40143:2;40127:36;;;40164:12;:10;:12::i;:::-;40178:4;40184:7;40193:5;40127:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40123:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40378:1;40361:6;:13;:18;40357:235;;40407:40;;;;;;;;;;;;;;40357:235;40550:6;40544:13;40535:6;40531:2;40527:15;40520:38;40123:480;40256:45;;;40246:55;;;:6;:55;;;;40239:62;;;39943:667;;;;;;:::o;55096:108::-;55156:13;55189:7;55182:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55096:108;:::o;17758:723::-;17814:13;18044:1;18035:5;:10;18031:53;;18062:10;;;;;;;;;;;;;;;;;;;;;18031:53;18094:12;18109:5;18094:20;;18125:14;18150:78;18165:1;18157:4;:9;18150:78;;18183:8;;;;;:::i;:::-;;;;18214:2;18206:10;;;;;:::i;:::-;;;18150:78;;;18238:19;18270:6;18260:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18238:39;;18288:154;18304:1;18295:5;:10;18288:154;;18332:1;18322:11;;;;;:::i;:::-;;;18399:2;18391:5;:10;;;;:::i;:::-;18378:2;:24;;;;:::i;:::-;18365:39;;18348:6;18355;18348:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18428:2;18419:11;;;;;:::i;:::-;;;18288:154;;;18466:6;18452:21;;;;;17758:723;;;;:::o;41258:159::-;;;;;:::o;42076:158::-;;;;;:::o;31839:104::-;31908:27;31918:2;31922:8;31908:27;;;;;;;;;;;;:9;:27::i;:::-;31839:104;;:::o;52991:675::-;53074:7;53094:20;53117:4;53094:27;;53137:9;53132:497;53156:5;:12;53152:1;:16;53132:497;;;53190:20;53213:5;53219:1;53213:8;;;;;;;;:::i;:::-;;;;;;;;53190:31;;53256:12;53240;:28;53236:382;;53383:42;53398:12;53412;53383:14;:42::i;:::-;53368:57;;53236:382;;;53560:42;53575:12;53589;53560:14;:42::i;:::-;53545:57;;53236:382;53175:454;53170:3;;;;;:::i;:::-;;;;53132:497;;;;53646:12;53639:19;;;52991:675;;;;:::o;32306:163::-;32429:32;32435:2;32439:8;32449:5;32456:4;32429:5;:32::i;:::-;32306:163;;;:::o;53674:224::-;53742:13;53805:1;53799:4;53792:15;53834:1;53828:4;53821:15;53875:4;53869;53859:21;53850:30;;53674:224;;;;:::o;32728:1775::-;32867:20;32890:13;;32867:36;;32932:1;32918:16;;:2;:16;;;32914:48;;32943:19;;;;;;;;;;;;;;32914:48;32989:1;32977:8;:13;32973:44;;32999:18;;;;;;;;;;;;;;32973:44;33030:61;33060:1;33064:2;33068:12;33082:8;33030:21;:61::i;:::-;33403:8;33368:12;:16;33381:2;33368:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33467:8;33427:12;:16;33440:2;33427:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33526:2;33493:11;:25;33505:12;33493:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33593:15;33543:11;:25;33555:12;33543:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33626:20;33649:12;33626:35;;33676:11;33705:8;33690:12;:23;33676:37;;33734:4;:23;;;;;33742:15;:2;:13;;;:15::i;:::-;33734:23;33730:641;;;33778:314;33834:12;33830:2;33809:38;;33826:1;33809:38;;;;;;;;;;;;33875:69;33914:1;33918:2;33922:14;;;;;;33938:5;33875:30;:69::i;:::-;33870:174;;33980:40;;;;;;;;;;;;;;33870:174;34087:3;34071:12;:19;33778:314;;34173:12;34156:13;;:29;34152:43;;34187:8;;;34152:43;33730:641;;;34236:120;34292:14;;;;;;34288:2;34267:40;;34284:1;34267:40;;;;;;;;;;;;34351:3;34335:12;:19;34236:120;;33730:641;34401:12;34385:13;:28;;;;33343:1082;;34435:60;34464:1;34468:2;34472:12;34486:8;34435:20;:60::i;:::-;32856:1647;32728:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:118::-;6085:24;6103:5;6085:24;:::i;:::-;6080:3;6073:37;5998:118;;:::o;6122:222::-;6215:4;6253:2;6242:9;6238:18;6230:26;;6266:71;6334:1;6323:9;6319:17;6310:6;6266:71;:::i;:::-;6122:222;;;;:::o;6350:117::-;6459:1;6456;6449:12;6473:117;6582:1;6579;6572:12;6596:180;6644:77;6641:1;6634:88;6741:4;6738:1;6731:15;6765:4;6762:1;6755:15;6782:281;6865:27;6887:4;6865:27;:::i;:::-;6857:6;6853:40;6995:6;6983:10;6980:22;6959:18;6947:10;6944:34;6941:62;6938:88;;;7006:18;;:::i;:::-;6938:88;7046:10;7042:2;7035:22;6825:238;6782:281;;:::o;7069:129::-;7103:6;7130:20;;:::i;:::-;7120:30;;7159:33;7187:4;7179:6;7159:33;:::i;:::-;7069:129;;;:::o;7204:308::-;7266:4;7356:18;7348:6;7345:30;7342:56;;;7378:18;;:::i;:::-;7342:56;7416:29;7438:6;7416:29;:::i;:::-;7408:37;;7500:4;7494;7490:15;7482:23;;7204:308;;;:::o;7518:154::-;7602:6;7597:3;7592;7579:30;7664:1;7655:6;7650:3;7646:16;7639:27;7518:154;;;:::o;7678:412::-;7756:5;7781:66;7797:49;7839:6;7797:49;:::i;:::-;7781:66;:::i;:::-;7772:75;;7870:6;7863:5;7856:21;7908:4;7901:5;7897:16;7946:3;7937:6;7932:3;7928:16;7925:25;7922:112;;;7953:79;;:::i;:::-;7922:112;8043:41;8077:6;8072:3;8067;8043:41;:::i;:::-;7762:328;7678:412;;;;;:::o;8110:340::-;8166:5;8215:3;8208:4;8200:6;8196:17;8192:27;8182:122;;8223:79;;:::i;:::-;8182:122;8340:6;8327:20;8365:79;8440:3;8432:6;8425:4;8417:6;8413:17;8365:79;:::i;:::-;8356:88;;8172:278;8110:340;;;;:::o;8456:509::-;8525:6;8574:2;8562:9;8553:7;8549:23;8545:32;8542:119;;;8580:79;;:::i;:::-;8542:119;8728:1;8717:9;8713:17;8700:31;8758:18;8750:6;8747:30;8744:117;;;8780:79;;:::i;:::-;8744:117;8885:63;8940:7;8931:6;8920:9;8916:22;8885:63;:::i;:::-;8875:73;;8671:287;8456:509;;;;:::o;8971:117::-;9080:1;9077;9070:12;9094:117;9203:1;9200;9193:12;9234:568;9307:8;9317:6;9367:3;9360:4;9352:6;9348:17;9344:27;9334:122;;9375:79;;:::i;:::-;9334:122;9488:6;9475:20;9465:30;;9518:18;9510:6;9507:30;9504:117;;;9540:79;;:::i;:::-;9504:117;9654:4;9646:6;9642:17;9630:29;;9708:3;9700:4;9692:6;9688:17;9678:8;9674:32;9671:41;9668:128;;;9715:79;;:::i;:::-;9668:128;9234:568;;;;;:::o;9808:704::-;9903:6;9911;9919;9968:2;9956:9;9947:7;9943:23;9939:32;9936:119;;;9974:79;;:::i;:::-;9936:119;10094:1;10119:53;10164:7;10155:6;10144:9;10140:22;10119:53;:::i;:::-;10109:63;;10065:117;10249:2;10238:9;10234:18;10221:32;10280:18;10272:6;10269:30;10266:117;;;10302:79;;:::i;:::-;10266:117;10415:80;10487:7;10478:6;10467:9;10463:22;10415:80;:::i;:::-;10397:98;;;;10192:313;9808:704;;;;;:::o;10518:329::-;10577:6;10626:2;10614:9;10605:7;10601:23;10597:32;10594:119;;;10632:79;;:::i;:::-;10594:119;10752:1;10777:53;10822:7;10813:6;10802:9;10798:22;10777:53;:::i;:::-;10767:63;;10723:117;10518:329;;;;:::o;10853:122::-;10926:24;10944:5;10926:24;:::i;:::-;10919:5;10916:35;10906:63;;10965:1;10962;10955:12;10906:63;10853:122;:::o;10981:139::-;11027:5;11065:6;11052:20;11043:29;;11081:33;11108:5;11081:33;:::i;:::-;10981:139;;;;:::o;11126:329::-;11185:6;11234:2;11222:9;11213:7;11209:23;11205:32;11202:119;;;11240:79;;:::i;:::-;11202:119;11360:1;11385:53;11430:7;11421:6;11410:9;11406:22;11385:53;:::i;:::-;11375:63;;11331:117;11126:329;;;;:::o;11461:116::-;11531:21;11546:5;11531:21;:::i;:::-;11524:5;11521:32;11511:60;;11567:1;11564;11557:12;11511:60;11461:116;:::o;11583:133::-;11626:5;11664:6;11651:20;11642:29;;11680:30;11704:5;11680:30;:::i;:::-;11583:133;;;;:::o;11722:468::-;11787:6;11795;11844:2;11832:9;11823:7;11819:23;11815:32;11812:119;;;11850:79;;:::i;:::-;11812:119;11970:1;11995:53;12040:7;12031:6;12020:9;12016:22;11995:53;:::i;:::-;11985:63;;11941:117;12097:2;12123:50;12165:7;12156:6;12145:9;12141:22;12123:50;:::i;:::-;12113:60;;12068:115;11722:468;;;;;:::o;12196:307::-;12257:4;12347:18;12339:6;12336:30;12333:56;;;12369:18;;:::i;:::-;12333:56;12407:29;12429:6;12407:29;:::i;:::-;12399:37;;12491:4;12485;12481:15;12473:23;;12196:307;;;:::o;12509:410::-;12586:5;12611:65;12627:48;12668:6;12627:48;:::i;:::-;12611:65;:::i;:::-;12602:74;;12699:6;12692:5;12685:21;12737:4;12730:5;12726:16;12775:3;12766:6;12761:3;12757:16;12754:25;12751:112;;;12782:79;;:::i;:::-;12751:112;12872:41;12906:6;12901:3;12896;12872:41;:::i;:::-;12592:327;12509:410;;;;;:::o;12938:338::-;12993:5;13042:3;13035:4;13027:6;13023:17;13019:27;13009:122;;13050:79;;:::i;:::-;13009:122;13167:6;13154:20;13192:78;13266:3;13258:6;13251:4;13243:6;13239:17;13192:78;:::i;:::-;13183:87;;12999:277;12938:338;;;;:::o;13282:943::-;13377:6;13385;13393;13401;13450:3;13438:9;13429:7;13425:23;13421:33;13418:120;;;13457:79;;:::i;:::-;13418:120;13577:1;13602:53;13647:7;13638:6;13627:9;13623:22;13602:53;:::i;:::-;13592:63;;13548:117;13704:2;13730:53;13775:7;13766:6;13755:9;13751:22;13730:53;:::i;:::-;13720:63;;13675:118;13832:2;13858:53;13903:7;13894:6;13883:9;13879:22;13858:53;:::i;:::-;13848:63;;13803:118;13988:2;13977:9;13973:18;13960:32;14019:18;14011:6;14008:30;14005:117;;;14041:79;;:::i;:::-;14005:117;14146:62;14200:7;14191:6;14180:9;14176:22;14146:62;:::i;:::-;14136:72;;13931:287;13282:943;;;;;;;:::o;14231:704::-;14326:6;14334;14342;14391:2;14379:9;14370:7;14366:23;14362:32;14359:119;;;14397:79;;:::i;:::-;14359:119;14517:1;14542:53;14587:7;14578:6;14567:9;14563:22;14542:53;:::i;:::-;14532:63;;14488:117;14672:2;14661:9;14657:18;14644:32;14703:18;14695:6;14692:30;14689:117;;;14725:79;;:::i;:::-;14689:117;14838:80;14910:7;14901:6;14890:9;14886:22;14838:80;:::i;:::-;14820:98;;;;14615:313;14231:704;;;;;:::o;14941:474::-;15009:6;15017;15066:2;15054:9;15045:7;15041:23;15037:32;15034:119;;;15072:79;;:::i;:::-;15034:119;15192:1;15217:53;15262:7;15253:6;15242:9;15238:22;15217:53;:::i;:::-;15207:63;;15163:117;15319:2;15345:53;15390:7;15381:6;15370:9;15366:22;15345:53;:::i;:::-;15335:63;;15290:118;14941:474;;;;;:::o;15421:180::-;15469:77;15466:1;15459:88;15566:4;15563:1;15556:15;15590:4;15587:1;15580:15;15607:320;15651:6;15688:1;15682:4;15678:12;15668:22;;15735:1;15729:4;15725:12;15756:18;15746:81;;15812:4;15804:6;15800:17;15790:27;;15746:81;15874:2;15866:6;15863:14;15843:18;15840:38;15837:84;;15893:18;;:::i;:::-;15837:84;15658:269;15607:320;;;:::o;15933:182::-;16073:34;16069:1;16061:6;16057:14;16050:58;15933:182;:::o;16121:366::-;16263:3;16284:67;16348:2;16343:3;16284:67;:::i;:::-;16277:74;;16360:93;16449:3;16360:93;:::i;:::-;16478:2;16473:3;16469:12;16462:19;;16121:366;;;:::o;16493:419::-;16659:4;16697:2;16686:9;16682:18;16674:26;;16746:9;16740:4;16736:20;16732:1;16721:9;16717:17;16710:47;16774:131;16900:4;16774:131;:::i;:::-;16766:139;;16493:419;;;:::o;16918:170::-;17058:22;17054:1;17046:6;17042:14;17035:46;16918:170;:::o;17094:366::-;17236:3;17257:67;17321:2;17316:3;17257:67;:::i;:::-;17250:74;;17333:93;17422:3;17333:93;:::i;:::-;17451:2;17446:3;17442:12;17435:19;;17094:366;;;:::o;17466:419::-;17632:4;17670:2;17659:9;17655:18;17647:26;;17719:9;17713:4;17709:20;17705:1;17694:9;17690:17;17683:47;17747:131;17873:4;17747:131;:::i;:::-;17739:139;;17466:419;;;:::o;17891:243::-;18031:34;18027:1;18019:6;18015:14;18008:58;18100:26;18095:2;18087:6;18083:15;18076:51;17891:243;:::o;18140:366::-;18282:3;18303:67;18367:2;18362:3;18303:67;:::i;:::-;18296:74;;18379:93;18468:3;18379:93;:::i;:::-;18497:2;18492:3;18488:12;18481:19;;18140:366;;;:::o;18512:419::-;18678:4;18716:2;18705:9;18701:18;18693:26;;18765:9;18759:4;18755:20;18751:1;18740:9;18736:17;18729:47;18793:131;18919:4;18793:131;:::i;:::-;18785:139;;18512:419;;;:::o;18937:229::-;19077:34;19073:1;19065:6;19061:14;19054:58;19146:12;19141:2;19133:6;19129:15;19122:37;18937:229;:::o;19172:366::-;19314:3;19335:67;19399:2;19394:3;19335:67;:::i;:::-;19328:74;;19411:93;19500:3;19411:93;:::i;:::-;19529:2;19524:3;19520:12;19513:19;;19172:366;;;:::o;19544:419::-;19710:4;19748:2;19737:9;19733:18;19725:26;;19797:9;19791:4;19787:20;19783:1;19772:9;19768:17;19761:47;19825:131;19951:4;19825:131;:::i;:::-;19817:139;;19544:419;;;:::o;19969:181::-;20109:33;20105:1;20097:6;20093:14;20086:57;19969:181;:::o;20156:366::-;20298:3;20319:67;20383:2;20378:3;20319:67;:::i;:::-;20312:74;;20395:93;20484:3;20395:93;:::i;:::-;20513:2;20508:3;20504:12;20497:19;;20156:366;;;:::o;20528:419::-;20694:4;20732:2;20721:9;20717:18;20709:26;;20781:9;20775:4;20771:20;20767:1;20756:9;20752:17;20745:47;20809:131;20935:4;20809:131;:::i;:::-;20801:139;;20528:419;;;:::o;20953:181::-;21093:33;21089:1;21081:6;21077:14;21070:57;20953:181;:::o;21140:366::-;21282:3;21303:67;21367:2;21362:3;21303:67;:::i;:::-;21296:74;;21379:93;21468:3;21379:93;:::i;:::-;21497:2;21492:3;21488:12;21481:19;;21140:366;;;:::o;21512:419::-;21678:4;21716:2;21705:9;21701:18;21693:26;;21765:9;21759:4;21755:20;21751:1;21740:9;21736:17;21729:47;21793:131;21919:4;21793:131;:::i;:::-;21785:139;;21512:419;;;:::o;21937:94::-;21970:8;22018:5;22014:2;22010:14;21989:35;;21937:94;;;:::o;22037:::-;22076:7;22105:20;22119:5;22105:20;:::i;:::-;22094:31;;22037:94;;;:::o;22137:100::-;22176:7;22205:26;22225:5;22205:26;:::i;:::-;22194:37;;22137:100;;;:::o;22243:157::-;22348:45;22368:24;22386:5;22368:24;:::i;:::-;22348:45;:::i;:::-;22343:3;22336:58;22243:157;;:::o;22406:256::-;22518:3;22533:75;22604:3;22595:6;22533:75;:::i;:::-;22633:2;22628:3;22624:12;22617:19;;22653:3;22646:10;;22406:256;;;;:::o;22668:148::-;22770:11;22807:3;22792:18;;22668:148;;;;:::o;22822:377::-;22928:3;22956:39;22989:5;22956:39;:::i;:::-;23011:89;23093:6;23088:3;23011:89;:::i;:::-;23004:96;;23109:52;23154:6;23149:3;23142:4;23135:5;23131:16;23109:52;:::i;:::-;23186:6;23181:3;23177:16;23170:23;;22932:267;22822:377;;;;:::o;23205:435::-;23385:3;23407:95;23498:3;23489:6;23407:95;:::i;:::-;23400:102;;23519:95;23610:3;23601:6;23519:95;:::i;:::-;23512:102;;23631:3;23624:10;;23205:435;;;;;:::o;23646:173::-;23786:25;23782:1;23774:6;23770:14;23763:49;23646:173;:::o;23825:366::-;23967:3;23988:67;24052:2;24047:3;23988:67;:::i;:::-;23981:74;;24064:93;24153:3;24064:93;:::i;:::-;24182:2;24177:3;24173:12;24166:19;;23825:366;;;:::o;24197:419::-;24363:4;24401:2;24390:9;24386:18;24378:26;;24450:9;24444:4;24440:20;24436:1;24425:9;24421:17;24414:47;24478:131;24604:4;24478:131;:::i;:::-;24470:139;;24197:419;;;:::o;24622:240::-;24762:34;24758:1;24750:6;24746:14;24739:58;24831:23;24826:2;24818:6;24814:15;24807:48;24622:240;:::o;24868:366::-;25010:3;25031:67;25095:2;25090:3;25031:67;:::i;:::-;25024:74;;25107:93;25196:3;25107:93;:::i;:::-;25225:2;25220:3;25216:12;25209:19;;24868:366;;;:::o;25240:419::-;25406:4;25444:2;25433:9;25429:18;25421:26;;25493:9;25487:4;25483:20;25479:1;25468:9;25464:17;25457:47;25521:131;25647:4;25521:131;:::i;:::-;25513:139;;25240:419;;;:::o;25665:239::-;25805:34;25801:1;25793:6;25789:14;25782:58;25874:22;25869:2;25861:6;25857:15;25850:47;25665:239;:::o;25910:366::-;26052:3;26073:67;26137:2;26132:3;26073:67;:::i;:::-;26066:74;;26149:93;26238:3;26149:93;:::i;:::-;26267:2;26262:3;26258:12;26251:19;;25910:366;;;:::o;26282:419::-;26448:4;26486:2;26475:9;26471:18;26463:26;;26535:9;26529:4;26525:20;26521:1;26510:9;26506:17;26499:47;26563:131;26689:4;26563:131;:::i;:::-;26555:139;;26282:419;;;:::o;26707:225::-;26847:34;26843:1;26835:6;26831:14;26824:58;26916:8;26911:2;26903:6;26899:15;26892:33;26707:225;:::o;26938:366::-;27080:3;27101:67;27165:2;27160:3;27101:67;:::i;:::-;27094:74;;27177:93;27266:3;27177:93;:::i;:::-;27295:2;27290:3;27286:12;27279:19;;26938:366;;;:::o;27310:419::-;27476:4;27514:2;27503:9;27499:18;27491:26;;27563:9;27557:4;27553:20;27549:1;27538:9;27534:17;27527:47;27591:131;27717:4;27591:131;:::i;:::-;27583:139;;27310:419;;;:::o;27735:180::-;27783:77;27780:1;27773:88;27880:4;27877:1;27870:15;27904:4;27901:1;27894:15;27921:305;27961:3;27980:20;27998:1;27980:20;:::i;:::-;27975:25;;28014:20;28032:1;28014:20;:::i;:::-;28009:25;;28168:1;28100:66;28096:74;28093:1;28090:81;28087:107;;;28174:18;;:::i;:::-;28087:107;28218:1;28215;28211:9;28204:16;;27921:305;;;;:::o;28232:348::-;28272:7;28295:20;28313:1;28295:20;:::i;:::-;28290:25;;28329:20;28347:1;28329:20;:::i;:::-;28324:25;;28517:1;28449:66;28445:74;28442:1;28439:81;28434:1;28427:9;28420:17;28416:105;28413:131;;;28524:18;;:::i;:::-;28413:131;28572:1;28569;28565:9;28554:20;;28232:348;;;;:::o;28586:182::-;28726:34;28722:1;28714:6;28710:14;28703:58;28586:182;:::o;28774:366::-;28916:3;28937:67;29001:2;28996:3;28937:67;:::i;:::-;28930:74;;29013:93;29102:3;29013:93;:::i;:::-;29131:2;29126:3;29122:12;29115:19;;28774:366;;;:::o;29146:419::-;29312:4;29350:2;29339:9;29335:18;29327:26;;29399:9;29393:4;29389:20;29385:1;29374:9;29370:17;29363:47;29427:131;29553:4;29427:131;:::i;:::-;29419:139;;29146:419;;;:::o;29571:98::-;29622:6;29656:5;29650:12;29640:22;;29571:98;;;:::o;29675:168::-;29758:11;29792:6;29787:3;29780:19;29832:4;29827:3;29823:14;29808:29;;29675:168;;;;:::o;29849:360::-;29935:3;29963:38;29995:5;29963:38;:::i;:::-;30017:70;30080:6;30075:3;30017:70;:::i;:::-;30010:77;;30096:52;30141:6;30136:3;30129:4;30122:5;30118:16;30096:52;:::i;:::-;30173:29;30195:6;30173:29;:::i;:::-;30168:3;30164:39;30157:46;;29939:270;29849:360;;;;:::o;30215:640::-;30410:4;30448:3;30437:9;30433:19;30425:27;;30462:71;30530:1;30519:9;30515:17;30506:6;30462:71;:::i;:::-;30543:72;30611:2;30600:9;30596:18;30587:6;30543:72;:::i;:::-;30625;30693:2;30682:9;30678:18;30669:6;30625:72;:::i;:::-;30744:9;30738:4;30734:20;30729:2;30718:9;30714:18;30707:48;30772:76;30843:4;30834:6;30772:76;:::i;:::-;30764:84;;30215:640;;;;;;;:::o;30861:141::-;30917:5;30948:6;30942:13;30933:22;;30964:32;30990:5;30964:32;:::i;:::-;30861:141;;;;:::o;31008:349::-;31077:6;31126:2;31114:9;31105:7;31101:23;31097:32;31094:119;;;31132:79;;:::i;:::-;31094:119;31252:1;31277:63;31332:7;31323:6;31312:9;31308:22;31277:63;:::i;:::-;31267:73;;31223:127;31008:349;;;;:::o;31363:233::-;31402:3;31425:24;31443:5;31425:24;:::i;:::-;31416:33;;31471:66;31464:5;31461:77;31458:103;;31541:18;;:::i;:::-;31458:103;31588:1;31581:5;31577:13;31570:20;;31363:233;;;:::o;31602:180::-;31650:77;31647:1;31640:88;31747:4;31744:1;31737:15;31771:4;31768:1;31761:15;31788:185;31828:1;31845:20;31863:1;31845:20;:::i;:::-;31840:25;;31879:20;31897:1;31879:20;:::i;:::-;31874:25;;31918:1;31908:35;;31923:18;;:::i;:::-;31908:35;31965:1;31962;31958:9;31953:14;;31788:185;;;;:::o;31979:191::-;32019:4;32039:20;32057:1;32039:20;:::i;:::-;32034:25;;32073:20;32091:1;32073:20;:::i;:::-;32068:25;;32112:1;32109;32106:8;32103:34;;;32117:18;;:::i;:::-;32103:34;32162:1;32159;32155:9;32147:17;;31979:191;;;;:::o;32176:176::-;32208:1;32225:20;32243:1;32225:20;:::i;:::-;32220:25;;32259:20;32277:1;32259:20;:::i;:::-;32254:25;;32298:1;32288:35;;32303:18;;:::i;:::-;32288:35;32344:1;32341;32337:9;32332:14;;32176:176;;;;:::o;32358:180::-;32406:77;32403:1;32396:88;32503:4;32500:1;32493:15;32527:4;32524:1;32517:15

Swarm Source

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