ETH Price: $3,391.63 (-1.30%)
Gas: 2 Gwei

Token

Lazy Lions Bungalows (BUNGALOW)
 

Overview

Max Total Supply

10,262 BUNGALOW

Holders

4,798

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 BUNGALOW
0x178dbd0f897ee7551c8e6b4d667dde107de1e414
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Welcome to the home of Lazy Lions Bungalows on OpenSea. Discover the best items in this collection.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LazyLionsBungalows

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File @openzeppelin/contracts/utils/introspection/[email protected]

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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



// File @openzeppelin/contracts/access/[email protected]

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


// File @openzeppelin/contracts/utils/structs/[email protected]
pragma solidity ^0.8.0;

/**
 * @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential.
 * Largelly inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor].
 */
library BitMaps {
    struct BitMap {
        mapping(uint256 => uint256) _data;
    }

    /**
     * @dev Returns whether the bit at `index` is set.
     */
    function get(BitMap storage bitmap, uint256 index) internal view returns (bool) {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        return bitmap._data[bucket] & mask != 0;
    }

    /**
     * @dev Sets the bit at `index` to the boolean `value`.
     */
    function setTo(
        BitMap storage bitmap,
        uint256 index,
        bool value
    ) internal {
        if (value) {
            set(bitmap, index);
        } else {
            unset(bitmap, index);
        }
    }

    /**
     * @dev Sets the bit at `index`.
     */
    function set(BitMap storage bitmap, uint256 index) internal {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        bitmap._data[bucket] |= mask;
    }

    /**
     * @dev Unsets the bit at `index`.
     */
    function unset(BitMap storage bitmap, uint256 index) internal {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        bitmap._data[bucket] &= ~mask;
    }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

// File contracts/LazyLionsBungalows.sol
pragma solidity ^0.8.0;

contract LazyLionsBungalows is Ownable, ERC721Enumerable {

    using Counters for Counters.Counter;
    using Strings for uint256;

    // Private fields
    Counters.Counter private _tokenIds;

    // Public constants
    uint256 public constant BUYABLE_SUPPLY = 1500;
    uint256 public constant MAX_NFTS = 11600;

    // Real 0x8943C7bAC1914C9A7ABa750Bf2B6B09Fd21037E0
    address public constant LAZY_LIONS = 0x8943C7bAC1914C9A7ABa750Bf2B6B09Fd21037E0;

    uint256 public startingIndexBlock;

    uint256 public startingIndex;
    // Public fields
    bool public open = false;

    bool public openFree = false;

    string public bungalow_provenance = "";

    string public provenanceURI = "";

    bool public locked = false;

    uint256 public mintPrice = 0.3 ether;

    uint256 public mintAmount = 5;

    uint256 public bungalowReserve = 100;

    uint256 public bought = 0;

    string public baseURI = "";

    uint256 public REVEAL_TIMESTAMP;

    mapping(uint256 => bool) public seen;

    struct Frame {
        IERC721 external_nft;
        uint256 tokenId;
    }
    mapping(uint256 => mapping(uint256 => Frame)) public frames;
    
    modifier notLocked() {
        require(!locked, "Contract has been locked");
        _;
    }

    constructor() ERC721("Lazy Lions Bungalows", "BUNGALOW") {
        REVEAL_TIMESTAMP = block.timestamp;
    }

    function mint(uint256 quantity) public payable {
        require(open, "Drop not open yet");
        require(quantity > 0, "Quantity must be at least 1");
        require(BUYABLE_SUPPLY > bought, "Sold Out");

        if (quantity > mintAmount) {
            quantity = mintAmount;
        }

        if (quantity + bought > BUYABLE_SUPPLY) {
            quantity = BUYABLE_SUPPLY - bought;
        }



        uint256 price = getPrice(quantity);

        require(msg.value >= price, "Not enough ETH sent");

        for (uint256 i = 0; i < quantity; i++) {
            _mintInternal(msg.sender);
        }

        bought += quantity;

        uint256 remaining = msg.value - price;

        if (remaining > 0) {
            (bool success, ) = msg.sender.call{value: remaining}("");
            require(success);
        }


        if (startingIndexBlock == 0 && (bought == BUYABLE_SUPPLY || block.timestamp >= REVEAL_TIMESTAMP)) {
            startingIndexBlock = block.number;
        }
    }

    function mintFree() public {
        require(openFree, "Drop not open yet");
        ERC721Enumerable nfts = ERC721Enumerable(LAZY_LIONS);
        uint256 numNFTs = nfts.balanceOf(msg.sender);
        for (uint256 i = 0; i < numNFTs; i++) {
            uint256 nftId = nfts.tokenOfOwnerByIndex(msg.sender, i);
            if (seen[nftId]) {
                continue;
            }
            seen[nftId] = true;
            _mintInternal(msg.sender);
        }
    }
    function mintFreeOne() public {
        require(openFree, "Drop not open yet");

        ERC721Enumerable nfts = ERC721Enumerable(LAZY_LIONS);
        uint256 numNFTs = nfts.balanceOf(msg.sender);
        for (uint256 i = 0; i < numNFTs; i++) {
            uint256 nftId = nfts.tokenOfOwnerByIndex(msg.sender, i);
            if (seen[nftId]) {
                continue;
            }
            seen[nftId] = true;
            i = i+numNFTs;
            _mintInternal(msg.sender);
        }
    }

    function mintFreeSome(uint256 _indexStart, uint256 _indexEnd) public {
        require(openFree, "Drop not open yet");

        ERC721Enumerable nfts = ERC721Enumerable(LAZY_LIONS);
        uint256 numNFTs = nfts.balanceOf(msg.sender);
        require(_indexEnd < numNFTs, "Not Enough Lions");
        for (uint256 i = _indexStart; i <= _indexEnd; i++) {
            uint256 nftId = nfts.tokenOfOwnerByIndex(msg.sender, i);
            if (seen[nftId]) {
                continue;
            }
            seen[nftId] = true;
            _mintInternal(msg.sender);
        }
    }
    function freeMints(address owner) external view returns (uint256) {
        uint256 total = 0;
        ERC721Enumerable nfts = ERC721Enumerable(LAZY_LIONS);
        uint256 numNFTs = nfts.balanceOf(owner);
        for (uint256 i = 0; i < numNFTs; i++) {
            uint256 nftId = nfts.tokenOfOwnerByIndex(owner, i);
            if (seen[nftId]) {
                continue;
            }
            total += 1;
        }
        return total;
    }


    function getPrice(uint256 quantity) public view returns (uint256) {
        require(quantity <= BUYABLE_SUPPLY);
        return quantity*mintPrice;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            tokenId < totalSupply(),
            "URI query for nonexistent token"
        );
        return string(abi.encodePacked(baseURI, tokenId.toString()));
    }
    function tokensOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index =0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
    function setFrame(IERC721 _external_nft, uint256 _content, uint256 _bungalow, uint256 _frame_index)
        external
    {
        require(msg.sender == ownerOf(_bungalow), "Must Own bungalow to Set Frames");
        require(_frame_index < 3, "Ran out of frames");
        //IERC721 external_nft = IERC721(_nft);
        require(msg.sender == _external_nft.ownerOf(_content), "Must own content");
        frames[_bungalow][_frame_index] = Frame(_external_nft, _content);

    }

    function getFrames(uint256 _tokenId) external view returns (Frame[3] memory)
    {
        Frame[3] memory results = [frames[_tokenId][0], frames[_tokenId][1], frames[_tokenId][2]];
        return results;
    }
    

    function reserveBungalows(address _to, uint256 _reserveAmount) public onlyOwner {
        require(_reserveAmount > 0 && _reserveAmount <= bungalowReserve, "Not Enough reserves left for team");
        for (uint256 i = 0; i < _reserveAmount; i++) {
            _mintInternal(_to);
        }
        bungalowReserve = bungalowReserve - _reserveAmount;
    }

    function setMintAmount(uint256 amount) external onlyOwner {
        mintAmount = amount;
    }

    function setMintPrice(uint256 price) external onlyOwner {
        mintPrice = price;
    }

    function setOpen(bool shouldOpen) external onlyOwner {
        open = shouldOpen;
    }

    function setOpenFree(bool shouldOpen) external onlyOwner {
        openFree = shouldOpen;
    }

    function setBaseURI(string memory newBaseURI) external onlyOwner notLocked {
        baseURI = newBaseURI;
    }

    function setProvenanceURI(string memory _provenanceURI)
        external
        onlyOwner
        notLocked
    {
        provenanceURI = _provenanceURI;
    }

    function setProvenance(string memory _provenance)
        external
        onlyOwner
        notLocked
    {
        bungalow_provenance = _provenance;
    }

    function setRevealTimestamp(uint256 revealTimeStamp) public onlyOwner {
        REVEAL_TIMESTAMP = revealTimeStamp;
    } 



    function lock() external onlyOwner {
        locked = true;
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        (bool success, ) = msg.sender.call{value: balance}("");
        require(success);
    }

    function partialWithdraw(uint256 _amount, address payable _to) external onlyOwner {
        require(_amount > 0, "Withdraw Must be greater than 0");
        require(_amount <= address(this).balance, "Amount too high");
        (bool success, ) = _to.call{value: _amount}("");
        require(success);
    }


    function _mintInternal(address owner) private {
        uint256 newItemId = _tokenIds.current();
        _safeMint(owner, newItemId);
        _tokenIds.increment();
    }


    function setStartingIndex() public {
        require(startingIndex == 0, "Starting index is already set");
        require(startingIndexBlock != 0, "Starting index block must be set");
        
        startingIndex = uint(blockhash(startingIndexBlock)) % MAX_NFTS;

        if (block.number - startingIndexBlock > 255) {
            startingIndex = uint(blockhash(block.number - 1)) % MAX_NFTS;
        }

        if (startingIndex == 0) {
            startingIndex = startingIndex + 1;
        }
    }


    function emergencySetStartingIndexBlock() public onlyOwner {
        require(startingIndex == 0, "Starting index is already set");
        
        startingIndexBlock = block.number;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BUYABLE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LAZY_LIONS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEAL_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bought","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bungalowReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bungalow_provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"frames","outputs":[{"internalType":"contract IERC721","name":"external_nft","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"freeMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFrames","outputs":[{"components":[{"internalType":"contract IERC721","name":"external_nft","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct LazyLionsBungalows.Frame[3]","name":"","type":"tuple[3]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintFreeOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_indexStart","type":"uint256"},{"internalType":"uint256","name":"_indexEnd","type":"uint256"}],"name":"mintFreeSome","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPrice","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":"open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable","name":"_to","type":"address"}],"name":"partialWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"provenanceURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveBungalows","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"seen","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"_external_nft","type":"address"},{"internalType":"uint256","name":"_content","type":"uint256"},{"internalType":"uint256","name":"_bungalow","type":"uint256"},{"internalType":"uint256","name":"_frame_index","type":"uint256"}],"name":"setFrame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"shouldOpen","type":"bool"}],"name":"setOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"shouldOpen","type":"bool"}],"name":"setOpenFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceURI","type":"string"}],"name":"setProvenanceURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"revealTimeStamp","type":"uint256"}],"name":"setRevealTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600e805461ffff1916905560a06040819052600060808190526200002691600f9162000199565b50604080516020810191829052600090819052620000479160109162000199565b506011805460ff19169055670429d069189e000060125560056013556064601455600060158190556040805160208101918290528290526200008d916016919062000199565b503480156200009b57600080fd5b506040518060400160405280601481526020017f4c617a79204c696f6e732042756e67616c6f77730000000000000000000000008152506040518060400160405280600881526020016742554e47414c4f5760c01b8152506200010d620001076200014560201b60201c565b62000149565b81516200012290600190602085019062000199565b5080516200013890600290602084019062000199565b505042601755506200027c565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001a7906200023f565b90600052602060002090601f016020900481019282620001cb576000855562000216565b82601f10620001e657805160ff191683800117855562000216565b8280016001018555821562000216579182015b8281111562000216578251825591602001919060010190620001f9565b506200022492915062000228565b5090565b5b8082111562000224576000815560010162000229565b600181811c908216806200025457607f821691505b602082108114156200027657634e487b7160e01b600052602260045260246000fd5b50919050565b613821806200028c6000396000f3fe6080604052600436106103975760003560e01c80637f501d04116101dc578063c7cd997f11610102578063e7572230116100a0578063f4a0a5281161006f578063f4a0a52814610a97578063f83d08ba14610ab7578063fcfff16f14610acc578063ffe630b514610ae657600080fd5b8063e7572230146109f9578063e985e9c514610a19578063e986655014610a62578063f2fde38b14610a7757600080fd5b8063cbe97649116100dc578063cbe976491461098b578063cf309012146109a1578063df0e5181146109bb578063e36d6498146109e357600080fd5b8063c7cd997f14610935578063c87b56dd14610955578063cb774d471461097557600080fd5b8063987fa94f1161017a578063a22cb46511610149578063a22cb465146108b5578063a9373d94146108d5578063b2b12525146108f5578063b88d4fde1461091557600080fd5b8063987fa94f1461085757806399a2e7a114610877578063a063f8471461088d578063a0712d68146108a257600080fd5b80638da5cb5b116101b65780638da5cb5b1461079a5780638e8c32f9146107b85780639530703b146107d857806395d89b411461084257600080fd5b80637f501d04146107285780638462151c146107585780638ab534471461078557600080fd5b806342e9894c116102c15780636c0360eb1161025f578063715018a61161022e578063715018a6146106c957806373debd96146106de5780637d17fcbe146106fe5780637e6c4d5e1461071357600080fd5b80636c0360eb146106545780636d41d4fb146106695780636fdca5e01461068957806370a08231146106a957600080fd5b80635a2bcc181161029b5780635a2bcc18146105f35780636352211e1461060957806365477dc0146106295780636817c76c1461063e57600080fd5b806342e9894c146105865780634f6ccce7146105b357806355f804b3146105d357600080fd5b806318160ddd116103395780632f745c59116103085780632f745c591461051b57806334976b9b1461053b5780633ccfd60b1461055157806342842e0e1461056657600080fd5b806318160ddd146104b057806318e20a38146104c55780631d97f38e146104db57806323b872dd146104fb57600080fd5b8063081812fc11610375578063081812fc14610415578063093d8c641461044d578063095ea7b3146104715780631644fa8e1461049157600080fd5b8063018a2c371461039c57806301ffc9a7146103be57806306fdde03146103f3575b600080fd5b3480156103a857600080fd5b506103bc6103b73660046132e4565b610b06565b005b3480156103ca57600080fd5b506103de6103d9366004613226565b610b3e565b60405190151581526020015b60405180910390f35b3480156103ff57600080fd5b50610408610b69565b6040516103ea9190613513565b34801561042157600080fd5b506104356104303660046132e4565b610bfb565b6040516001600160a01b0390911681526020016103ea565b34801561045957600080fd5b50610463612d5081565b6040519081526020016103ea565b34801561047d57600080fd5b506103bc61048c3660046131df565b610c90565b34801561049d57600080fd5b50600e546103de90610100900460ff1681565b3480156104bc57600080fd5b50600954610463565b3480156104d157600080fd5b5061046360175481565b3480156104e757600080fd5b506103bc6104f6366004613316565b610da6565b34801561050757600080fd5b506103bc6105163660046130e9565b610ec2565b34801561052757600080fd5b506104636105363660046131df565b610ef3565b34801561054757600080fd5b5061046360155481565b34801561055d57600080fd5b506103bc610f89565b34801561057257600080fd5b506103bc6105813660046130e9565b61100e565b34801561059257600080fd5b506105a66105a13660046132e4565b611029565b6040516103ea9190613489565b3480156105bf57600080fd5b506104636105ce3660046132e4565b6110c2565b3480156105df57600080fd5b506103bc6105ee36600461329b565b611155565b3480156105ff57600080fd5b5061046360135481565b34801561061557600080fd5b506104356106243660046132e4565b6111b5565b34801561063557600080fd5b5061040861122c565b34801561064a57600080fd5b5061046360125481565b34801561066057600080fd5b506104086112ba565b34801561067557600080fd5b5061046361068436600461306f565b6112c7565b34801561069557600080fd5b506103bc6106a436600461320b565b611437565b3480156106b557600080fd5b506104636106c436600461306f565b611474565b3480156106d557600080fd5b506103bc6114fb565b3480156106ea57600080fd5b506103bc6106f936600461333b565b611531565b34801561070a57600080fd5b506103bc61170a565b34801561071f57600080fd5b5061040861178a565b34801561073457600080fd5b506103de6107433660046132e4565b60186020526000908152604090205460ff1681565b34801561076457600080fd5b5061077861077336600461306f565b611797565b6040516103ea91906134cf565b34801561079157600080fd5b506103bc611856565b3480156107a657600080fd5b506000546001600160a01b0316610435565b3480156107c457600080fd5b506103bc6107d3366004613260565b6119e8565b3480156107e457600080fd5b506108236107f336600461333b565b6019602090815260009283526040808420909152908252902080546001909101546001600160a01b039091169082565b604080516001600160a01b0390931683526020830191909152016103ea565b34801561084e57600080fd5b50610408611bb3565b34801561086357600080fd5b506103bc61087236600461320b565b611bc2565b34801561088357600080fd5b506104636105dc81565b34801561089957600080fd5b506103bc611c06565b6103bc6108b03660046132e4565b611da4565b3480156108c157600080fd5b506103bc6108d03660046131aa565b611fb6565b3480156108e157600080fd5b506103bc6108f036600461329b565b61207b565b34801561090157600080fd5b506103bc6109103660046131df565b6120db565b34801561092157600080fd5b506103bc61093036600461312a565b6121a9565b34801561094157600080fd5b506103bc6109503660046132e4565b6121e1565b34801561096157600080fd5b506104086109703660046132e4565b612210565b34801561098157600080fd5b50610463600d5481565b34801561099757600080fd5b5061046360145481565b3480156109ad57600080fd5b506011546103de9060ff1681565b3480156109c757600080fd5b50610435738943c7bac1914c9a7aba750bf2b6b09fd21037e081565b3480156109ef57600080fd5b50610463600c5481565b348015610a0557600080fd5b50610463610a143660046132e4565b61229b565b348015610a2557600080fd5b506103de610a343660046130b0565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a6e57600080fd5b506103bc6122b9565b348015610a8357600080fd5b506103bc610a9236600461306f565b6123b9565b348015610aa357600080fd5b506103bc610ab23660046132e4565b612454565b348015610ac357600080fd5b506103bc612483565b348015610ad857600080fd5b50600e546103de9060ff1681565b348015610af257600080fd5b506103bc610b0136600461329b565b6124bc565b6000546001600160a01b03163314610b395760405162461bcd60e51b8152600401610b30906135af565b60405180910390fd5b601755565b60006001600160e01b0319821663780e9d6360e01b1480610b635750610b638261251c565b92915050565b606060018054610b78906136ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba4906136ee565b8015610bf15780601f10610bc657610100808354040283529160200191610bf1565b820191906000526020600020905b815481529060010190602001808311610bd457829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610c745760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b30565b506000908152600560205260409020546001600160a01b031690565b6000610c9b826111b5565b9050806001600160a01b0316836001600160a01b03161415610d095760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b30565b336001600160a01b0382161480610d255750610d258133610a34565b610d975760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b30565b610da1838361256c565b505050565b6000546001600160a01b03163314610dd05760405162461bcd60e51b8152600401610b30906135af565b60008211610e205760405162461bcd60e51b815260206004820152601f60248201527f5769746864726177204d7573742062652067726561746572207468616e2030006044820152606401610b30565b47821115610e625760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840e8dede40d0d2ced608b1b6044820152606401610b30565b6000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114610eaf576040519150601f19603f3d011682016040523d82523d6000602084013e610eb4565b606091505b5050905080610da157600080fd5b610ecc33826125da565b610ee85760405162461bcd60e51b8152600401610b309061360f565b610da18383836126d1565b6000610efe83611474565b8210610f605760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b30565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000546001600160a01b03163314610fb35760405162461bcd60e51b8152600401610b30906135af565b6040514790600090339083908381818185875af1925050503d8060008114610ff7576040519150601f19603f3d011682016040523d82523d6000602084013e610ffc565b606091505b505090508061100a57600080fd5b5050565b610da1838383604051806020016040528060008152506121a9565b611031612f12565b506040805160009283526019602090815282842084805280825283852060a08401855280546001600160a01b039081166060860190815260019283015460808701528552818752828452858720865180880188528154831681529083015481860152848601526002875291835294849020845180860186528154909216825290940154908401529081019190915290565b60006110cd60095490565b82106111305760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b30565b6009828154811061114357611143613794565b90600052602060002001549050919050565b6000546001600160a01b0316331461117f5760405162461bcd60e51b8152600401610b30906135af565b60115460ff16156111a25760405162461bcd60e51b8152600401610b3090613526565b805161100a906016906020840190612f4b565b6000818152600360205260408120546001600160a01b031680610b635760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b30565b60108054611239906136ee565b80601f0160208091040260200160405190810160405280929190818152602001828054611265906136ee565b80156112b25780601f10611287576101008083540402835291602001916112b2565b820191906000526020600020905b81548152906001019060200180831161129557829003601f168201915b505050505081565b60168054611239906136ee565b6040516370a0823160e01b81526001600160a01b03821660048201526000908190738943c7bac1914c9a7aba750bf2b6b09fd21037e090829082906370a082319060240160206040518083038186803b15801561132357600080fd5b505afa158015611337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135b91906132fd565b905060005b8181101561142d57604051632f745c5960e01b81526001600160a01b0387811660048301526024820183905260009190851690632f745c599060440160206040518083038186803b1580156113b457600080fd5b505afa1580156113c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ec91906132fd565b60008181526018602052604090205490915060ff161561140c575061141b565b611417600186613660565b9450505b8061142581613723565b915050611360565b5091949350505050565b6000546001600160a01b031633146114615760405162461bcd60e51b8152600401610b30906135af565b600e805460ff1916911515919091179055565b60006001600160a01b0382166114df5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b30565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146115255760405162461bcd60e51b8152600401610b30906135af565b61152f600061287c565b565b600e54610100900460ff166115585760405162461bcd60e51b8152600401610b30906135e4565b6040516370a0823160e01b8152336004820152738943c7bac1914c9a7aba750bf2b6b09fd21037e09060009082906370a082319060240160206040518083038186803b1580156115a757600080fd5b505afa1580156115bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115df91906132fd565b90508083106116235760405162461bcd60e51b815260206004820152601060248201526f4e6f7420456e6f756768204c696f6e7360801b6044820152606401610b30565b835b83811161170357604051632f745c5960e01b8152336004820152602481018290526000906001600160a01b03851690632f745c599060440160206040518083038186803b15801561167557600080fd5b505afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad91906132fd565b60008181526018602052604090205490915060ff16156116cd57506116f1565b6000818152601860205260409020805460ff191660011790556116ef336128cc565b505b806116fb81613723565b915050611625565b5050505050565b6000546001600160a01b031633146117345760405162461bcd60e51b8152600401610b30906135af565b600d54156117845760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610b30565b43600c55565b600f8054611239906136ee565b606060006117a483611474565b9050806117c55760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156117e0576117e06137aa565b604051908082528060200260200182016040528015611809578160200160208202803683370190505b50905060005b828110156117bd576118218582610ef3565b82828151811061183357611833613794565b60209081029190910101528061184881613723565b91505061180f565b50919050565b600e54610100900460ff1661187d5760405162461bcd60e51b8152600401610b30906135e4565b6040516370a0823160e01b8152336004820152738943c7bac1914c9a7aba750bf2b6b09fd21037e09060009082906370a082319060240160206040518083038186803b1580156118cc57600080fd5b505afa1580156118e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190491906132fd565b905060005b81811015610da157604051632f745c5960e01b8152336004820152602481018290526000906001600160a01b03851690632f745c599060440160206040518083038186803b15801561195a57600080fd5b505afa15801561196e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199291906132fd565b60008181526018602052604090205490915060ff16156119b257506119d6565b6000818152601860205260409020805460ff191660011790556119d4336128cc565b505b806119e081613723565b915050611909565b6119f1826111b5565b6001600160a01b0316336001600160a01b031614611a515760405162461bcd60e51b815260206004820152601f60248201527f4d757374204f776e2062756e67616c6f7720746f20536574204672616d6573006044820152606401610b30565b60038110611a955760405162461bcd60e51b815260206004820152601160248201527052616e206f7574206f66206672616d657360781b6044820152606401610b30565b6040516331a9108f60e11b8152600481018490526001600160a01b03851690636352211e9060240160206040518083038186803b158015611ad557600080fd5b505afa158015611ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0d9190613093565b6001600160a01b0316336001600160a01b031614611b605760405162461bcd60e51b815260206004820152601060248201526f135d5cdd081bdddb8818dbdb9d195b9d60821b6044820152606401610b30565b6040805180820182526001600160a01b039586168152602080820195865260009485526019815282852093855292909252909120905181546001600160a01b031916931692909217825551600190910155565b606060028054610b78906136ee565b6000546001600160a01b03163314611bec5760405162461bcd60e51b8152600401610b30906135af565b600e80549115156101000261ff0019909216919091179055565b600e54610100900460ff16611c2d5760405162461bcd60e51b8152600401610b30906135e4565b6040516370a0823160e01b8152336004820152738943c7bac1914c9a7aba750bf2b6b09fd21037e09060009082906370a082319060240160206040518083038186803b158015611c7c57600080fd5b505afa158015611c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb491906132fd565b905060005b81811015610da157604051632f745c5960e01b8152336004820152602481018290526000906001600160a01b03851690632f745c599060440160206040518083038186803b158015611d0a57600080fd5b505afa158015611d1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4291906132fd565b60008181526018602052604090205490915060ff1615611d625750611d92565b6000818152601860205260409020805460ff19166001179055611d858383613660565b9150611d90336128cc565b505b80611d9c81613723565b915050611cb9565b600e5460ff16611dc65760405162461bcd60e51b8152600401610b30906135e4565b60008111611e165760405162461bcd60e51b815260206004820152601b60248201527f5175616e74697479206d757374206265206174206c65617374203100000000006044820152606401610b30565b6015546105dc11611e545760405162461bcd60e51b815260206004820152600860248201526714dbdb190813dd5d60c21b6044820152606401610b30565b601354811115611e6357506013545b6105dc60155482611e749190613660565b1115611e8c57601554611e89906105dc6136ab565b90505b6000611e978261229b565b905080341015611edf5760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b6044820152606401610b30565b60005b82811015611f0557611ef3336128cc565b80611efd81613723565b915050611ee2565b508160156000828254611f189190613660565b9091555060009050611f2a82346136ab565b90508015611f8957604051600090339083908381818185875af1925050503d8060008114611f74576040519150601f19603f3d011682016040523d82523d6000602084013e611f79565b606091505b5050905080611f8757600080fd5b505b600c54158015611fa857506105dc6015541480611fa857506017544210155b15610da15743600c55505050565b6001600160a01b03821633141561200f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b30565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146120a55760405162461bcd60e51b8152600401610b30906135af565b60115460ff16156120c85760405162461bcd60e51b8152600401610b3090613526565b805161100a906010906020840190612f4b565b6000546001600160a01b031633146121055760405162461bcd60e51b8152600401610b30906135af565b60008111801561211757506014548111155b61216d5760405162461bcd60e51b815260206004820152602160248201527f4e6f7420456e6f756768207265736572766573206c65667420666f72207465616044820152606d60f81b6064820152608401610b30565b60005b8181101561219357612181836128cc565b8061218b81613723565b915050612170565b50806014546121a291906136ab565b6014555050565b6121b333836125da565b6121cf5760405162461bcd60e51b8152600401610b309061360f565b6121db848484846128f1565b50505050565b6000546001600160a01b0316331461220b5760405162461bcd60e51b8152600401610b30906135af565b601355565b606061221b60095490565b82106122695760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610b30565b601661227483612924565b6040516020016122859291906133a5565b6040516020818303038152906040529050919050565b60006105dc8211156122ac57600080fd5b601254610b63908361368c565b600d54156123095760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610b30565b600c546123585760405162461bcd60e51b815260206004820181905260248201527f5374617274696e6720696e64657820626c6f636b206d757374206265207365746044820152606401610b30565b600c5461236990612d50904061373e565b600d55600c5460ff9061237c90436136ab565b111561239f57612d506123906001436136ab565b61239b91904061373e565b600d555b600d5461152f57600d546123b4906001613660565b600d55565b6000546001600160a01b031633146123e35760405162461bcd60e51b8152600401610b30906135af565b6001600160a01b0381166124485760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b30565b6124518161287c565b50565b6000546001600160a01b0316331461247e5760405162461bcd60e51b8152600401610b30906135af565b601255565b6000546001600160a01b031633146124ad5760405162461bcd60e51b8152600401610b30906135af565b6011805460ff19166001179055565b6000546001600160a01b031633146124e65760405162461bcd60e51b8152600401610b30906135af565b60115460ff16156125095760405162461bcd60e51b8152600401610b3090613526565b805161100a90600f906020840190612f4b565b60006001600160e01b031982166380ac58cd60e01b148061254d57506001600160e01b03198216635b5e139f60e01b145b80610b6357506301ffc9a760e01b6001600160e01b0319831614610b63565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906125a1826111b5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166126535760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b30565b600061265e836111b5565b9050806001600160a01b0316846001600160a01b031614806126995750836001600160a01b031661268e84610bfb565b6001600160a01b0316145b806126c957506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166126e4826111b5565b6001600160a01b03161461274c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b30565b6001600160a01b0382166127ae5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b30565b6127b9838383612a22565b6127c460008261256c565b6001600160a01b03831660009081526004602052604081208054600192906127ed9084906136ab565b90915550506001600160a01b038216600090815260046020526040812080546001929061281b908490613660565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006128d7600b5490565b90506128e38282612ada565b61100a600b80546001019055565b6128fc8484846126d1565b61290884848484612af4565b6121db5760405162461bcd60e51b8152600401610b309061355d565b6060816129485750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612972578061295c81613723565b915061296b9050600a83613678565b915061294c565b60008167ffffffffffffffff81111561298d5761298d6137aa565b6040519080825280601f01601f1916602001820160405280156129b7576020820181803683370190505b5090505b84156126c9576129cc6001836136ab565b91506129d9600a8661373e565b6129e4906030613660565b60f81b8183815181106129f9576129f9613794565b60200101906001600160f81b031916908160001a905350612a1b600a86613678565b94506129bb565b6001600160a01b038316612a7d57612a7881600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612aa0565b816001600160a01b0316836001600160a01b031614612aa057612aa08382612c01565b6001600160a01b038216612ab757610da181612c9e565b826001600160a01b0316826001600160a01b031614610da157610da18282612d4d565b61100a828260405180602001604052806000815250612d91565b60006001600160a01b0384163b15612bf657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b3890339089908890889060040161344c565b602060405180830381600087803b158015612b5257600080fd5b505af1925050508015612b82575060408051601f3d908101601f19168201909252612b7f91810190613243565b60015b612bdc573d808015612bb0576040519150601f19603f3d011682016040523d82523d6000602084013e612bb5565b606091505b508051612bd45760405162461bcd60e51b8152600401610b309061355d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506126c9565b506001949350505050565b60006001612c0e84611474565b612c1891906136ab565b600083815260086020526040902054909150808214612c6b576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b600954600090612cb0906001906136ab565b6000838152600a602052604081205460098054939450909284908110612cd857612cd8613794565b906000526020600020015490508060098381548110612cf957612cf9613794565b6000918252602080832090910192909255828152600a90915260408082208490558582528120556009805480612d3157612d3161377e565b6001900381819060005260206000200160009055905550505050565b6000612d5883611474565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b612d9b8383612dc4565b612da86000848484612af4565b610da15760405162461bcd60e51b8152600401610b309061355d565b6001600160a01b038216612e1a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b30565b6000818152600360205260409020546001600160a01b031615612e7f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b30565b612e8b60008383612a22565b6001600160a01b0382166000908152600460205260408120805460019290612eb4908490613660565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60405180606001604052806003905b6040805180820190915260008082526020820152815260200190600190039081612f215790505090565b828054612f57906136ee565b90600052602060002090601f016020900481019282612f795760008555612fbf565b82601f10612f9257805160ff1916838001178555612fbf565b82800160010185558215612fbf579182015b82811115612fbf578251825591602001919060010190612fa4565b50612fcb929150612fcf565b5090565b5b80821115612fcb5760008155600101612fd0565b600067ffffffffffffffff80841115612fff57612fff6137aa565b604051601f8501601f19908116603f01168101908282118183101715613027576130276137aa565b8160405280935085815286868601111561304057600080fd5b858560208301376000602087830101525050509392505050565b8035801515811461306a57600080fd5b919050565b60006020828403121561308157600080fd5b813561308c816137c0565b9392505050565b6000602082840312156130a557600080fd5b815161308c816137c0565b600080604083850312156130c357600080fd5b82356130ce816137c0565b915060208301356130de816137c0565b809150509250929050565b6000806000606084860312156130fe57600080fd5b8335613109816137c0565b92506020840135613119816137c0565b929592945050506040919091013590565b6000806000806080858703121561314057600080fd5b843561314b816137c0565b9350602085013561315b816137c0565b925060408501359150606085013567ffffffffffffffff81111561317e57600080fd5b8501601f8101871361318f57600080fd5b61319e87823560208401612fe4565b91505092959194509250565b600080604083850312156131bd57600080fd5b82356131c8816137c0565b91506131d66020840161305a565b90509250929050565b600080604083850312156131f257600080fd5b82356131fd816137c0565b946020939093013593505050565b60006020828403121561321d57600080fd5b61308c8261305a565b60006020828403121561323857600080fd5b813561308c816137d5565b60006020828403121561325557600080fd5b815161308c816137d5565b6000806000806080858703121561327657600080fd5b8435613281816137c0565b966020860135965060408601359560600135945092505050565b6000602082840312156132ad57600080fd5b813567ffffffffffffffff8111156132c457600080fd5b8201601f810184136132d557600080fd5b6126c984823560208401612fe4565b6000602082840312156132f657600080fd5b5035919050565b60006020828403121561330f57600080fd5b5051919050565b6000806040838503121561332957600080fd5b8235915060208301356130de816137c0565b6000806040838503121561334e57600080fd5b50508035926020909101359150565b600081518084526133758160208601602086016136c2565b601f01601f19169290920160200192915050565b6000815161339b8185602086016136c2565b9290920192915050565b600080845481600182811c9150808316806133c157607f831692505b60208084108214156133e157634e487b7160e01b86526022600452602486fd5b8180156133f5576001811461340657613433565b60ff19861689528489019650613433565b60008b81526020902060005b8681101561342b5781548b820152908501908301613412565b505084890196505b5050505050506134438185613389565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061347f9083018461335d565b9695505050505050565b60c08101818360005b60038110156134c657815180516001600160a01b031684526020908101518185015260409093019290910190600101613492565b50505092915050565b6020808252825182820181905260009190848201906040850190845b81811015613507578351835292840192918401916001016134eb565b50909695505050505050565b60208152600061308c602083018461335d565b60208082526018908201527f436f6e747261637420686173206265656e206c6f636b65640000000000000000604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260119082015270111c9bdc081b9bdd081bdc195b881e595d607a1b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561367357613673613752565b500190565b60008261368757613687613768565b500490565b60008160001904831182151516156136a6576136a6613752565b500290565b6000828210156136bd576136bd613752565b500390565b60005b838110156136dd5781810151838201526020016136c5565b838111156121db5750506000910152565b600181811c9082168061370257607f821691505b6020821081141561185057634e487b7160e01b600052602260045260246000fd5b600060001982141561373757613737613752565b5060010190565b60008261374d5761374d613768565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461245157600080fd5b6001600160e01b03198116811461245157600080fdfea2646970667358221220d680872251d69ebc3c0014a3d1681b2d1df4927252e689e20d97049682bafabb64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106103975760003560e01c80637f501d04116101dc578063c7cd997f11610102578063e7572230116100a0578063f4a0a5281161006f578063f4a0a52814610a97578063f83d08ba14610ab7578063fcfff16f14610acc578063ffe630b514610ae657600080fd5b8063e7572230146109f9578063e985e9c514610a19578063e986655014610a62578063f2fde38b14610a7757600080fd5b8063cbe97649116100dc578063cbe976491461098b578063cf309012146109a1578063df0e5181146109bb578063e36d6498146109e357600080fd5b8063c7cd997f14610935578063c87b56dd14610955578063cb774d471461097557600080fd5b8063987fa94f1161017a578063a22cb46511610149578063a22cb465146108b5578063a9373d94146108d5578063b2b12525146108f5578063b88d4fde1461091557600080fd5b8063987fa94f1461085757806399a2e7a114610877578063a063f8471461088d578063a0712d68146108a257600080fd5b80638da5cb5b116101b65780638da5cb5b1461079a5780638e8c32f9146107b85780639530703b146107d857806395d89b411461084257600080fd5b80637f501d04146107285780638462151c146107585780638ab534471461078557600080fd5b806342e9894c116102c15780636c0360eb1161025f578063715018a61161022e578063715018a6146106c957806373debd96146106de5780637d17fcbe146106fe5780637e6c4d5e1461071357600080fd5b80636c0360eb146106545780636d41d4fb146106695780636fdca5e01461068957806370a08231146106a957600080fd5b80635a2bcc181161029b5780635a2bcc18146105f35780636352211e1461060957806365477dc0146106295780636817c76c1461063e57600080fd5b806342e9894c146105865780634f6ccce7146105b357806355f804b3146105d357600080fd5b806318160ddd116103395780632f745c59116103085780632f745c591461051b57806334976b9b1461053b5780633ccfd60b1461055157806342842e0e1461056657600080fd5b806318160ddd146104b057806318e20a38146104c55780631d97f38e146104db57806323b872dd146104fb57600080fd5b8063081812fc11610375578063081812fc14610415578063093d8c641461044d578063095ea7b3146104715780631644fa8e1461049157600080fd5b8063018a2c371461039c57806301ffc9a7146103be57806306fdde03146103f3575b600080fd5b3480156103a857600080fd5b506103bc6103b73660046132e4565b610b06565b005b3480156103ca57600080fd5b506103de6103d9366004613226565b610b3e565b60405190151581526020015b60405180910390f35b3480156103ff57600080fd5b50610408610b69565b6040516103ea9190613513565b34801561042157600080fd5b506104356104303660046132e4565b610bfb565b6040516001600160a01b0390911681526020016103ea565b34801561045957600080fd5b50610463612d5081565b6040519081526020016103ea565b34801561047d57600080fd5b506103bc61048c3660046131df565b610c90565b34801561049d57600080fd5b50600e546103de90610100900460ff1681565b3480156104bc57600080fd5b50600954610463565b3480156104d157600080fd5b5061046360175481565b3480156104e757600080fd5b506103bc6104f6366004613316565b610da6565b34801561050757600080fd5b506103bc6105163660046130e9565b610ec2565b34801561052757600080fd5b506104636105363660046131df565b610ef3565b34801561054757600080fd5b5061046360155481565b34801561055d57600080fd5b506103bc610f89565b34801561057257600080fd5b506103bc6105813660046130e9565b61100e565b34801561059257600080fd5b506105a66105a13660046132e4565b611029565b6040516103ea9190613489565b3480156105bf57600080fd5b506104636105ce3660046132e4565b6110c2565b3480156105df57600080fd5b506103bc6105ee36600461329b565b611155565b3480156105ff57600080fd5b5061046360135481565b34801561061557600080fd5b506104356106243660046132e4565b6111b5565b34801561063557600080fd5b5061040861122c565b34801561064a57600080fd5b5061046360125481565b34801561066057600080fd5b506104086112ba565b34801561067557600080fd5b5061046361068436600461306f565b6112c7565b34801561069557600080fd5b506103bc6106a436600461320b565b611437565b3480156106b557600080fd5b506104636106c436600461306f565b611474565b3480156106d557600080fd5b506103bc6114fb565b3480156106ea57600080fd5b506103bc6106f936600461333b565b611531565b34801561070a57600080fd5b506103bc61170a565b34801561071f57600080fd5b5061040861178a565b34801561073457600080fd5b506103de6107433660046132e4565b60186020526000908152604090205460ff1681565b34801561076457600080fd5b5061077861077336600461306f565b611797565b6040516103ea91906134cf565b34801561079157600080fd5b506103bc611856565b3480156107a657600080fd5b506000546001600160a01b0316610435565b3480156107c457600080fd5b506103bc6107d3366004613260565b6119e8565b3480156107e457600080fd5b506108236107f336600461333b565b6019602090815260009283526040808420909152908252902080546001909101546001600160a01b039091169082565b604080516001600160a01b0390931683526020830191909152016103ea565b34801561084e57600080fd5b50610408611bb3565b34801561086357600080fd5b506103bc61087236600461320b565b611bc2565b34801561088357600080fd5b506104636105dc81565b34801561089957600080fd5b506103bc611c06565b6103bc6108b03660046132e4565b611da4565b3480156108c157600080fd5b506103bc6108d03660046131aa565b611fb6565b3480156108e157600080fd5b506103bc6108f036600461329b565b61207b565b34801561090157600080fd5b506103bc6109103660046131df565b6120db565b34801561092157600080fd5b506103bc61093036600461312a565b6121a9565b34801561094157600080fd5b506103bc6109503660046132e4565b6121e1565b34801561096157600080fd5b506104086109703660046132e4565b612210565b34801561098157600080fd5b50610463600d5481565b34801561099757600080fd5b5061046360145481565b3480156109ad57600080fd5b506011546103de9060ff1681565b3480156109c757600080fd5b50610435738943c7bac1914c9a7aba750bf2b6b09fd21037e081565b3480156109ef57600080fd5b50610463600c5481565b348015610a0557600080fd5b50610463610a143660046132e4565b61229b565b348015610a2557600080fd5b506103de610a343660046130b0565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a6e57600080fd5b506103bc6122b9565b348015610a8357600080fd5b506103bc610a9236600461306f565b6123b9565b348015610aa357600080fd5b506103bc610ab23660046132e4565b612454565b348015610ac357600080fd5b506103bc612483565b348015610ad857600080fd5b50600e546103de9060ff1681565b348015610af257600080fd5b506103bc610b0136600461329b565b6124bc565b6000546001600160a01b03163314610b395760405162461bcd60e51b8152600401610b30906135af565b60405180910390fd5b601755565b60006001600160e01b0319821663780e9d6360e01b1480610b635750610b638261251c565b92915050565b606060018054610b78906136ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba4906136ee565b8015610bf15780601f10610bc657610100808354040283529160200191610bf1565b820191906000526020600020905b815481529060010190602001808311610bd457829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610c745760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b30565b506000908152600560205260409020546001600160a01b031690565b6000610c9b826111b5565b9050806001600160a01b0316836001600160a01b03161415610d095760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b30565b336001600160a01b0382161480610d255750610d258133610a34565b610d975760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b30565b610da1838361256c565b505050565b6000546001600160a01b03163314610dd05760405162461bcd60e51b8152600401610b30906135af565b60008211610e205760405162461bcd60e51b815260206004820152601f60248201527f5769746864726177204d7573742062652067726561746572207468616e2030006044820152606401610b30565b47821115610e625760405162461bcd60e51b815260206004820152600f60248201526e082dadeeadce840e8dede40d0d2ced608b1b6044820152606401610b30565b6000816001600160a01b03168360405160006040518083038185875af1925050503d8060008114610eaf576040519150601f19603f3d011682016040523d82523d6000602084013e610eb4565b606091505b5050905080610da157600080fd5b610ecc33826125da565b610ee85760405162461bcd60e51b8152600401610b309061360f565b610da18383836126d1565b6000610efe83611474565b8210610f605760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b30565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000546001600160a01b03163314610fb35760405162461bcd60e51b8152600401610b30906135af565b6040514790600090339083908381818185875af1925050503d8060008114610ff7576040519150601f19603f3d011682016040523d82523d6000602084013e610ffc565b606091505b505090508061100a57600080fd5b5050565b610da1838383604051806020016040528060008152506121a9565b611031612f12565b506040805160009283526019602090815282842084805280825283852060a08401855280546001600160a01b039081166060860190815260019283015460808701528552818752828452858720865180880188528154831681529083015481860152848601526002875291835294849020845180860186528154909216825290940154908401529081019190915290565b60006110cd60095490565b82106111305760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b30565b6009828154811061114357611143613794565b90600052602060002001549050919050565b6000546001600160a01b0316331461117f5760405162461bcd60e51b8152600401610b30906135af565b60115460ff16156111a25760405162461bcd60e51b8152600401610b3090613526565b805161100a906016906020840190612f4b565b6000818152600360205260408120546001600160a01b031680610b635760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b30565b60108054611239906136ee565b80601f0160208091040260200160405190810160405280929190818152602001828054611265906136ee565b80156112b25780601f10611287576101008083540402835291602001916112b2565b820191906000526020600020905b81548152906001019060200180831161129557829003601f168201915b505050505081565b60168054611239906136ee565b6040516370a0823160e01b81526001600160a01b03821660048201526000908190738943c7bac1914c9a7aba750bf2b6b09fd21037e090829082906370a082319060240160206040518083038186803b15801561132357600080fd5b505afa158015611337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135b91906132fd565b905060005b8181101561142d57604051632f745c5960e01b81526001600160a01b0387811660048301526024820183905260009190851690632f745c599060440160206040518083038186803b1580156113b457600080fd5b505afa1580156113c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ec91906132fd565b60008181526018602052604090205490915060ff161561140c575061141b565b611417600186613660565b9450505b8061142581613723565b915050611360565b5091949350505050565b6000546001600160a01b031633146114615760405162461bcd60e51b8152600401610b30906135af565b600e805460ff1916911515919091179055565b60006001600160a01b0382166114df5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b30565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146115255760405162461bcd60e51b8152600401610b30906135af565b61152f600061287c565b565b600e54610100900460ff166115585760405162461bcd60e51b8152600401610b30906135e4565b6040516370a0823160e01b8152336004820152738943c7bac1914c9a7aba750bf2b6b09fd21037e09060009082906370a082319060240160206040518083038186803b1580156115a757600080fd5b505afa1580156115bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115df91906132fd565b90508083106116235760405162461bcd60e51b815260206004820152601060248201526f4e6f7420456e6f756768204c696f6e7360801b6044820152606401610b30565b835b83811161170357604051632f745c5960e01b8152336004820152602481018290526000906001600160a01b03851690632f745c599060440160206040518083038186803b15801561167557600080fd5b505afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad91906132fd565b60008181526018602052604090205490915060ff16156116cd57506116f1565b6000818152601860205260409020805460ff191660011790556116ef336128cc565b505b806116fb81613723565b915050611625565b5050505050565b6000546001600160a01b031633146117345760405162461bcd60e51b8152600401610b30906135af565b600d54156117845760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610b30565b43600c55565b600f8054611239906136ee565b606060006117a483611474565b9050806117c55760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156117e0576117e06137aa565b604051908082528060200260200182016040528015611809578160200160208202803683370190505b50905060005b828110156117bd576118218582610ef3565b82828151811061183357611833613794565b60209081029190910101528061184881613723565b91505061180f565b50919050565b600e54610100900460ff1661187d5760405162461bcd60e51b8152600401610b30906135e4565b6040516370a0823160e01b8152336004820152738943c7bac1914c9a7aba750bf2b6b09fd21037e09060009082906370a082319060240160206040518083038186803b1580156118cc57600080fd5b505afa1580156118e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190491906132fd565b905060005b81811015610da157604051632f745c5960e01b8152336004820152602481018290526000906001600160a01b03851690632f745c599060440160206040518083038186803b15801561195a57600080fd5b505afa15801561196e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199291906132fd565b60008181526018602052604090205490915060ff16156119b257506119d6565b6000818152601860205260409020805460ff191660011790556119d4336128cc565b505b806119e081613723565b915050611909565b6119f1826111b5565b6001600160a01b0316336001600160a01b031614611a515760405162461bcd60e51b815260206004820152601f60248201527f4d757374204f776e2062756e67616c6f7720746f20536574204672616d6573006044820152606401610b30565b60038110611a955760405162461bcd60e51b815260206004820152601160248201527052616e206f7574206f66206672616d657360781b6044820152606401610b30565b6040516331a9108f60e11b8152600481018490526001600160a01b03851690636352211e9060240160206040518083038186803b158015611ad557600080fd5b505afa158015611ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0d9190613093565b6001600160a01b0316336001600160a01b031614611b605760405162461bcd60e51b815260206004820152601060248201526f135d5cdd081bdddb8818dbdb9d195b9d60821b6044820152606401610b30565b6040805180820182526001600160a01b039586168152602080820195865260009485526019815282852093855292909252909120905181546001600160a01b031916931692909217825551600190910155565b606060028054610b78906136ee565b6000546001600160a01b03163314611bec5760405162461bcd60e51b8152600401610b30906135af565b600e80549115156101000261ff0019909216919091179055565b600e54610100900460ff16611c2d5760405162461bcd60e51b8152600401610b30906135e4565b6040516370a0823160e01b8152336004820152738943c7bac1914c9a7aba750bf2b6b09fd21037e09060009082906370a082319060240160206040518083038186803b158015611c7c57600080fd5b505afa158015611c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb491906132fd565b905060005b81811015610da157604051632f745c5960e01b8152336004820152602481018290526000906001600160a01b03851690632f745c599060440160206040518083038186803b158015611d0a57600080fd5b505afa158015611d1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4291906132fd565b60008181526018602052604090205490915060ff1615611d625750611d92565b6000818152601860205260409020805460ff19166001179055611d858383613660565b9150611d90336128cc565b505b80611d9c81613723565b915050611cb9565b600e5460ff16611dc65760405162461bcd60e51b8152600401610b30906135e4565b60008111611e165760405162461bcd60e51b815260206004820152601b60248201527f5175616e74697479206d757374206265206174206c65617374203100000000006044820152606401610b30565b6015546105dc11611e545760405162461bcd60e51b815260206004820152600860248201526714dbdb190813dd5d60c21b6044820152606401610b30565b601354811115611e6357506013545b6105dc60155482611e749190613660565b1115611e8c57601554611e89906105dc6136ab565b90505b6000611e978261229b565b905080341015611edf5760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b6044820152606401610b30565b60005b82811015611f0557611ef3336128cc565b80611efd81613723565b915050611ee2565b508160156000828254611f189190613660565b9091555060009050611f2a82346136ab565b90508015611f8957604051600090339083908381818185875af1925050503d8060008114611f74576040519150601f19603f3d011682016040523d82523d6000602084013e611f79565b606091505b5050905080611f8757600080fd5b505b600c54158015611fa857506105dc6015541480611fa857506017544210155b15610da15743600c55505050565b6001600160a01b03821633141561200f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b30565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b031633146120a55760405162461bcd60e51b8152600401610b30906135af565b60115460ff16156120c85760405162461bcd60e51b8152600401610b3090613526565b805161100a906010906020840190612f4b565b6000546001600160a01b031633146121055760405162461bcd60e51b8152600401610b30906135af565b60008111801561211757506014548111155b61216d5760405162461bcd60e51b815260206004820152602160248201527f4e6f7420456e6f756768207265736572766573206c65667420666f72207465616044820152606d60f81b6064820152608401610b30565b60005b8181101561219357612181836128cc565b8061218b81613723565b915050612170565b50806014546121a291906136ab565b6014555050565b6121b333836125da565b6121cf5760405162461bcd60e51b8152600401610b309061360f565b6121db848484846128f1565b50505050565b6000546001600160a01b0316331461220b5760405162461bcd60e51b8152600401610b30906135af565b601355565b606061221b60095490565b82106122695760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610b30565b601661227483612924565b6040516020016122859291906133a5565b6040516020818303038152906040529050919050565b60006105dc8211156122ac57600080fd5b601254610b63908361368c565b600d54156123095760405162461bcd60e51b815260206004820152601d60248201527f5374617274696e6720696e64657820697320616c7265616479207365740000006044820152606401610b30565b600c546123585760405162461bcd60e51b815260206004820181905260248201527f5374617274696e6720696e64657820626c6f636b206d757374206265207365746044820152606401610b30565b600c5461236990612d50904061373e565b600d55600c5460ff9061237c90436136ab565b111561239f57612d506123906001436136ab565b61239b91904061373e565b600d555b600d5461152f57600d546123b4906001613660565b600d55565b6000546001600160a01b031633146123e35760405162461bcd60e51b8152600401610b30906135af565b6001600160a01b0381166124485760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b30565b6124518161287c565b50565b6000546001600160a01b0316331461247e5760405162461bcd60e51b8152600401610b30906135af565b601255565b6000546001600160a01b031633146124ad5760405162461bcd60e51b8152600401610b30906135af565b6011805460ff19166001179055565b6000546001600160a01b031633146124e65760405162461bcd60e51b8152600401610b30906135af565b60115460ff16156125095760405162461bcd60e51b8152600401610b3090613526565b805161100a90600f906020840190612f4b565b60006001600160e01b031982166380ac58cd60e01b148061254d57506001600160e01b03198216635b5e139f60e01b145b80610b6357506301ffc9a760e01b6001600160e01b0319831614610b63565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906125a1826111b5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166126535760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b30565b600061265e836111b5565b9050806001600160a01b0316846001600160a01b031614806126995750836001600160a01b031661268e84610bfb565b6001600160a01b0316145b806126c957506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166126e4826111b5565b6001600160a01b03161461274c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b30565b6001600160a01b0382166127ae5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b30565b6127b9838383612a22565b6127c460008261256c565b6001600160a01b03831660009081526004602052604081208054600192906127ed9084906136ab565b90915550506001600160a01b038216600090815260046020526040812080546001929061281b908490613660565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006128d7600b5490565b90506128e38282612ada565b61100a600b80546001019055565b6128fc8484846126d1565b61290884848484612af4565b6121db5760405162461bcd60e51b8152600401610b309061355d565b6060816129485750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612972578061295c81613723565b915061296b9050600a83613678565b915061294c565b60008167ffffffffffffffff81111561298d5761298d6137aa565b6040519080825280601f01601f1916602001820160405280156129b7576020820181803683370190505b5090505b84156126c9576129cc6001836136ab565b91506129d9600a8661373e565b6129e4906030613660565b60f81b8183815181106129f9576129f9613794565b60200101906001600160f81b031916908160001a905350612a1b600a86613678565b94506129bb565b6001600160a01b038316612a7d57612a7881600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612aa0565b816001600160a01b0316836001600160a01b031614612aa057612aa08382612c01565b6001600160a01b038216612ab757610da181612c9e565b826001600160a01b0316826001600160a01b031614610da157610da18282612d4d565b61100a828260405180602001604052806000815250612d91565b60006001600160a01b0384163b15612bf657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612b3890339089908890889060040161344c565b602060405180830381600087803b158015612b5257600080fd5b505af1925050508015612b82575060408051601f3d908101601f19168201909252612b7f91810190613243565b60015b612bdc573d808015612bb0576040519150601f19603f3d011682016040523d82523d6000602084013e612bb5565b606091505b508051612bd45760405162461bcd60e51b8152600401610b309061355d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506126c9565b506001949350505050565b60006001612c0e84611474565b612c1891906136ab565b600083815260086020526040902054909150808214612c6b576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b600954600090612cb0906001906136ab565b6000838152600a602052604081205460098054939450909284908110612cd857612cd8613794565b906000526020600020015490508060098381548110612cf957612cf9613794565b6000918252602080832090910192909255828152600a90915260408082208490558582528120556009805480612d3157612d3161377e565b6001900381819060005260206000200160009055905550505050565b6000612d5883611474565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b612d9b8383612dc4565b612da86000848484612af4565b610da15760405162461bcd60e51b8152600401610b309061355d565b6001600160a01b038216612e1a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b30565b6000818152600360205260409020546001600160a01b031615612e7f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b30565b612e8b60008383612a22565b6001600160a01b0382166000908152600460205260408120805460019290612eb4908490613660565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60405180606001604052806003905b6040805180820190915260008082526020820152815260200190600190039081612f215790505090565b828054612f57906136ee565b90600052602060002090601f016020900481019282612f795760008555612fbf565b82601f10612f9257805160ff1916838001178555612fbf565b82800160010185558215612fbf579182015b82811115612fbf578251825591602001919060010190612fa4565b50612fcb929150612fcf565b5090565b5b80821115612fcb5760008155600101612fd0565b600067ffffffffffffffff80841115612fff57612fff6137aa565b604051601f8501601f19908116603f01168101908282118183101715613027576130276137aa565b8160405280935085815286868601111561304057600080fd5b858560208301376000602087830101525050509392505050565b8035801515811461306a57600080fd5b919050565b60006020828403121561308157600080fd5b813561308c816137c0565b9392505050565b6000602082840312156130a557600080fd5b815161308c816137c0565b600080604083850312156130c357600080fd5b82356130ce816137c0565b915060208301356130de816137c0565b809150509250929050565b6000806000606084860312156130fe57600080fd5b8335613109816137c0565b92506020840135613119816137c0565b929592945050506040919091013590565b6000806000806080858703121561314057600080fd5b843561314b816137c0565b9350602085013561315b816137c0565b925060408501359150606085013567ffffffffffffffff81111561317e57600080fd5b8501601f8101871361318f57600080fd5b61319e87823560208401612fe4565b91505092959194509250565b600080604083850312156131bd57600080fd5b82356131c8816137c0565b91506131d66020840161305a565b90509250929050565b600080604083850312156131f257600080fd5b82356131fd816137c0565b946020939093013593505050565b60006020828403121561321d57600080fd5b61308c8261305a565b60006020828403121561323857600080fd5b813561308c816137d5565b60006020828403121561325557600080fd5b815161308c816137d5565b6000806000806080858703121561327657600080fd5b8435613281816137c0565b966020860135965060408601359560600135945092505050565b6000602082840312156132ad57600080fd5b813567ffffffffffffffff8111156132c457600080fd5b8201601f810184136132d557600080fd5b6126c984823560208401612fe4565b6000602082840312156132f657600080fd5b5035919050565b60006020828403121561330f57600080fd5b5051919050565b6000806040838503121561332957600080fd5b8235915060208301356130de816137c0565b6000806040838503121561334e57600080fd5b50508035926020909101359150565b600081518084526133758160208601602086016136c2565b601f01601f19169290920160200192915050565b6000815161339b8185602086016136c2565b9290920192915050565b600080845481600182811c9150808316806133c157607f831692505b60208084108214156133e157634e487b7160e01b86526022600452602486fd5b8180156133f5576001811461340657613433565b60ff19861689528489019650613433565b60008b81526020902060005b8681101561342b5781548b820152908501908301613412565b505084890196505b5050505050506134438185613389565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061347f9083018461335d565b9695505050505050565b60c08101818360005b60038110156134c657815180516001600160a01b031684526020908101518185015260409093019290910190600101613492565b50505092915050565b6020808252825182820181905260009190848201906040850190845b81811015613507578351835292840192918401916001016134eb565b50909695505050505050565b60208152600061308c602083018461335d565b60208082526018908201527f436f6e747261637420686173206265656e206c6f636b65640000000000000000604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260119082015270111c9bdc081b9bdd081bdc195b881e595d607a1b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561367357613673613752565b500190565b60008261368757613687613768565b500490565b60008160001904831182151516156136a6576136a6613752565b500290565b6000828210156136bd576136bd613752565b500390565b60005b838110156136dd5781810151838201526020016136c5565b838111156121db5750506000910152565b600181811c9082168061370257607f821691505b6020821081141561185057634e487b7160e01b600052602260045260246000fd5b600060001982141561373757613737613752565b5060010190565b60008261374d5761374d613768565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461245157600080fd5b6001600160e01b03198116811461245157600080fdfea2646970667358221220d680872251d69ebc3c0014a3d1681b2d1df4927252e689e20d97049682bafabb64736f6c63430008070033

Deployed Bytecode Sourcemap

46238:9188:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53793:123;;;;;;;;;;-1:-1:-1;53793:123:0;;;;;:::i;:::-;;:::i;:::-;;40021:224;;;;;;;;;;-1:-1:-1;40021:224:0;;;;;:::i;:::-;;:::i;:::-;;;10469:14:1;;10462:22;10444:41;;10432:2;10417:18;40021:224:0;;;;;;;;21616:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23175:221::-;;;;;;;;;;-1:-1:-1;23175:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8192:32:1;;;8174:51;;8162:2;8147:18;23175:221:0;8028:203:1;46523:40:0;;;;;;;;;;;;46558:5;46523:40;;;;;23271:25:1;;;23259:2;23244:18;46523:40:0;23125:177:1;22698:411:0;;;;;;;;;;-1:-1:-1;22698:411:0;;;;;:::i;:::-;;:::i;46848:28::-;;;;;;;;;;-1:-1:-1;46848:28:0;;;;;;;;;;;40661:113;;;;;;;;;;-1:-1:-1;40749:10:0;:17;40661:113;;47205:31;;;;;;;;;;;;;;;;54199:312;;;;;;;;;;-1:-1:-1;54199:312:0;;;;;:::i;:::-;;:::i;24065:339::-;;;;;;;;;;-1:-1:-1;24065:339:0;;;;;:::i;:::-;;:::i;40329:256::-;;;;;;;;;;-1:-1:-1;40329:256:0;;;;;:::i;:::-;;:::i;47136:25::-;;;;;;;;;;;;;;;;54004:187;;;;;;;;;;;;;:::i;24475:185::-;;;;;;;;;;-1:-1:-1;24475:185:0;;;;;:::i;:::-;;:::i;52322:215::-;;;;;;;;;;-1:-1:-1;52322:215:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40851:233::-;;;;;;;;;;-1:-1:-1;40851:233:0;;;;;:::i;:::-;;:::i;53326:114::-;;;;;;;;;;-1:-1:-1;53326:114:0;;;;;:::i;:::-;;:::i;47053:29::-;;;;;;;;;;;;;;;;21310:239;;;;;;;;;;-1:-1:-1;21310:239:0;;;;;:::i;:::-;;:::i;46932:32::-;;;;;;;;;;;;;:::i;47008:36::-;;;;;;;;;;;;;;;;47170:26;;;;;;;;;;;;;:::i;50315:462::-;;;;;;;;;;-1:-1:-1;50315:462:0;;;;;:::i;:::-;;:::i;53124:89::-;;;;;;;;;;-1:-1:-1;53124:89:0;;;;;:::i;:::-;;:::i;21040:208::-;;;;;;;;;;-1:-1:-1;21040:208:0;;;;;:::i;:::-;;:::i;34447:94::-;;;;;;;;;;;;;:::i;49714:595::-;;;;;;;;;;-1:-1:-1;49714:595:0;;;;;:::i;:::-;;:::i;55231:192::-;;;;;;;;;;;;;:::i;46885:38::-;;;;;;;;;;;;;:::i;47245:36::-;;;;;;;;;;-1:-1:-1;47245:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;51289:533;;;;;;;;;;-1:-1:-1;51289:533:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48709:479::-;;;;;;;;;;;;;:::i;33796:87::-;;;;;;;;;;-1:-1:-1;33842:7:0;33869:6;-1:-1:-1;;;;;33869:6:0;33796:87;;51828:486;;;;;;;;;;-1:-1:-1;51828:486:0;;;;;:::i;:::-;;:::i;47374:59::-;;;;;;;;;;-1:-1:-1;47374:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47374:59:0;;;;;;;;;;-1:-1:-1;;;;;8921:32:1;;;8903:51;;8985:2;8970:18;;8963:34;;;;8876:18;47374:59:0;8729:274:1;21785:104:0;;;;;;;;;;;;;:::i;53221:97::-;;;;;;;;;;-1:-1:-1;53221:97:0;;;;;:::i;:::-;;:::i;46471:45::-;;;;;;;;;;;;46512:4;46471:45;;49194:512;;;;;;;;;;;;;:::i;47668:1033::-;;;;;;:::i;:::-;;:::i;23468:295::-;;;;;;;;;;-1:-1:-1;23468:295:0;;;;;:::i;:::-;;:::i;53448:166::-;;;;;;;;;;-1:-1:-1;53448:166:0;;;;;:::i;:::-;;:::i;52551:361::-;;;;;;;;;;-1:-1:-1;52551:361:0;;;;;:::i;:::-;;:::i;24731:328::-;;;;;;;;;;-1:-1:-1;24731:328:0;;;;;:::i;:::-;;:::i;52920:96::-;;;;;;;;;;-1:-1:-1;52920:96:0;;;;;:::i;:::-;;:::i;50951:332::-;;;;;;;;;;-1:-1:-1;50951:332:0;;;;;:::i;:::-;;:::i;46758:28::-;;;;;;;;;;;;;;;;47091:36;;;;;;;;;;;;;;;;46973:26;;;;;;;;;;-1:-1:-1;46973:26:0;;;;;;;;46628:79;;;;;;;;;;;;46665:42;46628:79;;46716:33;;;;;;;;;;;;;;;;50787:156;;;;;;;;;;-1:-1:-1;50787:156:0;;;;;:::i;:::-;;:::i;23834:164::-;;;;;;;;;;-1:-1:-1;23834:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23955:25:0;;;23931:4;23955:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23834:164;54705:516;;;;;;;;;;;;;:::i;34696:192::-;;;;;;;;;;-1:-1:-1;34696:192:0;;;;;:::i;:::-;;:::i;53024:92::-;;;;;;;;;;-1:-1:-1;53024:92:0;;;;;:::i;:::-;;:::i;53929:67::-;;;;;;;;;;;;;:::i;46815:24::-;;;;;;;;;;-1:-1:-1;46815:24:0;;;;;;;;53622:163;;;;;;;;;;-1:-1:-1;53622:163:0;;;;;:::i;:::-;;:::i;53793:123::-;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;;;;;;;;;53874:16:::1;:34:::0;53793:123::o;40021:224::-;40123:4;-1:-1:-1;;;;;;40147:50:0;;-1:-1:-1;;;40147:50:0;;:90;;;40201:36;40225:11;40201:23;:36::i;:::-;40140:97;40021:224;-1:-1:-1;;40021:224:0:o;21616:100::-;21670:13;21703:5;21696:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21616:100;:::o;23175:221::-;23251:7;26658:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26658:16:0;23271:73;;;;-1:-1:-1;;;23271:73:0;;18448:2:1;23271:73:0;;;18430:21:1;18487:2;18467:18;;;18460:30;18526:34;18506:18;;;18499:62;-1:-1:-1;;;18577:18:1;;;18570:42;18629:19;;23271:73:0;18246:408:1;23271:73:0;-1:-1:-1;23364:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23364:24:0;;23175:221::o;22698:411::-;22779:13;22795:23;22810:7;22795:14;:23::i;:::-;22779:39;;22843:5;-1:-1:-1;;;;;22837:11:0;:2;-1:-1:-1;;;;;22837:11:0;;;22829:57;;;;-1:-1:-1;;;22829:57:0;;20685:2:1;22829:57:0;;;20667:21:1;20724:2;20704:18;;;20697:30;20763:34;20743:18;;;20736:62;-1:-1:-1;;;20814:18:1;;;20807:31;20855:19;;22829:57:0;20483:397:1;22829:57:0;16165:10;-1:-1:-1;;;;;22921:21:0;;;;:62;;-1:-1:-1;22946:37:0;22963:5;16165:10;23834:164;:::i;22946:37::-;22899:168;;;;-1:-1:-1;;;22899:168:0;;16497:2:1;22899:168:0;;;16479:21:1;16536:2;16516:18;;;16509:30;16575:34;16555:18;;;16548:62;16646:26;16626:18;;;16619:54;16690:19;;22899:168:0;16295:420:1;22899:168:0;23080:21;23089:2;23093:7;23080:8;:21::i;:::-;22768:341;22698:411;;:::o;54199:312::-;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;54310:1:::1;54300:7;:11;54292:55;;;::::0;-1:-1:-1;;;54292:55:0;;18861:2:1;54292:55:0::1;::::0;::::1;18843:21:1::0;18900:2;18880:18;;;18873:30;18939:33;18919:18;;;18912:61;18990:18;;54292:55:0::1;18659:355:1::0;54292:55:0::1;54377:21;54366:7;:32;;54358:60;;;::::0;-1:-1:-1;;;54358:60:0;;16922:2:1;54358:60:0::1;::::0;::::1;16904:21:1::0;16961:2;16941:18;;;16934:30;-1:-1:-1;;;16980:18:1;;;16973:45;17035:18;;54358:60:0::1;16720:339:1::0;54358:60:0::1;54430:12;54448:3;-1:-1:-1::0;;;;;54448:8:0::1;54464:7;54448:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54429:47;;;54495:7;54487:16;;;::::0;::::1;24065:339:::0;24260:41;16165:10;24293:7;24260:18;:41::i;:::-;24252:103;;;;-1:-1:-1;;;24252:103:0;;;;;;;:::i;:::-;24368:28;24378:4;24384:2;24388:7;24368:9;:28::i;40329:256::-;40426:7;40462:23;40479:5;40462:16;:23::i;:::-;40454:5;:31;40446:87;;;;-1:-1:-1;;;40446:87:0;;12274:2:1;40446:87:0;;;12256:21:1;12313:2;12293:18;;;12286:30;12352:34;12332:18;;;12325:62;-1:-1:-1;;;12403:18:1;;;12396:41;12454:19;;40446:87:0;12072:407:1;40446:87:0;-1:-1:-1;;;;;;40551:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40329:256::o;54004:187::-;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;54121:35:::1;::::0;54070:21:::1;::::0;54052:15:::1;::::0;54121:10:::1;::::0;54070:21;;54052:15;54121:35;54052:15;54121:35;54070:21;54121:10;:35:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54102:54;;;54175:7;54167:16;;;::::0;::::1;;54041:150;;54004:187::o:0;24475:185::-;24613:39;24630:4;24636:2;24640:7;24613:39;;;;;;;;;;;;:16;:39::i;52322:215::-;52382:15;;:::i;:::-;-1:-1:-1;52415:89:0;;;:23;52442:16;;;:6;:16;;;;;;;:19;;;;;;;;;52415:89;;;;;;;-1:-1:-1;;;;;52415:89:0;;;;;;;;;;;;;;;;;;;;52463:19;;;;;;;;;52415:89;;;;;;;;;;;;;;;;;;;;;;;;;52501:1;52484:19;;;;;;;;;52415:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52322:215::o;40851:233::-;40926:7;40962:30;40749:10;:17;;40661:113;40962:30;40954:5;:38;40946:95;;;;-1:-1:-1;;;40946:95:0;;22568:2:1;40946:95:0;;;22550:21:1;22607:2;22587:18;;;22580:30;22646:34;22626:18;;;22619:62;-1:-1:-1;;;22697:18:1;;;22690:42;22749:19;;40946:95:0;22366:408:1;40946:95:0;41059:10;41070:5;41059:17;;;;;;;;:::i;:::-;;;;;;;;;41052:24;;40851:233;;;:::o;53326:114::-;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;47487:6:::1;::::0;::::1;;47486:7;47478:44;;;;-1:-1:-1::0;;;47478:44:0::1;;;;;;;:::i;:::-;53412:20:::0;;::::2;::::0;:7:::2;::::0;:20:::2;::::0;::::2;::::0;::::2;:::i;21310:239::-:0;21382:7;21418:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21418:16:0;21453:19;21445:73;;;;-1:-1:-1;;;21445:73:0;;17677:2:1;21445:73:0;;;17659:21:1;17716:2;17696:18;;;17689:30;17755:34;17735:18;;;17728:62;-1:-1:-1;;;17806:18:1;;;17799:39;17855:19;;21445:73:0;17475:405:1;46932:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47170:26::-;;;;;;;:::i;50315:462::-;50501:21;;-1:-1:-1;;;50501:21:0;;-1:-1:-1;;;;;8192:32:1;;50501:21:0;;;8174:51:1;50372:7:0;;;;46665:42;;50372:7;;46665:42;;50501:14;;8147:18:1;;50501:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50483:39;;50538:9;50533:214;50557:7;50553:1;:11;50533:214;;;50602:34;;-1:-1:-1;;;50602:34:0;;-1:-1:-1;;;;;8921:32:1;;;50602:34:0;;;8903:51:1;8970:18;;;8963:34;;;50586:13:0;;50602:24;;;;;;8876:18:1;;50602:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50655:11;;;;:4;:11;;;;;;50586:50;;-1:-1:-1;50655:11:0;;50651:60;;;50687:8;;;50651:60;50725:10;50734:1;50725:10;;:::i;:::-;;;50571:176;50533:214;50566:3;;;;:::i;:::-;;;;50533:214;;;-1:-1:-1;50764:5:0;;50315:462;-1:-1:-1;;;;50315:462:0:o;53124:89::-;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;53188:4:::1;:17:::0;;-1:-1:-1;;53188:17:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53124:89::o;21040:208::-;21112:7;-1:-1:-1;;;;;21140:19:0;;21132:74;;;;-1:-1:-1;;;21132:74:0;;17266:2:1;21132:74:0;;;17248:21:1;17305:2;17285:18;;;17278:30;17344:34;17324:18;;;17317:62;-1:-1:-1;;;17395:18:1;;;17388:40;17445:19;;21132:74:0;17064:406:1;21132:74:0;-1:-1:-1;;;;;;21224:16:0;;;;;:9;:16;;;;;;;21040:208::o;34447:94::-;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;34512:21:::1;34530:1;34512:9;:21::i;:::-;34447:94::o:0;49714:595::-;49802:8;;;;;;;49794:38;;;;-1:-1:-1;;;49794:38:0;;;;;;;:::i;:::-;49926:26;;-1:-1:-1;;;49926:26:0;;49941:10;49926:26;;;8174:51:1;46665:42:0;;49845:21;;46665:42;;49926:14;;8147:18:1;;49926:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49908:44;;49983:7;49971:9;:19;49963:48;;;;-1:-1:-1;;;49963:48:0;;11569:2:1;49963:48:0;;;11551:21:1;11608:2;11588:18;;;11581:30;-1:-1:-1;;;11627:18:1;;;11620:46;11683:18;;49963:48:0;11367:340:1;49963:48:0;50039:11;50022:280;50057:9;50052:1;:14;50022:280;;50104:39;;-1:-1:-1;;;50104:39:0;;50129:10;50104:39;;;8903:51:1;8970:18;;;8963:34;;;50088:13:0;;-1:-1:-1;;;;;50104:24:0;;;;;8876:18:1;;50104:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50162:11;;;;:4;:11;;;;;;50088:55;;-1:-1:-1;50162:11:0;;50158:60;;;50194:8;;;50158:60;50232:11;;;;:4;:11;;;;;:18;;-1:-1:-1;;50232:18:0;50246:4;50232:18;;;50265:25;50279:10;50265:13;:25::i;:::-;50073:229;50022:280;50068:3;;;;:::i;:::-;;;;50022:280;;;;49783:526;;49714:595;;:::o;55231:192::-;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;55309:13:::1;::::0;:18;55301:60:::1;;;::::0;-1:-1:-1;;;55301:60:0;;16139:2:1;55301:60:0::1;::::0;::::1;16121:21:1::0;16178:2;16158:18;;;16151:30;16217:31;16197:18;;;16190:59;16266:18;;55301:60:0::1;15937:353:1::0;55301:60:0::1;55403:12;55382:18;:33:::0;55231:192::o;46885:38::-;;;;;;;:::i;51289:533::-;51378:16;51412:18;51433:17;51443:6;51433:9;:17::i;:::-;51412:38;-1:-1:-1;51465:15:0;51461:354;;51504:16;;;51518:1;51504:16;;;;;;;;;;;-1:-1:-1;51497:23:0;51289:533;-1:-1:-1;;;51289:533:0:o;51461:354::-;51553:23;51593:10;51579:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51579:25:0;;51553:51;;51619:13;51647:129;51670:10;51662:5;:18;51647:129;;;51726:34;51746:6;51754:5;51726:19;:34::i;:::-;51710:6;51717:5;51710:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;51682:7;;;;:::i;:::-;;;;51647:129;;51461:354;51401:421;51289:533;;;:::o;48709:479::-;48755:8;;;;;;;48747:38;;;;-1:-1:-1;;;48747:38:0;;;;;;;:::i;:::-;48877:26;;-1:-1:-1;;;48877:26:0;;48892:10;48877:26;;;8174:51:1;46665:42:0;;48796:21;;46665:42;;48877:14;;8147:18:1;;48877:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48859:44;;48919:9;48914:267;48938:7;48934:1;:11;48914:267;;;48983:39;;-1:-1:-1;;;48983:39:0;;49008:10;48983:39;;;8903:51:1;8970:18;;;8963:34;;;48967:13:0;;-1:-1:-1;;;;;48983:24:0;;;;;8876:18:1;;48983:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49041:11;;;;:4;:11;;;;;;48967:55;;-1:-1:-1;49041:11:0;;49037:60;;;49073:8;;;49037:60;49111:11;;;;:4;:11;;;;;:18;;-1:-1:-1;;49111:18:0;49125:4;49111:18;;;49144:25;49158:10;49144:13;:25::i;:::-;48952:229;48914:267;48947:3;;;;:::i;:::-;;;;48914:267;;51828:486;51984:18;51992:9;51984:7;:18::i;:::-;-1:-1:-1;;;;;51970:32:0;:10;-1:-1:-1;;;;;51970:32:0;;51962:76;;;;-1:-1:-1;;;51962:76:0;;14205:2:1;51962:76:0;;;14187:21:1;14244:2;14224:18;;;14217:30;14283:33;14263:18;;;14256:61;14334:18;;51962:76:0;14003:355:1;51962:76:0;52072:1;52057:12;:16;52049:46;;;;-1:-1:-1;;;52049:46:0;;22981:2:1;52049:46:0;;;22963:21:1;23020:2;23000:18;;;22993:30;-1:-1:-1;;;23039:18:1;;;23032:47;23096:18;;52049:46:0;22779:341:1;52049:46:0;52177:31;;-1:-1:-1;;;52177:31:0;;;;;23271:25:1;;;-1:-1:-1;;;;;52177:21:0;;;;;23244:18:1;;52177:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52163:45:0;:10;-1:-1:-1;;;;;52163:45:0;;52155:74;;;;-1:-1:-1;;;52155:74:0;;19582:2:1;52155:74:0;;;19564:21:1;19621:2;19601:18;;;19594:30;-1:-1:-1;;;19640:18:1;;;19633:46;19696:18;;52155:74:0;19380:340:1;52155:74:0;52274:30;;;;;;;;-1:-1:-1;;;;;52274:30:0;;;;;;;;;;;;-1:-1:-1;52240:17:0;;;:6;:17;;;;;:31;;;;;;;;;;:64;;;;-1:-1:-1;;;;;;52240:64:0;;;;;;;;;;-1:-1:-1;52240:64:0;;;;51828:486::o;21785:104::-;21841:13;21874:7;21867:14;;;;;:::i;53221:97::-;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;53289:8:::1;:21:::0;;;::::1;;;;-1:-1:-1::0;;53289:21:0;;::::1;::::0;;;::::1;::::0;;53221:97::o;49194:512::-;49243:8;;;;;;;49235:38;;;;-1:-1:-1;;;49235:38:0;;;;;;;:::i;:::-;49367:26;;-1:-1:-1;;;49367:26:0;;49382:10;49367:26;;;8174:51:1;46665:42:0;;49286:21;;46665:42;;49367:14;;8147:18:1;;49367:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49349:44;;49409:9;49404:295;49428:7;49424:1;:11;49404:295;;;49473:39;;-1:-1:-1;;;49473:39:0;;49498:10;49473:39;;;8903:51:1;8970:18;;;8963:34;;;49457:13:0;;-1:-1:-1;;;;;49473:24:0;;;;;8876:18:1;;49473:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49531:11;;;;:4;:11;;;;;;49457:55;;-1:-1:-1;49531:11:0;;49527:60;;;49563:8;;;49527:60;49601:11;;;;:4;:11;;;;;:18;;-1:-1:-1;;49601:18:0;49615:4;49601:18;;;49638:9;49640:7;49638:1;:9;:::i;:::-;49634:13;;49662:25;49676:10;49662:13;:25::i;:::-;49442:257;49404:295;49437:3;;;;:::i;:::-;;;;49404:295;;47668:1033;47734:4;;;;47726:34;;;;-1:-1:-1;;;47726:34:0;;;;;;;:::i;:::-;47790:1;47779:8;:12;47771:52;;;;-1:-1:-1;;;47771:52:0;;21433:2:1;47771:52:0;;;21415:21:1;21472:2;21452:18;;;21445:30;21511:29;21491:18;;;21484:57;21558:18;;47771:52:0;21231:351:1;47771:52:0;47859:6;;46512:4;47842:23;47834:44;;;;-1:-1:-1;;;47834:44:0;;13105:2:1;47834:44:0;;;13087:21:1;13144:1;13124:18;;;13117:29;-1:-1:-1;;;13162:18:1;;;13155:38;13210:18;;47834:44:0;12903:331:1;47834:44:0;47906:10;;47895:8;:21;47891:75;;;-1:-1:-1;47944:10:0;;47891:75;46512:4;47993:6;;47982:8;:17;;;;:::i;:::-;:34;47978:101;;;48061:6;;48044:23;;46512:4;48044:23;:::i;:::-;48033:34;;47978:101;48095:13;48111:18;48120:8;48111;:18::i;:::-;48095:34;;48163:5;48150:9;:18;;48142:50;;;;-1:-1:-1;;;48142:50:0;;20337:2:1;48142:50:0;;;20319:21:1;20376:2;20356:18;;;20349:30;-1:-1:-1;;;20395:18:1;;;20388:49;20454:18;;48142:50:0;20135:343:1;48142:50:0;48210:9;48205:91;48229:8;48225:1;:12;48205:91;;;48259:25;48273:10;48259:13;:25::i;:::-;48239:3;;;;:::i;:::-;;;;48205:91;;;;48318:8;48308:6;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;48339:17:0;;-1:-1:-1;48359:17:0;48371:5;48359:9;:17;:::i;:::-;48339:37;-1:-1:-1;48393:13:0;;48389:133;;48442:37;;48424:12;;48442:10;;48465:9;;48424:12;48442:37;48424:12;48442:37;48465:9;48442:10;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48423:56;;;48502:7;48494:16;;;;;;48408:114;48389:133;48540:18;;:23;:92;;;;;46512:4;48568:6;;:24;:63;;;;48615:16;;48596:15;:35;;48568:63;48536:158;;;48670:12;48649:18;:33;47715:986;;47668:1033;:::o;23468:295::-;-1:-1:-1;;;;;23571:24:0;;16165:10;23571:24;;23563:62;;;;-1:-1:-1;;;23563:62:0;;14970:2:1;23563:62:0;;;14952:21:1;15009:2;14989:18;;;14982:30;15048:27;15028:18;;;15021:55;15093:18;;23563:62:0;14768:349:1;23563:62:0;16165:10;23638:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23638:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23638:53:0;;;;;;;;;;23707:48;;10444:41:1;;;23638:42:0;;16165:10;23707:48;;10417:18:1;23707:48:0;;;;;;;23468:295;;:::o;53448:166::-;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;47487:6:::1;::::0;::::1;;47486:7;47478:44;;;;-1:-1:-1::0;;;47478:44:0::1;;;;;;;:::i;:::-;53576:30:::0;;::::2;::::0;:13:::2;::::0;:30:::2;::::0;::::2;::::0;::::2;:::i;52551:361::-:0;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;52667:1:::1;52650:14;:18;:55;;;;;52690:15;;52672:14;:33;;52650:55;52642:101;;;::::0;-1:-1:-1;;;52642:101:0;;15324:2:1;52642:101:0::1;::::0;::::1;15306:21:1::0;15363:2;15343:18;;;15336:30;15402:34;15382:18;;;15375:62;-1:-1:-1;;;15453:18:1;;;15446:31;15494:19;;52642:101:0::1;15122:397:1::0;52642:101:0::1;52759:9;52754:90;52778:14;52774:1;:18;52754:90;;;52814:18;52828:3;52814:13;:18::i;:::-;52794:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52754:90;;;;52890:14;52872:15;;:32;;;;:::i;:::-;52854:15;:50:::0;-1:-1:-1;;52551:361:0:o;24731:328::-;24906:41;16165:10;24939:7;24906:18;:41::i;:::-;24898:103;;;;-1:-1:-1;;;24898:103:0;;;;;;;:::i;:::-;25012:39;25026:4;25032:2;25036:7;25045:5;25012:13;:39::i;:::-;24731:328;;;;:::o;52920:96::-;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;52989:10:::1;:19:::0;52920:96::o;50951:332::-;51069:13;51132;40749:10;:17;;40661:113;51132:13;51122:7;:23;51100:104;;;;-1:-1:-1;;;51100:104:0;;11914:2:1;51100:104:0;;;11896:21:1;11953:2;11933:18;;;11926:30;11992:33;11972:18;;;11965:61;12043:18;;51100:104:0;11712:355:1;51100:104:0;51246:7;51255:18;:7;:16;:18::i;:::-;51229:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51215:60;;50951:332;;;:::o;50787:156::-;50844:7;46512:4;50872:8;:26;;50864:35;;;;;;50926:9;;50917:18;;:8;:18;:::i;54705:516::-;54759:13;;:18;54751:60;;;;-1:-1:-1;;;54751:60:0;;16139:2:1;54751:60:0;;;16121:21:1;16178:2;16158:18;;;16151:30;16217:31;16197:18;;;16190:59;16266:18;;54751:60:0;15937:353:1;54751:60:0;54830:18;;54822:68;;;;-1:-1:-1;;;54822:68:0;;21789:2:1;54822:68:0;;;21771:21:1;;;21808:18;;;21801:30;21867:34;21847:18;;;21840:62;21919:18;;54822:68:0;21587:356:1;54822:68:0;54942:18;;54927:46;;46558:5;;54932:29;54927:46;:::i;:::-;54911:13;:62;55005:18;;55026:3;;54990:33;;:12;:33;:::i;:::-;:39;54986:132;;;46558:5;55077:16;55092:1;55077:12;:16;:::i;:::-;55062:44;;;55067:27;55062:44;:::i;:::-;55046:13;:60;54986:132;55134:13;;55130:84;;55185:13;;:17;;55201:1;55185:17;:::i;:::-;55169:13;:33;54705:516::o;34696:192::-;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34785:22:0;::::1;34777:73;;;::::0;-1:-1:-1;;;34777:73:0;;13441:2:1;34777:73:0::1;::::0;::::1;13423:21:1::0;13480:2;13460:18;;;13453:30;13519:34;13499:18;;;13492:62;-1:-1:-1;;;13570:18:1;;;13563:36;13616:19;;34777:73:0::1;13239:402:1::0;34777:73:0::1;34861:19;34871:8;34861:9;:19::i;:::-;34696:192:::0;:::o;53024:92::-;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;53091:9:::1;:17:::0;53024:92::o;53929:67::-;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;53975:6:::1;:13:::0;;-1:-1:-1;;53975:13:0::1;53984:4;53975:13;::::0;;53929:67::o;53622:163::-;33842:7;33869:6;-1:-1:-1;;;;;33869:6:0;16165:10;34016:23;34008:68;;;;-1:-1:-1;;;34008:68:0;;;;;;;:::i;:::-;47487:6:::1;::::0;::::1;;47486:7;47478:44;;;;-1:-1:-1::0;;;47478:44:0::1;;;;;;;:::i;:::-;53744:33:::0;;::::2;::::0;:19:::2;::::0;:33:::2;::::0;::::2;::::0;::::2;:::i;20671:305::-:0;20773:4;-1:-1:-1;;;;;;20810:40:0;;-1:-1:-1;;;20810:40:0;;:105;;-1:-1:-1;;;;;;;20867:48:0;;-1:-1:-1;;;20867:48:0;20810:105;:158;;;-1:-1:-1;;;;;;;;;;19282:40:0;;;20932:36;19173:157;30551:174;30626:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30626:29:0;-1:-1:-1;;;;;30626:29:0;;;;;;;;:24;;30680:23;30626:24;30680:14;:23::i;:::-;-1:-1:-1;;;;;30671:46:0;;;;;;;;;;;30551:174;;:::o;26863:348::-;26956:4;26658:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26658:16:0;26973:73;;;;-1:-1:-1;;;26973:73:0;;15726:2:1;26973:73:0;;;15708:21:1;15765:2;15745:18;;;15738:30;15804:34;15784:18;;;15777:62;-1:-1:-1;;;15855:18:1;;;15848:42;15907:19;;26973:73:0;15524:408:1;26973:73:0;27057:13;27073:23;27088:7;27073:14;:23::i;:::-;27057:39;;27126:5;-1:-1:-1;;;;;27115:16:0;:7;-1:-1:-1;;;;;27115:16:0;;:51;;;;27159:7;-1:-1:-1;;;;;27135:31:0;:20;27147:7;27135:11;:20::i;:::-;-1:-1:-1;;;;;27135:31:0;;27115:51;:87;;;-1:-1:-1;;;;;;23955:25:0;;;23931:4;23955:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27170:32;27107:96;26863:348;-1:-1:-1;;;;26863:348:0:o;29855:578::-;30014:4;-1:-1:-1;;;;;29987:31:0;:23;30002:7;29987:14;:23::i;:::-;-1:-1:-1;;;;;29987:31:0;;29979:85;;;;-1:-1:-1;;;29979:85:0;;19927:2:1;29979:85:0;;;19909:21:1;19966:2;19946:18;;;19939:30;20005:34;19985:18;;;19978:62;-1:-1:-1;;;20056:18:1;;;20049:39;20105:19;;29979:85:0;19725:405:1;29979:85:0;-1:-1:-1;;;;;30083:16:0;;30075:65;;;;-1:-1:-1;;;30075:65:0;;14565:2:1;30075:65:0;;;14547:21:1;14604:2;14584:18;;;14577:30;14643:34;14623:18;;;14616:62;-1:-1:-1;;;14694:18:1;;;14687:34;14738:19;;30075:65:0;14363:400:1;30075:65:0;30153:39;30174:4;30180:2;30184:7;30153:20;:39::i;:::-;30257:29;30274:1;30278:7;30257:8;:29::i;:::-;-1:-1:-1;;;;;30299:15:0;;;;;;:9;:15;;;;;:20;;30318:1;;30299:15;:20;;30318:1;;30299:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30330:13:0;;;;;;:9;:13;;;;;:18;;30347:1;;30330:13;:18;;30347:1;;30330:18;:::i;:::-;;;;-1:-1:-1;;30359:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30359:21:0;-1:-1:-1;;;;;30359:21:0;;;;;;;;;30398:27;;30359:16;;30398:27;;;;;;;29855:578;;;:::o;34896:173::-;34952:16;34971:6;;-1:-1:-1;;;;;34988:17:0;;;-1:-1:-1;;;;;;34988:17:0;;;;;;35021:40;;34971:6;;;;;;;35021:40;;34952:16;35021:40;34941:128;34896:173;:::o;54521:174::-;54578:17;54598:19;:9;35989:14;;35897:114;54598:19;54578:39;;54628:27;54638:5;54645:9;54628;:27::i;:::-;54666:21;:9;36108:19;;36126:1;36108:19;;;36019:127;25941:315;26098:28;26108:4;26114:2;26118:7;26098:9;:28::i;:::-;26145:48;26168:4;26174:2;26178:7;26187:5;26145:22;:48::i;:::-;26137:111;;;;-1:-1:-1;;;26137:111:0;;;;;;;:::i;16614:723::-;16670:13;16891:10;16887:53;;-1:-1:-1;;16918:10:0;;;;;;;;;;;;-1:-1:-1;;;16918:10:0;;;;;16614:723::o;16887:53::-;16965:5;16950:12;17006:78;17013:9;;17006:78;;17039:8;;;;:::i;:::-;;-1:-1:-1;17062:10:0;;-1:-1:-1;17070:2:0;17062:10;;:::i;:::-;;;17006:78;;;17094:19;17126:6;17116:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17116:17:0;;17094:39;;17144:154;17151:10;;17144:154;;17178:11;17188:1;17178:11;;:::i;:::-;;-1:-1:-1;17247:10:0;17255:2;17247:5;:10;:::i;:::-;17234:24;;:2;:24;:::i;:::-;17221:39;;17204:6;17211;17204:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17204:56:0;;;;;;;;-1:-1:-1;17275:11:0;17284:2;17275:11;;:::i;:::-;;;17144:154;;41697:589;-1:-1:-1;;;;;41903:18:0;;41899:187;;41938:40;41970:7;43113:10;:17;;43086:24;;;;:15;:24;;;;;:44;;;43141:24;;;;;;;;;;;;43009:164;41938:40;41899:187;;;42008:2;-1:-1:-1;;;;;42000:10:0;:4;-1:-1:-1;;;;;42000:10:0;;41996:90;;42027:47;42060:4;42066:7;42027:32;:47::i;:::-;-1:-1:-1;;;;;42100:16:0;;42096:183;;42133:45;42170:7;42133:36;:45::i;42096:183::-;42206:4;-1:-1:-1;;;;;42200:10:0;:2;-1:-1:-1;;;;;42200:10:0;;42196:83;;42227:40;42255:2;42259:7;42227:27;:40::i;27553:110::-;27629:26;27639:2;27643:7;27629:26;;;;;;;;;;;;:9;:26::i;31290:799::-;31445:4;-1:-1:-1;;;;;31466:13:0;;8448:20;8496:8;31462:620;;31502:72;;-1:-1:-1;;;31502:72:0;;-1:-1:-1;;;;;31502:36:0;;;;;:72;;16165:10;;31553:4;;31559:7;;31568:5;;31502:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31502:72:0;;;;;;;;-1:-1:-1;;31502:72:0;;;;;;;;;;;;:::i;:::-;;;31498:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31744:13:0;;31740:272;;31787:60;;-1:-1:-1;;;31787:60:0;;;;;;;:::i;31740:272::-;31962:6;31956:13;31947:6;31943:2;31939:15;31932:38;31498:529;-1:-1:-1;;;;;;31625:51:0;-1:-1:-1;;;31625:51:0;;-1:-1:-1;31618:58:0;;31462:620;-1:-1:-1;32066:4:0;31290:799;;;;;;:::o;43800:988::-;44066:22;44116:1;44091:22;44108:4;44091:16;:22::i;:::-;:26;;;;:::i;:::-;44128:18;44149:26;;;:17;:26;;;;;;44066:51;;-1:-1:-1;44282:28:0;;;44278:328;;-1:-1:-1;;;;;44349:18:0;;44327:19;44349:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44400:30;;;;;;:44;;;44517:30;;:17;:30;;;;;:43;;;44278:328;-1:-1:-1;44702:26:0;;;;:17;:26;;;;;;;;44695:33;;;-1:-1:-1;;;;;44746:18:0;;;;;:12;:18;;;;;:34;;;;;;;44739:41;43800:988::o;45083:1079::-;45361:10;:17;45336:22;;45361:21;;45381:1;;45361:21;:::i;:::-;45393:18;45414:24;;;:15;:24;;;;;;45787:10;:26;;45336:46;;-1:-1:-1;45414:24:0;;45336:46;;45787:26;;;;;;:::i;:::-;;;;;;;;;45765:48;;45851:11;45826:10;45837;45826:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;45931:28;;;:15;:28;;;;;;;:41;;;46103:24;;;;;46096:31;46138:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45154:1008;;;45083:1079;:::o;42587:221::-;42672:14;42689:20;42706:2;42689:16;:20::i;:::-;-1:-1:-1;;;;;42720:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;42765:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42587:221:0:o;27890:321::-;28020:18;28026:2;28030:7;28020:5;:18::i;:::-;28071:54;28102:1;28106:2;28110:7;28119:5;28071:22;:54::i;:::-;28049:154;;;;-1:-1:-1;;;28049:154:0;;;;;;;:::i;28547:382::-;-1:-1:-1;;;;;28627:16:0;;28619:61;;;;-1:-1:-1;;;28619:61:0;;18087:2:1;28619:61:0;;;18069:21:1;;;18106:18;;;18099:30;18165:34;18145:18;;;18138:62;18217:18;;28619:61:0;17885:356:1;28619:61:0;26634:4;26658:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26658:16:0;:30;28691:58;;;;-1:-1:-1;;;28691:58:0;;13848:2:1;28691:58:0;;;13830:21:1;13887:2;13867:18;;;13860:30;13926;13906:18;;;13899:58;13974:18;;28691:58:0;13646:352:1;28691:58:0;28762:45;28791:1;28795:2;28799:7;28762:20;:45::i;:::-;-1:-1:-1;;;;;28820:13:0;;;;;;:9;:13;;;;;:18;;28837:1;;28820:13;:18;;28837:1;;28820:18;:::i;:::-;;;;-1:-1:-1;;28849:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28849:21:0;-1:-1:-1;;;;;28849:21:0;;;;;;;;28888:33;;28849:16;;;28888:33;;28849:16;;28888:33;28547:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:160::-;715:20;;771:13;;764:21;754:32;;744:60;;800:1;797;790:12;744:60;650:160;;;:::o;815:247::-;874:6;927:2;915:9;906:7;902:23;898:32;895:52;;;943:1;940;933:12;895:52;982:9;969:23;1001:31;1026:5;1001:31;:::i;:::-;1051:5;815:247;-1:-1:-1;;;815:247:1:o;1067:251::-;1137:6;1190:2;1178:9;1169:7;1165:23;1161:32;1158:52;;;1206:1;1203;1196:12;1158:52;1238:9;1232:16;1257:31;1282:5;1257:31;:::i;1323:388::-;1391:6;1399;1452:2;1440:9;1431:7;1427:23;1423:32;1420:52;;;1468:1;1465;1458:12;1420:52;1507:9;1494:23;1526:31;1551:5;1526:31;:::i;:::-;1576:5;-1:-1:-1;1633:2:1;1618:18;;1605:32;1646:33;1605:32;1646:33;:::i;:::-;1698:7;1688:17;;;1323:388;;;;;:::o;1716:456::-;1793:6;1801;1809;1862:2;1850:9;1841:7;1837:23;1833:32;1830:52;;;1878:1;1875;1868:12;1830:52;1917:9;1904:23;1936:31;1961:5;1936:31;:::i;:::-;1986:5;-1:-1:-1;2043:2:1;2028:18;;2015:32;2056:33;2015:32;2056:33;:::i;:::-;1716:456;;2108:7;;-1:-1:-1;;;2162:2:1;2147:18;;;;2134:32;;1716:456::o;2177:794::-;2272:6;2280;2288;2296;2349:3;2337:9;2328:7;2324:23;2320:33;2317:53;;;2366:1;2363;2356:12;2317:53;2405:9;2392:23;2424:31;2449:5;2424:31;:::i;:::-;2474:5;-1:-1:-1;2531:2:1;2516:18;;2503:32;2544:33;2503:32;2544:33;:::i;:::-;2596:7;-1:-1:-1;2650:2:1;2635:18;;2622:32;;-1:-1:-1;2705:2:1;2690:18;;2677:32;2732:18;2721:30;;2718:50;;;2764:1;2761;2754:12;2718:50;2787:22;;2840:4;2832:13;;2828:27;-1:-1:-1;2818:55:1;;2869:1;2866;2859:12;2818:55;2892:73;2957:7;2952:2;2939:16;2934:2;2930;2926:11;2892:73;:::i;:::-;2882:83;;;2177:794;;;;;;;:::o;2976:315::-;3041:6;3049;3102:2;3090:9;3081:7;3077:23;3073:32;3070:52;;;3118:1;3115;3108:12;3070:52;3157:9;3144:23;3176:31;3201:5;3176:31;:::i;:::-;3226:5;-1:-1:-1;3250:35:1;3281:2;3266:18;;3250:35;:::i;:::-;3240:45;;2976:315;;;;;:::o;3296:::-;3364:6;3372;3425:2;3413:9;3404:7;3400:23;3396:32;3393:52;;;3441:1;3438;3431:12;3393:52;3480:9;3467:23;3499:31;3524:5;3499:31;:::i;:::-;3549:5;3601:2;3586:18;;;;3573:32;;-1:-1:-1;;;3296:315:1:o;3616:180::-;3672:6;3725:2;3713:9;3704:7;3700:23;3696:32;3693:52;;;3741:1;3738;3731:12;3693:52;3764:26;3780:9;3764:26;:::i;3801:245::-;3859:6;3912:2;3900:9;3891:7;3887:23;3883:32;3880:52;;;3928:1;3925;3918:12;3880:52;3967:9;3954:23;3986:30;4010:5;3986:30;:::i;4051:249::-;4120:6;4173:2;4161:9;4152:7;4148:23;4144:32;4141:52;;;4189:1;4186;4179:12;4141:52;4221:9;4215:16;4240:30;4264:5;4240:30;:::i;4305:467::-;4406:6;4414;4422;4430;4483:3;4471:9;4462:7;4458:23;4454:33;4451:53;;;4500:1;4497;4490:12;4451:53;4539:9;4526:23;4558:31;4583:5;4558:31;:::i;:::-;4608:5;4660:2;4645:18;;4632:32;;-1:-1:-1;4711:2:1;4696:18;;4683:32;;4762:2;4747:18;4734:32;;-1:-1:-1;4305:467:1;-1:-1:-1;;;4305:467:1:o;4777:450::-;4846:6;4899:2;4887:9;4878:7;4874:23;4870:32;4867:52;;;4915:1;4912;4905:12;4867:52;4955:9;4942:23;4988:18;4980:6;4977:30;4974:50;;;5020:1;5017;5010:12;4974:50;5043:22;;5096:4;5088:13;;5084:27;-1:-1:-1;5074:55:1;;5125:1;5122;5115:12;5074:55;5148:73;5213:7;5208:2;5195:16;5190:2;5186;5182:11;5148:73;:::i;5232:180::-;5291:6;5344:2;5332:9;5323:7;5319:23;5315:32;5312:52;;;5360:1;5357;5350:12;5312:52;-1:-1:-1;5383:23:1;;5232:180;-1:-1:-1;5232:180:1:o;5417:184::-;5487:6;5540:2;5528:9;5519:7;5515:23;5511:32;5508:52;;;5556:1;5553;5546:12;5508:52;-1:-1:-1;5579:16:1;;5417:184;-1:-1:-1;5417:184:1:o;5606:323::-;5682:6;5690;5743:2;5731:9;5722:7;5718:23;5714:32;5711:52;;;5759:1;5756;5749:12;5711:52;5795:9;5782:23;5772:33;;5855:2;5844:9;5840:18;5827:32;5868:31;5893:5;5868:31;:::i;5934:248::-;6002:6;6010;6063:2;6051:9;6042:7;6038:23;6034:32;6031:52;;;6079:1;6076;6069:12;6031:52;-1:-1:-1;;6102:23:1;;;6172:2;6157:18;;;6144:32;;-1:-1:-1;5934:248:1:o;6187:257::-;6228:3;6266:5;6260:12;6293:6;6288:3;6281:19;6309:63;6365:6;6358:4;6353:3;6349:14;6342:4;6335:5;6331:16;6309:63;:::i;:::-;6426:2;6405:15;-1:-1:-1;;6401:29:1;6392:39;;;;6433:4;6388:50;;6187:257;-1:-1:-1;;6187:257:1:o;6449:185::-;6491:3;6529:5;6523:12;6544:52;6589:6;6584:3;6577:4;6570:5;6566:16;6544:52;:::i;:::-;6612:16;;;;;6449:185;-1:-1:-1;;6449:185:1:o;6639:1174::-;6815:3;6844:1;6877:6;6871:13;6907:3;6929:1;6957:9;6953:2;6949:18;6939:28;;7017:2;7006:9;7002:18;7039;7029:61;;7083:4;7075:6;7071:17;7061:27;;7029:61;7109:2;7157;7149:6;7146:14;7126:18;7123:38;7120:165;;;-1:-1:-1;;;7184:33:1;;7240:4;7237:1;7230:15;7270:4;7191:3;7258:17;7120:165;7301:18;7328:104;;;;7446:1;7441:320;;;;7294:467;;7328:104;-1:-1:-1;;7361:24:1;;7349:37;;7406:16;;;;-1:-1:-1;7328:104:1;;7441:320;23380:1;23373:14;;;23417:4;23404:18;;7536:1;7550:165;7564:6;7561:1;7558:13;7550:165;;;7642:14;;7629:11;;;7622:35;7685:16;;;;7579:10;;7550:165;;;7554:3;;7744:6;7739:3;7735:16;7728:23;;7294:467;;;;;;;7777:30;7803:3;7795:6;7777:30;:::i;:::-;7770:37;6639:1174;-1:-1:-1;;;;;6639:1174:1:o;8236:488::-;-1:-1:-1;;;;;8505:15:1;;;8487:34;;8557:15;;8552:2;8537:18;;8530:43;8604:2;8589:18;;8582:34;;;8652:3;8647:2;8632:18;;8625:31;;;8430:4;;8673:45;;8698:19;;8690:6;8673:45;:::i;:::-;8665:53;8236:488;-1:-1:-1;;;;;;8236:488:1:o;9008:654::-;9234:3;9219:19;;9223:9;9315:6;9192:4;9349:307;9363:4;9360:1;9357:11;9349:307;;;9420:13;;9462:9;;-1:-1:-1;;;;;9458:35:1;9446:48;;9517:4;9561:11;;;9555:18;9541:12;;;9534:40;9603:4;9594:14;;;;9631:15;;;;9490:1;9376:9;9349:307;;;9353:3;;;9008:654;;;;:::o;9667:632::-;9838:2;9890:21;;;9960:13;;9863:18;;;9982:22;;;9809:4;;9838:2;10061:15;;;;10035:2;10020:18;;;9809:4;10104:169;10118:6;10115:1;10112:13;10104:169;;;10179:13;;10167:26;;10248:15;;;;10213:12;;;;10140:1;10133:9;10104:169;;;-1:-1:-1;10290:3:1;;9667:632;-1:-1:-1;;;;;;9667:632:1:o;10790:219::-;10939:2;10928:9;10921:21;10902:4;10959:44;10999:2;10988:9;10984:18;10976:6;10959:44;:::i;11014:348::-;11216:2;11198:21;;;11255:2;11235:18;;;11228:30;11294:26;11289:2;11274:18;;11267:54;11353:2;11338:18;;11014:348::o;12484:414::-;12686:2;12668:21;;;12725:2;12705:18;;;12698:30;12764:34;12759:2;12744:18;;12737:62;-1:-1:-1;;;12830:2:1;12815:18;;12808:48;12888:3;12873:19;;12484:414::o;19019:356::-;19221:2;19203:21;;;19240:18;;;19233:30;19299:34;19294:2;19279:18;;19272:62;19366:2;19351:18;;19019:356::o;20885:341::-;21087:2;21069:21;;;21126:2;21106:18;;;21099:30;-1:-1:-1;;;21160:2:1;21145:18;;21138:47;21217:2;21202:18;;20885:341::o;21948:413::-;22150:2;22132:21;;;22189:2;22169:18;;;22162:30;22228:34;22223:2;22208:18;;22201:62;-1:-1:-1;;;22294:2:1;22279:18;;22272:47;22351:3;22336:19;;21948:413::o;23433:128::-;23473:3;23504:1;23500:6;23497:1;23494:13;23491:39;;;23510:18;;:::i;:::-;-1:-1:-1;23546:9:1;;23433:128::o;23566:120::-;23606:1;23632;23622:35;;23637:18;;:::i;:::-;-1:-1:-1;23671:9:1;;23566:120::o;23691:168::-;23731:7;23797:1;23793;23789:6;23785:14;23782:1;23779:21;23774:1;23767:9;23760:17;23756:45;23753:71;;;23804:18;;:::i;:::-;-1:-1:-1;23844:9:1;;23691:168::o;23864:125::-;23904:4;23932:1;23929;23926:8;23923:34;;;23937:18;;:::i;:::-;-1:-1:-1;23974:9:1;;23864:125::o;23994:258::-;24066:1;24076:113;24090:6;24087:1;24084:13;24076:113;;;24166:11;;;24160:18;24147:11;;;24140:39;24112:2;24105:10;24076:113;;;24207:6;24204:1;24201:13;24198:48;;;-1:-1:-1;;24242:1:1;24224:16;;24217:27;23994:258::o;24257:380::-;24336:1;24332:12;;;;24379;;;24400:61;;24454:4;24446:6;24442:17;24432:27;;24400:61;24507:2;24499:6;24496:14;24476:18;24473:38;24470:161;;;24553:10;24548:3;24544:20;24541:1;24534:31;24588:4;24585:1;24578:15;24616:4;24613:1;24606:15;24642:135;24681:3;-1:-1:-1;;24702:17:1;;24699:43;;;24722:18;;:::i;:::-;-1:-1:-1;24769:1:1;24758:13;;24642:135::o;24782:112::-;24814:1;24840;24830:35;;24845:18;;:::i;:::-;-1:-1:-1;24879:9:1;;24782:112::o;24899:127::-;24960:10;24955:3;24951:20;24948:1;24941:31;24991:4;24988:1;24981:15;25015:4;25012:1;25005:15;25031:127;25092:10;25087:3;25083:20;25080:1;25073:31;25123:4;25120:1;25113:15;25147:4;25144:1;25137:15;25163:127;25224:10;25219:3;25215:20;25212:1;25205:31;25255:4;25252:1;25245:15;25279:4;25276:1;25269:15;25295:127;25356:10;25351:3;25347:20;25344:1;25337:31;25387:4;25384:1;25377:15;25411:4;25408:1;25401:15;25427:127;25488:10;25483:3;25479:20;25476:1;25469:31;25519:4;25516:1;25509:15;25543:4;25540:1;25533:15;25559:131;-1:-1:-1;;;;;25634:31:1;;25624:42;;25614:70;;25680:1;25677;25670:12;25695:131;-1:-1:-1;;;;;;25769:32:1;;25759:43;;25749:71;;25816:1;25813;25806:12

Swarm Source

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