ETH Price: $3,506.10 (-0.10%)
Gas: 2 Gwei

Token

Mega Mcpepes (MM)
 

Overview

Max Total Supply

109 MM

Holders

66

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Null: 0x000...000
Balance
0 MM
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MegaMcpepes

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 12 of 14: MegaMcpepes.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import "./ERC721A.sol";
import "./Ownable.sol";

contract MegaMcpepes is ERC721A, Ownable {
    using Strings for uint256;
    uint256 public maxSupply = 3333;
    uint256 public maxFreeAmount = 3333;
    uint256 public maxFreePerWallet = 1;
    uint256 public price = 0.002 ether;
    uint256 public maxPerTx = 10;
    uint256 public maxPerWallet = 50;
    uint256 public teamReserved = 2;
    bool public mintEnabled = false;
    string public baseURI;

    constructor() ERC721A("Mega Mcpepes", "MM") {
        _safeMint(msg.sender, teamReserved);
    }

    function publicMint(uint256 quantity) external payable {
        require(mintEnabled, "Minting is not live yet.");
        require(totalSupply() + quantity < maxSupply + 1, "No more");
        uint256 cost = price;
        uint256 _maxPerWallet = maxPerWallet;

        if (
            totalSupply() < maxFreeAmount &&
            _numberMinted(msg.sender) == 0 &&
            quantity <= maxFreePerWallet
        ) {
            cost = 0;
            _maxPerWallet = maxFreePerWallet;
        }

        require(
            _numberMinted(msg.sender) + quantity <= _maxPerWallet,
            "Max per wallet"
        );

        uint256 needPayCount = quantity;
        if (_numberMinted(msg.sender) == 0) {
            needPayCount = quantity - 1;
        }
        require(
            msg.value >= needPayCount * cost,
            "Please send the exact amount."
        );
        _safeMint(msg.sender, quantity);
    }

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

    function tokenURI(
        uint256 tokenId
    ) public view virtual override returns (string memory) {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        return string(abi.encodePacked(baseURI, tokenId.toString(), ".json"));
    }

    function flipSale() external onlyOwner {
        mintEnabled = !mintEnabled;
    }

    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }

    function setPrice(uint256 _newPrice) external onlyOwner {
        price = _newPrice;
    }

    function setMaxFreeAmount(uint256 _amount) external onlyOwner {
        maxFreeAmount = _amount;
    }

    function setMaxFreePerWallet(uint256 _amount) external onlyOwner {
        maxFreePerWallet = _amount;
    }

    function withdraw() external onlyOwner {
        (bool success, ) = payable(msg.sender).call{
            value: address(this).balance
        }("");
        require(success, "Transfer failed.");
    }
}

File 1 of 14: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 14: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 3 of 14: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 4 of 14: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @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 overridden 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 {
        _setApprovalForAll(_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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 5 of 14: ERC721A.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./IERC721Enumerable.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

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

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

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

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

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

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

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

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (
                    safe &&
                    !_checkOnERC721Received(address(0), to, updatedIndex, _data)
                ) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 6 of 14: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @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 7 of 14: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 8 of 14: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 9 of 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 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 10 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 11 of 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 13 of 14: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

File 14 of 14: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"flipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxFreeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxFreePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052610d05600955610d05600a556001600b5566071afd498d0000600c55600a600d556032600e556002600f556000601060006101000a81548160ff0219169083151502179055503480156200005757600080fd5b506040518060400160405280600c81526020017f4d656761204d63706570657300000000000000000000000000000000000000008152506040518060400160405280600281526020017f4d4d0000000000000000000000000000000000000000000000000000000000008152508160029081620000d5919062000997565b508060039081620000e7919062000997565b5050506000620000fc620001b560201b60201c565b905080600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620001af33600f54620001bd60201b60201c565b62000c56565b600033905090565b620001df828260405180602001604052806000815250620001e360201b60201c565b5050565b620001f88383836001620001fd60201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036200026a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403620002a5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620002ba60008683876200055060201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156200052b57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015620004dd5750620004db60008884886200055660201b60201c565b155b1562000515576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8180600101925050808060010191505062000458565b508060008190555050620005496000868387620006f460201b60201c565b5050505050565b50505050565b6000620005848473ffffffffffffffffffffffffffffffffffffffff16620006fa60201b62001ccc1760201c565b15620006e7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620005b6620001b560201b60201c565b8786866040518563ffffffff1660e01b8152600401620005da949392919062000b6e565b6020604051808303816000875af19250505080156200061957506040513d601f19601f8201168201806040525081019062000616919062000c24565b60015b62000696573d80600081146200064c576040519150601f19603f3d011682016040523d82523d6000602084013e62000651565b606091505b5060008151036200068e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620006ec565b600190505b949350505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200079f57607f821691505b602082108103620007b557620007b462000757565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200081f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007e0565b6200082b8683620007e0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000878620008726200086c8462000843565b6200084d565b62000843565b9050919050565b6000819050919050565b620008948362000857565b620008ac620008a3826200087f565b848454620007ed565b825550505050565b600090565b620008c3620008b4565b620008d081848462000889565b505050565b5b81811015620008f857620008ec600082620008b9565b600181019050620008d6565b5050565b601f82111562000947576200091181620007bb565b6200091c84620007d0565b810160208510156200092c578190505b620009446200093b85620007d0565b830182620008d5565b50505b505050565b600082821c905092915050565b60006200096c600019846008026200094c565b1980831691505092915050565b600062000987838362000959565b9150826002028217905092915050565b620009a2826200071d565b67ffffffffffffffff811115620009be57620009bd62000728565b5b620009ca825462000786565b620009d7828285620008fc565b600060209050601f83116001811462000a0f5760008415620009fa578287015190505b62000a06858262000979565b86555062000a76565b601f19841662000a1f86620007bb565b60005b8281101562000a495784890151825560018201915060208501945060208101905062000a22565b8683101562000a69578489015162000a65601f89168262000959565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000aab8262000a7e565b9050919050565b62000abd8162000a9e565b82525050565b62000ace8162000843565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000b1057808201518184015260208101905062000af3565b60008484015250505050565b6000601f19601f8301169050919050565b600062000b3a8262000ad4565b62000b46818562000adf565b935062000b5881856020860162000af0565b62000b638162000b1c565b840191505092915050565b600060808201905062000b85600083018762000ab2565b62000b94602083018662000ab2565b62000ba3604083018562000ac3565b818103606083015262000bb7818462000b2d565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000bfe8162000bc7565b811462000c0a57600080fd5b50565b60008151905062000c1e8162000bf3565b92915050565b60006020828403121562000c3d5762000c3c62000bc2565b5b600062000c4d8482850162000c0d565b91505092915050565b613ec18062000c666000396000f3fe6080604052600436106102045760003560e01c80636d7c4a4b11610118578063a7027357116100a0578063d5abeb011161006f578063d5abeb0114610734578063e985e9c51461075f578063f2fde38b1461079c578063f892c6e2146107c5578063f968adbe146107f057610204565b8063a702735714610678578063b88d4fde146106a3578063c87b56dd146106cc578063d12397301461070957610204565b80638da5cb5b116100e75780638da5cb5b146105a557806391b7f5ed146105d057806395d89b41146105f9578063a035b1fe14610624578063a22cb4651461064f57610204565b80636d7c4a4b1461051157806370a082311461053a578063715018a6146105775780637ba5e6211461058e57610204565b80632f745c591161019b578063453c23101161016a578063453c2310146104185780634f6ccce71461044357806355f804b3146104805780636352211e146104a95780636c0360eb146104e657610204565b80632f745c591461037057806336f5b9a3146103ad5780633ccfd60b146103d857806342842e0e146103ef57610204565b80630c23bb3f116101d75780630c23bb3f146102d757806318160ddd1461030057806323b872dd1461032b5780632db115441461035457610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190612d85565b61081b565b60405161023d9190612dcd565b60405180910390f35b34801561025257600080fd5b5061025b610965565b6040516102689190612e78565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190612ed0565b6109f7565b6040516102a59190612f3e565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190612f85565b610a73565b005b3480156102e357600080fd5b506102fe60048036038101906102f99190612ed0565b610b7d565b005b34801561030c57600080fd5b50610315610c03565b6040516103229190612fd4565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190612fef565b610c11565b005b61036e60048036038101906103699190612ed0565b610c21565b005b34801561037c57600080fd5b5061039760048036038101906103929190612f85565b610df6565b6040516103a49190612fd4565b60405180910390f35b3480156103b957600080fd5b506103c2610fcc565b6040516103cf9190612fd4565b60405180910390f35b3480156103e457600080fd5b506103ed610fd2565b005b3480156103fb57600080fd5b5061041660048036038101906104119190612fef565b6110fd565b005b34801561042457600080fd5b5061042d61111d565b60405161043a9190612fd4565b60405180910390f35b34801561044f57600080fd5b5061046a60048036038101906104659190612ed0565b611123565b6040516104779190612fd4565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190613177565b611267565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190612ed0565b6112f6565b6040516104dd9190612f3e565b60405180910390f35b3480156104f257600080fd5b506104fb61130c565b6040516105089190612e78565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190612ed0565b61139a565b005b34801561054657600080fd5b50610561600480360381019061055c91906131c0565b611420565b60405161056e9190612fd4565b60405180910390f35b34801561058357600080fd5b5061058c6114ef565b005b34801561059a57600080fd5b506105a361162c565b005b3480156105b157600080fd5b506105ba6116d4565b6040516105c79190612f3e565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190612ed0565b6116fe565b005b34801561060557600080fd5b5061060e611784565b60405161061b9190612e78565b60405180910390f35b34801561063057600080fd5b50610639611816565b6040516106469190612fd4565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190613219565b61181c565b005b34801561068457600080fd5b5061068d611993565b60405161069a9190612fd4565b60405180910390f35b3480156106af57600080fd5b506106ca60048036038101906106c591906132fa565b611999565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190612ed0565b6119ec565b6040516107009190612e78565b60405180910390f35b34801561071557600080fd5b5061071e611a68565b60405161072b9190612dcd565b60405180910390f35b34801561074057600080fd5b50610749611a7b565b6040516107569190612fd4565b60405180910390f35b34801561076b57600080fd5b506107866004803603810190610781919061337d565b611a81565b6040516107939190612dcd565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be91906131c0565b611b15565b005b3480156107d157600080fd5b506107da611cc0565b6040516107e79190612fd4565b60405180910390f35b3480156107fc57600080fd5b50610805611cc6565b6040516108129190612fd4565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061094e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061095e575061095d82611cef565b5b9050919050565b606060028054610974906133ec565b80601f01602080910402602001604051908101604052809291908181526020018280546109a0906133ec565b80156109ed5780601f106109c2576101008083540402835291602001916109ed565b820191906000526020600020905b8154815290600101906020018083116109d057829003601f168201915b5050505050905090565b6000610a0282611d59565b610a38576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7e826112f6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ae5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b04611d93565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b365750610b3481610b2f611d93565b611a81565b155b15610b6d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b78838383611d9b565b505050565b610b85611d93565b73ffffffffffffffffffffffffffffffffffffffff16610ba36116d4565b73ffffffffffffffffffffffffffffffffffffffff1614610bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf090613469565b60405180910390fd5b80600a8190555050565b600060015460005403905090565b610c1c838383611e4d565b505050565b601060009054906101000a900460ff16610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c67906134d5565b60405180910390fd5b6001600954610c7f9190613524565b81610c88610c03565b610c929190613524565b10610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc9906135a4565b60405180910390fd5b6000600c5490506000600e549050600a54610ceb610c03565b108015610d0057506000610cfe3361233c565b145b8015610d0e5750600b548311155b15610d1d5760009150600b5490505b8083610d283361233c565b610d329190613524565b1115610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a90613610565b60405180910390fd5b60008390506000610d833361233c565b03610d9857600184610d959190613630565b90505b8281610da49190613664565b341015610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd906136f2565b60405180910390fd5b610df0338561240b565b50505050565b6000610e0183611420565b8210610e39576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054905060008060005b83811015610fc1576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610f225750610fb4565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f6257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fb257868403610fa9578195505050505050610fc6565b83806001019450505b505b8080600101915050610e45565b600080fd5b92915050565b600f5481565b610fda611d93565b73ffffffffffffffffffffffffffffffffffffffff16610ff86116d4565b73ffffffffffffffffffffffffffffffffffffffff161461104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590613469565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161107490613743565b60006040518083038185875af1925050503d80600081146110b1576040519150601f19603f3d011682016040523d82523d6000602084013e6110b6565b606091505b50509050806110fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f1906137a4565b60405180910390fd5b50565b61111883838360405180602001604052806000815250611999565b505050565b600e5481565b60008060005490506000805b8281101561122f576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611221578583036112185781945050505050611262565b82806001019350505b50808060010191505061112f565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61126f611d93565b73ffffffffffffffffffffffffffffffffffffffff1661128d6116d4565b73ffffffffffffffffffffffffffffffffffffffff16146112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da90613469565b60405180910390fd5b80601190816112f29190613970565b5050565b600061130182612429565b600001519050919050565b60118054611319906133ec565b80601f0160208091040260200160405190810160405280929190818152602001828054611345906133ec565b80156113925780601f1061136757610100808354040283529160200191611392565b820191906000526020600020905b81548152906001019060200180831161137557829003601f168201915b505050505081565b6113a2611d93565b73ffffffffffffffffffffffffffffffffffffffff166113c06116d4565b73ffffffffffffffffffffffffffffffffffffffff1614611416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140d90613469565b60405180910390fd5b80600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611487576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6114f7611d93565b73ffffffffffffffffffffffffffffffffffffffff166115156116d4565b73ffffffffffffffffffffffffffffffffffffffff161461156b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156290613469565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611634611d93565b73ffffffffffffffffffffffffffffffffffffffff166116526116d4565b73ffffffffffffffffffffffffffffffffffffffff16146116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f90613469565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611706611d93565b73ffffffffffffffffffffffffffffffffffffffff166117246116d4565b73ffffffffffffffffffffffffffffffffffffffff161461177a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177190613469565b60405180910390fd5b80600c8190555050565b606060038054611793906133ec565b80601f01602080910402602001604051908101604052809291908181526020018280546117bf906133ec565b801561180c5780601f106117e15761010080835404028352916020019161180c565b820191906000526020600020905b8154815290600101906020018083116117ef57829003601f168201915b5050505050905090565b600c5481565b611824611d93565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611888576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611895611d93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611942611d93565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119879190612dcd565b60405180910390a35050565b600b5481565b6119a4848484611e4d565b6119b0848484846126a5565b6119e6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606119f782611d59565b611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90613ab4565b60405180910390fd5b6011611a4183612823565b604051602001611a52929190613bdf565b6040516020818303038152906040529050919050565b601060009054906101000a900460ff1681565b60095481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b1d611d93565b73ffffffffffffffffffffffffffffffffffffffff16611b3b6116d4565b73ffffffffffffffffffffffffffffffffffffffff1614611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8890613469565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf790613c80565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b600d5481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482108015611d8c575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611e5882612429565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611e7f611d93565b73ffffffffffffffffffffffffffffffffffffffff161480611eb25750611eb18260000151611eac611d93565b611a81565b5b80611ef75750611ec0611d93565b73ffffffffffffffffffffffffffffffffffffffff16611edf846109f7565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611f30576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f99576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611fff576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61200c8585856001612983565b61201c6000848460000151611d9b565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036122cc576000548110156122cb5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123358585856001612989565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123a3576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61242582826040518060200160405280600081525061298f565b5050565b612431612cd6565b600082905060005481101561266e576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161266c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125505780925050506126a0565b5b60011561266b57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126665780925050506126a0565b612551565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60006126c68473ffffffffffffffffffffffffffffffffffffffff16611ccc565b15612816578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126ef611d93565b8786866040518563ffffffff1660e01b81526004016127119493929190613cf5565b6020604051808303816000875af192505050801561274d57506040513d601f19601f8201168201806040525081019061274a9190613d56565b60015b6127c6573d806000811461277d576040519150601f19603f3d011682016040523d82523d6000602084013e612782565b606091505b5060008151036127be576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061281b565b600190505b949350505050565b60606000820361286a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061297e565b600082905060005b6000821461289c57808061288590613d83565b915050600a826128959190613dfa565b9150612872565b60008167ffffffffffffffff8111156128b8576128b761304c565b5b6040519080825280601f01601f1916602001820160405280156128ea5781602001600182028036833780820191505090505b5090505b60008514612977576001826129039190613630565b9150600a856129129190613e2b565b603061291e9190613524565b60f81b81838151811061293457612933613e5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129709190613dfa565b94506128ee565b8093505050505b919050565b50505050565b50505050565b61299c83838360016129a1565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612a0d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612a47576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a546000868387612983565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612cb957818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015612c6d5750612c6b60008884886126a5565b155b15612ca4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612bf2565b508060008190555050612ccf6000868387612989565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d6281612d2d565b8114612d6d57600080fd5b50565b600081359050612d7f81612d59565b92915050565b600060208284031215612d9b57612d9a612d23565b5b6000612da984828501612d70565b91505092915050565b60008115159050919050565b612dc781612db2565b82525050565b6000602082019050612de26000830184612dbe565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e22578082015181840152602081019050612e07565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e4a82612de8565b612e548185612df3565b9350612e64818560208601612e04565b612e6d81612e2e565b840191505092915050565b60006020820190508181036000830152612e928184612e3f565b905092915050565b6000819050919050565b612ead81612e9a565b8114612eb857600080fd5b50565b600081359050612eca81612ea4565b92915050565b600060208284031215612ee657612ee5612d23565b5b6000612ef484828501612ebb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f2882612efd565b9050919050565b612f3881612f1d565b82525050565b6000602082019050612f536000830184612f2f565b92915050565b612f6281612f1d565b8114612f6d57600080fd5b50565b600081359050612f7f81612f59565b92915050565b60008060408385031215612f9c57612f9b612d23565b5b6000612faa85828601612f70565b9250506020612fbb85828601612ebb565b9150509250929050565b612fce81612e9a565b82525050565b6000602082019050612fe96000830184612fc5565b92915050565b60008060006060848603121561300857613007612d23565b5b600061301686828701612f70565b935050602061302786828701612f70565b925050604061303886828701612ebb565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61308482612e2e565b810181811067ffffffffffffffff821117156130a3576130a261304c565b5b80604052505050565b60006130b6612d19565b90506130c2828261307b565b919050565b600067ffffffffffffffff8211156130e2576130e161304c565b5b6130eb82612e2e565b9050602081019050919050565b82818337600083830152505050565b600061311a613115846130c7565b6130ac565b90508281526020810184848401111561313657613135613047565b5b6131418482856130f8565b509392505050565b600082601f83011261315e5761315d613042565b5b813561316e848260208601613107565b91505092915050565b60006020828403121561318d5761318c612d23565b5b600082013567ffffffffffffffff8111156131ab576131aa612d28565b5b6131b784828501613149565b91505092915050565b6000602082840312156131d6576131d5612d23565b5b60006131e484828501612f70565b91505092915050565b6131f681612db2565b811461320157600080fd5b50565b600081359050613213816131ed565b92915050565b600080604083850312156132305761322f612d23565b5b600061323e85828601612f70565b925050602061324f85828601613204565b9150509250929050565b600067ffffffffffffffff8211156132745761327361304c565b5b61327d82612e2e565b9050602081019050919050565b600061329d61329884613259565b6130ac565b9050828152602081018484840111156132b9576132b8613047565b5b6132c48482856130f8565b509392505050565b600082601f8301126132e1576132e0613042565b5b81356132f184826020860161328a565b91505092915050565b6000806000806080858703121561331457613313612d23565b5b600061332287828801612f70565b945050602061333387828801612f70565b935050604061334487828801612ebb565b925050606085013567ffffffffffffffff81111561336557613364612d28565b5b613371878288016132cc565b91505092959194509250565b6000806040838503121561339457613393612d23565b5b60006133a285828601612f70565b92505060206133b385828601612f70565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061340457607f821691505b602082108103613417576134166133bd565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613453602083612df3565b915061345e8261341d565b602082019050919050565b6000602082019050818103600083015261348281613446565b9050919050565b7f4d696e74696e67206973206e6f74206c697665207965742e0000000000000000600082015250565b60006134bf601883612df3565b91506134ca82613489565b602082019050919050565b600060208201905081810360008301526134ee816134b2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061352f82612e9a565b915061353a83612e9a565b9250828201905080821115613552576135516134f5565b5b92915050565b7f4e6f206d6f726500000000000000000000000000000000000000000000000000600082015250565b600061358e600783612df3565b915061359982613558565b602082019050919050565b600060208201905081810360008301526135bd81613581565b9050919050565b7f4d6178207065722077616c6c6574000000000000000000000000000000000000600082015250565b60006135fa600e83612df3565b9150613605826135c4565b602082019050919050565b60006020820190508181036000830152613629816135ed565b9050919050565b600061363b82612e9a565b915061364683612e9a565b925082820390508181111561365e5761365d6134f5565b5b92915050565b600061366f82612e9a565b915061367a83612e9a565b925082820261368881612e9a565b9150828204841483151761369f5761369e6134f5565b5b5092915050565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b60006136dc601d83612df3565b91506136e7826136a6565b602082019050919050565b6000602082019050818103600083015261370b816136cf565b9050919050565b600081905092915050565b50565b600061372d600083613712565b91506137388261371d565b600082019050919050565b600061374e82613720565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061378e601083612df3565b915061379982613758565b602082019050919050565b600060208201905081810360008301526137bd81613781565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138267fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826137e9565b61383086836137e9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061386d61386861386384612e9a565b613848565b612e9a565b9050919050565b6000819050919050565b61388783613852565b61389b61389382613874565b8484546137f6565b825550505050565b600090565b6138b06138a3565b6138bb81848461387e565b505050565b5b818110156138df576138d46000826138a8565b6001810190506138c1565b5050565b601f821115613924576138f5816137c4565b6138fe846137d9565b8101602085101561390d578190505b613921613919856137d9565b8301826138c0565b50505b505050565b600082821c905092915050565b600061394760001984600802613929565b1980831691505092915050565b60006139608383613936565b9150826002028217905092915050565b61397982612de8565b67ffffffffffffffff8111156139925761399161304c565b5b61399c82546133ec565b6139a78282856138e3565b600060209050601f8311600181146139da57600084156139c8578287015190505b6139d28582613954565b865550613a3a565b601f1984166139e8866137c4565b60005b82811015613a10578489015182556001820191506020850194506020810190506139eb565b86831015613a2d5784890151613a29601f891682613936565b8355505b6001600288020188555050505b505050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613a9e602f83612df3565b9150613aa982613a42565b604082019050919050565b60006020820190508181036000830152613acd81613a91565b9050919050565b600081905092915050565b60008154613aec816133ec565b613af68186613ad4565b94506001821660008114613b115760018114613b2657613b59565b60ff1983168652811515820286019350613b59565b613b2f856137c4565b60005b83811015613b5157815481890152600182019150602081019050613b32565b838801955050505b50505092915050565b6000613b6d82612de8565b613b778185613ad4565b9350613b87818560208601612e04565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613bc9600583613ad4565b9150613bd482613b93565b600582019050919050565b6000613beb8285613adf565b9150613bf78284613b62565b9150613c0282613bbc565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c6a602683612df3565b9150613c7582613c0e565b604082019050919050565b60006020820190508181036000830152613c9981613c5d565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613cc782613ca0565b613cd18185613cab565b9350613ce1818560208601612e04565b613cea81612e2e565b840191505092915050565b6000608082019050613d0a6000830187612f2f565b613d176020830186612f2f565b613d246040830185612fc5565b8181036060830152613d368184613cbc565b905095945050505050565b600081519050613d5081612d59565b92915050565b600060208284031215613d6c57613d6b612d23565b5b6000613d7a84828501613d41565b91505092915050565b6000613d8e82612e9a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613dc057613dbf6134f5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e0582612e9a565b9150613e1083612e9a565b925082613e2057613e1f613dcb565b5b828204905092915050565b6000613e3682612e9a565b9150613e4183612e9a565b925082613e5157613e50613dcb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212205742942ce990659989da112ddd5250b55e03991117e601177681a76dff75545364736f6c63430008120033

Deployed Bytecode

0x6080604052600436106102045760003560e01c80636d7c4a4b11610118578063a7027357116100a0578063d5abeb011161006f578063d5abeb0114610734578063e985e9c51461075f578063f2fde38b1461079c578063f892c6e2146107c5578063f968adbe146107f057610204565b8063a702735714610678578063b88d4fde146106a3578063c87b56dd146106cc578063d12397301461070957610204565b80638da5cb5b116100e75780638da5cb5b146105a557806391b7f5ed146105d057806395d89b41146105f9578063a035b1fe14610624578063a22cb4651461064f57610204565b80636d7c4a4b1461051157806370a082311461053a578063715018a6146105775780637ba5e6211461058e57610204565b80632f745c591161019b578063453c23101161016a578063453c2310146104185780634f6ccce71461044357806355f804b3146104805780636352211e146104a95780636c0360eb146104e657610204565b80632f745c591461037057806336f5b9a3146103ad5780633ccfd60b146103d857806342842e0e146103ef57610204565b80630c23bb3f116101d75780630c23bb3f146102d757806318160ddd1461030057806323b872dd1461032b5780632db115441461035457610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190612d85565b61081b565b60405161023d9190612dcd565b60405180910390f35b34801561025257600080fd5b5061025b610965565b6040516102689190612e78565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190612ed0565b6109f7565b6040516102a59190612f3e565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190612f85565b610a73565b005b3480156102e357600080fd5b506102fe60048036038101906102f99190612ed0565b610b7d565b005b34801561030c57600080fd5b50610315610c03565b6040516103229190612fd4565b60405180910390f35b34801561033757600080fd5b50610352600480360381019061034d9190612fef565b610c11565b005b61036e60048036038101906103699190612ed0565b610c21565b005b34801561037c57600080fd5b5061039760048036038101906103929190612f85565b610df6565b6040516103a49190612fd4565b60405180910390f35b3480156103b957600080fd5b506103c2610fcc565b6040516103cf9190612fd4565b60405180910390f35b3480156103e457600080fd5b506103ed610fd2565b005b3480156103fb57600080fd5b5061041660048036038101906104119190612fef565b6110fd565b005b34801561042457600080fd5b5061042d61111d565b60405161043a9190612fd4565b60405180910390f35b34801561044f57600080fd5b5061046a60048036038101906104659190612ed0565b611123565b6040516104779190612fd4565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190613177565b611267565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190612ed0565b6112f6565b6040516104dd9190612f3e565b60405180910390f35b3480156104f257600080fd5b506104fb61130c565b6040516105089190612e78565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190612ed0565b61139a565b005b34801561054657600080fd5b50610561600480360381019061055c91906131c0565b611420565b60405161056e9190612fd4565b60405180910390f35b34801561058357600080fd5b5061058c6114ef565b005b34801561059a57600080fd5b506105a361162c565b005b3480156105b157600080fd5b506105ba6116d4565b6040516105c79190612f3e565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f29190612ed0565b6116fe565b005b34801561060557600080fd5b5061060e611784565b60405161061b9190612e78565b60405180910390f35b34801561063057600080fd5b50610639611816565b6040516106469190612fd4565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190613219565b61181c565b005b34801561068457600080fd5b5061068d611993565b60405161069a9190612fd4565b60405180910390f35b3480156106af57600080fd5b506106ca60048036038101906106c591906132fa565b611999565b005b3480156106d857600080fd5b506106f360048036038101906106ee9190612ed0565b6119ec565b6040516107009190612e78565b60405180910390f35b34801561071557600080fd5b5061071e611a68565b60405161072b9190612dcd565b60405180910390f35b34801561074057600080fd5b50610749611a7b565b6040516107569190612fd4565b60405180910390f35b34801561076b57600080fd5b506107866004803603810190610781919061337d565b611a81565b6040516107939190612dcd565b60405180910390f35b3480156107a857600080fd5b506107c360048036038101906107be91906131c0565b611b15565b005b3480156107d157600080fd5b506107da611cc0565b6040516107e79190612fd4565b60405180910390f35b3480156107fc57600080fd5b50610805611cc6565b6040516108129190612fd4565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061094e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061095e575061095d82611cef565b5b9050919050565b606060028054610974906133ec565b80601f01602080910402602001604051908101604052809291908181526020018280546109a0906133ec565b80156109ed5780601f106109c2576101008083540402835291602001916109ed565b820191906000526020600020905b8154815290600101906020018083116109d057829003601f168201915b5050505050905090565b6000610a0282611d59565b610a38576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a7e826112f6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ae5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b04611d93565b73ffffffffffffffffffffffffffffffffffffffff1614158015610b365750610b3481610b2f611d93565b611a81565b155b15610b6d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b78838383611d9b565b505050565b610b85611d93565b73ffffffffffffffffffffffffffffffffffffffff16610ba36116d4565b73ffffffffffffffffffffffffffffffffffffffff1614610bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf090613469565b60405180910390fd5b80600a8190555050565b600060015460005403905090565b610c1c838383611e4d565b505050565b601060009054906101000a900460ff16610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c67906134d5565b60405180910390fd5b6001600954610c7f9190613524565b81610c88610c03565b610c929190613524565b10610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc9906135a4565b60405180910390fd5b6000600c5490506000600e549050600a54610ceb610c03565b108015610d0057506000610cfe3361233c565b145b8015610d0e5750600b548311155b15610d1d5760009150600b5490505b8083610d283361233c565b610d329190613524565b1115610d73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6a90613610565b60405180910390fd5b60008390506000610d833361233c565b03610d9857600184610d959190613630565b90505b8281610da49190613664565b341015610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd906136f2565b60405180910390fd5b610df0338561240b565b50505050565b6000610e0183611420565b8210610e39576040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008054905060008060005b83811015610fc1576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115610f225750610fb4565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f6257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610fb257868403610fa9578195505050505050610fc6565b83806001019450505b505b8080600101915050610e45565b600080fd5b92915050565b600f5481565b610fda611d93565b73ffffffffffffffffffffffffffffffffffffffff16610ff86116d4565b73ffffffffffffffffffffffffffffffffffffffff161461104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590613469565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161107490613743565b60006040518083038185875af1925050503d80600081146110b1576040519150601f19603f3d011682016040523d82523d6000602084013e6110b6565b606091505b50509050806110fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f1906137a4565b60405180910390fd5b50565b61111883838360405180602001604052806000815250611999565b505050565b600e5481565b60008060005490506000805b8281101561122f576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611221578583036112185781945050505050611262565b82806001019350505b50808060010191505061112f565b506040517fa723001c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61126f611d93565b73ffffffffffffffffffffffffffffffffffffffff1661128d6116d4565b73ffffffffffffffffffffffffffffffffffffffff16146112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da90613469565b60405180910390fd5b80601190816112f29190613970565b5050565b600061130182612429565b600001519050919050565b60118054611319906133ec565b80601f0160208091040260200160405190810160405280929190818152602001828054611345906133ec565b80156113925780601f1061136757610100808354040283529160200191611392565b820191906000526020600020905b81548152906001019060200180831161137557829003601f168201915b505050505081565b6113a2611d93565b73ffffffffffffffffffffffffffffffffffffffff166113c06116d4565b73ffffffffffffffffffffffffffffffffffffffff1614611416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140d90613469565b60405180910390fd5b80600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611487576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6114f7611d93565b73ffffffffffffffffffffffffffffffffffffffff166115156116d4565b73ffffffffffffffffffffffffffffffffffffffff161461156b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156290613469565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611634611d93565b73ffffffffffffffffffffffffffffffffffffffff166116526116d4565b73ffffffffffffffffffffffffffffffffffffffff16146116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f90613469565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611706611d93565b73ffffffffffffffffffffffffffffffffffffffff166117246116d4565b73ffffffffffffffffffffffffffffffffffffffff161461177a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177190613469565b60405180910390fd5b80600c8190555050565b606060038054611793906133ec565b80601f01602080910402602001604051908101604052809291908181526020018280546117bf906133ec565b801561180c5780601f106117e15761010080835404028352916020019161180c565b820191906000526020600020905b8154815290600101906020018083116117ef57829003601f168201915b5050505050905090565b600c5481565b611824611d93565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611888576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611895611d93565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611942611d93565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119879190612dcd565b60405180910390a35050565b600b5481565b6119a4848484611e4d565b6119b0848484846126a5565b6119e6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60606119f782611d59565b611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90613ab4565b60405180910390fd5b6011611a4183612823565b604051602001611a52929190613bdf565b6040516020818303038152906040529050919050565b601060009054906101000a900460ff1681565b60095481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b1d611d93565b73ffffffffffffffffffffffffffffffffffffffff16611b3b6116d4565b73ffffffffffffffffffffffffffffffffffffffff1614611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8890613469565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf790613c80565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b600d5481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482108015611d8c575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611e5882612429565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611e7f611d93565b73ffffffffffffffffffffffffffffffffffffffff161480611eb25750611eb18260000151611eac611d93565b611a81565b5b80611ef75750611ec0611d93565b73ffffffffffffffffffffffffffffffffffffffff16611edf846109f7565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611f30576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f99576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611fff576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61200c8585856001612983565b61201c6000848460000151611d9b565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036122cc576000548110156122cb5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123358585856001612989565b5050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036123a3576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61242582826040518060200160405280600081525061298f565b5050565b612431612cd6565b600082905060005481101561266e576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161266c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125505780925050506126a0565b5b60011561266b57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126665780925050506126a0565b612551565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60006126c68473ffffffffffffffffffffffffffffffffffffffff16611ccc565b15612816578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126ef611d93565b8786866040518563ffffffff1660e01b81526004016127119493929190613cf5565b6020604051808303816000875af192505050801561274d57506040513d601f19601f8201168201806040525081019061274a9190613d56565b60015b6127c6573d806000811461277d576040519150601f19603f3d011682016040523d82523d6000602084013e612782565b606091505b5060008151036127be576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061281b565b600190505b949350505050565b60606000820361286a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061297e565b600082905060005b6000821461289c57808061288590613d83565b915050600a826128959190613dfa565b9150612872565b60008167ffffffffffffffff8111156128b8576128b761304c565b5b6040519080825280601f01601f1916602001820160405280156128ea5781602001600182028036833780820191505090505b5090505b60008514612977576001826129039190613630565b9150600a856129129190613e2b565b603061291e9190613524565b60f81b81838151811061293457612933613e5c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129709190613dfa565b94506128ee565b8093505050505b919050565b50505050565b50505050565b61299c83838360016129a1565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612a0d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612a47576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a546000868387612983565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612cb957818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4838015612c6d5750612c6b60008884886126a5565b155b15612ca4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81806001019250508080600101915050612bf2565b508060008190555050612ccf6000868387612989565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d6281612d2d565b8114612d6d57600080fd5b50565b600081359050612d7f81612d59565b92915050565b600060208284031215612d9b57612d9a612d23565b5b6000612da984828501612d70565b91505092915050565b60008115159050919050565b612dc781612db2565b82525050565b6000602082019050612de26000830184612dbe565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e22578082015181840152602081019050612e07565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e4a82612de8565b612e548185612df3565b9350612e64818560208601612e04565b612e6d81612e2e565b840191505092915050565b60006020820190508181036000830152612e928184612e3f565b905092915050565b6000819050919050565b612ead81612e9a565b8114612eb857600080fd5b50565b600081359050612eca81612ea4565b92915050565b600060208284031215612ee657612ee5612d23565b5b6000612ef484828501612ebb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f2882612efd565b9050919050565b612f3881612f1d565b82525050565b6000602082019050612f536000830184612f2f565b92915050565b612f6281612f1d565b8114612f6d57600080fd5b50565b600081359050612f7f81612f59565b92915050565b60008060408385031215612f9c57612f9b612d23565b5b6000612faa85828601612f70565b9250506020612fbb85828601612ebb565b9150509250929050565b612fce81612e9a565b82525050565b6000602082019050612fe96000830184612fc5565b92915050565b60008060006060848603121561300857613007612d23565b5b600061301686828701612f70565b935050602061302786828701612f70565b925050604061303886828701612ebb565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61308482612e2e565b810181811067ffffffffffffffff821117156130a3576130a261304c565b5b80604052505050565b60006130b6612d19565b90506130c2828261307b565b919050565b600067ffffffffffffffff8211156130e2576130e161304c565b5b6130eb82612e2e565b9050602081019050919050565b82818337600083830152505050565b600061311a613115846130c7565b6130ac565b90508281526020810184848401111561313657613135613047565b5b6131418482856130f8565b509392505050565b600082601f83011261315e5761315d613042565b5b813561316e848260208601613107565b91505092915050565b60006020828403121561318d5761318c612d23565b5b600082013567ffffffffffffffff8111156131ab576131aa612d28565b5b6131b784828501613149565b91505092915050565b6000602082840312156131d6576131d5612d23565b5b60006131e484828501612f70565b91505092915050565b6131f681612db2565b811461320157600080fd5b50565b600081359050613213816131ed565b92915050565b600080604083850312156132305761322f612d23565b5b600061323e85828601612f70565b925050602061324f85828601613204565b9150509250929050565b600067ffffffffffffffff8211156132745761327361304c565b5b61327d82612e2e565b9050602081019050919050565b600061329d61329884613259565b6130ac565b9050828152602081018484840111156132b9576132b8613047565b5b6132c48482856130f8565b509392505050565b600082601f8301126132e1576132e0613042565b5b81356132f184826020860161328a565b91505092915050565b6000806000806080858703121561331457613313612d23565b5b600061332287828801612f70565b945050602061333387828801612f70565b935050604061334487828801612ebb565b925050606085013567ffffffffffffffff81111561336557613364612d28565b5b613371878288016132cc565b91505092959194509250565b6000806040838503121561339457613393612d23565b5b60006133a285828601612f70565b92505060206133b385828601612f70565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061340457607f821691505b602082108103613417576134166133bd565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613453602083612df3565b915061345e8261341d565b602082019050919050565b6000602082019050818103600083015261348281613446565b9050919050565b7f4d696e74696e67206973206e6f74206c697665207965742e0000000000000000600082015250565b60006134bf601883612df3565b91506134ca82613489565b602082019050919050565b600060208201905081810360008301526134ee816134b2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061352f82612e9a565b915061353a83612e9a565b9250828201905080821115613552576135516134f5565b5b92915050565b7f4e6f206d6f726500000000000000000000000000000000000000000000000000600082015250565b600061358e600783612df3565b915061359982613558565b602082019050919050565b600060208201905081810360008301526135bd81613581565b9050919050565b7f4d6178207065722077616c6c6574000000000000000000000000000000000000600082015250565b60006135fa600e83612df3565b9150613605826135c4565b602082019050919050565b60006020820190508181036000830152613629816135ed565b9050919050565b600061363b82612e9a565b915061364683612e9a565b925082820390508181111561365e5761365d6134f5565b5b92915050565b600061366f82612e9a565b915061367a83612e9a565b925082820261368881612e9a565b9150828204841483151761369f5761369e6134f5565b5b5092915050565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b60006136dc601d83612df3565b91506136e7826136a6565b602082019050919050565b6000602082019050818103600083015261370b816136cf565b9050919050565b600081905092915050565b50565b600061372d600083613712565b91506137388261371d565b600082019050919050565b600061374e82613720565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061378e601083612df3565b915061379982613758565b602082019050919050565b600060208201905081810360008301526137bd81613781565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138267fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826137e9565b61383086836137e9565b95508019841693508086168417925050509392505050565b6000819050919050565b600061386d61386861386384612e9a565b613848565b612e9a565b9050919050565b6000819050919050565b61388783613852565b61389b61389382613874565b8484546137f6565b825550505050565b600090565b6138b06138a3565b6138bb81848461387e565b505050565b5b818110156138df576138d46000826138a8565b6001810190506138c1565b5050565b601f821115613924576138f5816137c4565b6138fe846137d9565b8101602085101561390d578190505b613921613919856137d9565b8301826138c0565b50505b505050565b600082821c905092915050565b600061394760001984600802613929565b1980831691505092915050565b60006139608383613936565b9150826002028217905092915050565b61397982612de8565b67ffffffffffffffff8111156139925761399161304c565b5b61399c82546133ec565b6139a78282856138e3565b600060209050601f8311600181146139da57600084156139c8578287015190505b6139d28582613954565b865550613a3a565b601f1984166139e8866137c4565b60005b82811015613a10578489015182556001820191506020850194506020810190506139eb565b86831015613a2d5784890151613a29601f891682613936565b8355505b6001600288020188555050505b505050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613a9e602f83612df3565b9150613aa982613a42565b604082019050919050565b60006020820190508181036000830152613acd81613a91565b9050919050565b600081905092915050565b60008154613aec816133ec565b613af68186613ad4565b94506001821660008114613b115760018114613b2657613b59565b60ff1983168652811515820286019350613b59565b613b2f856137c4565b60005b83811015613b5157815481890152600182019150602081019050613b32565b838801955050505b50505092915050565b6000613b6d82612de8565b613b778185613ad4565b9350613b87818560208601612e04565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613bc9600583613ad4565b9150613bd482613b93565b600582019050919050565b6000613beb8285613adf565b9150613bf78284613b62565b9150613c0282613bbc565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c6a602683612df3565b9150613c7582613c0e565b604082019050919050565b60006020820190508181036000830152613c9981613c5d565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613cc782613ca0565b613cd18185613cab565b9350613ce1818560208601612e04565b613cea81612e2e565b840191505092915050565b6000608082019050613d0a6000830187612f2f565b613d176020830186612f2f565b613d246040830185612fc5565b8181036060830152613d368184613cbc565b905095945050505050565b600081519050613d5081612d59565b92915050565b600060208284031215613d6c57613d6b612d23565b5b6000613d7a84828501613d41565b91505092915050565b6000613d8e82612e9a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613dc057613dbf6134f5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e0582612e9a565b9150613e1083612e9a565b925082613e2057613e1f613dcb565b5b828204905092915050565b6000613e3682612e9a565b9150613e4183612e9a565b925082613e5157613e50613dcb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212205742942ce990659989da112ddd5250b55e03991117e601177681a76dff75545364736f6c63430008120033

Deployed Bytecode Sourcemap

107:2571:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6016:410:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8629:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10173:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9750:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2253:102:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3248:278:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11104:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;620:925:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4836:1113:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;416:31:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2475:201;;;;;;;;;;;;;:::i;:::-;;11334:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;378:32:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3812:731:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2065:86:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8445:122:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;490:21:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2361:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6485:203:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:145:12;;;;;;;;;;;;;:::i;:::-;;1977:82:11;;;;;;;;;;;;;:::i;:::-;;1061:85:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2157:90:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8791:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;304:34:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10476:294:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;263:35:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11579:332:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1663:308:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;453:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;185;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10836:206:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1987:240:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;222:35:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;344:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6016:410:4;6158:4;6212:25;6197:40;;;:11;:40;;;;:104;;;;6268:33;6253:48;;;:11;:48;;;;6197:104;:170;;;;6332:35;6317:50;;;:11;:50;;;;6197:170;:222;;;;6383:36;6407:11;6383:23;:36::i;:::-;6197:222;6178:241;;6016:410;;;:::o;8629:98::-;8683:13;8715:5;8708:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8629:98;:::o;10173:236::-;10273:7;10301:16;10309:7;10301;:16::i;:::-;10296:64;;10326:34;;;;;;;;;;;;;;10296:64;10378:15;:24;10394:7;10378:24;;;;;;;;;;;;;;;;;;;;;10371:31;;10173:236;;;:::o;9750:362::-;9822:13;9838:24;9854:7;9838:15;:24::i;:::-;9822:40;;9882:5;9876:11;;:2;:11;;;9872:48;;9896:24;;;;;;;;;;;;;;9872:48;9951:5;9935:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;9961:37;9978:5;9985:12;:10;:12::i;:::-;9961:16;:37::i;:::-;9960:38;9935:63;9931:136;;;10021:35;;;;;;;;;;;;;;9931:136;10077:28;10086:2;10090:7;10099:5;10077:8;:28::i;:::-;9812:300;9750:362;;:::o;2253:102:11:-;1284:12:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2341:7:11::1;2325:13;:23;;;;2253:102:::0;:::o;3248:278:4:-;3309:7;3497:12;;3481:13;;:28;3474:35;;3248:278;:::o;11104:164::-;11233:28;11243:4;11249:2;11253:7;11233:9;:28::i;:::-;11104:164;;;:::o;620:925:11:-;693:11;;;;;;;;;;;685:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;790:1;778:9;;:13;;;;:::i;:::-;767:8;751:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;743:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;813:12;828:5;;813:20;;843:21;867:12;;843:36;;923:13;;907;:11;:13::i;:::-;:29;:75;;;;;981:1;952:25;966:10;952:13;:25::i;:::-;:30;907:75;:119;;;;;1010:16;;998:8;:28;;907:119;890:226;;;1058:1;1051:8;;1089:16;;1073:32;;890:226;1187:13;1175:8;1147:25;1161:10;1147:13;:25::i;:::-;:36;;;;:::i;:::-;:53;;1126:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;1251:20;1274:8;1251:31;;1325:1;1296:25;1310:10;1296:13;:25::i;:::-;:30;1292:88;;1368:1;1357:8;:12;;;;:::i;:::-;1342:27;;1292:88;1438:4;1423:12;:19;;;;:::i;:::-;1410:9;:32;;1389:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;1507:31;1517:10;1529:8;1507:9;:31::i;:::-;675:870;;;620:925;:::o;4836:1113:4:-;4957:7;4993:16;5003:5;4993:9;:16::i;:::-;4984:5;:25;4980:61;;5018:23;;;;;;;;;;;;;;4980:61;5051:22;5076:13;;5051:38;;5099:19;5128:25;5324:9;5319:543;5339:14;5335:1;:18;5319:543;;;5378:31;5412:11;:14;5424:1;5412:14;;;;;;;;;;;5378:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5448:9;:16;;;5444:71;;;5488:8;;;5444:71;5562:1;5536:28;;:9;:14;;;:28;;;5532:109;;5608:9;:14;;;5588:34;;5532:109;5683:5;5662:26;;:17;:26;;;5658:190;;5731:5;5716:11;:20;5712:83;;5771:1;5764:8;;;;;;;;;5712:83;5816:13;;;;;;;5658:190;5360:502;5319:543;5355:3;;;;;;;5319:543;;;5934:8;;;4836:1113;;;;;:::o;416:31:11:-;;;;:::o;2475:201::-;1284:12:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2525:12:11::1;2551:10;2543:24;;2588:21;2543:80;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2524:99;;;2641:7;2633:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;2514:162;2475:201::o:0;11334:179:4:-;11467:39;11484:4;11490:2;11494:7;11467:39;;;;;;;;;;;;:16;:39::i;:::-;11334:179;;;:::o;378:32:11:-;;;;:::o;3812:731:4:-;3911:7;3934:22;3959:13;;3934:38;;3982:19;4172:9;4167:320;4187:14;4183:1;:18;4167:320;;;4226:31;4260:11;:14;4272:1;4260:14;;;;;;;;;;;4226:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4297:9;:16;;;4292:181;;4356:5;4341:11;:20;4337:83;;4396:1;4389:8;;;;;;;;4337:83;4441:13;;;;;;;4292:181;4208:279;4203:3;;;;;;;4167:320;;;;4513:23;;;;;;;;;;;;;;3812:731;;;;:::o;2065:86:11:-;1284:12:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2141:3:11::1;2131:7;:13;;;;;;:::i;:::-;;2065:86:::0;:::o;8445:122:4:-;8509:7;8535:20;8547:7;8535:11;:20::i;:::-;:25;;;8528:32;;8445:122;;;:::o;490:21:11:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2361:108::-;1284:12:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2455:7:11::1;2436:16;:26;;;;2361:108:::0;:::o;6485:203:4:-;6549:7;6589:1;6572:19;;:5;:19;;;6568:60;;6600:28;;;;;;;;;;;;;;6568:60;6653:12;:19;6666:5;6653:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;6645:36;;6638:43;;6485:203;;;:::o;1693:145:12:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1799:1:::1;1762:40;;1783:6;;;;;;;;;;;1762:40;;;;;;;;;;;;1829:1;1812:6;;:19;;;;;;;;;;;;;;;;;;1693:145::o:0;1977:82:11:-;1284:12:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2041:11:11::1;;;;;;;;;;;2040:12;2026:11;;:26;;;;;;;;;;;;;;;;;;1977:82::o:0;1061:85:12:-;1107:7;1133:6;;;;;;;;;;;1126:13;;1061:85;:::o;2157:90:11:-;1284:12:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2231:9:11::1;2223:5;:17;;;;2157:90:::0;:::o;8791:102:4:-;8847:13;8879:7;8872:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8791:102;:::o;304:34:11:-;;;;:::o;10476:294:4:-;10598:12;:10;:12::i;:::-;10586:24;;:8;:24;;;10582:54;;10619:17;;;;;;;;;;;;;;10582:54;10692:8;10647:18;:32;10666:12;:10;:12::i;:::-;10647:32;;;;;;;;;;;;;;;:42;10680:8;10647:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;10744:8;10715:48;;10730:12;:10;:12::i;:::-;10715:48;;;10754:8;10715:48;;;;;;:::i;:::-;;;;;;;;10476:294;;:::o;263:35:11:-;;;;:::o;11579:332:4:-;11740:28;11750:4;11756:2;11760:7;11740:9;:28::i;:::-;11783:48;11806:4;11812:2;11816:7;11825:5;11783:22;:48::i;:::-;11778:127;;11854:40;;;;;;;;;;;;;;11778:127;11579:332;;;;:::o;1663:308:11:-;1750:13;1796:16;1804:7;1796;:16::i;:::-;1775:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;1926:7;1935:18;:7;:16;:18::i;:::-;1909:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1895:69;;1663:308;;;:::o;453:31::-;;;;;;;;;;;;;:::o;185:::-;;;;:::o;10836:206:4:-;10973:4;11000:18;:25;11019:5;11000:25;;;;;;;;;;;;;;;:35;11026:8;11000:35;;;;;;;;;;;;;;;;;;;;;;;;;10993:42;;10836:206;;;;:::o;1987:240:12:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2095:1:::1;2075:22;;:8;:22;;::::0;2067:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2184:8;2155:38;;2176:6;;;;;;;;;;;2155:38;;;;;;;;;;;;2212:8;2203:6;;:17;;;;;;;;;;;;;;;;;;1987:240:::0;:::o;222:35:11:-;;;;:::o;344:28::-;;;;:::o;1160:320:0:-;1220:4;1472:1;1450:7;:19;;;:23;1443:30;;1160:320;;;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;12157:142:4:-;12214:4;12247:13;;12237:7;:23;:55;;;;;12265:11;:20;12277:7;12265:20;;;;;;;;;;;:27;;;;;;;;;;;;12264:28;12237:55;12230:62;;12157:142;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;19283:189:4:-;19420:2;19393:15;:24;19409:7;19393:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19457:7;19453:2;19437:28;;19446:5;19437:28;;;;;;;;;;;;19283:189;;;:::o;14839:2092::-;14949:35;14987:20;14999:7;14987:11;:20::i;:::-;14949:58;;15018:22;15060:13;:18;;;15044:34;;:12;:10;:12::i;:::-;:34;;;:100;;;;15094:50;15111:13;:18;;;15131:12;:10;:12::i;:::-;15094:16;:50::i;:::-;15044:100;:152;;;;15184:12;:10;:12::i;:::-;15160:36;;:20;15172:7;15160:11;:20::i;:::-;:36;;;15044:152;15018:179;;15213:17;15208:66;;15239:35;;;;;;;;;;;;;;15208:66;15310:4;15288:26;;:13;:18;;;:26;;;15284:67;;15323:28;;;;;;;;;;;;;;15284:67;15379:1;15365:16;;:2;:16;;;15361:52;;15390:23;;;;;;;;;;;;;;15361:52;15424:43;15446:4;15452:2;15456:7;15465:1;15424:21;:43::i;:::-;15529:49;15546:1;15550:7;15559:13;:18;;;15529:8;:49::i;:::-;15898:1;15868:12;:18;15881:4;15868:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15941:1;15913:12;:16;15926:2;15913:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15985:2;15957:11;:20;15969:7;15957:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;16046:15;16001:11;:20;16013:7;16001:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;16310:19;16342:1;16332:7;:11;16310:33;;16402:1;16361:43;;:11;:24;16373:11;16361:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;16357:463;;16583:13;;16569:11;:27;16565:241;;;16652:13;:18;;;16620:11;:24;16632:11;16620:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;16734:13;:53;;;16692:11;:24;16704:11;16692:24;;;;;;;;;;;:39;;;:95;;;;;;;;;;;;;;;;;;16565:241;16357:463;15844:986;16864:7;16860:2;16845:27;;16854:4;16845:27;;;;;;;;;;;;16882:42;16903:4;16909:2;16913:7;16922:1;16882:20;:42::i;:::-;14939:1992;;14839:2092;;;:::o;6694:204::-;6755:7;6795:1;6778:19;;:5;:19;;;6774:59;;6806:27;;;;;;;;;;;;;;6774:59;6858:12;:19;6871:5;6858:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;6850:41;;6843:48;;6694:204;;;:::o;12305:102::-;12373:27;12383:2;12387:8;12373:27;;;;;;;;;;;;:9;:27::i;:::-;12305:102;;:::o;7304:1084::-;7389:21;;:::i;:::-;7426:12;7441:7;7426:22;;7494:13;;7487:4;:20;7483:841;;;7527:31;7561:11;:17;7573:4;7561:17;;;;;;;;;;;7527:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7601:9;:16;;;7596:714;;7671:1;7645:28;;:9;:14;;;:28;;;7641:99;;7708:9;7701:16;;;;;;7641:99;8037:255;8044:4;8037:255;;;8076:6;;;;;;;;8120:11;:17;8132:4;8120:17;;;;;;;;;;;8108:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8193:1;8167:28;;:9;:14;;;:28;;;8163:107;;8234:9;8227:16;;;;;;8163:107;8037:255;;;7596:714;7509:815;7483:841;8350:31;;;;;;;;;;;;;;7304:1084;;;;:::o;20025:895::-;20175:4;20195:15;:2;:13;;;:15::i;:::-;20191:723;;;20262:2;20246:36;;;20304:12;:10;:12::i;:::-;20338:4;20364:7;20393:5;20246:170;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;20226:636;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20616:1;20599:6;:13;:18;20595:253;;20648:40;;;;;;;;;;;;;;20595:253;20800:6;20794:13;20785:6;20781:2;20777:15;20770:38;20226:636;20488:45;;;20478:55;;;:6;:55;;;;20471:62;;;;;20191:723;20899:4;20892:11;;20025:895;;;;;;;:::o;328:703:13:-;384:13;610:1;601:5;:10;597:51;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;21551:154:4:-;;;;;:::o;22346:153::-;;;;;:::o;12758:157::-;12876:32;12882:2;12886:8;12896:5;12903:4;12876:5;:32::i;:::-;12758:157;;;:::o;13162:1435::-;13295:20;13318:13;;13295:36;;13359:1;13345:16;;:2;:16;;;13341:48;;13370:19;;;;;;;;;;;;;;13341:48;13415:1;13403:8;:13;13399:44;;13425:18;;;;;;;;;;;;;;13399:44;13454:61;13484:1;13488:2;13492:12;13506:8;13454:21;:61::i;:::-;13821:8;13786:12;:16;13799:2;13786:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13884:8;13844:12;:16;13857:2;13844:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13941:2;13908:11;:25;13920:12;13908:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;14007:15;13957:11;:25;13969:12;13957:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;14038:20;14061:12;14038:35;;14093:9;14088:380;14108:8;14104:1;:12;14088:380;;;14171:12;14167:2;14146:38;;14163:1;14146:38;;;;;;;;;;;;14227:4;:88;;;;;14256:59;14287:1;14291:2;14295:12;14309:5;14256:22;:59::i;:::-;14255:60;14227:88;14202:220;;;14363:40;;;;;;;;;;;;;;14202:220;14439:14;;;;;;;14118:3;;;;;;;14088:380;;;;14498:12;14482:13;:28;;;;13762:759;14530:60;14559:1;14563:2;14567:12;14581:8;14530:20;:60::i;:::-;13285:1312;13162:1435;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:14:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:180;6161:77;6158:1;6151:88;6258:4;6255:1;6248:15;6282:4;6279:1;6272:15;6299:281;6382:27;6404:4;6382:27;:::i;:::-;6374:6;6370:40;6512:6;6500:10;6497:22;6476:18;6464:10;6461:34;6458:62;6455:88;;;6523:18;;:::i;:::-;6455:88;6563:10;6559:2;6552:22;6342:238;6299:281;;:::o;6586:129::-;6620:6;6647:20;;:::i;:::-;6637:30;;6676:33;6704:4;6696:6;6676:33;:::i;:::-;6586:129;;;:::o;6721:308::-;6783:4;6873:18;6865:6;6862:30;6859:56;;;6895:18;;:::i;:::-;6859:56;6933:29;6955:6;6933:29;:::i;:::-;6925:37;;7017:4;7011;7007:15;6999:23;;6721:308;;;:::o;7035:146::-;7132:6;7127:3;7122;7109:30;7173:1;7164:6;7159:3;7155:16;7148:27;7035:146;;;:::o;7187:425::-;7265:5;7290:66;7306:49;7348:6;7306:49;:::i;:::-;7290:66;:::i;:::-;7281:75;;7379:6;7372:5;7365:21;7417:4;7410:5;7406:16;7455:3;7446:6;7441:3;7437:16;7434:25;7431:112;;;7462:79;;:::i;:::-;7431:112;7552:54;7599:6;7594:3;7589;7552:54;:::i;:::-;7271:341;7187:425;;;;;:::o;7632:340::-;7688:5;7737:3;7730:4;7722:6;7718:17;7714:27;7704:122;;7745:79;;:::i;:::-;7704:122;7862:6;7849:20;7887:79;7962:3;7954:6;7947:4;7939:6;7935:17;7887:79;:::i;:::-;7878:88;;7694:278;7632:340;;;;:::o;7978:509::-;8047:6;8096:2;8084:9;8075:7;8071:23;8067:32;8064:119;;;8102:79;;:::i;:::-;8064:119;8250:1;8239:9;8235:17;8222:31;8280:18;8272:6;8269:30;8266:117;;;8302:79;;:::i;:::-;8266:117;8407:63;8462:7;8453:6;8442:9;8438:22;8407:63;:::i;:::-;8397:73;;8193:287;7978:509;;;;:::o;8493:329::-;8552:6;8601:2;8589:9;8580:7;8576:23;8572:32;8569:119;;;8607:79;;:::i;:::-;8569:119;8727:1;8752:53;8797:7;8788:6;8777:9;8773:22;8752:53;:::i;:::-;8742:63;;8698:117;8493:329;;;;:::o;8828:116::-;8898:21;8913:5;8898:21;:::i;:::-;8891:5;8888:32;8878:60;;8934:1;8931;8924:12;8878:60;8828:116;:::o;8950:133::-;8993:5;9031:6;9018:20;9009:29;;9047:30;9071:5;9047:30;:::i;:::-;8950:133;;;;:::o;9089:468::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9464:2;9490:50;9532:7;9523:6;9512:9;9508:22;9490:50;:::i;:::-;9480:60;;9435:115;9089:468;;;;;:::o;9563:307::-;9624:4;9714:18;9706:6;9703:30;9700:56;;;9736:18;;:::i;:::-;9700:56;9774:29;9796:6;9774:29;:::i;:::-;9766:37;;9858:4;9852;9848:15;9840:23;;9563:307;;;:::o;9876:423::-;9953:5;9978:65;9994:48;10035:6;9994:48;:::i;:::-;9978:65;:::i;:::-;9969:74;;10066:6;10059:5;10052:21;10104:4;10097:5;10093:16;10142:3;10133:6;10128:3;10124:16;10121:25;10118:112;;;10149:79;;:::i;:::-;10118:112;10239:54;10286:6;10281:3;10276;10239:54;:::i;:::-;9959:340;9876:423;;;;;:::o;10318:338::-;10373:5;10422:3;10415:4;10407:6;10403:17;10399:27;10389:122;;10430:79;;:::i;:::-;10389:122;10547:6;10534:20;10572:78;10646:3;10638:6;10631:4;10623:6;10619:17;10572:78;:::i;:::-;10563:87;;10379:277;10318:338;;;;:::o;10662:943::-;10757:6;10765;10773;10781;10830:3;10818:9;10809:7;10805:23;10801:33;10798:120;;;10837:79;;:::i;:::-;10798:120;10957:1;10982:53;11027:7;11018:6;11007:9;11003:22;10982:53;:::i;:::-;10972:63;;10928:117;11084:2;11110:53;11155:7;11146:6;11135:9;11131:22;11110:53;:::i;:::-;11100:63;;11055:118;11212:2;11238:53;11283:7;11274:6;11263:9;11259:22;11238:53;:::i;:::-;11228:63;;11183:118;11368:2;11357:9;11353:18;11340:32;11399:18;11391:6;11388:30;11385:117;;;11421:79;;:::i;:::-;11385:117;11526:62;11580:7;11571:6;11560:9;11556:22;11526:62;:::i;:::-;11516:72;;11311:287;10662:943;;;;;;;:::o;11611:474::-;11679:6;11687;11736:2;11724:9;11715:7;11711:23;11707:32;11704:119;;;11742:79;;:::i;:::-;11704:119;11862:1;11887:53;11932:7;11923:6;11912:9;11908:22;11887:53;:::i;:::-;11877:63;;11833:117;11989:2;12015:53;12060:7;12051:6;12040:9;12036:22;12015:53;:::i;:::-;12005:63;;11960:118;11611:474;;;;;:::o;12091:180::-;12139:77;12136:1;12129:88;12236:4;12233:1;12226:15;12260:4;12257:1;12250:15;12277:320;12321:6;12358:1;12352:4;12348:12;12338:22;;12405:1;12399:4;12395:12;12426:18;12416:81;;12482:4;12474:6;12470:17;12460:27;;12416:81;12544:2;12536:6;12533:14;12513:18;12510:38;12507:84;;12563:18;;:::i;:::-;12507:84;12328:269;12277:320;;;:::o;12603:182::-;12743:34;12739:1;12731:6;12727:14;12720:58;12603:182;:::o;12791:366::-;12933:3;12954:67;13018:2;13013:3;12954:67;:::i;:::-;12947:74;;13030:93;13119:3;13030:93;:::i;:::-;13148:2;13143:3;13139:12;13132:19;;12791:366;;;:::o;13163:419::-;13329:4;13367:2;13356:9;13352:18;13344:26;;13416:9;13410:4;13406:20;13402:1;13391:9;13387:17;13380:47;13444:131;13570:4;13444:131;:::i;:::-;13436:139;;13163:419;;;:::o;13588:174::-;13728:26;13724:1;13716:6;13712:14;13705:50;13588:174;:::o;13768:366::-;13910:3;13931:67;13995:2;13990:3;13931:67;:::i;:::-;13924:74;;14007:93;14096:3;14007:93;:::i;:::-;14125:2;14120:3;14116:12;14109:19;;13768:366;;;:::o;14140:419::-;14306:4;14344:2;14333:9;14329:18;14321:26;;14393:9;14387:4;14383:20;14379:1;14368:9;14364:17;14357:47;14421:131;14547:4;14421:131;:::i;:::-;14413:139;;14140:419;;;:::o;14565:180::-;14613:77;14610:1;14603:88;14710:4;14707:1;14700:15;14734:4;14731:1;14724:15;14751:191;14791:3;14810:20;14828:1;14810:20;:::i;:::-;14805:25;;14844:20;14862:1;14844:20;:::i;:::-;14839:25;;14887:1;14884;14880:9;14873:16;;14908:3;14905:1;14902:10;14899:36;;;14915:18;;:::i;:::-;14899:36;14751:191;;;;:::o;14948:157::-;15088:9;15084:1;15076:6;15072:14;15065:33;14948:157;:::o;15111:365::-;15253:3;15274:66;15338:1;15333:3;15274:66;:::i;:::-;15267:73;;15349:93;15438:3;15349:93;:::i;:::-;15467:2;15462:3;15458:12;15451:19;;15111:365;;;:::o;15482:419::-;15648:4;15686:2;15675:9;15671:18;15663:26;;15735:9;15729:4;15725:20;15721:1;15710:9;15706:17;15699:47;15763:131;15889:4;15763:131;:::i;:::-;15755:139;;15482:419;;;:::o;15907:164::-;16047:16;16043:1;16035:6;16031:14;16024:40;15907:164;:::o;16077:366::-;16219:3;16240:67;16304:2;16299:3;16240:67;:::i;:::-;16233:74;;16316:93;16405:3;16316:93;:::i;:::-;16434:2;16429:3;16425:12;16418:19;;16077:366;;;:::o;16449:419::-;16615:4;16653:2;16642:9;16638:18;16630:26;;16702:9;16696:4;16692:20;16688:1;16677:9;16673:17;16666:47;16730:131;16856:4;16730:131;:::i;:::-;16722:139;;16449:419;;;:::o;16874:194::-;16914:4;16934:20;16952:1;16934:20;:::i;:::-;16929:25;;16968:20;16986:1;16968:20;:::i;:::-;16963:25;;17012:1;17009;17005:9;16997:17;;17036:1;17030:4;17027:11;17024:37;;;17041:18;;:::i;:::-;17024:37;16874:194;;;;:::o;17074:410::-;17114:7;17137:20;17155:1;17137:20;:::i;:::-;17132:25;;17171:20;17189:1;17171:20;:::i;:::-;17166:25;;17226:1;17223;17219:9;17248:30;17266:11;17248:30;:::i;:::-;17237:41;;17427:1;17418:7;17414:15;17411:1;17408:22;17388:1;17381:9;17361:83;17338:139;;17457:18;;:::i;:::-;17338:139;17122:362;17074:410;;;;:::o;17490:179::-;17630:31;17626:1;17618:6;17614:14;17607:55;17490:179;:::o;17675:366::-;17817:3;17838:67;17902:2;17897:3;17838:67;:::i;:::-;17831:74;;17914:93;18003:3;17914:93;:::i;:::-;18032:2;18027:3;18023:12;18016:19;;17675:366;;;:::o;18047:419::-;18213:4;18251:2;18240:9;18236:18;18228:26;;18300:9;18294:4;18290:20;18286:1;18275:9;18271:17;18264:47;18328:131;18454:4;18328:131;:::i;:::-;18320:139;;18047:419;;;:::o;18472:147::-;18573:11;18610:3;18595:18;;18472:147;;;;:::o;18625:114::-;;:::o;18745:398::-;18904:3;18925:83;19006:1;19001:3;18925:83;:::i;:::-;18918:90;;19017:93;19106:3;19017:93;:::i;:::-;19135:1;19130:3;19126:11;19119:18;;18745:398;;;:::o;19149:379::-;19333:3;19355:147;19498:3;19355:147;:::i;:::-;19348:154;;19519:3;19512:10;;19149:379;;;:::o;19534:166::-;19674:18;19670:1;19662:6;19658:14;19651:42;19534:166;:::o;19706:366::-;19848:3;19869:67;19933:2;19928:3;19869:67;:::i;:::-;19862:74;;19945:93;20034:3;19945:93;:::i;:::-;20063:2;20058:3;20054:12;20047:19;;19706:366;;;:::o;20078:419::-;20244:4;20282:2;20271:9;20267:18;20259:26;;20331:9;20325:4;20321:20;20317:1;20306:9;20302:17;20295:47;20359:131;20485:4;20359:131;:::i;:::-;20351:139;;20078:419;;;:::o;20503:141::-;20552:4;20575:3;20567:11;;20598:3;20595:1;20588:14;20632:4;20629:1;20619:18;20611:26;;20503:141;;;:::o;20650:93::-;20687:6;20734:2;20729;20722:5;20718:14;20714:23;20704:33;;20650:93;;;:::o;20749:107::-;20793:8;20843:5;20837:4;20833:16;20812:37;;20749:107;;;;:::o;20862:393::-;20931:6;20981:1;20969:10;20965:18;21004:97;21034:66;21023:9;21004:97;:::i;:::-;21122:39;21152:8;21141:9;21122:39;:::i;:::-;21110:51;;21194:4;21190:9;21183:5;21179:21;21170:30;;21243:4;21233:8;21229:19;21222:5;21219:30;21209:40;;20938:317;;20862:393;;;;;:::o;21261:60::-;21289:3;21310:5;21303:12;;21261:60;;;:::o;21327:142::-;21377:9;21410:53;21428:34;21437:24;21455:5;21437:24;:::i;:::-;21428:34;:::i;:::-;21410:53;:::i;:::-;21397:66;;21327:142;;;:::o;21475:75::-;21518:3;21539:5;21532:12;;21475:75;;;:::o;21556:269::-;21666:39;21697:7;21666:39;:::i;:::-;21727:91;21776:41;21800:16;21776:41;:::i;:::-;21768:6;21761:4;21755:11;21727:91;:::i;:::-;21721:4;21714:105;21632:193;21556:269;;;:::o;21831:73::-;21876:3;21831:73;:::o;21910:189::-;21987:32;;:::i;:::-;22028:65;22086:6;22078;22072:4;22028:65;:::i;:::-;21963:136;21910:189;;:::o;22105:186::-;22165:120;22182:3;22175:5;22172:14;22165:120;;;22236:39;22273:1;22266:5;22236:39;:::i;:::-;22209:1;22202:5;22198:13;22189:22;;22165:120;;;22105:186;;:::o;22297:543::-;22398:2;22393:3;22390:11;22387:446;;;22432:38;22464:5;22432:38;:::i;:::-;22516:29;22534:10;22516:29;:::i;:::-;22506:8;22502:44;22699:2;22687:10;22684:18;22681:49;;;22720:8;22705:23;;22681:49;22743:80;22799:22;22817:3;22799:22;:::i;:::-;22789:8;22785:37;22772:11;22743:80;:::i;:::-;22402:431;;22387:446;22297:543;;;:::o;22846:117::-;22900:8;22950:5;22944:4;22940:16;22919:37;;22846:117;;;;:::o;22969:169::-;23013:6;23046:51;23094:1;23090:6;23082:5;23079:1;23075:13;23046:51;:::i;:::-;23042:56;23127:4;23121;23117:15;23107:25;;23020:118;22969:169;;;;:::o;23143:295::-;23219:4;23365:29;23390:3;23384:4;23365:29;:::i;:::-;23357:37;;23427:3;23424:1;23420:11;23414:4;23411:21;23403:29;;23143:295;;;;:::o;23443:1395::-;23560:37;23593:3;23560:37;:::i;:::-;23662:18;23654:6;23651:30;23648:56;;;23684:18;;:::i;:::-;23648:56;23728:38;23760:4;23754:11;23728:38;:::i;:::-;23813:67;23873:6;23865;23859:4;23813:67;:::i;:::-;23907:1;23931:4;23918:17;;23963:2;23955:6;23952:14;23980:1;23975:618;;;;24637:1;24654:6;24651:77;;;24703:9;24698:3;24694:19;24688:26;24679:35;;24651:77;24754:67;24814:6;24807:5;24754:67;:::i;:::-;24748:4;24741:81;24610:222;23945:887;;23975:618;24027:4;24023:9;24015:6;24011:22;24061:37;24093:4;24061:37;:::i;:::-;24120:1;24134:208;24148:7;24145:1;24142:14;24134:208;;;24227:9;24222:3;24218:19;24212:26;24204:6;24197:42;24278:1;24270:6;24266:14;24256:24;;24325:2;24314:9;24310:18;24297:31;;24171:4;24168:1;24164:12;24159:17;;24134:208;;;24370:6;24361:7;24358:19;24355:179;;;24428:9;24423:3;24419:19;24413:26;24471:48;24513:4;24505:6;24501:17;24490:9;24471:48;:::i;:::-;24463:6;24456:64;24378:156;24355:179;24580:1;24576;24568:6;24564:14;24560:22;24554:4;24547:36;23982:611;;;23945:887;;23535:1303;;;23443:1395;;:::o;24844:234::-;24984:34;24980:1;24972:6;24968:14;24961:58;25053:17;25048:2;25040:6;25036:15;25029:42;24844:234;:::o;25084:366::-;25226:3;25247:67;25311:2;25306:3;25247:67;:::i;:::-;25240:74;;25323:93;25412:3;25323:93;:::i;:::-;25441:2;25436:3;25432:12;25425:19;;25084:366;;;:::o;25456:419::-;25622:4;25660:2;25649:9;25645:18;25637:26;;25709:9;25703:4;25699:20;25695:1;25684:9;25680:17;25673:47;25737:131;25863:4;25737:131;:::i;:::-;25729:139;;25456:419;;;:::o;25881:148::-;25983:11;26020:3;26005:18;;25881:148;;;;:::o;26059:874::-;26162:3;26199:5;26193:12;26228:36;26254:9;26228:36;:::i;:::-;26280:89;26362:6;26357:3;26280:89;:::i;:::-;26273:96;;26400:1;26389:9;26385:17;26416:1;26411:166;;;;26591:1;26586:341;;;;26378:549;;26411:166;26495:4;26491:9;26480;26476:25;26471:3;26464:38;26557:6;26550:14;26543:22;26535:6;26531:35;26526:3;26522:45;26515:52;;26411:166;;26586:341;26653:38;26685:5;26653:38;:::i;:::-;26713:1;26727:154;26741:6;26738:1;26735:13;26727:154;;;26815:7;26809:14;26805:1;26800:3;26796:11;26789:35;26865:1;26856:7;26852:15;26841:26;;26763:4;26760:1;26756:12;26751:17;;26727:154;;;26910:6;26905:3;26901:16;26894:23;;26593:334;;26378:549;;26166:767;;26059:874;;;;:::o;26939:390::-;27045:3;27073:39;27106:5;27073:39;:::i;:::-;27128:89;27210:6;27205:3;27128:89;:::i;:::-;27121:96;;27226:65;27284:6;27279:3;27272:4;27265:5;27261:16;27226:65;:::i;:::-;27316:6;27311:3;27307:16;27300:23;;27049:280;26939:390;;;;:::o;27335:155::-;27475:7;27471:1;27463:6;27459:14;27452:31;27335:155;:::o;27496:400::-;27656:3;27677:84;27759:1;27754:3;27677:84;:::i;:::-;27670:91;;27770:93;27859:3;27770:93;:::i;:::-;27888:1;27883:3;27879:11;27872:18;;27496:400;;;:::o;27902:695::-;28180:3;28202:92;28290:3;28281:6;28202:92;:::i;:::-;28195:99;;28311:95;28402:3;28393:6;28311:95;:::i;:::-;28304:102;;28423:148;28567:3;28423:148;:::i;:::-;28416:155;;28588:3;28581:10;;27902:695;;;;;:::o;28603:225::-;28743:34;28739:1;28731:6;28727:14;28720:58;28812:8;28807:2;28799:6;28795:15;28788:33;28603:225;:::o;28834:366::-;28976:3;28997:67;29061:2;29056:3;28997:67;:::i;:::-;28990:74;;29073:93;29162:3;29073:93;:::i;:::-;29191:2;29186:3;29182:12;29175:19;;28834:366;;;:::o;29206:419::-;29372:4;29410:2;29399:9;29395:18;29387:26;;29459:9;29453:4;29449:20;29445:1;29434:9;29430:17;29423:47;29487:131;29613:4;29487:131;:::i;:::-;29479:139;;29206:419;;;:::o;29631:98::-;29682:6;29716:5;29710:12;29700:22;;29631:98;;;:::o;29735:168::-;29818:11;29852:6;29847:3;29840:19;29892:4;29887:3;29883:14;29868:29;;29735:168;;;;:::o;29909:373::-;29995:3;30023:38;30055:5;30023:38;:::i;:::-;30077:70;30140:6;30135:3;30077:70;:::i;:::-;30070:77;;30156:65;30214:6;30209:3;30202:4;30195:5;30191:16;30156:65;:::i;:::-;30246:29;30268:6;30246:29;:::i;:::-;30241:3;30237:39;30230:46;;29999:283;29909:373;;;;:::o;30288:640::-;30483:4;30521:3;30510:9;30506:19;30498:27;;30535:71;30603:1;30592:9;30588:17;30579:6;30535:71;:::i;:::-;30616:72;30684:2;30673:9;30669:18;30660:6;30616:72;:::i;:::-;30698;30766:2;30755:9;30751:18;30742:6;30698:72;:::i;:::-;30817:9;30811:4;30807:20;30802:2;30791:9;30787:18;30780:48;30845:76;30916:4;30907:6;30845:76;:::i;:::-;30837:84;;30288:640;;;;;;;:::o;30934:141::-;30990:5;31021:6;31015:13;31006:22;;31037:32;31063:5;31037:32;:::i;:::-;30934:141;;;;:::o;31081:349::-;31150:6;31199:2;31187:9;31178:7;31174:23;31170:32;31167:119;;;31205:79;;:::i;:::-;31167:119;31325:1;31350:63;31405:7;31396:6;31385:9;31381:22;31350:63;:::i;:::-;31340:73;;31296:127;31081:349;;;;:::o;31436:233::-;31475:3;31498:24;31516:5;31498:24;:::i;:::-;31489:33;;31544:66;31537:5;31534:77;31531:103;;31614:18;;:::i;:::-;31531:103;31661:1;31654:5;31650:13;31643:20;;31436:233;;;:::o;31675:180::-;31723:77;31720:1;31713:88;31820:4;31817:1;31810:15;31844:4;31841:1;31834:15;31861:185;31901:1;31918:20;31936:1;31918:20;:::i;:::-;31913:25;;31952:20;31970:1;31952:20;:::i;:::-;31947:25;;31991:1;31981:35;;31996:18;;:::i;:::-;31981:35;32038:1;32035;32031:9;32026:14;;31861:185;;;;:::o;32052:176::-;32084:1;32101:20;32119:1;32101:20;:::i;:::-;32096:25;;32135:20;32153:1;32135:20;:::i;:::-;32130:25;;32174:1;32164:35;;32179:18;;:::i;:::-;32164:35;32220:1;32217;32213:9;32208:14;;32052:176;;;;:::o;32234:180::-;32282:77;32279:1;32272:88;32379:4;32376:1;32369:15;32403:4;32400:1;32393:15

Swarm Source

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