ETH Price: $2,395.80 (-0.76%)

Token

Metaplaces Artifacts (MA)
 

Overview

Max Total Supply

64 MA

Holders

40

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
hyperchoco.eth
Balance
1 MA
0x4e89c46c2ffa7c927aab7c4b45e17c6fbee4f219
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:
MetaplacesArtifacts

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-04
*/

/**
 *Submitted for verification at Etherscan.io on 2022-04-17
*/

// File lib/utils/introspection/IERC165.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.8.4;
/**
 * @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 lib/token/ERC721/IERC721.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 lib/token/ERC721/IERC721Receiver.sol


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


// File lib/token/ERC721/extensions/IERC721Metadata.sol

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

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

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


// File lib/utils/Address.sol


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File lib/utils/Context.sol


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

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


// File lib/utils/Strings.sol


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

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

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

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

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


// File lib/utils/introspection/ERC165.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 lib/token/ERC721A.sol









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

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
    IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
            operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
            && operatorFilterRegistry.isOperatorAllowed(address(this), from)
            )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual 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 onlyAllowedOperator(from) virtual override {
        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // 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 storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.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;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

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

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

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

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

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


// File lib/token/ERC721AOwnersExplicit.sol


error AllOwnershipsHaveBeenSet();
error QuantityMustBeNonZero();
error NoTokensMintedYet();

abstract contract ERC721AOwnersExplicit is ERC721A {
    uint256 public nextOwnerToExplicitlySet;

    /**
     * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
     */
    function _setOwnersExplicit(uint256 quantity) internal {
        if (quantity == 0) revert QuantityMustBeNonZero();
        if (_currentIndex == _startTokenId()) revert NoTokensMintedYet();
        uint256 _nextOwnerToExplicitlySet = nextOwnerToExplicitlySet;
        if (_nextOwnerToExplicitlySet == 0) {
            _nextOwnerToExplicitlySet = _startTokenId();
        }
        if (_nextOwnerToExplicitlySet >= _currentIndex) revert AllOwnershipsHaveBeenSet();

        // Index underflow is impossible.
        // Counter or index overflow is incredibly unrealistic.
        unchecked {
            uint256 endIndex = _nextOwnerToExplicitlySet + quantity - 1;

            // Set the end index to be the last token index
            if (endIndex + 1 > _currentIndex) {
                endIndex = _currentIndex - 1;
            }

            for (uint256 i = _nextOwnerToExplicitlySet; i <= endIndex; i++) {
                if (_ownerships[i].addr == address(0) && !_ownerships[i].burned) {
                    TokenOwnership memory ownership = _ownershipOf(i);
                    _ownerships[i].addr = ownership.addr;
                    _ownerships[i].startTimestamp = ownership.startTimestamp;
                }
            }

            nextOwnerToExplicitlySet = endIndex + 1;
        }
    }
}


// File lib/token/ERC721/extensions/ERC721Ownable.sol


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

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

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

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

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

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

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

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


// File lib/utils/cryptography/MerkleProof.sol


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

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




// import "../lib/utils/ReentrancyGuard.sol";
contract ERC721AMO is ERC721AOwnersExplicit, Ownable {
    mapping (uint256 => string) public bridgedNfts;

    uint16 public airdropsClaimed;
    uint16 public maxAirdropClaims = 100;
    struct AirdropClaim {
        address user;
        uint256 amount;
    }

    // Mint Sale dates
    uint32 private wlSaleStartTime;
    uint32 private publicSaleStartTime;

    // Max Supply
    uint16 public maxSupply = 1000;

    // Mint config
    uint16 private constant maxBatchSize = 20;
    uint16 private constant maxMintTx = 1;
    uint16 private constant maxWlMintNumber = 10;


    bytes32 private rootmt;

    // Mint Price
    uint256 public mintPrice = 0.065 ether;
    uint256 public wlMintPrice = 0.045 ether;

    // Metadata URI
    string private _baseTokenURI;

    constructor(string memory name_, string memory symbol_)
        ERC721A(name_, symbol_)
    {}

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    event MintInitiated(
        uint256 mintPrice,
        uint256 wlMintPrice,
        uint16 maxAirdropClaims,
        uint16 maxSupply
    );

    event MintedAI(
        uint256 nftId,
        uint256 params,
        address owner
    );

    event BridgedAndBurned(
        address from,
        uint256 nftId,
        string btcAddress
    );

    function initiateMint(
        uint256 _mintPrice,
        uint256 _wlMintPrice,
        uint16 _maxAirdropClaims,
        uint16 _maxSupply
    ) external onlyOwner {
        require(
            _mintPrice != 0
            && _wlMintPrice != 0,
            "ERC721AMO::initiateMint: wrong prices provided"
        );

        require(
            _maxAirdropClaims > airdropsClaimed
            && _maxSupply > totalSupply(),
            "ERC721AMO::initiateMint: wrong supplies provided"
        );

        mintPrice = _mintPrice;
        wlMintPrice = _wlMintPrice;
        maxAirdropClaims = _maxAirdropClaims;
        maxSupply = _maxSupply;

        emit MintInitiated(
            _mintPrice,
            _wlMintPrice,
            _maxAirdropClaims,
            _maxSupply
        );
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function totalMinted() public view returns (uint256) {
        return _totalMinted();
    }

    function baseURI() public view returns (string memory) {
        return _baseURI();
    }

    function exists(uint256 tokenId) public view returns (bool) {
        return _exists(tokenId);
    }

    // Verifying whitelist spot
    function checkValidity(bytes32[] calldata _merkleProof)
        public
        view
        returns (bool)
    {
        bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
        require(
            MerkleProof.verify(_merkleProof, rootmt, leaf),
            "Incorrect proof"
        );
        return true;
    }

    function setRootMerkleHash(bytes32 _rootmt) external onlyOwner {
        rootmt = _rootmt;
    }

    // Mint dates could be set to a distant future to stop the mint
    function setMintDates(uint32 wlDate, uint32 publicDate) external onlyOwner {
        require(wlDate != 0 && publicDate != 0, "dates must be defined");
        wlSaleStartTime = wlDate;
        publicSaleStartTime = publicDate;
    }

    function publicMint(address to, uint256 quantity, uint256 _params)
        external
        payable
        callerIsUser
    {
        require(isPublicSaleOn(), "public sale has not started yet");
        require(quantity <= maxMintTx, "can not mint this many at once");
        require(msg.value >= mintPrice * quantity, "need to send more ETH");
        safeMint(to, quantity);
        emit MintedAI(_currentIndex-1, _params, _msgSender());
    }

    // Only whitelisted addresses are authorized to mint during the Whitelist Mint
    function whitelistMint(
        address to,
        uint256 quantity,
        bytes32[] calldata _merkleProof,
        uint256 _params
    ) external payable {
        require(isWlSaleOn(), "whitelist sale has not started yet");
        require(
            numberMinted(to) + quantity <= maxWlMintNumber,
            "can not mint this many"
        );
        // Checking address to instead of _msgSender()
        bytes32 leaf = keccak256(abi.encodePacked(to));
        require(
            MerkleProof.verify(_merkleProof, rootmt, leaf),
            "Incorrect proof"
        );
        require(msg.value >= wlMintPrice * quantity, "need to send more ETH");
        safeMint(to, quantity);
        emit MintedAI(_currentIndex-1, _params, _msgSender());
    }

    function safeMint(address to, uint256 quantity) private {
        require(
            totalMinted() + quantity <= maxSupply,
            "insufficient remaining supply for desired mint amount"
        );
        require(
            quantity > 0 && quantity <= maxBatchSize,
            "incorrect mint quantity"
        );

        _safeMint(to, quantity);
    }

    receive() external payable {}

    function isWlSaleOn() public view returns (bool) {
        uint256 _wlSaleStartTime = uint256(wlSaleStartTime);
        return _wlSaleStartTime != 0 && block.timestamp >= _wlSaleStartTime;
    }

    function isPublicSaleOn() public view returns (bool) {
        uint256 _publicSaleStartTime = uint256(publicSaleStartTime);
        return
            _publicSaleStartTime != 0 &&
            block.timestamp >= _publicSaleStartTime;
    }

    function airdropClaims(
        AirdropClaim[] calldata airdropClaimList
    ) external onlyOwner {
        uint256 tokensBeingClaimed;
        for (uint256 i = 0; i < airdropClaimList.length; i++)
            tokensBeingClaimed += airdropClaimList[i].amount;

        require(
            tokensBeingClaimed + airdropsClaimed <= maxAirdropClaims,
            "cannot mint"
        );

        airdropsClaimed += uint16(tokensBeingClaimed);

        for (uint256 i = 0; i < airdropClaimList.length; i++)
            _safeMint(airdropClaimList[i].user, airdropClaimList[i].amount);
    }

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

    function setBaseURI(string calldata baseURIValue) external onlyOwner {
        _baseTokenURI = baseURIValue;
    }

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

    function setOwnersExplicit(uint256 quantity) external onlyOwner {
        _setOwnersExplicit(quantity);
    }

    function getOwnershipData(uint256 tokenId)
        external
        view
        returns (TokenOwnership memory)
    {
        return _ownershipOf(tokenId);
    }

    function bridgeAndBurn(uint256 _nftId,  string memory _btcAddress) external {
        TokenOwnership memory prevOwnership = _ownershipOf(_nftId);
        bytes memory btcAddressBytes = bytes(_btcAddress);
        require(btcAddressBytes.length > 0 , "Invalid BTC Address");
        if (_msgSender() != prevOwnership.addr) revert TransferCallerNotOwnerNorApproved();
        bridgedNfts[_nftId] = _btcAddress;
        _burn(_nftId);
        emit BridgedAndBurned(_msgSender(), _nftId, _btcAddress);
    }
}

// File contracts/MetaplacesArtifacts.sol
contract MetaplacesArtifacts is ERC721AMO {
    constructor() ERC721AMO("Metaplaces Artifacts", "MA") {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllOwnershipsHaveBeenSet","type":"error"},{"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":"NoTokensMintedYet","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"QuantityMustBeNonZero","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"},{"indexed":false,"internalType":"string","name":"btcAddress","type":"string"}],"name":"BridgedAndBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mintPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wlMintPrice","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"maxAirdropClaims","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"maxSupply","type":"uint16"}],"name":"MintInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"params","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"MintedAI","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":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ERC721AMO.AirdropClaim[]","name":"airdropClaimList","type":"tuple[]"}],"name":"airdropClaims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropsClaimed","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"string","name":"_btcAddress","type":"string"}],"name":"bridgeAndBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bridgedNfts","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"checkValidity","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_wlMintPrice","type":"uint256"},{"internalType":"uint16","name":"_maxAirdropClaims","type":"uint16"},{"internalType":"uint16","name":"_maxSupply","type":"uint16"}],"name":"initiateMint","outputs":[],"stateMutability":"nonpayable","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":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWlSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAirdropClaims","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"_params","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":"baseURIValue","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"wlDate","type":"uint32"},{"internalType":"uint32","name":"publicDate","type":"uint32"}],"name":"setMintDates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_rootmt","type":"bytes32"}],"name":"setRootMerkleHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_params","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600b805463ffff000061ffff60601b0119166d03e800000000000000000064000017905566e6ed27d6668000600d55669fdf42f6e48000600e553480156200004b57600080fd5b50604080518082018252601481527f4d657461706c6163657320417274696661637473000000000000000000000000602080830191909152825180840190935260028352614d4160f01b90830152908181733cc6cdda760b79bafa08df41ecfa224f810dceb660016daaeb6d7670e522a718067333cd4e3b15620001f85780156200014657604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200012757600080fd5b505af11580156200013c573d6000803e3d6000fd5b50505050620001f8565b6001600160a01b03821615620001975760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016200010c565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001de57600080fd5b505af1158015620001f3573d6000803e3d6000fd5b505050505b505081516200020f90600290602085019062000291565b5080516200022590600390602084019062000291565b5050600080555062000237336200023f565b505062000374565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200029f9062000337565b90600052602060002090601f016020900481019282620002c357600085556200030e565b82601f10620002de57805160ff19168380011785556200030e565b828001600101855582156200030e579182015b828111156200030e578251825591602001919060010190620002f1565b506200031c92915062000320565b5090565b5b808211156200031c576000815560010162000321565b600181811c908216806200034c57607f821691505b602082108114156200036e57634e487b7160e01b600052602260045260246000fd5b50919050565b61329980620003846000396000f3fe6080604052600436106102555760003560e01c80636c0360eb11610139578063a22cb465116100b6578063d334c54f1161007a578063d334c54f146106e8578063d5abeb01146106fd578063d7224ba01461071f578063dc33e68114610735578063e985e9c514610755578063f2fde38b1461079e57600080fd5b8063a22cb46514610653578063a2309ff814610673578063b88d4fde14610688578063c507b806146106a8578063c87b56dd146106c857600080fd5b80639028241b116100fd5780639028241b1461059a5780639231ab2a146105b5578063954d90d01461060b57806395d89b411461062b5780639f02c81e1461064057600080fd5b80636c0360eb1461051257806370a0823114610527578063715018a61461054757806383e3d7691461055c5780638da5cb5b1461057c57600080fd5b80632ee4361c116101d257806355f804b31161019657806355f804b31461045557806358155dcc1461047557806362d5d3f0146104885780636352211e146104bc578063645eb7b8146104dc5780636817c76c146104fc57600080fd5b80632ee4361c146103cb5780633ccfd60b146103eb5780633f5e47411461040057806342842e0e146104155780634f558e791461043557600080fd5b806318160ddd1161021957806318160ddd1461033257806323b872dd146103555780632c4e9fc6146103755780632d20fb601461038b5780632d4d8765146103ab57600080fd5b806301ffc9a71461026157806306fdde0314610296578063081812fc146102b85780630829ea90146102f0578063095ea7b31461031257600080fd5b3661025c57005b600080fd5b34801561026d57600080fd5b5061028161027c366004612e61565b6107be565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ab610810565b60405161028d9190613080565b3480156102c457600080fd5b506102d86102d3366004612e49565b6108a2565b6040516001600160a01b03909116815260200161028d565b3480156102fc57600080fd5b5061031061030b366004612dbe565b6108e6565b005b34801561031e57600080fd5b5061031061032d366004612cc5565b610a83565b34801561033e57600080fd5b50600154600054035b60405190815260200161028d565b34801561036157600080fd5b50610310610370366004612bdc565b610b11565b34801561038157600080fd5b50610347600e5481565b34801561039757600080fd5b506103106103a6366004612e49565b610c86565b3480156103b757600080fd5b506103106103c6366004612e49565b610cbc565b3480156103d757600080fd5b506102ab6103e6366004612e49565b610ceb565b3480156103f757600080fd5b50610310610d85565b34801561040c57600080fd5b50610281610e3a565b34801561042157600080fd5b50610310610430366004612bdc565b610e62565b34801561044157600080fd5b50610281610450366004612e49565b610ff2565b34801561046157600080fd5b50610310610470366004612e99565b610ffd565b610310610483366004612cee565b611033565b34801561049457600080fd5b50600b546104a99062010000900461ffff1681565b60405161ffff909116815260200161028d565b3480156104c857600080fd5b506102d86104d7366004612e49565b61125c565b3480156104e857600080fd5b506103106104f7366004612f4a565b61126e565b34801561050857600080fd5b50610347600d5481565b34801561051e57600080fd5b506102ab611425565b34801561053357600080fd5b50610347610542366004612b90565b611434565b34801561055357600080fd5b50610310611482565b34801561056857600080fd5b50610310610577366004612ef3565b6114b8565b34801561058857600080fd5b506009546001600160a01b03166102d8565b3480156105a657600080fd5b50600b546104a99061ffff1681565b3480156105c157600080fd5b506105d56105d0366004612e49565b61159b565b6040805182516001600160a01b031681526020808401516001600160401b0316908201529181015115159082015260600161028d565b34801561061757600080fd5b50610281610626366004612d7f565b6115c1565b34801561063757600080fd5b506102ab611685565b61031061064e366004612d4d565b611694565b34801561065f57600080fd5b5061031061066e366004612c8f565b611839565b34801561067f57600080fd5b50600054610347565b34801561069457600080fd5b506103106106a3366004612c17565b6118cf565b3480156106b457600080fd5b506103106106c3366004612f8f565b611acb565b3480156106d457600080fd5b506102ab6106e3366004612e49565b611b9a565b3480156106f457600080fd5b50610281611c1f565b34801561070957600080fd5b50600b546104a990600160601b900461ffff1681565b34801561072b57600080fd5b5061034760085481565b34801561074157600080fd5b50610347610750366004612b90565b611c45565b34801561076157600080fd5b50610281610770366004612baa565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156107aa57600080fd5b506103106107b9366004612b90565b611c73565b60006001600160e01b031982166380ac58cd60e01b14806107ef57506001600160e01b03198216635b5e139f60e01b145b8061080a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461081f90613173565b80601f016020809104026020016040519081016040528092919081815260200182805461084b90613173565b80156108985780601f1061086d57610100808354040283529160200191610898565b820191906000526020600020905b81548152906001019060200180831161087b57829003601f168201915b5050505050905090565b60006108ad82611d0b565b6108ca576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6009546001600160a01b031633146109195760405162461bcd60e51b815260040161091090613093565b60405180910390fd5b6000805b8281101561096e5783838281811061094557634e487b7160e01b600052603260045260246000fd5b905060400201602001358261095a91906130e5565b915080610966816131ae565b91505061091d565b50600b5461ffff6201000082048116916109899116836130e5565b11156109c55760405162461bcd60e51b815260206004820152600b60248201526a18d85b9b9bdd081b5a5b9d60aa1b6044820152606401610910565b600b80548291906000906109de90849061ffff166130c8565b92506101000a81548161ffff021916908361ffff16021790555060005b82811015610a7d57610a6b848483818110610a2657634e487b7160e01b600052603260045260246000fd5b610a3c9260206040909202019081019150612b90565b858584818110610a5c57634e487b7160e01b600052603260045260246000fd5b90506040020160200135611d36565b80610a75816131ae565b9150506109fb565b50505050565b6000610a8e8261125c565b9050806001600160a01b0316836001600160a01b03161415610ac35760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610ae35750610ae18133610770565b155b15610b01576040516367d9dca160e11b815260040160405180910390fd5b610b0c838383611d54565b505050565b826daaeb6d7670e522a718067333cd4e3b15610c7b576001600160a01b038116331415610b4857610b43848484611db0565b610a7d565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015610b9257600080fd5b505afa158015610ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bca9190612e2d565b8015610c5c5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015610c2457600080fd5b505afa158015610c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5c9190612e2d565b610c7b57604051633b79c77360e21b8152336004820152602401610910565b610a7d848484611db0565b6009546001600160a01b03163314610cb05760405162461bcd60e51b815260040161091090613093565b610cb981611f89565b50565b6009546001600160a01b03163314610ce65760405162461bcd60e51b815260040161091090613093565b600c55565b600a6020526000908152604090208054610d0490613173565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3090613173565b8015610d7d5780601f10610d5257610100808354040283529160200191610d7d565b820191906000526020600020905b815481529060010190602001808311610d6057829003601f168201915b505050505081565b6009546001600160a01b03163314610daf5760405162461bcd60e51b815260040161091090613093565b604051600090339047908381818185875af1925050503d8060008114610df1576040519150601f19603f3d011682016040523d82523d6000602084013e610df6565b606091505b5050905080610cb95760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610910565b600b54600090600160401b900463ffffffff168015801590610e5c5750804210155b91505090565b826daaeb6d7670e522a718067333cd4e3b15610fd7576001600160a01b038116331415610ea457610b43848484604051806020016040528060008152506118cf565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015610eee57600080fd5b505afa158015610f02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f269190612e2d565b8015610fb85750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015610f8057600080fd5b505afa158015610f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb89190612e2d565b610fd757604051633b79c77360e21b8152336004820152602401610910565b610a7d848484604051806020016040528060008152506118cf565b600061080a82611d0b565b6009546001600160a01b031633146110275760405162461bcd60e51b815260040161091090613093565b610b0c600f8383612983565b61103b611c1f565b6110925760405162461bcd60e51b815260206004820152602260248201527f77686974656c6973742073616c6520686173206e6f7420737461727465642079604482015261195d60f21b6064820152608401610910565b600a8461109e87611c45565b6110a891906130e5565b11156110ef5760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610910565b6040516bffffffffffffffffffffffff19606087901b16602082015260009060340160405160208183030381529060405280519060200120905061116a84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c5491508490506120c0565b6111a85760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba10383937b7b360891b6044820152606401610910565b84600e546111b69190613111565b3410156111fd5760405162461bcd60e51b81526020600482015260156024820152740dccacac840e8de40e6cadcc840dadee4ca408aa89605b1b6044820152606401610910565b61120786866120d6565b7fbb2712c8d066be423635db2e56b33a40294747837c735e577e4f5a705e41f3b960016000546112379190613130565b60408051918252602082018590523382820152519081900360600190a1505050505050565b6000611267826121cb565b5192915050565b6009546001600160a01b031633146112985760405162461bcd60e51b815260040161091090613093565b83158015906112a657508215155b6113095760405162461bcd60e51b815260206004820152602e60248201527f455243373231414d4f3a3a696e6974696174654d696e743a2077726f6e67207060448201526d1c9a58d95cc81c1c9bdd9a59195960921b6064820152608401610910565b600b5461ffff90811690831611801561132b5750600154600054038161ffff16115b6113905760405162461bcd60e51b815260206004820152603060248201527f455243373231414d4f3a3a696e6974696174654d696e743a2077726f6e67207360448201526f1d5c1c1b1a595cc81c1c9bdd9a59195960821b6064820152608401610910565b600d849055600e839055600b80546dffff0000000000000000ffff000019166201000061ffff85811691820261ffff60601b191692909217600160601b9285169283021790925560408051878152602081018790529081019290925260608201527f5292d4cf9a529b61fb8831a8378588433abfa9931c4c15938d37072af0ad82a2906080015b60405180910390a150505050565b606061142f6122e5565b905090565b60006001600160a01b03821661145d576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6009546001600160a01b031633146114ac5760405162461bcd60e51b815260040161091090613093565b6114b660006122f4565b565b60006114c3836121cb565b8251909150829061150c5760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420425443204164647265737360681b6044820152606401610910565b81516001600160a01b0316336001600160a01b03161461153f57604051632ce44b5f60e11b815260040160405180910390fd5b6000848152600a60209081526040909120845161155e92860190612a07565b5061156884612346565b7f782b8c45a3d76437bf64bea1ffceab832414e5e636280818393a9759d251deca33858560405161141793929190613050565b604080516060810182526000808252602082018190529181019190915261080a826121cb565b6040516bffffffffffffffffffffffff193360601b166020820152600090819060340160405160208183030381529060405280519060200120905061163d84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c5491508490506120c0565b61167b5760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba10383937b7b360891b6044820152606401610910565b5060019392505050565b60606003805461081f90613173565b3233146116e35760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610910565b6116eb610e3a565b6117375760405162461bcd60e51b815260206004820152601f60248201527f7075626c69632073616c6520686173206e6f74207374617274656420796574006044820152606401610910565b60018211156117885760405162461bcd60e51b815260206004820152601e60248201527f63616e206e6f74206d696e742074686973206d616e79206174206f6e636500006044820152606401610910565b81600d546117969190613111565b3410156117dd5760405162461bcd60e51b81526020600482015260156024820152740dccacac840e8de40e6cadcc840dadee4ca408aa89605b1b6044820152606401610910565b6117e783836120d6565b7fbb2712c8d066be423635db2e56b33a40294747837c735e577e4f5a705e41f3b960016000546118179190613130565b60408051918252602082018490523382820152519081900360600190a1505050565b6001600160a01b0382163314156118635760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b836daaeb6d7670e522a718067333cd4e3b15611a79576001600160a01b03811633141561194657611901858585611db0565b6001600160a01b0384163b15158015611923575061192185858585612351565b155b15611941576040516368d2bf6b60e11b815260040160405180910390fd5b611ac4565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b15801561199057600080fd5b505afa1580156119a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c89190612e2d565b8015611a5a5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015611a2257600080fd5b505afa158015611a36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5a9190612e2d565b611a7957604051633b79c77360e21b8152336004820152602401610910565b611a84858585611db0565b6001600160a01b0384163b15158015611aa65750611aa485858585612351565b155b15611ac4576040516368d2bf6b60e11b815260040160405180910390fd5b5050505050565b6009546001600160a01b03163314611af55760405162461bcd60e51b815260040161091090613093565b63ffffffff821615801590611b0f575063ffffffff811615155b611b535760405162461bcd60e51b815260206004820152601560248201527419185d195cc81b5d5cdd081899481919599a5b9959605a1b6044820152606401610910565b600b80546bffffffffffffffff00000000191664010000000063ffffffff948516026bffffffff0000000000000000191617600160401b9290931691909102919091179055565b6060611ba582611d0b565b611bc257604051630a14c4b560e41b815260040160405180910390fd5b6000611bcc6122e5565b9050805160001415611bed5760405180602001604052806000815250611c18565b80611bf784612449565b604051602001611c08929190612fe4565b6040516020818303038152906040525b9392505050565b600b54600090640100000000900463ffffffff168015801590610e5c5750421015919050565b6001600160a01b038116600090815260056020526040812054600160401b90046001600160401b031661080a565b6009546001600160a01b03163314611c9d5760405162461bcd60e51b815260040161091090613093565b6001600160a01b038116611d025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610910565b610cb9816122f4565b600080548210801561080a575050600090815260046020526040902054600160e01b900460ff161590565b611d50828260405180602001604052806000815250612562565b5050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611dbb826121cb565b9050836001600160a01b031681600001516001600160a01b031614611df25760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611e105750611e108533610770565b80611e2b575033611e20846108a2565b6001600160a01b0316145b905080611e4b57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611e7257604051633a954ecd60e21b815260040160405180910390fd5b611e7e60008487611d54565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611f52576000548214611f5257805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061324483398151915260405160405180910390a4611ac4565b80611fa7576040516356be441560e01b815260040160405180910390fd5b600054611fc75760405163c0367cab60e01b815260040160405180910390fd5b60085480611fd3575060005b6000548110611ff5576040516370e89b1b60e01b815260040160405180910390fd5b60005482820160001981019110156120105750600054600019015b815b8181116120b5576000818152600460205260409020546001600160a01b03161580156120545750600081815260046020526040902054600160e01b900460ff16155b156120ad576000612064826121cb565b80516000848152600460209081526040909120805491909301516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b0390921691909117179055505b600101612012565b506001016008555050565b6000826120cd858461256f565b14949350505050565b600b54600160601b900461ffff16816120ee60005490565b6120f891906130e5565b11156121645760405162461bcd60e51b815260206004820152603560248201527f696e73756666696369656e742072656d61696e696e6720737570706c7920666f6044820152741c8819195cda5c9959081b5a5b9d08185b5bdd5b9d605a1b6064820152608401610910565b600081118015612175575060148111155b6121c15760405162461bcd60e51b815260206004820152601760248201527f696e636f7272656374206d696e74207175616e746974790000000000000000006044820152606401610910565b611d508282611d36565b6040805160608101825260008082526020820181905291810191909152816000548110156122cc57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906122ca5780516001600160a01b031615612261579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156122c5579392505050565b612261565b505b604051636f96cda160e11b815260040160405180910390fd5b6060600f805461081f90613173565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610cb9816000612629565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612386903390899088908890600401613013565b602060405180830381600087803b1580156123a057600080fd5b505af19250505080156123d0575060408051601f3d908101601f191682019092526123cd91810190612e7d565b60015b61242b573d8080156123fe576040519150601f19603f3d011682016040523d82523d6000602084013e612403565b606091505b508051612423576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161246d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124975780612481816131ae565b91506124909050600a836130fd565b9150612471565b6000816001600160401b038111156124bf57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124e9576020820181803683370190505b5090505b8415612441576124fe600183613130565b915061250b600a866131c9565b6125169060306130e5565b60f81b81838151811061253957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061255b600a866130fd565b94506124ed565b610b0c83838360016127dc565b600081815b845181101561262157600085828151811061259f57634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116125e157604080516020810185905290810182905260600160405160208183030381529060405280519060200120925061260e565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612619816131ae565b915050612574565b509392505050565b6000612634836121cb565b8051909150821561269a576000336001600160a01b038316148061265d575061265d8233610770565b8061267857503361266d866108a2565b6001600160a01b0316145b90508061269857604051632ce44b5f60e11b815260040160405180910390fd5b505b6126a660008583611d54565b6001600160a01b0380821660008181526005602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526004909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b1785559189018084529220805491949091166127a45760005482146127a457805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020613244833981519152908390a4505060018054810190555050565b6000546001600160a01b03851661280557604051622e076360e81b815260040160405180910390fd5b836128235760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b4290921691909102179055808085018380156128cf57506001600160a01b0387163b15155b15612946575b60405182906001600160a01b03891690600090600080516020613244833981519152908290a461290e6000888480600101955088612351565b61292b576040516368d2bf6b60e11b815260040160405180910390fd5b808214156128d557826000541461294157600080fd5b61297a565b5b6040516001830192906001600160a01b03891690600090600080516020613244833981519152908290a480821415612947575b50600055611ac4565b82805461298f90613173565b90600052602060002090601f0160209004810192826129b157600085556129f7565b82601f106129ca5782800160ff198235161785556129f7565b828001600101855582156129f7579182015b828111156129f75782358255916020019190600101906129dc565b50612a03929150612a7b565b5090565b828054612a1390613173565b90600052602060002090601f016020900481019282612a3557600085556129f7565b82601f10612a4e57805160ff19168380011785556129f7565b828001600101855582156129f7579182015b828111156129f7578251825591602001919060010190612a60565b5b80821115612a035760008155600101612a7c565b60006001600160401b0380841115612aaa57612aaa613209565b604051601f8501601f19908116603f01168101908282118183101715612ad257612ad2613209565b81604052809350858152868686011115612aeb57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612b1c57600080fd5b919050565b60008083601f840112612b32578081fd5b5081356001600160401b03811115612b48578182fd5b6020830191508360208260051b8501011115612b6357600080fd5b9250929050565b803561ffff81168114612b1c57600080fd5b803563ffffffff81168114612b1c57600080fd5b600060208284031215612ba1578081fd5b611c1882612b05565b60008060408385031215612bbc578081fd5b612bc583612b05565b9150612bd360208401612b05565b90509250929050565b600080600060608486031215612bf0578081fd5b612bf984612b05565b9250612c0760208501612b05565b9150604084013590509250925092565b60008060008060808587031215612c2c578081fd5b612c3585612b05565b9350612c4360208601612b05565b92506040850135915060608501356001600160401b03811115612c64578182fd5b8501601f81018713612c74578182fd5b612c8387823560208401612a90565b91505092959194509250565b60008060408385031215612ca1578182fd5b612caa83612b05565b91506020830135612cba8161321f565b809150509250929050565b60008060408385031215612cd7578182fd5b612ce083612b05565b946020939093013593505050565b600080600080600060808688031215612d05578081fd5b612d0e86612b05565b94506020860135935060408601356001600160401b03811115612d2f578182fd5b612d3b88828901612b21565b96999598509660600135949350505050565b600080600060608486031215612d61578283fd5b612d6a84612b05565b95602085013595506040909401359392505050565b60008060208385031215612d91578182fd5b82356001600160401b03811115612da6578283fd5b612db285828601612b21565b90969095509350505050565b60008060208385031215612dd0578182fd5b82356001600160401b0380821115612de6578384fd5b818501915085601f830112612df9578384fd5b813581811115612e07578485fd5b8660208260061b8501011115612e1b578485fd5b60209290920196919550909350505050565b600060208284031215612e3e578081fd5b8151611c188161321f565b600060208284031215612e5a578081fd5b5035919050565b600060208284031215612e72578081fd5b8135611c188161322d565b600060208284031215612e8e578081fd5b8151611c188161322d565b60008060208385031215612eab578182fd5b82356001600160401b0380821115612ec1578384fd5b818501915085601f830112612ed4578384fd5b813581811115612ee2578485fd5b866020828501011115612e1b578485fd5b60008060408385031215612f05578182fd5b8235915060208301356001600160401b03811115612f21578182fd5b8301601f81018513612f31578182fd5b612f4085823560208401612a90565b9150509250929050565b60008060008060808587031215612f5f578182fd5b8435935060208501359250612f7660408601612b6a565b9150612f8460608601612b6a565b905092959194509250565b60008060408385031215612fa1578182fd5b612faa83612b7c565b9150612bd360208401612b7c565b60008151808452612fd0816020860160208601613147565b601f01601f19169290920160200192915050565b60008351612ff6818460208801613147565b83519083019061300a818360208801613147565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061304690830184612fb8565b9695505050505050565b60018060a01b03841681528260208201526060604082015260006130776060830184612fb8565b95945050505050565b602081526000611c186020830184612fb8565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600061ffff80831681851680830382111561300a5761300a6131dd565b600082198211156130f8576130f86131dd565b500190565b60008261310c5761310c6131f3565b500490565b600081600019048311821515161561312b5761312b6131dd565b500290565b600082821015613142576131426131dd565b500390565b60005b8381101561316257818101518382015260200161314a565b83811115610a7d5750506000910152565b600181811c9082168061318757607f821691505b602082108114156131a857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156131c2576131c26131dd565b5060010190565b6000826131d8576131d86131f3565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610cb957600080fd5b6001600160e01b031981168114610cb957600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220f2b50238fce90a0b209f53f412337a63f66dd08672a0ad4e96f362a20396366a64736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102555760003560e01c80636c0360eb11610139578063a22cb465116100b6578063d334c54f1161007a578063d334c54f146106e8578063d5abeb01146106fd578063d7224ba01461071f578063dc33e68114610735578063e985e9c514610755578063f2fde38b1461079e57600080fd5b8063a22cb46514610653578063a2309ff814610673578063b88d4fde14610688578063c507b806146106a8578063c87b56dd146106c857600080fd5b80639028241b116100fd5780639028241b1461059a5780639231ab2a146105b5578063954d90d01461060b57806395d89b411461062b5780639f02c81e1461064057600080fd5b80636c0360eb1461051257806370a0823114610527578063715018a61461054757806383e3d7691461055c5780638da5cb5b1461057c57600080fd5b80632ee4361c116101d257806355f804b31161019657806355f804b31461045557806358155dcc1461047557806362d5d3f0146104885780636352211e146104bc578063645eb7b8146104dc5780636817c76c146104fc57600080fd5b80632ee4361c146103cb5780633ccfd60b146103eb5780633f5e47411461040057806342842e0e146104155780634f558e791461043557600080fd5b806318160ddd1161021957806318160ddd1461033257806323b872dd146103555780632c4e9fc6146103755780632d20fb601461038b5780632d4d8765146103ab57600080fd5b806301ffc9a71461026157806306fdde0314610296578063081812fc146102b85780630829ea90146102f0578063095ea7b31461031257600080fd5b3661025c57005b600080fd5b34801561026d57600080fd5b5061028161027c366004612e61565b6107be565b60405190151581526020015b60405180910390f35b3480156102a257600080fd5b506102ab610810565b60405161028d9190613080565b3480156102c457600080fd5b506102d86102d3366004612e49565b6108a2565b6040516001600160a01b03909116815260200161028d565b3480156102fc57600080fd5b5061031061030b366004612dbe565b6108e6565b005b34801561031e57600080fd5b5061031061032d366004612cc5565b610a83565b34801561033e57600080fd5b50600154600054035b60405190815260200161028d565b34801561036157600080fd5b50610310610370366004612bdc565b610b11565b34801561038157600080fd5b50610347600e5481565b34801561039757600080fd5b506103106103a6366004612e49565b610c86565b3480156103b757600080fd5b506103106103c6366004612e49565b610cbc565b3480156103d757600080fd5b506102ab6103e6366004612e49565b610ceb565b3480156103f757600080fd5b50610310610d85565b34801561040c57600080fd5b50610281610e3a565b34801561042157600080fd5b50610310610430366004612bdc565b610e62565b34801561044157600080fd5b50610281610450366004612e49565b610ff2565b34801561046157600080fd5b50610310610470366004612e99565b610ffd565b610310610483366004612cee565b611033565b34801561049457600080fd5b50600b546104a99062010000900461ffff1681565b60405161ffff909116815260200161028d565b3480156104c857600080fd5b506102d86104d7366004612e49565b61125c565b3480156104e857600080fd5b506103106104f7366004612f4a565b61126e565b34801561050857600080fd5b50610347600d5481565b34801561051e57600080fd5b506102ab611425565b34801561053357600080fd5b50610347610542366004612b90565b611434565b34801561055357600080fd5b50610310611482565b34801561056857600080fd5b50610310610577366004612ef3565b6114b8565b34801561058857600080fd5b506009546001600160a01b03166102d8565b3480156105a657600080fd5b50600b546104a99061ffff1681565b3480156105c157600080fd5b506105d56105d0366004612e49565b61159b565b6040805182516001600160a01b031681526020808401516001600160401b0316908201529181015115159082015260600161028d565b34801561061757600080fd5b50610281610626366004612d7f565b6115c1565b34801561063757600080fd5b506102ab611685565b61031061064e366004612d4d565b611694565b34801561065f57600080fd5b5061031061066e366004612c8f565b611839565b34801561067f57600080fd5b50600054610347565b34801561069457600080fd5b506103106106a3366004612c17565b6118cf565b3480156106b457600080fd5b506103106106c3366004612f8f565b611acb565b3480156106d457600080fd5b506102ab6106e3366004612e49565b611b9a565b3480156106f457600080fd5b50610281611c1f565b34801561070957600080fd5b50600b546104a990600160601b900461ffff1681565b34801561072b57600080fd5b5061034760085481565b34801561074157600080fd5b50610347610750366004612b90565b611c45565b34801561076157600080fd5b50610281610770366004612baa565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156107aa57600080fd5b506103106107b9366004612b90565b611c73565b60006001600160e01b031982166380ac58cd60e01b14806107ef57506001600160e01b03198216635b5e139f60e01b145b8061080a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461081f90613173565b80601f016020809104026020016040519081016040528092919081815260200182805461084b90613173565b80156108985780601f1061086d57610100808354040283529160200191610898565b820191906000526020600020905b81548152906001019060200180831161087b57829003601f168201915b5050505050905090565b60006108ad82611d0b565b6108ca576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6009546001600160a01b031633146109195760405162461bcd60e51b815260040161091090613093565b60405180910390fd5b6000805b8281101561096e5783838281811061094557634e487b7160e01b600052603260045260246000fd5b905060400201602001358261095a91906130e5565b915080610966816131ae565b91505061091d565b50600b5461ffff6201000082048116916109899116836130e5565b11156109c55760405162461bcd60e51b815260206004820152600b60248201526a18d85b9b9bdd081b5a5b9d60aa1b6044820152606401610910565b600b80548291906000906109de90849061ffff166130c8565b92506101000a81548161ffff021916908361ffff16021790555060005b82811015610a7d57610a6b848483818110610a2657634e487b7160e01b600052603260045260246000fd5b610a3c9260206040909202019081019150612b90565b858584818110610a5c57634e487b7160e01b600052603260045260246000fd5b90506040020160200135611d36565b80610a75816131ae565b9150506109fb565b50505050565b6000610a8e8261125c565b9050806001600160a01b0316836001600160a01b03161415610ac35760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610ae35750610ae18133610770565b155b15610b01576040516367d9dca160e11b815260040160405180910390fd5b610b0c838383611d54565b505050565b826daaeb6d7670e522a718067333cd4e3b15610c7b576001600160a01b038116331415610b4857610b43848484611db0565b610a7d565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015610b9257600080fd5b505afa158015610ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bca9190612e2d565b8015610c5c5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015610c2457600080fd5b505afa158015610c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5c9190612e2d565b610c7b57604051633b79c77360e21b8152336004820152602401610910565b610a7d848484611db0565b6009546001600160a01b03163314610cb05760405162461bcd60e51b815260040161091090613093565b610cb981611f89565b50565b6009546001600160a01b03163314610ce65760405162461bcd60e51b815260040161091090613093565b600c55565b600a6020526000908152604090208054610d0490613173565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3090613173565b8015610d7d5780601f10610d5257610100808354040283529160200191610d7d565b820191906000526020600020905b815481529060010190602001808311610d6057829003601f168201915b505050505081565b6009546001600160a01b03163314610daf5760405162461bcd60e51b815260040161091090613093565b604051600090339047908381818185875af1925050503d8060008114610df1576040519150601f19603f3d011682016040523d82523d6000602084013e610df6565b606091505b5050905080610cb95760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610910565b600b54600090600160401b900463ffffffff168015801590610e5c5750804210155b91505090565b826daaeb6d7670e522a718067333cd4e3b15610fd7576001600160a01b038116331415610ea457610b43848484604051806020016040528060008152506118cf565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015610eee57600080fd5b505afa158015610f02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f269190612e2d565b8015610fb85750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015610f8057600080fd5b505afa158015610f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb89190612e2d565b610fd757604051633b79c77360e21b8152336004820152602401610910565b610a7d848484604051806020016040528060008152506118cf565b600061080a82611d0b565b6009546001600160a01b031633146110275760405162461bcd60e51b815260040161091090613093565b610b0c600f8383612983565b61103b611c1f565b6110925760405162461bcd60e51b815260206004820152602260248201527f77686974656c6973742073616c6520686173206e6f7420737461727465642079604482015261195d60f21b6064820152608401610910565b600a8461109e87611c45565b6110a891906130e5565b11156110ef5760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610910565b6040516bffffffffffffffffffffffff19606087901b16602082015260009060340160405160208183030381529060405280519060200120905061116a84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c5491508490506120c0565b6111a85760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba10383937b7b360891b6044820152606401610910565b84600e546111b69190613111565b3410156111fd5760405162461bcd60e51b81526020600482015260156024820152740dccacac840e8de40e6cadcc840dadee4ca408aa89605b1b6044820152606401610910565b61120786866120d6565b7fbb2712c8d066be423635db2e56b33a40294747837c735e577e4f5a705e41f3b960016000546112379190613130565b60408051918252602082018590523382820152519081900360600190a1505050505050565b6000611267826121cb565b5192915050565b6009546001600160a01b031633146112985760405162461bcd60e51b815260040161091090613093565b83158015906112a657508215155b6113095760405162461bcd60e51b815260206004820152602e60248201527f455243373231414d4f3a3a696e6974696174654d696e743a2077726f6e67207060448201526d1c9a58d95cc81c1c9bdd9a59195960921b6064820152608401610910565b600b5461ffff90811690831611801561132b5750600154600054038161ffff16115b6113905760405162461bcd60e51b815260206004820152603060248201527f455243373231414d4f3a3a696e6974696174654d696e743a2077726f6e67207360448201526f1d5c1c1b1a595cc81c1c9bdd9a59195960821b6064820152608401610910565b600d849055600e839055600b80546dffff0000000000000000ffff000019166201000061ffff85811691820261ffff60601b191692909217600160601b9285169283021790925560408051878152602081018790529081019290925260608201527f5292d4cf9a529b61fb8831a8378588433abfa9931c4c15938d37072af0ad82a2906080015b60405180910390a150505050565b606061142f6122e5565b905090565b60006001600160a01b03821661145d576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6009546001600160a01b031633146114ac5760405162461bcd60e51b815260040161091090613093565b6114b660006122f4565b565b60006114c3836121cb565b8251909150829061150c5760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420425443204164647265737360681b6044820152606401610910565b81516001600160a01b0316336001600160a01b03161461153f57604051632ce44b5f60e11b815260040160405180910390fd5b6000848152600a60209081526040909120845161155e92860190612a07565b5061156884612346565b7f782b8c45a3d76437bf64bea1ffceab832414e5e636280818393a9759d251deca33858560405161141793929190613050565b604080516060810182526000808252602082018190529181019190915261080a826121cb565b6040516bffffffffffffffffffffffff193360601b166020820152600090819060340160405160208183030381529060405280519060200120905061163d84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c5491508490506120c0565b61167b5760405162461bcd60e51b815260206004820152600f60248201526e24b731b7b93932b1ba10383937b7b360891b6044820152606401610910565b5060019392505050565b60606003805461081f90613173565b3233146116e35760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610910565b6116eb610e3a565b6117375760405162461bcd60e51b815260206004820152601f60248201527f7075626c69632073616c6520686173206e6f74207374617274656420796574006044820152606401610910565b60018211156117885760405162461bcd60e51b815260206004820152601e60248201527f63616e206e6f74206d696e742074686973206d616e79206174206f6e636500006044820152606401610910565b81600d546117969190613111565b3410156117dd5760405162461bcd60e51b81526020600482015260156024820152740dccacac840e8de40e6cadcc840dadee4ca408aa89605b1b6044820152606401610910565b6117e783836120d6565b7fbb2712c8d066be423635db2e56b33a40294747837c735e577e4f5a705e41f3b960016000546118179190613130565b60408051918252602082018490523382820152519081900360600190a1505050565b6001600160a01b0382163314156118635760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b836daaeb6d7670e522a718067333cd4e3b15611a79576001600160a01b03811633141561194657611901858585611db0565b6001600160a01b0384163b15158015611923575061192185858585612351565b155b15611941576040516368d2bf6b60e11b815260040160405180910390fd5b611ac4565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b15801561199057600080fd5b505afa1580156119a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c89190612e2d565b8015611a5a5750604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c61711349060440160206040518083038186803b158015611a2257600080fd5b505afa158015611a36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5a9190612e2d565b611a7957604051633b79c77360e21b8152336004820152602401610910565b611a84858585611db0565b6001600160a01b0384163b15158015611aa65750611aa485858585612351565b155b15611ac4576040516368d2bf6b60e11b815260040160405180910390fd5b5050505050565b6009546001600160a01b03163314611af55760405162461bcd60e51b815260040161091090613093565b63ffffffff821615801590611b0f575063ffffffff811615155b611b535760405162461bcd60e51b815260206004820152601560248201527419185d195cc81b5d5cdd081899481919599a5b9959605a1b6044820152606401610910565b600b80546bffffffffffffffff00000000191664010000000063ffffffff948516026bffffffff0000000000000000191617600160401b9290931691909102919091179055565b6060611ba582611d0b565b611bc257604051630a14c4b560e41b815260040160405180910390fd5b6000611bcc6122e5565b9050805160001415611bed5760405180602001604052806000815250611c18565b80611bf784612449565b604051602001611c08929190612fe4565b6040516020818303038152906040525b9392505050565b600b54600090640100000000900463ffffffff168015801590610e5c5750421015919050565b6001600160a01b038116600090815260056020526040812054600160401b90046001600160401b031661080a565b6009546001600160a01b03163314611c9d5760405162461bcd60e51b815260040161091090613093565b6001600160a01b038116611d025760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610910565b610cb9816122f4565b600080548210801561080a575050600090815260046020526040902054600160e01b900460ff161590565b611d50828260405180602001604052806000815250612562565b5050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611dbb826121cb565b9050836001600160a01b031681600001516001600160a01b031614611df25760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611e105750611e108533610770565b80611e2b575033611e20846108a2565b6001600160a01b0316145b905080611e4b57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611e7257604051633a954ecd60e21b815260040160405180910390fd5b611e7e60008487611d54565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611f52576000548214611f5257805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b031660008051602061324483398151915260405160405180910390a4611ac4565b80611fa7576040516356be441560e01b815260040160405180910390fd5b600054611fc75760405163c0367cab60e01b815260040160405180910390fd5b60085480611fd3575060005b6000548110611ff5576040516370e89b1b60e01b815260040160405180910390fd5b60005482820160001981019110156120105750600054600019015b815b8181116120b5576000818152600460205260409020546001600160a01b03161580156120545750600081815260046020526040902054600160e01b900460ff16155b156120ad576000612064826121cb565b80516000848152600460209081526040909120805491909301516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b0390921691909117179055505b600101612012565b506001016008555050565b6000826120cd858461256f565b14949350505050565b600b54600160601b900461ffff16816120ee60005490565b6120f891906130e5565b11156121645760405162461bcd60e51b815260206004820152603560248201527f696e73756666696369656e742072656d61696e696e6720737570706c7920666f6044820152741c8819195cda5c9959081b5a5b9d08185b5bdd5b9d605a1b6064820152608401610910565b600081118015612175575060148111155b6121c15760405162461bcd60e51b815260206004820152601760248201527f696e636f7272656374206d696e74207175616e746974790000000000000000006044820152606401610910565b611d508282611d36565b6040805160608101825260008082526020820181905291810191909152816000548110156122cc57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906122ca5780516001600160a01b031615612261579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156122c5579392505050565b612261565b505b604051636f96cda160e11b815260040160405180910390fd5b6060600f805461081f90613173565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610cb9816000612629565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612386903390899088908890600401613013565b602060405180830381600087803b1580156123a057600080fd5b505af19250505080156123d0575060408051601f3d908101601f191682019092526123cd91810190612e7d565b60015b61242b573d8080156123fe576040519150601f19603f3d011682016040523d82523d6000602084013e612403565b606091505b508051612423576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161246d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124975780612481816131ae565b91506124909050600a836130fd565b9150612471565b6000816001600160401b038111156124bf57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124e9576020820181803683370190505b5090505b8415612441576124fe600183613130565b915061250b600a866131c9565b6125169060306130e5565b60f81b81838151811061253957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061255b600a866130fd565b94506124ed565b610b0c83838360016127dc565b600081815b845181101561262157600085828151811061259f57634e487b7160e01b600052603260045260246000fd5b602002602001015190508083116125e157604080516020810185905290810182905260600160405160208183030381529060405280519060200120925061260e565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612619816131ae565b915050612574565b509392505050565b6000612634836121cb565b8051909150821561269a576000336001600160a01b038316148061265d575061265d8233610770565b8061267857503361266d866108a2565b6001600160a01b0316145b90508061269857604051632ce44b5f60e11b815260040160405180910390fd5b505b6126a660008583611d54565b6001600160a01b0380821660008181526005602090815260408083208054600160801b6000196001600160401b0380841691909101811667ffffffffffffffff198416811783900482166001908101831690930277ffffffffffffffff0000000000000000ffffffffffffffff19909416179290921783558b86526004909452828520805460ff60e01b1942909316600160a01b026001600160e01b03199091169097179690961716600160e01b1785559189018084529220805491949091166127a45760005482146127a457805460208701516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038716171781555b5050604051869250600091506001600160a01b03841690600080516020613244833981519152908390a4505060018054810190555050565b6000546001600160a01b03851661280557604051622e076360e81b815260040160405180910390fd5b836128235760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b4290921691909102179055808085018380156128cf57506001600160a01b0387163b15155b15612946575b60405182906001600160a01b03891690600090600080516020613244833981519152908290a461290e6000888480600101955088612351565b61292b576040516368d2bf6b60e11b815260040160405180910390fd5b808214156128d557826000541461294157600080fd5b61297a565b5b6040516001830192906001600160a01b03891690600090600080516020613244833981519152908290a480821415612947575b50600055611ac4565b82805461298f90613173565b90600052602060002090601f0160209004810192826129b157600085556129f7565b82601f106129ca5782800160ff198235161785556129f7565b828001600101855582156129f7579182015b828111156129f75782358255916020019190600101906129dc565b50612a03929150612a7b565b5090565b828054612a1390613173565b90600052602060002090601f016020900481019282612a3557600085556129f7565b82601f10612a4e57805160ff19168380011785556129f7565b828001600101855582156129f7579182015b828111156129f7578251825591602001919060010190612a60565b5b80821115612a035760008155600101612a7c565b60006001600160401b0380841115612aaa57612aaa613209565b604051601f8501601f19908116603f01168101908282118183101715612ad257612ad2613209565b81604052809350858152868686011115612aeb57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612b1c57600080fd5b919050565b60008083601f840112612b32578081fd5b5081356001600160401b03811115612b48578182fd5b6020830191508360208260051b8501011115612b6357600080fd5b9250929050565b803561ffff81168114612b1c57600080fd5b803563ffffffff81168114612b1c57600080fd5b600060208284031215612ba1578081fd5b611c1882612b05565b60008060408385031215612bbc578081fd5b612bc583612b05565b9150612bd360208401612b05565b90509250929050565b600080600060608486031215612bf0578081fd5b612bf984612b05565b9250612c0760208501612b05565b9150604084013590509250925092565b60008060008060808587031215612c2c578081fd5b612c3585612b05565b9350612c4360208601612b05565b92506040850135915060608501356001600160401b03811115612c64578182fd5b8501601f81018713612c74578182fd5b612c8387823560208401612a90565b91505092959194509250565b60008060408385031215612ca1578182fd5b612caa83612b05565b91506020830135612cba8161321f565b809150509250929050565b60008060408385031215612cd7578182fd5b612ce083612b05565b946020939093013593505050565b600080600080600060808688031215612d05578081fd5b612d0e86612b05565b94506020860135935060408601356001600160401b03811115612d2f578182fd5b612d3b88828901612b21565b96999598509660600135949350505050565b600080600060608486031215612d61578283fd5b612d6a84612b05565b95602085013595506040909401359392505050565b60008060208385031215612d91578182fd5b82356001600160401b03811115612da6578283fd5b612db285828601612b21565b90969095509350505050565b60008060208385031215612dd0578182fd5b82356001600160401b0380821115612de6578384fd5b818501915085601f830112612df9578384fd5b813581811115612e07578485fd5b8660208260061b8501011115612e1b578485fd5b60209290920196919550909350505050565b600060208284031215612e3e578081fd5b8151611c188161321f565b600060208284031215612e5a578081fd5b5035919050565b600060208284031215612e72578081fd5b8135611c188161322d565b600060208284031215612e8e578081fd5b8151611c188161322d565b60008060208385031215612eab578182fd5b82356001600160401b0380821115612ec1578384fd5b818501915085601f830112612ed4578384fd5b813581811115612ee2578485fd5b866020828501011115612e1b578485fd5b60008060408385031215612f05578182fd5b8235915060208301356001600160401b03811115612f21578182fd5b8301601f81018513612f31578182fd5b612f4085823560208401612a90565b9150509250929050565b60008060008060808587031215612f5f578182fd5b8435935060208501359250612f7660408601612b6a565b9150612f8460608601612b6a565b905092959194509250565b60008060408385031215612fa1578182fd5b612faa83612b7c565b9150612bd360208401612b7c565b60008151808452612fd0816020860160208601613147565b601f01601f19169290920160200192915050565b60008351612ff6818460208801613147565b83519083019061300a818360208801613147565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061304690830184612fb8565b9695505050505050565b60018060a01b03841681528260208201526060604082015260006130776060830184612fb8565b95945050505050565b602081526000611c186020830184612fb8565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600061ffff80831681851680830382111561300a5761300a6131dd565b600082198211156130f8576130f86131dd565b500190565b60008261310c5761310c6131f3565b500490565b600081600019048311821515161561312b5761312b6131dd565b500290565b600082821015613142576131426131dd565b500390565b60005b8381101561316257818101518382015260200161314a565b83811115610a7d5750506000910152565b600181811c9082168061318757607f821691505b602082108114156131a857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156131c2576131c26131dd565b5060010190565b6000826131d8576131d86131f3565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610cb957600080fd5b6001600160e01b031981168114610cb957600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220f2b50238fce90a0b209f53f412337a63f66dd08672a0ad4e96f362a20396366a64736f6c63430008040033

Deployed Bytecode Sourcemap

59254:108:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27603:305;;;;;;;;;;-1:-1:-1;27603:305:0;;;;;:::i;:::-;;:::i;:::-;;;11902:14:1;;11895:22;11877:41;;11865:2;11850:18;27603:305:0;;;;;;;;30716:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32219:204::-;;;;;;;;;;-1:-1:-1;32219:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10499:32:1;;;10481:51;;10469:2;10454:18;32219:204:0;10436:102:1;57361:602:0;;;;;;;;;;-1:-1:-1;57361:602:0;;;;;:::i;:::-;;:::i;:::-;;31782:371;;;;;;;;;;-1:-1:-1;31782:371:0;;;;;:::i;:::-;;:::i;26852:303::-;;;;;;;;;;-1:-1:-1;27106:12:0;;26896:7;27090:13;:28;26852:303;;;19221:25:1;;;19209:2;19194:18;26852:303:0;19176:76:1;33084:196:0;;;;;;;;;;-1:-1:-1;33084:196:0;;;;;:::i;:::-;;:::i;52375:40::-;;;;;;;;;;;;;;;;58398:111;;;;;;;;;;-1:-1:-1;58398:111:0;;;;;:::i;:::-;;:::i;54726:98::-;;;;;;;;;;-1:-1:-1;54726:98:0;;;;;:::i;:::-;;:::i;51733:46::-;;;;;;;;;;-1:-1:-1;51733:46:0;;;;;:::i;:::-;;:::i;58217:173::-;;;;;;;;;;;;;:::i;57110:243::-;;;;;;;;;;;;;:::i;33351:211::-;;;;;;;;;;-1:-1:-1;33351:211:0;;;;;:::i;:::-;;:::i;54241:102::-;;;;;;;;;;-1:-1:-1;54241:102:0;;;;;:::i;:::-;;:::i;58093:116::-;;;;;;;;;;-1:-1:-1;58093:116:0;;;;;:::i;:::-;;:::i;55695:782::-;;;;;;:::i;:::-;;:::i;51824:36::-;;;;;;;;;;-1:-1:-1;51824:36:0;;;;;;;;;;;;;;19056:6:1;19044:19;;;19026:38;;19014:2;18999:18;51824:36:0;18981:89:1;30524:125:0;;;;;;;;;;-1:-1:-1;30524:125:0;;;;;:::i;:::-;;:::i;53085:827::-;;;;;;;;;;-1:-1:-1;53085:827:0;;;;;:::i;:::-;;:::i;52330:38::-;;;;;;;;;;;;;;;;54142:91;;;;;;;;;;;;;:::i;27972:206::-;;;;;;;;;;-1:-1:-1;27972:206:0;;;;;:::i;:::-;;:::i;48754:103::-;;;;;;;;;;;;;:::i;58693:511::-;;;;;;;;;;-1:-1:-1;58693:511:0;;;;;:::i;:::-;;:::i;48103:87::-;;;;;;;;;;-1:-1:-1;48176:6:0;;-1:-1:-1;;;;;48176:6:0;48103:87;;51788:29;;;;;;;;;;-1:-1:-1;51788:29:0;;;;;;;;58517:168;;;;;;;;;;-1:-1:-1;58517:168:0;;;;;:::i;:::-;;:::i;:::-;;;;18668:13:1;;-1:-1:-1;;;;;18664:39:1;18646:58;;18764:4;18752:17;;;18746:24;-1:-1:-1;;;;;18742:49:1;18720:20;;;18713:79;18850:17;;;18844:24;18837:32;18830:40;18808:20;;;18801:70;18634:2;18619:18;58517:168:0;18601:276:1;54384:334:0;;;;;;;;;;-1:-1:-1;54384:334:0;;;;;:::i;:::-;;:::i;30885:104::-;;;;;;;;;;;;;:::i;55145:458::-;;;;;;:::i;:::-;;:::i;32495:287::-;;;;;;;;;;-1:-1:-1;32495:287:0;;;;;:::i;:::-;;:::i;54041:93::-;;;;;;;;;;-1:-1:-1;54085:7:0;27481:13;54041:93;54142:91;33633:395;;;;;;;;;;-1:-1:-1;33633:395:0;;;;;:::i;:::-;;:::i;54901:236::-;;;;;;;;;;-1:-1:-1;54901:236:0;;;;;:::i;:::-;;:::i;31060:318::-;;;;;;;;;;-1:-1:-1;31060:318:0;;;;;:::i;:::-;;:::i;56905:197::-;;;;;;;;;;;;;:::i;52074:30::-;;;;;;;;;;-1:-1:-1;52074:30:0;;;;-1:-1:-1;;;52074:30:0;;;;;;45632:39;;;;;;;;;;;;;;;;53920:113;;;;;;;;;;-1:-1:-1;53920:113:0;;;;;:::i;:::-;;:::i;32853:164::-;;;;;;;;;;-1:-1:-1;32853:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;32974:25:0;;;32950:4;32974:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32853:164;49012:201;;;;;;;;;;-1:-1:-1;49012:201:0;;;;;:::i;:::-;;:::i;27603:305::-;27705:4;-1:-1:-1;;;;;;27742:40:0;;-1:-1:-1;;;27742:40:0;;:105;;-1:-1:-1;;;;;;;27799:48:0;;-1:-1:-1;;;27799:48:0;27742:105;:158;;;-1:-1:-1;;;;;;;;;;18992:40:0;;;27864:36;27722:178;27603:305;-1:-1:-1;;27603:305:0:o;30716:100::-;30770:13;30803:5;30796:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30716:100;:::o;32219:204::-;32287:7;32312:16;32320:7;32312;:16::i;:::-;32307:64;;32337:34;;-1:-1:-1;;;32337:34:0;;;;;;;;;;;32307:64;-1:-1:-1;32391:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;32391:24:0;;32219:204::o;57361:602::-;48176:6;;-1:-1:-1;;;;;48176:6:0;15979:10;48323:23;48315:68;;;;-1:-1:-1;;;48315:68:0;;;;;;;:::i;:::-;;;;;;;;;57472:26:::1;::::0;57509:115:::1;57529:27:::0;;::::1;57509:115;;;57598:16;;57615:1;57598:19;;;;;-1:-1:-1::0;;;57598:19:0::1;;;;;;;;;;;;;;:26;;;57576:48;;;;;:::i;:::-;::::0;-1:-1:-1;57558:3:0;::::1;::::0;::::1;:::i;:::-;;;;57509:115;;;-1:-1:-1::0;57699:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;57659:36:::1;::::0;57680:15:::1;57659:18:::0;:36:::1;:::i;:::-;:56;;57637:117;;;::::0;-1:-1:-1;;;57637:117:0;;15715:2:1;57637:117:0::1;::::0;::::1;15697:21:1::0;15754:2;15734:18;;;15727:30;-1:-1:-1;;;15773:18:1;;;15766:41;15824:18;;57637:117:0::1;15687:161:1::0;57637:117:0::1;57767:15;:45:::0;;57793:18;;57767:15;::::1;::::0;:45:::1;::::0;57793:18;;57767:45:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;57830:9;57825:130;57845:27:::0;;::::1;57825:130;;;57892:63;57902:16;;57919:1;57902:19;;;;;-1:-1:-1::0;;;57902:19:0::1;;;;;;;;;:24;::::0;::::1;:19;::::0;;::::1;;:24:::0;;::::1;::::0;-1:-1:-1;57902:24:0::1;:::i;:::-;57928:16;;57945:1;57928:19;;;;;-1:-1:-1::0;;;57928:19:0::1;;;;;;;;;;;;;;:26;;;57892:9;:63::i;:::-;57874:3:::0;::::1;::::0;::::1;:::i;:::-;;;;57825:130;;;;48394:1;57361:602:::0;;:::o;31782:371::-;31855:13;31871:24;31887:7;31871:15;:24::i;:::-;31855:40;;31916:5;-1:-1:-1;;;;;31910:11:0;:2;-1:-1:-1;;;;;31910:11:0;;31906:48;;;31930:24;;-1:-1:-1;;;31930:24:0;;;;;;;;;;;31906:48;15979:10;-1:-1:-1;;;;;31971:21:0;;;;;;:63;;-1:-1:-1;31997:37:0;32014:5;15979:10;32853:164;:::i;31997:37::-;31996:38;31971:63;31967:138;;;32058:35;;-1:-1:-1;;;32058:35:0;;;;;;;;;;;31967:138;32117:28;32126:2;32130:7;32139:5;32117:8;:28::i;:::-;31782:371;;;:::o;33084:196::-;33210:4;21825:42;22965:43;:47;22961:675;;-1:-1:-1;;;;;23244:18:0;;23252:10;23244:18;23240:85;;;33244:28:::1;33254:4;33260:2;33264:7;33244:9;:28::i;:::-;23303:7:::0;;23240:85;23377:67;;-1:-1:-1;;;23377:67:0;;23426:4;23377:67;;;10755:34:1;23433:10:0;10805:18:1;;;10798:43;21825:42:0;;23377:40;;10690:18:1;;23377:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:145;;;;-1:-1:-1;23461:61:0;;-1:-1:-1;;;23461:61:0;;23510:4;23461:61;;;10755:34:1;-1:-1:-1;;;;;10825:15:1;;10805:18;;;10798:43;21825:42:0;;23461:40;;10690:18:1;;23461:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23339:286;;23579:30;;-1:-1:-1;;;23579:30:0;;23598:10;23579:30;;;10481:51:1;10454:18;;23579:30:0;10436:102:1;23339:286:0;33244:28:::1;33254:4;33260:2;33264:7;33244:9;:28::i;58398:111::-:0;48176:6;;-1:-1:-1;;;;;48176:6:0;15979:10;48323:23;48315:68;;;;-1:-1:-1;;;48315:68:0;;;;;;;:::i;:::-;58473:28:::1;58492:8;58473:18;:28::i;:::-;58398:111:::0;:::o;54726:98::-;48176:6;;-1:-1:-1;;;;;48176:6:0;15979:10;48323:23;48315:68;;;;-1:-1:-1;;;48315:68:0;;;;;;;:::i;:::-;54800:6:::1;:16:::0;54726:98::o;51733:46::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58217:173::-;48176:6;;-1:-1:-1;;;;;48176:6:0;15979:10;48323:23;48315:68;;;;-1:-1:-1;;;48315:68:0;;;;;;;:::i;:::-;58286:49:::1;::::0;58268:12:::1;::::0;58286:10:::1;::::0;58309:21:::1;::::0;58268:12;58286:49;58268:12;58286:49;58309:21;58286:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58267:68;;;58354:7;58346:36;;;::::0;-1:-1:-1;;;58346:36:0;;16760:2:1;58346:36:0::1;::::0;::::1;16742:21:1::0;16799:2;16779:18;;;16772:30;-1:-1:-1;;;16818:18:1;;;16811:46;16874:18;;58346:36:0::1;16732:166:1::0;57110:243:0;57213:19;;57157:4;;-1:-1:-1;;;57213:19:0;;;;57264:25;;;;;:81;;;57325:20;57306:15;:39;;57264:81;57244:101;;;57110:243;:::o;33351:211::-;33481:4;21825:42;22965:43;:47;22961:675;;-1:-1:-1;;;;;23244:18:0;;23252:10;23244:18;23240:85;;;33515:39:::1;33532:4;33538:2;33542:7;33515:39;;;;;;;;;;;::::0;:16:::1;:39::i;23240:85::-:0;23377:67;;-1:-1:-1;;;23377:67:0;;23426:4;23377:67;;;10755:34:1;23433:10:0;10805:18:1;;;10798:43;21825:42:0;;23377:40;;10690:18:1;;23377:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:145;;;;-1:-1:-1;23461:61:0;;-1:-1:-1;;;23461:61:0;;23510:4;23461:61;;;10755:34:1;-1:-1:-1;;;;;10825:15:1;;10805:18;;;10798:43;21825:42:0;;23461:40;;10690:18:1;;23461:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23339:286;;23579:30;;-1:-1:-1;;;23579:30:0;;23598:10;23579:30;;;10481:51:1;10454:18;;23579:30:0;10436:102:1;23339:286:0;33515:39:::1;33532:4;33538:2;33542:7;33515:39;;;;;;;;;;;::::0;:16:::1;:39::i;54241:102::-:0;54295:4;54319:16;54327:7;54319;:16::i;58093:116::-;48176:6;;-1:-1:-1;;;;;48176:6:0;15979:10;48323:23;48315:68;;;;-1:-1:-1;;;48315:68:0;;;;;;;:::i;:::-;58173:28:::1;:13;58189:12:::0;;58173:28:::1;:::i;55695:782::-:0;55877:12;:10;:12::i;:::-;55869:59;;;;-1:-1:-1;;;55869:59:0;;12707:2:1;55869:59:0;;;12689:21:1;12746:2;12726:18;;;12719:30;12785:34;12765:18;;;12758:62;-1:-1:-1;;;12836:18:1;;;12829:32;12878:19;;55869:59:0;12679:224:1;55869:59:0;52267:2;55980:8;55961:16;55974:2;55961:12;:16::i;:::-;:27;;;;:::i;:::-;:46;;55939:118;;;;-1:-1:-1;;;55939:118:0;;17937:2:1;55939:118:0;;;17919:21:1;17976:2;17956:18;;;17949:30;-1:-1:-1;;;17995:18:1;;;17988:52;18057:18;;55939:118:0;17909:172:1;55939:118:0;56149:20;;-1:-1:-1;;9313:2:1;9309:15;;;9305:53;56149:20:0;;;9293:66:1;56124:12:0;;9375::1;;56149:20:0;;;;;;;;;;;;56139:31;;;;;;56124:46;;56203;56222:12;;56203:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56236:6:0;;;-1:-1:-1;56244:4:0;;-1:-1:-1;56203:18:0;:46::i;:::-;56181:111;;;;-1:-1:-1;;;56181:111:0;;16416:2:1;56181:111:0;;;16398:21:1;16455:2;16435:18;;;16428:30;-1:-1:-1;;;16474:18:1;;;16467:45;16529:18;;56181:111:0;16388:165:1;56181:111:0;56338:8;56324:11;;:22;;;;:::i;:::-;56311:9;:35;;56303:69;;;;-1:-1:-1;;;56303:69:0;;14646:2:1;56303:69:0;;;14628:21:1;14685:2;14665:18;;;14658:30;-1:-1:-1;;;14704:18:1;;;14697:51;14765:18;;56303:69:0;14618:171:1;56303:69:0;56383:22;56392:2;56396:8;56383;:22::i;:::-;56421:48;56444:1;56430:13;;:15;;;;:::i;:::-;56421:48;;;19459:25:1;;;19515:2;19500:18;;19493:34;;;15979:10:0;19543:18:1;;;19536:60;56421:48:0;;;;;19447:2:1;56421:48:0;;;55695:782;;;;;;:::o;30524:125::-;30588:7;30615:21;30628:7;30615:12;:21::i;:::-;:26;;30524:125;-1:-1:-1;;30524:125:0:o;53085:827::-;48176:6;;-1:-1:-1;;;;;48176:6:0;15979:10;48323:23;48315:68;;;;-1:-1:-1;;;48315:68:0;;;;;;;:::i;:::-;53289:15;;;::::1;::::0;:49:::1;;-1:-1:-1::0;53321:17:0;;::::1;53289:49;53267:145;;;::::0;-1:-1:-1;;;53267:145:0;;17105:2:1;53267:145:0::1;::::0;::::1;17087:21:1::0;17144:2;17124:18;;;17117:30;17183:34;17163:18;;;17156:62;-1:-1:-1;;;17234:18:1;;;17227:44;17288:19;;53267:145:0::1;17077:236:1::0;53267:145:0::1;53467:15;::::0;::::1;::::0;;::::1;53447:35:::0;;::::1;;:78:::0;::::1;;;-1:-1:-1::0;27106:12:0;;26896:7;27090:13;:28;53499:10:::1;:26;;;53447:78;53425:176;;;::::0;-1:-1:-1;;;53425:176:0;;17520:2:1;53425:176:0::1;::::0;::::1;17502:21:1::0;17559:2;17539:18;;;17532:30;17598:34;17578:18;;;17571:62;-1:-1:-1;;;17649:18:1;;;17642:46;17705:19;;53425:176:0::1;17492:238:1::0;53425:176:0::1;53614:9;:22:::0;;;53647:11:::1;:26:::0;;;53684:16:::1;:36:::0;;-1:-1:-1;;53731:22:0;53684:36;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;;53731:22:0;;;;;-1:-1:-1;;;53731:22:0;;::::1;::::0;;::::1;;::::0;;;53771:133:::1;::::0;;19834:25:1;;;19890:2;19875:18;;19868:34;;;19943:18;;;19936:43;;;;20010:2;19995:18;;19988:43;53771:133:0::1;::::0;19821:3:1;19806:19;53771:133:0::1;;;;;;;;53085:827:::0;;;;:::o;54142:91::-;54182:13;54215:10;:8;:10::i;:::-;54208:17;;54142:91;:::o;27972:206::-;28036:7;-1:-1:-1;;;;;28060:19:0;;28056:60;;28088:28;;-1:-1:-1;;;28088:28:0;;;;;;;;;;;28056:60;-1:-1:-1;;;;;;28142:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;28142:27:0;;27972:206::o;48754:103::-;48176:6;;-1:-1:-1;;;;;48176:6:0;15979:10;48323:23;48315:68;;;;-1:-1:-1;;;48315:68:0;;;;;;;:::i;:::-;48819:30:::1;48846:1;48819:18;:30::i;:::-;48754:103::o:0;58693:511::-;58780:35;58818:20;58831:6;58818:12;:20::i;:::-;58917:22;;58780:58;;-1:-1:-1;58886:11:0;;58909:59;;;;-1:-1:-1;;;58909:59:0;;13110:2:1;58909:59:0;;;13092:21:1;13149:2;13129:18;;;13122:30;-1:-1:-1;;;13168:18:1;;;13161:49;13227:18;;58909:59:0;13082:169:1;58909:59:0;58999:18;;-1:-1:-1;;;;;58983:34:0;15979:10;-1:-1:-1;;;;;58983:34:0;;58979:82;;59026:35;;-1:-1:-1;;;59026:35:0;;;;;;;;;;;58979:82;59072:19;;;;:11;:19;;;;;;;;:33;;;;;;;;:::i;:::-;;59116:13;59122:6;59116:5;:13::i;:::-;59145:51;15979:10;59176:6;59184:11;59145:51;;;;;;;;:::i;58517:168::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;58656:21:0;58669:7;58656:12;:21::i;54384:334::-;54535:30;;-1:-1:-1;;15979:10:0;9313:2:1;9309:15;9305:53;54535:30:0;;;9293:66:1;54488:4:0;;;;9375:12:1;;54535:30:0;;;;;;;;;;;;54525:41;;;;;;54510:56;;54599:46;54618:12;;54599:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54632:6:0;;;-1:-1:-1;54640:4:0;;-1:-1:-1;54599:18:0;:46::i;:::-;54577:111;;;;-1:-1:-1;;;54577:111:0;;16416:2:1;54577:111:0;;;16398:21:1;16455:2;16435:18;;;16428:30;-1:-1:-1;;;16474:18:1;;;16467:45;16529:18;;54577:111:0;16388:165:1;54577:111:0;-1:-1:-1;54706:4:0;;54384:334;-1:-1:-1;;;54384:334:0:o;30885:104::-;30941:13;30974:7;30967:14;;;;;:::i;55145:458::-;52629:9;52642:10;52629:23;52621:66;;;;-1:-1:-1;;;52621:66:0;;15356:2:1;52621:66:0;;;15338:21:1;15395:2;15375:18;;;15368:30;15434:32;15414:18;;;15407:60;15484:18;;52621:66:0;15328:180:1;52621:66:0;55293:16:::1;:14;:16::i;:::-;55285:60;;;::::0;-1:-1:-1;;;55285:60:0;;14996:2:1;55285:60:0::1;::::0;::::1;14978:21:1::0;15035:2;15015:18;;;15008:30;15074:33;15054:18;;;15047:61;15125:18;;55285:60:0::1;14968:181:1::0;55285:60:0::1;52217:1;55364:21:::0;::::1;;55356:64;;;::::0;-1:-1:-1;;;55356:64:0;;14287:2:1;55356:64:0::1;::::0;::::1;14269:21:1::0;14326:2;14306:18;;;14299:30;14365:32;14345:18;;;14338:60;14415:18;;55356:64:0::1;14259:180:1::0;55356:64:0::1;55464:8;55452:9;;:20;;;;:::i;:::-;55439:9;:33;;55431:67;;;::::0;-1:-1:-1;;;55431:67:0;;14646:2:1;55431:67:0::1;::::0;::::1;14628:21:1::0;14685:2;14665:18;;;14658:30;-1:-1:-1;;;14704:18:1;;;14697:51;14765:18;;55431:67:0::1;14618:171:1::0;55431:67:0::1;55509:22;55518:2;55522:8;55509;:22::i;:::-;55547:48;55570:1;55556:13;;:15;;;;:::i;:::-;55547:48;::::0;;19459:25:1;;;19515:2;19500:18;;19493:34;;;15979:10:0;19543:18:1;;;19536:60;55547:48:0;;;;;19447:2:1;55547:48:0;;::::1;55145:458:::0;;;:::o;32495:287::-;-1:-1:-1;;;;;32594:24:0;;15979:10;32594:24;32590:54;;;32627:17;;-1:-1:-1;;;32627:17:0;;;;;;;;;;;32590:54;15979:10;32657:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;32657:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;32657:53:0;;;;;;;;;;32726:48;;11877:41:1;;;32657:42:0;;15979:10;32726:48;;11850:18:1;32726:48:0;;;;;;;32495:287;;:::o;33633:395::-;33792:4;21825:42;22965:43;:47;22961:675;;-1:-1:-1;;;;;23244:18:0;;23252:10;23244:18;23240:85;;;33826:28:::1;33836:4;33842:2;33846:7;33826:9;:28::i;:::-;-1:-1:-1::0;;;;;33869:13:0;::::1;8314:20:::0;8362:8;;33869:76:::1;;;;;33889:56;33920:4;33926:2;33930:7;33939:5;33889:30;:56::i;:::-;33888:57;33869:76;33865:156;;;33969:40;;-1:-1:-1::0;;;33969:40:0::1;;;;;;;;;;;33865:156;23303:7:::0;;23240:85;23377:67;;-1:-1:-1;;;23377:67:0;;23426:4;23377:67;;;10755:34:1;23433:10:0;10805:18:1;;;10798:43;21825:42:0;;23377:40;;10690:18:1;;23377:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:145;;;;-1:-1:-1;23461:61:0;;-1:-1:-1;;;23461:61:0;;23510:4;23461:61;;;10755:34:1;-1:-1:-1;;;;;10825:15:1;;10805:18;;;10798:43;21825:42:0;;23461:40;;10690:18:1;;23461:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23339:286;;23579:30;;-1:-1:-1;;;23579:30:0;;23598:10;23579:30;;;10481:51:1;10454:18;;23579:30:0;10436:102:1;23339:286:0;33826:28:::1;33836:4;33842:2;33846:7;33826:9;:28::i;:::-;-1:-1:-1::0;;;;;33869:13:0;::::1;8314:20:::0;8362:8;;33869:76:::1;;;;;33889:56;33920:4;33926:2;33930:7;33939:5;33889:30;:56::i;:::-;33888:57;33869:76;33865:156;;;33969:40;;-1:-1:-1::0;;;33969:40:0::1;;;;;;;;;;;33865:156;33633:395:::0;;;;;:::o;54901:236::-;48176:6;;-1:-1:-1;;;;;48176:6:0;15979:10;48323:23;48315:68;;;;-1:-1:-1;;;48315:68:0;;;;;;;:::i;:::-;54995:11:::1;::::0;::::1;::::0;;::::1;::::0;:30:::1;;-1:-1:-1::0;55010:15:0::1;::::0;::::1;::::0;::::1;54995:30;54987:64;;;::::0;-1:-1:-1;;;54987:64:0;;18288:2:1;54987:64:0::1;::::0;::::1;18270:21:1::0;18327:2;18307:18;;;18300:30;-1:-1:-1;;;18346:18:1;;;18339:51;18407:18;;54987:64:0::1;18260:171:1::0;54987:64:0::1;55062:15;:24:::0;;-1:-1:-1;;55097:32:0;55062:24;::::1;::::0;;::::1;;-1:-1:-1::0;;55097:32:0;;-1:-1:-1;;;55097:32:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;54901:236::o;31060:318::-;31133:13;31164:16;31172:7;31164;:16::i;:::-;31159:59;;31189:29;;-1:-1:-1;;;31189:29:0;;;;;;;;;;;31159:59;31231:21;31255:10;:8;:10::i;:::-;31231:34;;31289:7;31283:21;31308:1;31283:26;;:87;;;;;;;;;;;;;;;;;31336:7;31345:18;:7;:16;:18::i;:::-;31319:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31283:87;31276:94;31060:318;-1:-1:-1;;;31060:318:0:o;56905:197::-;57000:15;;56948:4;;57000:15;;;;;57034:21;;;;;:60;;-1:-1:-1;57059:15:0;:35;;;56905:197;-1:-1:-1;56905:197:0:o;53920:113::-;-1:-1:-1;;;;;28356:19:0;;53978:7;28356:19;;;:12;:19;;;;;:32;-1:-1:-1;;;28356:32:0;;-1:-1:-1;;;;;28356:32:0;54005:20;28260:137;49012:201;48176:6;;-1:-1:-1;;;;;48176:6:0;15979:10;48323:23;48315:68;;;;-1:-1:-1;;;48315:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;49101:22:0;::::1;49093:73;;;::::0;-1:-1:-1;;;49093:73:0;;13458:2:1;49093:73:0::1;::::0;::::1;13440:21:1::0;13497:2;13477:18;;;13470:30;13536:34;13516:18;;;13509:62;-1:-1:-1;;;13587:18:1;;;13580:36;13633:19;;49093:73:0::1;13430:228:1::0;49093:73:0::1;49177:28;49196:8;49177:18;:28::i;34283:174::-:0;34340:4;34404:13;;34394:7;:23;34364:85;;;;-1:-1:-1;;34422:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;34422:27:0;;;;34421:28;;34283:174::o;34465:104::-;34534:27;34544:2;34548:8;34534:27;;;;;;;;;;;;:9;:27::i;:::-;34465:104;;:::o;42440:196::-;42555:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;42555:29:0;-1:-1:-1;;;;;42555:29:0;;;;;;;;;42600:28;;42555:24;;42600:28;;;;;;;42440:196;;;:::o;37383:2130::-;37498:35;37536:21;37549:7;37536:12;:21::i;:::-;37498:59;;37596:4;-1:-1:-1;;;;;37574:26:0;:13;:18;;;-1:-1:-1;;;;;37574:26:0;;37570:67;;37609:28;;-1:-1:-1;;;37609:28:0;;;;;;;;;;;37570:67;37650:22;15979:10;-1:-1:-1;;;;;37676:20:0;;;;:73;;-1:-1:-1;37713:36:0;37730:4;15979:10;32853:164;:::i;37713:36::-;37676:126;;;-1:-1:-1;15979:10:0;37766:20;37778:7;37766:11;:20::i;:::-;-1:-1:-1;;;;;37766:36:0;;37676:126;37650:153;;37821:17;37816:66;;37847:35;;-1:-1:-1;;;37847:35:0;;;;;;;;;;;37816:66;-1:-1:-1;;;;;37897:16:0;;37893:52;;37922:23;;-1:-1:-1;;;37922:23:0;;;;;;;;;;;37893:52;38066:35;38083:1;38087:7;38096:4;38066:8;:35::i;:::-;-1:-1:-1;;;;;38397:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;38397:31:0;;;-1:-1:-1;;;;;38397:31:0;;;-1:-1:-1;;38397:31:0;;;;;;;38443:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;38443:29:0;;;;;;;;;;;38523:20;;;:11;:20;;;;;;38558:18;;-1:-1:-1;;;;;;38591:49:0;;;;-1:-1:-1;;;38624:15:0;38591:49;;;;;;;;;;38914:11;;38974:24;;;;;39017:13;;38523:20;;38974:24;;39017:13;39013:384;;39227:13;;39212:11;:28;39208:174;;39265:20;;39334:28;;;;-1:-1:-1;;;;;39308:54:0;-1:-1:-1;;;39308:54:0;-1:-1:-1;;;;;;39308:54:0;;;-1:-1:-1;;;;;39265:20:0;;39308:54;;;;39208:174;37383:2130;;;39444:7;39440:2;-1:-1:-1;;;;;39425:27:0;39434:4;-1:-1:-1;;;;;39425:27:0;-1:-1:-1;;;;;;;;;;;39425:27:0;;;;;;;;;39463:42;57361:602;45784:1332;45854:13;45850:49;;45876:23;;-1:-1:-1;;;45876:23:0;;;;;;;;;;;45850:49;26682:7;45914:13;45910:64;;45955:19;;-1:-1:-1;;;45955:19:0;;;;;;;;;;;45910:64;46021:24;;46060:30;46056:106;;-1:-1:-1;26682:7:0;46056:106;46205:13;;46176:25;:42;46172:81;;46227:26;;-1:-1:-1;;;46227:26:0;;;;;;;;;;;46172:81;46399:16;46555:13;46418:36;;;-1:-1:-1;;46418:40:0;;;-1:-1:-1;46536:97:0;;;-1:-1:-1;46600:13:0;;-1:-1:-1;;46600:17:0;46536:97;46666:25;46649:393;46698:8;46693:1;:13;46649:393;;46767:1;46736:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;46736:19:0;:33;:59;;;;-1:-1:-1;46774:14:0;;;;:11;:14;;;;;:21;-1:-1:-1;;;46774:21:0;;;;46773:22;46736:59;46732:295;;;46820:31;46854:15;46867:1;46854:12;:15::i;:::-;46914:14;;;46892;;;:11;:14;;;;;;;;:36;;46983:24;;;;;-1:-1:-1;;;;;46951:56:0;-1:-1:-1;;;46951:56:0;-1:-1:-1;;;;;;46951:56:0;;;-1:-1:-1;;;;;46892:36:0;;;46951:56;;;;;;;-1:-1:-1;46732:295:0;46708:3;;46649:393;;;-1:-1:-1;47096:1:0;47085:12;47058:24;:39;-1:-1:-1;;45784:1332:0:o;50360:190::-;50485:4;50538;50509:25;50522:5;50529:4;50509:12;:25::i;:::-;:33;;50360:190;-1:-1:-1;;;;50360:190:0:o;56485:375::-;56602:9;;-1:-1:-1;;;56602:9:0;;;;56590:8;56574:13;54085:7;27481:13;;54142:91;56574:13;:24;;;;:::i;:::-;:37;;56552:140;;;;-1:-1:-1;;;56552:140:0;;13865:2:1;56552:140:0;;;13847:21:1;13904:2;13884:18;;;13877:30;13943:34;13923:18;;;13916:62;-1:-1:-1;;;13994:18:1;;;13987:51;14055:19;;56552:140:0;13837:243:1;56552:140:0;56736:1;56725:8;:12;:40;;;;-1:-1:-1;52172:2:0;56741:24;;;56725:40;56703:113;;;;-1:-1:-1;;;56703:113:0;;12355:2:1;56703:113:0;;;12337:21:1;12394:2;12374:18;;;12367:30;12433:25;12413:18;;;12406:53;12476:18;;56703:113:0;12327:173:1;56703:113:0;56829:23;56839:2;56843:8;56829:9;:23::i;29353:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;29464:7:0;29547:13;;29540:4;:20;29509:886;;;29581:31;29615:17;;;:11;:17;;;;;;;;;29581:51;;;;;;;;;-1:-1:-1;;;;;29581:51:0;;;;-1:-1:-1;;;29581:51:0;;-1:-1:-1;;;;;29581:51:0;;;;;;;;-1:-1:-1;;;29581:51:0;;;;;;;;;;;;;;29651:729;;29701:14;;-1:-1:-1;;;;;29701:28:0;;29697:101;;29765:9;29353:1109;-1:-1:-1;;;29353:1109:0:o;29697:101::-;-1:-1:-1;;;30140:6:0;30185:17;;;;:11;:17;;;;;;;;;30173:29;;;;;;;;;-1:-1:-1;;;;;30173:29:0;;;;;-1:-1:-1;;;30173:29:0;;-1:-1:-1;;;;;30173:29:0;;;;;;;;-1:-1:-1;;;30173:29:0;;;;;;;;;;;;;30233:28;30229:109;;30301:9;29353:1109;-1:-1:-1;;;29353:1109:0:o;30229:109::-;30100:261;;;29509:886;;30423:31;;-1:-1:-1;;;30423:31:0;;;;;;;;;;;57971:114;58031:13;58064;58057:20;;;;;:::i;49373:191::-;49466:6;;;-1:-1:-1;;;;;49483:17:0;;;-1:-1:-1;;;;;;49483:17:0;;;;;;;49516:40;;49466:6;;;49483:17;49466:6;;49516:40;;49447:16;;49516:40;49373:191;;:::o;39596:89::-;39656:21;39662:7;39671:5;39656;:21::i;43128:667::-;43312:72;;-1:-1:-1;;;43312:72:0;;43291:4;;-1:-1:-1;;;;;43312:36:0;;;;;:72;;15979:10;;43363:4;;43369:7;;43378:5;;43312:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43312:72:0;;;;;;;;-1:-1:-1;;43312:72:0;;;;;;;;;;;;:::i;:::-;;;43308:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43546:13:0;;43542:235;;43592:40;;-1:-1:-1;;;43592:40:0;;;;;;;;;;;43542:235;43735:6;43729:13;43720:6;43716:2;43712:15;43705:38;43308:480;-1:-1:-1;;;;;;43431:55:0;-1:-1:-1;;;43431:55:0;;-1:-1:-1;43308:480:0;43128:667;;;;;;:::o;16376:723::-;16432:13;16653:10;16649:53;;-1:-1:-1;;16680:10:0;;;;;;;;;;;;-1:-1:-1;;;16680:10:0;;;;;16376:723::o;16649:53::-;16727:5;16712:12;16768:78;16775:9;;16768:78;;16801:8;;;;:::i;:::-;;-1:-1:-1;16824:10:0;;-1:-1:-1;16832:2:0;16824:10;;:::i;:::-;;;16768:78;;;16856:19;16888:6;-1:-1:-1;;;;;16878:17:0;;;;;-1:-1:-1;;;16878:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16878:17:0;;16856:39;;16906:154;16913:10;;16906:154;;16940:11;16950:1;16940:11;;:::i;:::-;;-1:-1:-1;17009:10:0;17017:2;17009:5;:10;:::i;:::-;16996:24;;:2;:24;:::i;:::-;16983:39;;16966:6;16973;16966:14;;;;;;-1:-1:-1;;;16966:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;16966:56:0;;;;;;;;-1:-1:-1;17037:11:0;17046:2;17037:11;;:::i;:::-;;;16906:154;;34932:163;35055:32;35061:2;35065:8;35075:5;35082:4;35055:5;:32::i;50912:701::-;50995:7;51038:4;50995:7;51053:523;51077:5;:12;51073:1;:16;51053:523;;;51111:20;51134:5;51140:1;51134:8;;;;;;-1:-1:-1;;;51134:8:0;;;;;;;;;;;;;;;51111:31;;51177:12;51161;:28;51157:408;;51314:44;;;;;;9555:19:1;;;9590:12;;;9583:28;;;9627:12;;51314:44:0;;;;;;;;;;;;51304:55;;;;;;51289:70;;51157:408;;;51504:44;;;;;;9555:19:1;;;9590:12;;;9583:28;;;9627:12;;51504:44:0;;;;;;;;;;;;51494:55;;;;;;51479:70;;51157:408;-1:-1:-1;51091:3:0;;;;:::i;:::-;;;;51053:523;;;-1:-1:-1;51593:12:0;50912:701;-1:-1:-1;;;50912:701:0:o;39914:2408::-;39994:35;40032:21;40045:7;40032:12;:21::i;:::-;40081:18;;39994:59;;-1:-1:-1;40112:290:0;;;;40146:22;15979:10;-1:-1:-1;;;;;40172:20:0;;;;:77;;-1:-1:-1;40213:36:0;40230:4;15979:10;32853:164;:::i;40213:36::-;40172:134;;;-1:-1:-1;15979:10:0;40270:20;40282:7;40270:11;:20::i;:::-;-1:-1:-1;;;;;40270:36:0;;40172:134;40146:161;;40329:17;40324:66;;40355:35;;-1:-1:-1;;;40355:35:0;;;;;;;;;;;40324:66;40112:290;;40530:35;40547:1;40551:7;40560:4;40530:8;:35::i;:::-;-1:-1:-1;;;;;40895:18:0;;;40861:31;40895:18;;;:12;:18;;;;;;;;40928:24;;-1:-1:-1;;;;;;;;;;40928:24:0;;;;;;;;;-1:-1:-1;;40928:24:0;;;;40967:29;;;;;40951:1;40967:29;;;;;;;;-1:-1:-1;;40967:29:0;;;;;;;;;;41129:20;;;:11;:20;;;;;;41164;;-1:-1:-1;;;;41232:15:0;41199:49;;;-1:-1:-1;;;41199:49:0;-1:-1:-1;;;;;;41199:49:0;;;;;;;;;;41263:22;-1:-1:-1;;;41263:22:0;;;41555:11;;;41615:24;;;;;41658:13;;40895:18;;41615:24;;41658:13;41654:384;;41868:13;;41853:11;:28;41849:174;;41906:20;;41975:28;;;;-1:-1:-1;;;;;41949:54:0;-1:-1:-1;;;41949:54:0;-1:-1:-1;;;;;;41949:54:0;;;-1:-1:-1;;;;;41906:20:0;;41949:54;;;;41849:174;-1:-1:-1;;42066:35:0;;42093:7;;-1:-1:-1;42089:1:0;;-1:-1:-1;;;;;;42066:35:0;;;-1:-1:-1;;;;;;;;;;;42066:35:0;42089:1;;42066:35;-1:-1:-1;;42289:12:0;:14;;;;;;-1:-1:-1;;39914:2408:0:o;35354:1775::-;35493:20;35516:13;-1:-1:-1;;;;;35544:16:0;;35540:48;;35569:19;;-1:-1:-1;;;35569:19:0;;;;;;;;;;;35540:48;35603:13;35599:44;;35625:18;;-1:-1:-1;;;35625:18:0;;;;;;;;;;;35599:44;-1:-1:-1;;;;;35994:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;36053:49:0;;-1:-1:-1;;;;;35994:44:0;;;;;;;36053:49;;;-1:-1:-1;;;;;35994:44:0;;;;;;36053:49;;;;;;;;;;;;;;;;36119:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;36169:66:0;;;;-1:-1:-1;;;36219:15:0;36169:66;;;;;;;;;;36119:25;36316:23;;;36360:4;:23;;;;-1:-1:-1;;;;;;36368:13:0;;8314:20;8362:8;;36368:15;36356:641;;;36404:314;36435:38;;36460:12;;-1:-1:-1;;;;;36435:38:0;;;36452:1;;-1:-1:-1;;;;;;;;;;;36435:38:0;36452:1;;36435:38;36501:69;36540:1;36544:2;36548:14;;;;;;36564:5;36501:30;:69::i;:::-;36496:174;;36606:40;;-1:-1:-1;;;36606:40:0;;;;;;;;;;;36496:174;36713:3;36697:12;:19;;36404:314;;36799:12;36782:13;;:29;36778:43;;36813:8;;;36778:43;36356:641;;;36862:120;36893:40;;36918:14;;;;;-1:-1:-1;;;;;36893:40:0;;;36910:1;;-1:-1:-1;;;;;;;;;;;36893:40:0;36910:1;;36893:40;36977:3;36961:12;:19;;36862:120;;36356:641;-1:-1:-1;37011:13:0;:28;37061:60;57361:602;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:391::-;891:8;901:6;955:3;948:4;940:6;936:17;932:27;922:2;;978:6;970;963:22;922:2;-1:-1:-1;1006:20:1;;-1:-1:-1;;;;;1038:30:1;;1035:2;;;1088:8;1078;1071:26;1035:2;1132:4;1124:6;1120:17;1108:29;;1192:3;1185:4;1175:6;1172:1;1168:14;1160:6;1156:27;1152:38;1149:47;1146:2;;;1209:1;1206;1199:12;1146:2;912:307;;;;;:::o;1224:159::-;1291:20;;1351:6;1340:18;;1330:29;;1320:2;;1373:1;1370;1363:12;1388:163;1455:20;;1515:10;1504:22;;1494:33;;1484:2;;1541:1;1538;1531:12;1556:196;1615:6;1668:2;1656:9;1647:7;1643:23;1639:32;1636:2;;;1689:6;1681;1674:22;1636:2;1717:29;1736:9;1717:29;:::i;1757:270::-;1825:6;1833;1886:2;1874:9;1865:7;1861:23;1857:32;1854:2;;;1907:6;1899;1892:22;1854:2;1935:29;1954:9;1935:29;:::i;:::-;1925:39;;1983:38;2017:2;2006:9;2002:18;1983:38;:::i;:::-;1973:48;;1844:183;;;;;:::o;2032:338::-;2109:6;2117;2125;2178:2;2166:9;2157:7;2153:23;2149:32;2146:2;;;2199:6;2191;2184:22;2146:2;2227:29;2246:9;2227:29;:::i;:::-;2217:39;;2275:38;2309:2;2298:9;2294:18;2275:38;:::i;:::-;2265:48;;2360:2;2349:9;2345:18;2332:32;2322:42;;2136:234;;;;;:::o;2375:696::-;2470:6;2478;2486;2494;2547:3;2535:9;2526:7;2522:23;2518:33;2515:2;;;2569:6;2561;2554:22;2515:2;2597:29;2616:9;2597:29;:::i;:::-;2587:39;;2645:38;2679:2;2668:9;2664:18;2645:38;:::i;:::-;2635:48;;2730:2;2719:9;2715:18;2702:32;2692:42;;2785:2;2774:9;2770:18;2757:32;-1:-1:-1;;;;;2804:6:1;2801:30;2798:2;;;2849:6;2841;2834:22;2798:2;2877:22;;2930:4;2922:13;;2918:27;-1:-1:-1;2908:2:1;;2964:6;2956;2949:22;2908:2;2992:73;3057:7;3052:2;3039:16;3034:2;3030;3026:11;2992:73;:::i;:::-;2982:83;;;2505:566;;;;;;;:::o;3076:325::-;3141:6;3149;3202:2;3190:9;3181:7;3177:23;3173:32;3170:2;;;3223:6;3215;3208:22;3170:2;3251:29;3270:9;3251:29;:::i;:::-;3241:39;;3330:2;3319:9;3315:18;3302:32;3343:28;3365:5;3343:28;:::i;:::-;3390:5;3380:15;;;3160:241;;;;;:::o;3406:264::-;3474:6;3482;3535:2;3523:9;3514:7;3510:23;3506:32;3503:2;;;3556:6;3548;3541:22;3503:2;3584:29;3603:9;3584:29;:::i;:::-;3574:39;3660:2;3645:18;;;;3632:32;;-1:-1:-1;;;3493:177:1:o;3675:668::-;3788:6;3796;3804;3812;3820;3873:3;3861:9;3852:7;3848:23;3844:33;3841:2;;;3895:6;3887;3880:22;3841:2;3923:29;3942:9;3923:29;:::i;:::-;3913:39;;3999:2;3988:9;3984:18;3971:32;3961:42;;4054:2;4043:9;4039:18;4026:32;-1:-1:-1;;;;;4073:6:1;4070:30;4067:2;;;4118:6;4110;4103:22;4067:2;4162:70;4224:7;4215:6;4204:9;4200:22;4162:70;:::i;:::-;3831:512;;;;-1:-1:-1;4251:8:1;4333:2;4318:18;4305:32;;3831:512;-1:-1:-1;;;;3831:512:1:o;4348:332::-;4425:6;4433;4441;4494:2;4482:9;4473:7;4469:23;4465:32;4462:2;;;4515:6;4507;4500:22;4462:2;4543:29;4562:9;4543:29;:::i;:::-;4533:39;4619:2;4604:18;;4591:32;;-1:-1:-1;4670:2:1;4655:18;;;4642:32;;4452:228;-1:-1:-1;;;4452:228:1:o;4685:457::-;4771:6;4779;4832:2;4820:9;4811:7;4807:23;4803:32;4800:2;;;4853:6;4845;4838:22;4800:2;4898:9;4885:23;-1:-1:-1;;;;;4923:6:1;4920:30;4917:2;;;4968:6;4960;4953:22;4917:2;5012:70;5074:7;5065:6;5054:9;5050:22;5012:70;:::i;:::-;5101:8;;4986:96;;-1:-1:-1;4790:352:1;-1:-1:-1;;;;4790:352:1:o;5147:697::-;5265:6;5273;5326:2;5314:9;5305:7;5301:23;5297:32;5294:2;;;5347:6;5339;5332:22;5294:2;5392:9;5379:23;-1:-1:-1;;;;;5462:2:1;5454:6;5451:14;5448:2;;;5483:6;5475;5468:22;5448:2;5526:6;5515:9;5511:22;5501:32;;5571:7;5564:4;5560:2;5556:13;5552:27;5542:2;;5598:6;5590;5583:22;5542:2;5643;5630:16;5669:2;5661:6;5658:14;5655:2;;;5690:6;5682;5675:22;5655:2;5748:7;5743:2;5733:6;5730:1;5726:14;5722:2;5718:23;5714:32;5711:45;5708:2;;;5774:6;5766;5759:22;5708:2;5810;5802:11;;;;;5832:6;;-1:-1:-1;5284:560:1;;-1:-1:-1;;;;5284:560:1:o;5849:255::-;5916:6;5969:2;5957:9;5948:7;5944:23;5940:32;5937:2;;;5990:6;5982;5975:22;5937:2;6027:9;6021:16;6046:28;6068:5;6046:28;:::i;6109:190::-;6168:6;6221:2;6209:9;6200:7;6196:23;6192:32;6189:2;;;6242:6;6234;6227:22;6189:2;-1:-1:-1;6270:23:1;;6179:120;-1:-1:-1;6179:120:1:o;6304:255::-;6362:6;6415:2;6403:9;6394:7;6390:23;6386:32;6383:2;;;6436:6;6428;6421:22;6383:2;6480:9;6467:23;6499:30;6523:5;6499:30;:::i;6564:259::-;6633:6;6686:2;6674:9;6665:7;6661:23;6657:32;6654:2;;;6707:6;6699;6692:22;6654:2;6744:9;6738:16;6763:30;6787:5;6763:30;:::i;6828:642::-;6899:6;6907;6960:2;6948:9;6939:7;6935:23;6931:32;6928:2;;;6981:6;6973;6966:22;6928:2;7026:9;7013:23;-1:-1:-1;;;;;7096:2:1;7088:6;7085:14;7082:2;;;7117:6;7109;7102:22;7082:2;7160:6;7149:9;7145:22;7135:32;;7205:7;7198:4;7194:2;7190:13;7186:27;7176:2;;7232:6;7224;7217:22;7176:2;7277;7264:16;7303:2;7295:6;7292:14;7289:2;;;7324:6;7316;7309:22;7289:2;7374:7;7369:2;7360:6;7356:2;7352:15;7348:24;7345:37;7342:2;;;7400:6;7392;7385:22;7670:548;7748:6;7756;7809:2;7797:9;7788:7;7784:23;7780:32;7777:2;;;7830:6;7822;7815:22;7777:2;7871:9;7858:23;7848:33;;7932:2;7921:9;7917:18;7904:32;-1:-1:-1;;;;;7951:6:1;7948:30;7945:2;;;7996:6;7988;7981:22;7945:2;8024:22;;8077:4;8069:13;;8065:27;-1:-1:-1;8055:2:1;;8111:6;8103;8096:22;8055:2;8139:73;8204:7;8199:2;8186:16;8181:2;8177;8173:11;8139:73;:::i;:::-;8129:83;;;7767:451;;;;;:::o;8223:403::-;8307:6;8315;8323;8331;8384:3;8372:9;8363:7;8359:23;8355:33;8352:2;;;8406:6;8398;8391:22;8352:2;8447:9;8434:23;8424:33;;8504:2;8493:9;8489:18;8476:32;8466:42;;8527:37;8560:2;8549:9;8545:18;8527:37;:::i;:::-;8517:47;;8583:37;8616:2;8605:9;8601:18;8583:37;:::i;:::-;8573:47;;8342:284;;;;;;;:::o;8631:266::-;8697:6;8705;8758:2;8746:9;8737:7;8733:23;8729:32;8726:2;;;8779:6;8771;8764:22;8726:2;8807:28;8825:9;8807:28;:::i;:::-;8797:38;;8854:37;8887:2;8876:9;8872:18;8854:37;:::i;8902:257::-;8943:3;8981:5;8975:12;9008:6;9003:3;8996:19;9024:63;9080:6;9073:4;9068:3;9064:14;9057:4;9050:5;9046:16;9024:63;:::i;:::-;9141:2;9120:15;-1:-1:-1;;9116:29:1;9107:39;;;;9148:4;9103:50;;8951:208;-1:-1:-1;;8951:208:1:o;9650:470::-;9829:3;9867:6;9861:13;9883:53;9929:6;9924:3;9917:4;9909:6;9905:17;9883:53;:::i;:::-;9999:13;;9958:16;;;;10021:57;9999:13;9958:16;10055:4;10043:17;;10021:57;:::i;:::-;10094:20;;9837:283;-1:-1:-1;;;;9837:283:1:o;10852:488::-;-1:-1:-1;;;;;11121:15:1;;;11103:34;;11173:15;;11168:2;11153:18;;11146:43;11220:2;11205:18;;11198:34;;;11268:3;11263:2;11248:18;;11241:31;;;11046:4;;11289:45;;11314:19;;11306:6;11289:45;:::i;:::-;11281:53;11055:285;-1:-1:-1;;;;;;11055:285:1:o;11345:387::-;11579:1;11575;11570:3;11566:11;11562:19;11554:6;11550:32;11539:9;11532:51;11619:6;11614:2;11603:9;11599:18;11592:34;11662:2;11657;11646:9;11642:18;11635:30;11513:4;11682:44;11722:2;11711:9;11707:18;11699:6;11682:44;:::i;:::-;11674:52;11522:210;-1:-1:-1;;;;;11522:210:1:o;11929:219::-;12078:2;12067:9;12060:21;12041:4;12098:44;12138:2;12127:9;12123:18;12115:6;12098:44;:::i;15853:356::-;16055:2;16037:21;;;16074:18;;;16067:30;16133:34;16128:2;16113:18;;16106:62;16200:2;16185:18;;16027:182::o;20042:224::-;20081:3;20109:6;20142:2;20139:1;20135:10;20172:2;20169:1;20165:10;20203:3;20199:2;20195:12;20190:3;20187:21;20184:2;;;20211:18;;:::i;20271:128::-;20311:3;20342:1;20338:6;20335:1;20332:13;20329:2;;;20348:18;;:::i;:::-;-1:-1:-1;20384:9:1;;20319:80::o;20404:120::-;20444:1;20470;20460:2;;20475:18;;:::i;:::-;-1:-1:-1;20509:9:1;;20450:74::o;20529:168::-;20569:7;20635:1;20631;20627:6;20623:14;20620:1;20617:21;20612:1;20605:9;20598:17;20594:45;20591:2;;;20642:18;;:::i;:::-;-1:-1:-1;20682:9:1;;20581:116::o;20702:125::-;20742:4;20770:1;20767;20764:8;20761:2;;;20775:18;;:::i;:::-;-1:-1:-1;20812:9:1;;20751:76::o;20832:258::-;20904:1;20914:113;20928:6;20925:1;20922:13;20914:113;;;21004:11;;;20998:18;20985:11;;;20978:39;20950:2;20943:10;20914:113;;;21045:6;21042:1;21039:13;21036:2;;;-1:-1:-1;;21080:1:1;21062:16;;21055:27;20885:205::o;21095:380::-;21174:1;21170:12;;;;21217;;;21238:2;;21292:4;21284:6;21280:17;21270:27;;21238:2;21345;21337:6;21334:14;21314:18;21311:38;21308:2;;;21391:10;21386:3;21382:20;21379:1;21372:31;21426:4;21423:1;21416:15;21454:4;21451:1;21444:15;21308:2;;21150:325;;;:::o;21480:135::-;21519:3;-1:-1:-1;;21540:17:1;;21537:2;;;21560:18;;:::i;:::-;-1:-1:-1;21607:1:1;21596:13;;21527:88::o;21620:112::-;21652:1;21678;21668:2;;21683:18;;:::i;:::-;-1:-1:-1;21717:9:1;;21658:74::o;21737:127::-;21798:10;21793:3;21789:20;21786:1;21779:31;21829:4;21826:1;21819:15;21853:4;21850:1;21843:15;21869:127;21930:10;21925:3;21921:20;21918:1;21911:31;21961:4;21958:1;21951:15;21985:4;21982:1;21975:15;22001:127;22062:10;22057:3;22053:20;22050:1;22043:31;22093:4;22090:1;22083:15;22117:4;22114:1;22107:15;22133:118;22219:5;22212:13;22205:21;22198:5;22195:32;22185:2;;22241:1;22238;22231:12;22256:131;-1:-1:-1;;;;;;22330:32:1;;22320:43;;22310:2;;22377:1;22374;22367:12

Swarm Source

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