ETH Price: $2,359.92 (+0.76%)

Token

Bad_Girls_Initiative (BGI)
 

Overview

Max Total Supply

131 BGI

Holders

91

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BGI
0xdb168e6fcd6dfb6b73631a33c70d2380f9c26798
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:
Bad_Girls_Initiative

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-16
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

contract Bad_Girls_Initiative is ERC721, ERC721Enumerable, Ownable {

    using SafeMath for uint256;

    uint256 public constant maxSupply = 6666;
    uint256 private PresalePrice = 0.05 ether;
    uint256 private price = 0.066 ether;
    uint256 private maxPerTranscationPreSale = 2;
    uint256 private maxPerTranscation = 10;
    uint256 private reserved = 40;
    uint256 private preSaleMax = 666;
    uint256 private profit;

    string public CG_PROVENANCE = "";
    uint256 public startingIndex;

    bool private saleStarted;
    bool private preSaleStarted;

    string public baseURI;

    mapping(address => bool) public PresaleList;


    address t1 = 0xD9a8d6026e301671B39694c26D3512953C13150d; //Kevin
    address t2 = 0xd456da9B74BB7CE27D4d7667bbB2657B1b4e4d16; //Arthur
    address t3 = 0x5794547EcF9c3aC515C1Fa2B988c654f3cF3028E; //Leo
    address t4 = 0xd9444f1dBE232C20a849B6556e929D1B814D6ca2; //Sean
    address t5 = 0xDe2F138cFf35cAb232965b8e0CA7C05EB9886D98; //Aries
    address t6 = 0x7AA9f8FF988B186cE6C6ac2c95a8ee8C139f4694; //Jerome
    address t7 = 0xf7FA2295c423cdb9d9a1D388695242E10B539b5e; //Vivian


    constructor() ERC721("Bad_Girls_Initiative", "BGI") {
        saleStarted = false;
        preSaleStarted = false;
    }

    modifier whenSaleStarted() {
        require(saleStarted);
        _;
    }

    modifier whenPreSaleStarted() {
        require(preSaleStarted);
        _;
    }

    modifier onlyPresaleListed() {
        require(
            PresaleList[msg.sender],
            "You're not on the whitelist!");
        _;
    }

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

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


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


    function getPrice() public view returns (uint256) {
        return price;
    }
    
    
    function addAddressesToPresaleList(address[] memory addrs) public onlyOwner {
        for (uint256 i = 0; i < addrs.length; i++) {
            PresaleList[addrs[i]] = true;
        }
    }


    function flipPreSaleStarted() external onlyOwner {
        preSaleStarted = !preSaleStarted;

        if (preSaleStarted && startingIndex == 0) {
            setStartingIndex();
        }
    }
    
    function flipSaleStarted() external onlyOwner {
        saleStarted = !saleStarted;
    }
    

    function presale(uint8 numberTokens) external payable onlyPresaleListed {
       
        uint256 supply = totalSupply();
        require(preSaleStarted);
        require(numberTokens <= maxPerTranscationPreSale,"You can only mint one in presale!");
        require(supply.add( numberTokens )  <= preSaleMax,"Enough Tokens are not left!");
        require(numberTokens*PresalePrice <= msg.value,"Amount sent is less");

        for (uint256 i; i < numberTokens; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }

    function mint(uint256 numberTokens) external payable whenSaleStarted {
        uint256 supply = totalSupply();
        require(numberTokens <= maxPerTranscation,"You cannot mint more than 10!");
        require(supply.add( numberTokens ) <= maxSupply,"Exceed the max supply!");
        require(numberTokens*price <= msg.value,"Amount sent is less" );

        for (uint256 i = 0; i < numberTokens; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }


    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        CG_PROVENANCE = provenanceHash;
    }

    function claimReserved(address[] memory addrs) external onlyOwner {
        uint256 len = addrs.length;
        require( len <= reserved, "That would exceed the max reserved.");

        uint256 _tokenId = totalSupply();
        for (uint256 i = 0 ; i < len; i++) {
            _safeMint(addrs[i], _tokenId + i);
        }

        reserved = reserved.sub( len ) ;
    }

    function setStartingIndex() public {
        require(startingIndex == 0, "Starting index is already set");

        // BlockHash only works for the most 256 recent blocks.
        uint256 block_shift = uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp)));
        block_shift =  1 + (block_shift % 255);

        // This shouldn't happen, but just in case the blockchain gets a reboot?
        if (block.number < block_shift) {
            block_shift = 1;
        }

        uint256 block_ref = block.number - block_shift;
        startingIndex = uint(blockhash(block_ref)) % maxSupply;

        // Prevent default sequence
        if (startingIndex == 0) {
            startingIndex = startingIndex + 1;
        }
    }
    
    
    function withdraw_All() public onlyOwner {
        uint256 balance = address(this).balance;
        require(payable(t1).send(balance));
    }
    
    
    function withdraw_1(uint256 share) public onlyOwner {
        profit = share;
        require(payable(t1).send(profit));
    }
    
    function withdraw_2(uint256 share) public onlyOwner {
        profit = share;
        require(payable(t2).send(profit));
    }
    
    function withdraw_3(uint256 share) public onlyOwner {
        profit = share;
        require(payable(t3).send(profit));
    }
    
    function withdraw_4(uint256 share) public onlyOwner {
        profit = share;
        require(payable(t4).send(profit));
    }
    
    function withdraw_5(uint256 share) public onlyOwner {
        profit = share;
        require(payable(t5).send(profit));
    }
    
    function withdraw_6(uint256 share) public onlyOwner {
        profit = share;
        require(payable(t6).send(profit));
    }
    
    function withdraw_7(uint256 share) public onlyOwner {
        profit = share;
        require(payable(t7).send(profit));
    }
    
    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CG_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"PresaleList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"addAddressesToPresaleList","outputs":[],"stateMutability":"nonpayable","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":"address[]","name":"addrs","type":"address[]"}],"name":"claimReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPreSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleStarted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberTokens","type":"uint8"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"name":"withdraw_1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"name":"withdraw_2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"name":"withdraw_3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"name":"withdraw_4","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"name":"withdraw_5","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"name":"withdraw_6","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"name":"withdraw_7","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw_All","outputs":[],"stateMutability":"nonpayable","type":"function"}]

66b1a2bc2ec50000600b5566ea7aa67b2d0000600c556002600d55600a600e556028600f5561029a60105560a060408190526000608081905262000046916012916200022d565b50601780546001600160a01b031990811673d9a8d6026e301671b39694c26d3512953c13150d1790915560188054821673d456da9b74bb7ce27d4d7667bbb2657b1b4e4d16179055601980548216735794547ecf9c3ac515c1fa2b988c654f3cf3028e179055601a8054821673d9444f1dbe232c20a849b6556e929d1b814d6ca2179055601b8054821673de2f138cff35cab232965b8e0ca7c05eb9886d98179055601c80548216737aa9f8ff988b186ce6c6ac2c95a8ee8c139f4694179055601d805490911673f7fa2295c423cdb9d9a1d388695242e10b539b5e1790553480156200013257600080fd5b50604080518082018252601481527f4261645f4769726c735f496e697469617469766500000000000000000000000060208083019182528351808501909452600384526242474960e81b90840152815191929162000193916000916200022d565b508051620001a99060019060208401906200022d565b505050620001c6620001c0620001d760201b60201c565b620001db565b6014805461ffff1916905562000310565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200023b90620002d3565b90600052602060002090601f0160209004810192826200025f5760008555620002aa565b82601f106200027a57805160ff1916838001178555620002aa565b82800160010185558215620002aa579182015b82811115620002aa5782518255916020019190600101906200028d565b50620002b8929150620002bc565b5090565b5b80821115620002b85760008155600101620002bd565b600281046001821680620002e857607f821691505b602082108114156200030a57634e487b7160e01b600052602260045260246000fd5b50919050565b612d9380620003206000396000f3fe60806040526004361061025c5760003560e01c8063715018a611610144578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd146106ad578063cb774d47146106cd578063d5abeb01146106e2578063e985e9c5146106f7578063e986655014610717578063f2fde38b1461072c5761025c565b8063a22cb46514610618578063b88d4fde14610638578063b9b3722414610658578063be2531241461066d578063be3197521461068d5761025c565b80638fef8ecc116101085780638fef8ecc1461058657806391b7f5ed1461059b57806395d89b41146105bb57806398d5fdca146105d05780639c791e99146105e5578063a0712d68146106055761025c565b8063715018a61461050757806377fb63f11461051c578063809e993b1461053c578063899d7b381461055c5780638da5cb5b146105715761025c565b806325914b71116101dd57806355f804b3116101a157806355f804b31461045f5780635f4b9a731461047f5780636352211e1461049f5780636c0360eb146104bf5780636d9f8ef1146104d457806370a08231146104e75761025c565b806325914b71146103ca5780632f745c59146103df57806340510c80146103ff57806342842e0e1461041f5780634f6ccce71461043f5761025c565b806310969523116102245780631096952314610328578063137b05621461034857806318160ddd14610368578063212a97eb1461038a57806323b872dd146103aa5761025c565b806301ffc9a71461026157806306fdde0314610297578063081812fc146102b9578063095ea7b3146102e65780630baf488414610308575b600080fd5b34801561026d57600080fd5b5061028161027c366004612391565b61074c565b60405161028e9190612502565b60405180910390f35b3480156102a357600080fd5b506102ac61075f565b60405161028e919061250d565b3480156102c557600080fd5b506102d96102d436600461240f565b6107f1565b60405161028e91906124b1565b3480156102f257600080fd5b506103066103013660046122ba565b61083d565b005b34801561031457600080fd5b5061030661032336600461240f565b6108d5565b34801561033457600080fd5b506103066103433660046123c9565b61094e565b34801561035457600080fd5b5061030661036336600461240f565b6109a4565b34801561037457600080fd5b5061037d610a1a565b60405161028e9190612bda565b34801561039657600080fd5b506103066103a536600461240f565b610a20565b3480156103b657600080fd5b506103066103c53660046121cc565b610a96565b3480156103d657600080fd5b506102ac610ace565b3480156103eb57600080fd5b5061037d6103fa3660046122ba565b610b5c565b34801561040b57600080fd5b5061030661041a36600461240f565b610bae565b34801561042b57600080fd5b5061030661043a3660046121cc565b610c24565b34801561044b57600080fd5b5061037d61045a36600461240f565b610c3f565b34801561046b57600080fd5b5061030661047a3660046123c9565b610c9a565b34801561048b57600080fd5b5061030661049a36600461240f565b610cec565b3480156104ab57600080fd5b506102d96104ba36600461240f565b610d62565b3480156104cb57600080fd5b506102ac610d97565b6103066104e2366004612427565b610da4565b3480156104f357600080fd5b5061037d610502366004612180565b610eaa565b34801561051357600080fd5b50610306610eee565b34801561052857600080fd5b506103066105373660046122e3565b610f39565b34801561054857600080fd5b50610281610557366004612180565b611012565b34801561056857600080fd5b50610306611027565b34801561057d57600080fd5b506102d961107a565b34801561059257600080fd5b50610306611089565b3480156105a757600080fd5b506103066105b636600461240f565b611104565b3480156105c757600080fd5b506102ac611148565b3480156105dc57600080fd5b5061037d611157565b3480156105f157600080fd5b506103066106003660046122e3565b61115d565b61030661061336600461240f565b611212565b34801561062457600080fd5b50610306610633366004612280565b6112d2565b34801561064457600080fd5b50610306610653366004612207565b6113a0565b34801561066457600080fd5b506103066113df565b34801561067957600080fd5b5061030661068836600461240f565b611450565b34801561069957600080fd5b506103066106a836600461240f565b6114c6565b3480156106b957600080fd5b506102ac6106c836600461240f565b61153c565b3480156106d957600080fd5b5061037d6115bf565b3480156106ee57600080fd5b5061037d6115c5565b34801561070357600080fd5b5061028161071236600461219a565b6115cb565b34801561072357600080fd5b506103066115f9565b34801561073857600080fd5b50610306610747366004612180565b6116a5565b600061075782611713565b90505b919050565b60606000805461076e90612c9b565b80601f016020809104026020016040519081016040528092919081815260200182805461079a90612c9b565b80156107e75780601f106107bc576101008083540402835291602001916107e7565b820191906000526020600020905b8154815290600101906020018083116107ca57829003601f168201915b5050505050905090565b60006107fc82611738565b6108215760405162461bcd60e51b815260040161081890612943565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061084882610d62565b9050806001600160a01b0316836001600160a01b0316141561087c5760405162461bcd60e51b815260040161081890612a5c565b806001600160a01b031661088e611755565b6001600160a01b031614806108aa57506108aa81610712611755565b6108c65760405162461bcd60e51b8152600401610818906127e7565b6108d08383611759565b505050565b6108dd611755565b6001600160a01b03166108ee61107a565b6001600160a01b0316146109145760405162461bcd60e51b81526004016108189061298f565b6011819055601c546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061094b57600080fd5b50565b610956611755565b6001600160a01b031661096761107a565b6001600160a01b03161461098d5760405162461bcd60e51b81526004016108189061298f565b80516109a0906012906020840190612078565b5050565b6109ac611755565b6001600160a01b03166109bd61107a565b6001600160a01b0316146109e35760405162461bcd60e51b81526004016108189061298f565b6011819055601a546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061094b57600080fd5b60085490565b610a28611755565b6001600160a01b0316610a3961107a565b6001600160a01b031614610a5f5760405162461bcd60e51b81526004016108189061298f565b6011819055601d546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061094b57600080fd5b610aa7610aa1611755565b826117c7565b610ac35760405162461bcd60e51b815260040161081890612b10565b6108d083838361184c565b60128054610adb90612c9b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0790612c9b565b8015610b545780601f10610b2957610100808354040283529160200191610b54565b820191906000526020600020905b815481529060010190602001808311610b3757829003601f168201915b505050505081565b6000610b6783610eaa565b8210610b855760405162461bcd60e51b815260040161081890612561565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610bb6611755565b6001600160a01b0316610bc761107a565b6001600160a01b031614610bed5760405162461bcd60e51b81526004016108189061298f565b6011819055601b546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061094b57600080fd5b6108d0838383604051806020016040528060008152506113a0565b6000610c49610a1a565b8210610c675760405162461bcd60e51b815260040161081890612b61565b60088281548110610c8857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b610ca2611755565b6001600160a01b0316610cb361107a565b6001600160a01b031614610cd95760405162461bcd60e51b81526004016108189061298f565b80516109a0906015906020840190612078565b610cf4611755565b6001600160a01b0316610d0561107a565b6001600160a01b031614610d2b5760405162461bcd60e51b81526004016108189061298f565b60118190556019546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061094b57600080fd5b6000818152600260205260408120546001600160a01b0316806107575760405162461bcd60e51b81526004016108189061288e565b60158054610adb90612c9b565b3360009081526016602052604090205460ff16610dd35760405162461bcd60e51b81526004016108189061290c565b6000610ddd610a1a565b601454909150610100900460ff16610df457600080fd5b600d548260ff161115610e195760405162461bcd60e51b815260040161081890612520565b601054610e298260ff8516611979565b1115610e475760405162461bcd60e51b81526004016108189061272d565b34600b548360ff16610e599190612c39565b1115610e775760405162461bcd60e51b815260040161081890612bad565b60005b8260ff168110156108d057610e9833610e938385612c0d565b611985565b80610ea281612cd6565b915050610e7a565b60006001600160a01b038216610ed25760405162461bcd60e51b815260040161081890612844565b506001600160a01b031660009081526003602052604090205490565b610ef6611755565b6001600160a01b0316610f0761107a565b6001600160a01b031614610f2d5760405162461bcd60e51b81526004016108189061298f565b610f37600061199f565b565b610f41611755565b6001600160a01b0316610f5261107a565b6001600160a01b031614610f785760405162461bcd60e51b81526004016108189061298f565b8051600f54811115610f9c5760405162461bcd60e51b815260040161081890612acd565b6000610fa6610a1a565b905060005b82811015610ffc57610fea848281518110610fd657634e487b7160e01b600052603260045260246000fd5b60200260200101518284610e939190612c0d565b80610ff481612cd6565b915050610fab565b50600f5461100a90836119f1565b600f55505050565b60166020526000908152604090205460ff1681565b61102f611755565b6001600160a01b031661104061107a565b6001600160a01b0316146110665760405162461bcd60e51b81526004016108189061298f565b6014805460ff19811660ff90911615179055565b600a546001600160a01b031690565b611091611755565b6001600160a01b03166110a261107a565b6001600160a01b0316146110c85760405162461bcd60e51b81526004016108189061298f565b6014805460ff610100808304821615810261ff0019909316929092179283905591041680156110f75750601354155b15610f3757610f376115f9565b61110c611755565b6001600160a01b031661111d61107a565b6001600160a01b0316146111435760405162461bcd60e51b81526004016108189061298f565b600c55565b60606001805461076e90612c9b565b600c5490565b611165611755565b6001600160a01b031661117661107a565b6001600160a01b03161461119c5760405162461bcd60e51b81526004016108189061298f565b60005b81518110156109a0576001601660008484815181106111ce57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061120a81612cd6565b91505061119f565b60145460ff1661122157600080fd5b600061122b610a1a565b9050600e5482111561124f5760405162461bcd60e51b81526004016108189061267b565b611a0a61125c8284611979565b111561127a5760405162461bcd60e51b815260040161081890612a9d565b34600c54836112899190612c39565b11156112a75760405162461bcd60e51b815260040161081890612bad565b60005b828110156108d0576112c033610e938385612c0d565b806112ca81612cd6565b9150506112aa565b6112da611755565b6001600160a01b0316826001600160a01b0316141561130b5760405162461bcd60e51b8152600401610818906126f6565b8060056000611318611755565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561135c611755565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113949190612502565b60405180910390a35050565b6113b16113ab611755565b836117c7565b6113cd5760405162461bcd60e51b815260040161081890612b10565b6113d9848484846119fd565b50505050565b6113e7611755565b6001600160a01b03166113f861107a565b6001600160a01b03161461141e5760405162461bcd60e51b81526004016108189061298f565b60175460405147916001600160a01b03169082156108fc029083906000818181858888f1935050505061094b57600080fd5b611458611755565b6001600160a01b031661146961107a565b6001600160a01b03161461148f5760405162461bcd60e51b81526004016108189061298f565b60118190556018546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061094b57600080fd5b6114ce611755565b6001600160a01b03166114df61107a565b6001600160a01b0316146115055760405162461bcd60e51b81526004016108189061298f565b60118190556017546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061094b57600080fd5b606061154782611738565b6115635760405162461bcd60e51b815260040161081890612a0d565b600061156d611a30565b9050600081511161158d57604051806020016040528060008152506115b8565b8061159784611a3f565b6040516020016115a8929190612474565b6040516020818303038152906040525b9392505050565b60135481565b611a0a81565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b601354156116195760405162461bcd60e51b8152600401610818906127b0565b6000444260405160200161162e9291906124a3565b60408051601f198184030181529190528051602090910120905061165360ff82612cf1565b61165e906001612c0d565b90508043101561166c575060015b60006116788243612c58565b9050611687611a0a8240612cf1565b60138190556109a05760135461169e906001612c0d565b6013555050565b6116ad611755565b6001600160a01b03166116be61107a565b6001600160a01b0316146116e45760405162461bcd60e51b81526004016108189061298f565b6001600160a01b03811661170a5760405162461bcd60e51b8152600401610818906125fe565b61094b8161199f565b60006001600160e01b0319821663780e9d6360e01b1480610757575061075782611b5a565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061178e82610d62565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117d282611738565b6117ee5760405162461bcd60e51b815260040161081890612764565b60006117f983610d62565b9050806001600160a01b0316846001600160a01b031614806118345750836001600160a01b0316611829846107f1565b6001600160a01b0316145b80611844575061184481856115cb565b949350505050565b826001600160a01b031661185f82610d62565b6001600160a01b0316146118855760405162461bcd60e51b8152600401610818906129c4565b6001600160a01b0382166118ab5760405162461bcd60e51b8152600401610818906126b2565b6118b6838383611b9a565b6118c1600082611759565b6001600160a01b03831660009081526003602052604081208054600192906118ea908490612c58565b90915550506001600160a01b0382166000908152600360205260408120805460019290611918908490612c0d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006115b88284612c0d565b6109a0828260405180602001604052806000815250611ba5565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006115b88284612c58565b611a0884848461184c565b611a1484848484611bd8565b6113d95760405162461bcd60e51b8152600401610818906125ac565b60606015805461076e90612c9b565b606081611a6457506040805180820190915260018152600360fc1b602082015261075a565b8160005b8115611a8e5780611a7881612cd6565b9150611a879050600a83612c25565b9150611a68565b60008167ffffffffffffffff811115611ab757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ae1576020820181803683370190505b5090505b841561184457611af6600183612c58565b9150611b03600a86612cf1565b611b0e906030612c0d565b60f81b818381518110611b3157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611b53600a86612c25565b9450611ae5565b60006001600160e01b031982166380ac58cd60e01b1480611b8b57506001600160e01b03198216635b5e139f60e01b145b80610757575061075782611cf3565b6108d0838383611d0c565b611baf8383611d95565b611bbc6000848484611bd8565b6108d05760405162461bcd60e51b8152600401610818906125ac565b6000611bec846001600160a01b0316611e74565b15611ce857836001600160a01b031663150b7a02611c08611755565b8786866040518563ffffffff1660e01b8152600401611c2a94939291906124c5565b602060405180830381600087803b158015611c4457600080fd5b505af1925050508015611c74575060408051601f3d908101601f19168201909252611c71918101906123ad565b60015b611cce573d808015611ca2576040519150601f19603f3d011682016040523d82523d6000602084013e611ca7565b606091505b508051611cc65760405162461bcd60e51b8152600401610818906125ac565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611844565b506001949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b611d178383836108d0565b6001600160a01b038316611d3357611d2e81611e7a565b611d56565b816001600160a01b0316836001600160a01b031614611d5657611d568382611ebe565b6001600160a01b038216611d7257611d6d81611f5b565b6108d0565b826001600160a01b0316826001600160a01b0316146108d0576108d08282612034565b6001600160a01b038216611dbb5760405162461bcd60e51b8152600401610818906128d7565b611dc481611738565b15611de15760405162461bcd60e51b815260040161081890612644565b611ded60008383611b9a565b6001600160a01b0382166000908152600360205260408120805460019290611e16908490612c0d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001611ecb84610eaa565b611ed59190612c58565b600083815260076020526040902054909150808214611f28576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611f6d90600190612c58565b60008381526009602052604081205460088054939450909284908110611fa357634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110611fd257634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061201857634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061203f83610eaa565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461208490612c9b565b90600052602060002090601f0160209004810192826120a657600085556120ec565b82601f106120bf57805160ff19168380011785556120ec565b828001600101855582156120ec579182015b828111156120ec5782518255916020019190600101906120d1565b506120f89291506120fc565b5090565b5b808211156120f857600081556001016120fd565b600067ffffffffffffffff83111561212b5761212b612d31565b61213e601f8401601f1916602001612be3565b905082815283838301111561215257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461075a57600080fd5b600060208284031215612191578081fd5b6115b882612169565b600080604083850312156121ac578081fd5b6121b583612169565b91506121c360208401612169565b90509250929050565b6000806000606084860312156121e0578081fd5b6121e984612169565b92506121f760208501612169565b9150604084013590509250925092565b6000806000806080858703121561221c578081fd5b61222585612169565b935061223360208601612169565b925060408501359150606085013567ffffffffffffffff811115612255578182fd5b8501601f81018713612265578182fd5b61227487823560208401612111565b91505092959194509250565b60008060408385031215612292578182fd5b61229b83612169565b9150602083013580151581146122af578182fd5b809150509250929050565b600080604083850312156122cc578182fd5b6122d583612169565b946020939093013593505050565b600060208083850312156122f5578182fd5b823567ffffffffffffffff8082111561230c578384fd5b818501915085601f83011261231f578384fd5b81358181111561233157612331612d31565b8381029150612341848301612be3565b8181528481019084860184860187018a101561235b578788fd5b8795505b838610156123845761237081612169565b83526001959095019491860191860161235f565b5098975050505050505050565b6000602082840312156123a2578081fd5b81356115b881612d47565b6000602082840312156123be578081fd5b81516115b881612d47565b6000602082840312156123da578081fd5b813567ffffffffffffffff8111156123f0578182fd5b8201601f81018413612400578182fd5b61184484823560208401612111565b600060208284031215612420578081fd5b5035919050565b600060208284031215612438578081fd5b813560ff811681146115b8578182fd5b60008151808452612460816020860160208601612c6f565b601f01601f19169290920160200192915050565b60008351612486818460208801612c6f565b83519083019061249a818360208801612c6f565b01949350505050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124f890830184612448565b9695505050505050565b901515815260200190565b6000602082526115b86020830184612448565b60208082526021908201527f596f752063616e206f6e6c79206d696e74206f6e6520696e2070726573616c656040820152602160f81b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601d908201527f596f752063616e6e6f74206d696e74206d6f7265207468616e20313021000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601b908201527f456e6f75676820546f6b656e7320617265206e6f74206c656674210000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601d908201527f5374617274696e6720696e64657820697320616c726561647920736574000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252601c908201527f596f75277265206e6f74206f6e207468652077686974656c6973742100000000604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526016908201527545786365656420746865206d617820737570706c792160501b604082015260600190565b60208082526023908201527f5468617420776f756c642065786365656420746865206d61782072657365727660408201526232b21760e91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b602080825260139082015272416d6f756e742073656e74206973206c65737360681b604082015260600190565b90815260200190565b60405181810167ffffffffffffffff81118282101715612c0557612c05612d31565b604052919050565b60008219821115612c2057612c20612d05565b500190565b600082612c3457612c34612d1b565b500490565b6000816000190483118215151615612c5357612c53612d05565b500290565b600082821015612c6a57612c6a612d05565b500390565b60005b83811015612c8a578181015183820152602001612c72565b838111156113d95750506000910152565b600281046001821680612caf57607f821691505b60208210811415612cd057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612cea57612cea612d05565b5060010190565b600082612d0057612d00612d1b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461094b57600080fdfea26469706673582212207c850fa7712f07bbb0b01830abb7af03d7d22d4c74e73a6db207f1f877071dab64736f6c63430008000033

Deployed Bytecode

0x60806040526004361061025c5760003560e01c8063715018a611610144578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd146106ad578063cb774d47146106cd578063d5abeb01146106e2578063e985e9c5146106f7578063e986655014610717578063f2fde38b1461072c5761025c565b8063a22cb46514610618578063b88d4fde14610638578063b9b3722414610658578063be2531241461066d578063be3197521461068d5761025c565b80638fef8ecc116101085780638fef8ecc1461058657806391b7f5ed1461059b57806395d89b41146105bb57806398d5fdca146105d05780639c791e99146105e5578063a0712d68146106055761025c565b8063715018a61461050757806377fb63f11461051c578063809e993b1461053c578063899d7b381461055c5780638da5cb5b146105715761025c565b806325914b71116101dd57806355f804b3116101a157806355f804b31461045f5780635f4b9a731461047f5780636352211e1461049f5780636c0360eb146104bf5780636d9f8ef1146104d457806370a08231146104e75761025c565b806325914b71146103ca5780632f745c59146103df57806340510c80146103ff57806342842e0e1461041f5780634f6ccce71461043f5761025c565b806310969523116102245780631096952314610328578063137b05621461034857806318160ddd14610368578063212a97eb1461038a57806323b872dd146103aa5761025c565b806301ffc9a71461026157806306fdde0314610297578063081812fc146102b9578063095ea7b3146102e65780630baf488414610308575b600080fd5b34801561026d57600080fd5b5061028161027c366004612391565b61074c565b60405161028e9190612502565b60405180910390f35b3480156102a357600080fd5b506102ac61075f565b60405161028e919061250d565b3480156102c557600080fd5b506102d96102d436600461240f565b6107f1565b60405161028e91906124b1565b3480156102f257600080fd5b506103066103013660046122ba565b61083d565b005b34801561031457600080fd5b5061030661032336600461240f565b6108d5565b34801561033457600080fd5b506103066103433660046123c9565b61094e565b34801561035457600080fd5b5061030661036336600461240f565b6109a4565b34801561037457600080fd5b5061037d610a1a565b60405161028e9190612bda565b34801561039657600080fd5b506103066103a536600461240f565b610a20565b3480156103b657600080fd5b506103066103c53660046121cc565b610a96565b3480156103d657600080fd5b506102ac610ace565b3480156103eb57600080fd5b5061037d6103fa3660046122ba565b610b5c565b34801561040b57600080fd5b5061030661041a36600461240f565b610bae565b34801561042b57600080fd5b5061030661043a3660046121cc565b610c24565b34801561044b57600080fd5b5061037d61045a36600461240f565b610c3f565b34801561046b57600080fd5b5061030661047a3660046123c9565b610c9a565b34801561048b57600080fd5b5061030661049a36600461240f565b610cec565b3480156104ab57600080fd5b506102d96104ba36600461240f565b610d62565b3480156104cb57600080fd5b506102ac610d97565b6103066104e2366004612427565b610da4565b3480156104f357600080fd5b5061037d610502366004612180565b610eaa565b34801561051357600080fd5b50610306610eee565b34801561052857600080fd5b506103066105373660046122e3565b610f39565b34801561054857600080fd5b50610281610557366004612180565b611012565b34801561056857600080fd5b50610306611027565b34801561057d57600080fd5b506102d961107a565b34801561059257600080fd5b50610306611089565b3480156105a757600080fd5b506103066105b636600461240f565b611104565b3480156105c757600080fd5b506102ac611148565b3480156105dc57600080fd5b5061037d611157565b3480156105f157600080fd5b506103066106003660046122e3565b61115d565b61030661061336600461240f565b611212565b34801561062457600080fd5b50610306610633366004612280565b6112d2565b34801561064457600080fd5b50610306610653366004612207565b6113a0565b34801561066457600080fd5b506103066113df565b34801561067957600080fd5b5061030661068836600461240f565b611450565b34801561069957600080fd5b506103066106a836600461240f565b6114c6565b3480156106b957600080fd5b506102ac6106c836600461240f565b61153c565b3480156106d957600080fd5b5061037d6115bf565b3480156106ee57600080fd5b5061037d6115c5565b34801561070357600080fd5b5061028161071236600461219a565b6115cb565b34801561072357600080fd5b506103066115f9565b34801561073857600080fd5b50610306610747366004612180565b6116a5565b600061075782611713565b90505b919050565b60606000805461076e90612c9b565b80601f016020809104026020016040519081016040528092919081815260200182805461079a90612c9b565b80156107e75780601f106107bc576101008083540402835291602001916107e7565b820191906000526020600020905b8154815290600101906020018083116107ca57829003601f168201915b5050505050905090565b60006107fc82611738565b6108215760405162461bcd60e51b815260040161081890612943565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061084882610d62565b9050806001600160a01b0316836001600160a01b0316141561087c5760405162461bcd60e51b815260040161081890612a5c565b806001600160a01b031661088e611755565b6001600160a01b031614806108aa57506108aa81610712611755565b6108c65760405162461bcd60e51b8152600401610818906127e7565b6108d08383611759565b505050565b6108dd611755565b6001600160a01b03166108ee61107a565b6001600160a01b0316146109145760405162461bcd60e51b81526004016108189061298f565b6011819055601c546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061094b57600080fd5b50565b610956611755565b6001600160a01b031661096761107a565b6001600160a01b03161461098d5760405162461bcd60e51b81526004016108189061298f565b80516109a0906012906020840190612078565b5050565b6109ac611755565b6001600160a01b03166109bd61107a565b6001600160a01b0316146109e35760405162461bcd60e51b81526004016108189061298f565b6011819055601a546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061094b57600080fd5b60085490565b610a28611755565b6001600160a01b0316610a3961107a565b6001600160a01b031614610a5f5760405162461bcd60e51b81526004016108189061298f565b6011819055601d546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061094b57600080fd5b610aa7610aa1611755565b826117c7565b610ac35760405162461bcd60e51b815260040161081890612b10565b6108d083838361184c565b60128054610adb90612c9b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0790612c9b565b8015610b545780601f10610b2957610100808354040283529160200191610b54565b820191906000526020600020905b815481529060010190602001808311610b3757829003601f168201915b505050505081565b6000610b6783610eaa565b8210610b855760405162461bcd60e51b815260040161081890612561565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610bb6611755565b6001600160a01b0316610bc761107a565b6001600160a01b031614610bed5760405162461bcd60e51b81526004016108189061298f565b6011819055601b546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061094b57600080fd5b6108d0838383604051806020016040528060008152506113a0565b6000610c49610a1a565b8210610c675760405162461bcd60e51b815260040161081890612b61565b60088281548110610c8857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b610ca2611755565b6001600160a01b0316610cb361107a565b6001600160a01b031614610cd95760405162461bcd60e51b81526004016108189061298f565b80516109a0906015906020840190612078565b610cf4611755565b6001600160a01b0316610d0561107a565b6001600160a01b031614610d2b5760405162461bcd60e51b81526004016108189061298f565b60118190556019546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061094b57600080fd5b6000818152600260205260408120546001600160a01b0316806107575760405162461bcd60e51b81526004016108189061288e565b60158054610adb90612c9b565b3360009081526016602052604090205460ff16610dd35760405162461bcd60e51b81526004016108189061290c565b6000610ddd610a1a565b601454909150610100900460ff16610df457600080fd5b600d548260ff161115610e195760405162461bcd60e51b815260040161081890612520565b601054610e298260ff8516611979565b1115610e475760405162461bcd60e51b81526004016108189061272d565b34600b548360ff16610e599190612c39565b1115610e775760405162461bcd60e51b815260040161081890612bad565b60005b8260ff168110156108d057610e9833610e938385612c0d565b611985565b80610ea281612cd6565b915050610e7a565b60006001600160a01b038216610ed25760405162461bcd60e51b815260040161081890612844565b506001600160a01b031660009081526003602052604090205490565b610ef6611755565b6001600160a01b0316610f0761107a565b6001600160a01b031614610f2d5760405162461bcd60e51b81526004016108189061298f565b610f37600061199f565b565b610f41611755565b6001600160a01b0316610f5261107a565b6001600160a01b031614610f785760405162461bcd60e51b81526004016108189061298f565b8051600f54811115610f9c5760405162461bcd60e51b815260040161081890612acd565b6000610fa6610a1a565b905060005b82811015610ffc57610fea848281518110610fd657634e487b7160e01b600052603260045260246000fd5b60200260200101518284610e939190612c0d565b80610ff481612cd6565b915050610fab565b50600f5461100a90836119f1565b600f55505050565b60166020526000908152604090205460ff1681565b61102f611755565b6001600160a01b031661104061107a565b6001600160a01b0316146110665760405162461bcd60e51b81526004016108189061298f565b6014805460ff19811660ff90911615179055565b600a546001600160a01b031690565b611091611755565b6001600160a01b03166110a261107a565b6001600160a01b0316146110c85760405162461bcd60e51b81526004016108189061298f565b6014805460ff610100808304821615810261ff0019909316929092179283905591041680156110f75750601354155b15610f3757610f376115f9565b61110c611755565b6001600160a01b031661111d61107a565b6001600160a01b0316146111435760405162461bcd60e51b81526004016108189061298f565b600c55565b60606001805461076e90612c9b565b600c5490565b611165611755565b6001600160a01b031661117661107a565b6001600160a01b03161461119c5760405162461bcd60e51b81526004016108189061298f565b60005b81518110156109a0576001601660008484815181106111ce57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061120a81612cd6565b91505061119f565b60145460ff1661122157600080fd5b600061122b610a1a565b9050600e5482111561124f5760405162461bcd60e51b81526004016108189061267b565b611a0a61125c8284611979565b111561127a5760405162461bcd60e51b815260040161081890612a9d565b34600c54836112899190612c39565b11156112a75760405162461bcd60e51b815260040161081890612bad565b60005b828110156108d0576112c033610e938385612c0d565b806112ca81612cd6565b9150506112aa565b6112da611755565b6001600160a01b0316826001600160a01b0316141561130b5760405162461bcd60e51b8152600401610818906126f6565b8060056000611318611755565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561135c611755565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113949190612502565b60405180910390a35050565b6113b16113ab611755565b836117c7565b6113cd5760405162461bcd60e51b815260040161081890612b10565b6113d9848484846119fd565b50505050565b6113e7611755565b6001600160a01b03166113f861107a565b6001600160a01b03161461141e5760405162461bcd60e51b81526004016108189061298f565b60175460405147916001600160a01b03169082156108fc029083906000818181858888f1935050505061094b57600080fd5b611458611755565b6001600160a01b031661146961107a565b6001600160a01b03161461148f5760405162461bcd60e51b81526004016108189061298f565b60118190556018546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061094b57600080fd5b6114ce611755565b6001600160a01b03166114df61107a565b6001600160a01b0316146115055760405162461bcd60e51b81526004016108189061298f565b60118190556017546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505061094b57600080fd5b606061154782611738565b6115635760405162461bcd60e51b815260040161081890612a0d565b600061156d611a30565b9050600081511161158d57604051806020016040528060008152506115b8565b8061159784611a3f565b6040516020016115a8929190612474565b6040516020818303038152906040525b9392505050565b60135481565b611a0a81565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b601354156116195760405162461bcd60e51b8152600401610818906127b0565b6000444260405160200161162e9291906124a3565b60408051601f198184030181529190528051602090910120905061165360ff82612cf1565b61165e906001612c0d565b90508043101561166c575060015b60006116788243612c58565b9050611687611a0a8240612cf1565b60138190556109a05760135461169e906001612c0d565b6013555050565b6116ad611755565b6001600160a01b03166116be61107a565b6001600160a01b0316146116e45760405162461bcd60e51b81526004016108189061298f565b6001600160a01b03811661170a5760405162461bcd60e51b8152600401610818906125fe565b61094b8161199f565b60006001600160e01b0319821663780e9d6360e01b1480610757575061075782611b5a565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061178e82610d62565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117d282611738565b6117ee5760405162461bcd60e51b815260040161081890612764565b60006117f983610d62565b9050806001600160a01b0316846001600160a01b031614806118345750836001600160a01b0316611829846107f1565b6001600160a01b0316145b80611844575061184481856115cb565b949350505050565b826001600160a01b031661185f82610d62565b6001600160a01b0316146118855760405162461bcd60e51b8152600401610818906129c4565b6001600160a01b0382166118ab5760405162461bcd60e51b8152600401610818906126b2565b6118b6838383611b9a565b6118c1600082611759565b6001600160a01b03831660009081526003602052604081208054600192906118ea908490612c58565b90915550506001600160a01b0382166000908152600360205260408120805460019290611918908490612c0d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006115b88284612c0d565b6109a0828260405180602001604052806000815250611ba5565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006115b88284612c58565b611a0884848461184c565b611a1484848484611bd8565b6113d95760405162461bcd60e51b8152600401610818906125ac565b60606015805461076e90612c9b565b606081611a6457506040805180820190915260018152600360fc1b602082015261075a565b8160005b8115611a8e5780611a7881612cd6565b9150611a879050600a83612c25565b9150611a68565b60008167ffffffffffffffff811115611ab757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611ae1576020820181803683370190505b5090505b841561184457611af6600183612c58565b9150611b03600a86612cf1565b611b0e906030612c0d565b60f81b818381518110611b3157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611b53600a86612c25565b9450611ae5565b60006001600160e01b031982166380ac58cd60e01b1480611b8b57506001600160e01b03198216635b5e139f60e01b145b80610757575061075782611cf3565b6108d0838383611d0c565b611baf8383611d95565b611bbc6000848484611bd8565b6108d05760405162461bcd60e51b8152600401610818906125ac565b6000611bec846001600160a01b0316611e74565b15611ce857836001600160a01b031663150b7a02611c08611755565b8786866040518563ffffffff1660e01b8152600401611c2a94939291906124c5565b602060405180830381600087803b158015611c4457600080fd5b505af1925050508015611c74575060408051601f3d908101601f19168201909252611c71918101906123ad565b60015b611cce573d808015611ca2576040519150601f19603f3d011682016040523d82523d6000602084013e611ca7565b606091505b508051611cc65760405162461bcd60e51b8152600401610818906125ac565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611844565b506001949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b611d178383836108d0565b6001600160a01b038316611d3357611d2e81611e7a565b611d56565b816001600160a01b0316836001600160a01b031614611d5657611d568382611ebe565b6001600160a01b038216611d7257611d6d81611f5b565b6108d0565b826001600160a01b0316826001600160a01b0316146108d0576108d08282612034565b6001600160a01b038216611dbb5760405162461bcd60e51b8152600401610818906128d7565b611dc481611738565b15611de15760405162461bcd60e51b815260040161081890612644565b611ded60008383611b9a565b6001600160a01b0382166000908152600360205260408120805460019290611e16908490612c0d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001611ecb84610eaa565b611ed59190612c58565b600083815260076020526040902054909150808214611f28576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611f6d90600190612c58565b60008381526009602052604081205460088054939450909284908110611fa357634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110611fd257634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061201857634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061203f83610eaa565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461208490612c9b565b90600052602060002090601f0160209004810192826120a657600085556120ec565b82601f106120bf57805160ff19168380011785556120ec565b828001600101855582156120ec579182015b828111156120ec5782518255916020019190600101906120d1565b506120f89291506120fc565b5090565b5b808211156120f857600081556001016120fd565b600067ffffffffffffffff83111561212b5761212b612d31565b61213e601f8401601f1916602001612be3565b905082815283838301111561215257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461075a57600080fd5b600060208284031215612191578081fd5b6115b882612169565b600080604083850312156121ac578081fd5b6121b583612169565b91506121c360208401612169565b90509250929050565b6000806000606084860312156121e0578081fd5b6121e984612169565b92506121f760208501612169565b9150604084013590509250925092565b6000806000806080858703121561221c578081fd5b61222585612169565b935061223360208601612169565b925060408501359150606085013567ffffffffffffffff811115612255578182fd5b8501601f81018713612265578182fd5b61227487823560208401612111565b91505092959194509250565b60008060408385031215612292578182fd5b61229b83612169565b9150602083013580151581146122af578182fd5b809150509250929050565b600080604083850312156122cc578182fd5b6122d583612169565b946020939093013593505050565b600060208083850312156122f5578182fd5b823567ffffffffffffffff8082111561230c578384fd5b818501915085601f83011261231f578384fd5b81358181111561233157612331612d31565b8381029150612341848301612be3565b8181528481019084860184860187018a101561235b578788fd5b8795505b838610156123845761237081612169565b83526001959095019491860191860161235f565b5098975050505050505050565b6000602082840312156123a2578081fd5b81356115b881612d47565b6000602082840312156123be578081fd5b81516115b881612d47565b6000602082840312156123da578081fd5b813567ffffffffffffffff8111156123f0578182fd5b8201601f81018413612400578182fd5b61184484823560208401612111565b600060208284031215612420578081fd5b5035919050565b600060208284031215612438578081fd5b813560ff811681146115b8578182fd5b60008151808452612460816020860160208601612c6f565b601f01601f19169290920160200192915050565b60008351612486818460208801612c6f565b83519083019061249a818360208801612c6f565b01949350505050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124f890830184612448565b9695505050505050565b901515815260200190565b6000602082526115b86020830184612448565b60208082526021908201527f596f752063616e206f6e6c79206d696e74206f6e6520696e2070726573616c656040820152602160f81b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601d908201527f596f752063616e6e6f74206d696e74206d6f7265207468616e20313021000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601b908201527f456e6f75676820546f6b656e7320617265206e6f74206c656674210000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601d908201527f5374617274696e6720696e64657820697320616c726561647920736574000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252601c908201527f596f75277265206e6f74206f6e207468652077686974656c6973742100000000604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526016908201527545786365656420746865206d617820737570706c792160501b604082015260600190565b60208082526023908201527f5468617420776f756c642065786365656420746865206d61782072657365727660408201526232b21760e91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b602080825260139082015272416d6f756e742073656e74206973206c65737360681b604082015260600190565b90815260200190565b60405181810167ffffffffffffffff81118282101715612c0557612c05612d31565b604052919050565b60008219821115612c2057612c20612d05565b500190565b600082612c3457612c34612d1b565b500490565b6000816000190483118215151615612c5357612c53612d05565b500290565b600082821015612c6a57612c6a612d05565b500390565b60005b83811015612c8a578181015183820152602001612c72565b838111156113d95750506000910152565b600281046001821680612caf57607f821691505b60208210811415612cd057634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612cea57612cea612d05565b5060010190565b600082612d0057612d00612d1b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461094b57600080fdfea26469706673582212207c850fa7712f07bbb0b01830abb7af03d7d22d4c74e73a6db207f1f877071dab64736f6c63430008000033

Deployed Bytecode Sourcemap

49110:6476:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55371:212;;;;;;;;;;-1:-1:-1;55371:212:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11055:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;12614:221::-;;;;;;;;;;-1:-1:-1;12614:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12137:411::-;;;;;;;;;;-1:-1:-1;12137:411:0;;;;;:::i;:::-;;:::i;:::-;;54877:129;;;;;;;;;;-1:-1:-1;54877:129:0;;;;;:::i;:::-;;:::i;52717:123::-;;;;;;;;;;-1:-1:-1;52717:123:0;;;;;:::i;:::-;;:::i;54595:129::-;;;;;;;;;;-1:-1:-1;54595:129:0;;;;;:::i;:::-;;:::i;23722:113::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;55018:129::-;;;;;;;;;;-1:-1:-1;55018:129:0;;;;;:::i;:::-;;:::i;13504:339::-;;;;;;;;;;-1:-1:-1;13504:339:0;;;;;:::i;:::-;;:::i;49560:32::-;;;;;;;;;;;;;:::i;23390:256::-;;;;;;;;;;-1:-1:-1;23390:256:0;;;;;:::i;:::-;;:::i;54736:129::-;;;;;;;;;;-1:-1:-1;54736:129:0;;;;;:::i;:::-;;:::i;13914:185::-;;;;;;;;;;-1:-1:-1;13914:185:0;;;;;:::i;:::-;;:::i;23912:233::-;;;;;;;;;;-1:-1:-1;23912:233:0;;;;;:::i;:::-;;:::i;50749:90::-;;;;;;;;;;-1:-1:-1;50749:90:0;;;;;:::i;:::-;;:::i;54454:129::-;;;;;;;;;;-1:-1:-1;54454:129:0;;;;;:::i;:::-;;:::i;10749:239::-;;;;;;;;;;-1:-1:-1;10749:239:0;;;;;:::i;:::-;;:::i;49703:21::-;;;;;;;;;;;;;:::i;51681:542::-;;;;;;:::i;:::-;;:::i;10479:208::-;;;;;;;;;;-1:-1:-1;10479:208:0;;;;;:::i;:::-;;:::i;48452:94::-;;;;;;;;;;;;;:::i;52848:380::-;;;;;;;;;;-1:-1:-1;52848:380:0;;;;;:::i;:::-;;:::i;49733:43::-;;;;;;;;;;-1:-1:-1;49733:43:0;;;;;:::i;:::-;;:::i;51576:91::-;;;;;;;;;;;;;:::i;47801:87::-;;;;;;;;;;;;;:::i;51365:199::-;;;;;;;;;;;;;:::i;50964:90::-;;;;;;;;;;-1:-1:-1;50964:90:0;;;;;:::i;:::-;;:::i;11224:104::-;;;;;;;;;;;;;:::i;51064:81::-;;;;;;;;;;;;;:::i;51163:192::-;;;;;;;;;;-1:-1:-1;51163:192:0;;;;;:::i;:::-;;:::i;52231:476::-;;;;;;:::i;:::-;;:::i;12907:295::-;;;;;;;;;;-1:-1:-1;12907:295:0;;;;;:::i;:::-;;:::i;14170:328::-;;;;;;;;;;-1:-1:-1;14170:328:0;;;;;:::i;:::-;;:::i;54010:144::-;;;;;;;;;;;;;:::i;54313:129::-;;;;;;;;;;-1:-1:-1;54313:129:0;;;;;:::i;:::-;;:::i;54172:::-;;;;;;;;;;-1:-1:-1;54172:129:0;;;;;:::i;:::-;;:::i;11399:334::-;;;;;;;;;;-1:-1:-1;11399:334:0;;;;;:::i;:::-;;:::i;49599:28::-;;;;;;;;;;;;;:::i;49221:40::-;;;;;;;;;;;;;:::i;13273:164::-;;;;;;;;;;-1:-1:-1;13273:164:0;;;;;:::i;:::-;;:::i;53236:756::-;;;;;;;;;;;;;:::i;48701:192::-;;;;;;;;;;-1:-1:-1;48701:192:0;;;;;:::i;:::-;;:::i;55371:212::-;55510:4;55539:36;55563:11;55539:23;:36::i;:::-;55532:43;;55371:212;;;;:::o;11055:100::-;11109:13;11142:5;11135:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11055:100;:::o;12614:221::-;12690:7;12718:16;12726:7;12718;:16::i;:::-;12710:73;;;;-1:-1:-1;;;12710:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;12803:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;12803:24:0;;12614:221::o;12137:411::-;12218:13;12234:23;12249:7;12234:14;:23::i;:::-;12218:39;;12282:5;-1:-1:-1;;;;;12276:11:0;:2;-1:-1:-1;;;;;12276:11:0;;;12268:57;;;;-1:-1:-1;;;12268:57:0;;;;;;;:::i;:::-;12376:5;-1:-1:-1;;;;;12360:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;12360:21:0;;:62;;;;12385:37;12402:5;12409:12;:10;:12::i;12385:37::-;12338:168;;;;-1:-1:-1;;;12338:168:0;;;;;;;:::i;:::-;12519:21;12528:2;12532:7;12519:8;:21::i;:::-;12137:411;;;:::o;54877:129::-;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;54940:6:::1;:14:::0;;;54981:2:::1;::::0;54973:24:::1;::::0;-1:-1:-1;;;;;54981:2:0;;::::1;::::0;54973:24;::::1;;;::::0;54949:5;;54981:2:::1;54973:24:::0;54981:2;54973:24;54949:5;54981:2;54973:24;::::1;;;;;;54965:33;;;::::0;::::1;;54877:129:::0;:::o;52717:123::-;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;52802:30;;::::1;::::0;:13:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;:::-;;52717:123:::0;:::o;54595:129::-;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;54658:6:::1;:14:::0;;;54699:2:::1;::::0;54691:24:::1;::::0;-1:-1:-1;;;;;54699:2:0;;::::1;::::0;54691:24;::::1;;;::::0;54667:5;;54699:2:::1;54691:24:::0;54699:2;54691:24;54667:5;54699:2;54691:24;::::1;;;;;;54683:33;;;::::0;::::1;23722:113:::0;23810:10;:17;23722:113;:::o;55018:129::-;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;55081:6:::1;:14:::0;;;55122:2:::1;::::0;55114:24:::1;::::0;-1:-1:-1;;;;;55122:2:0;;::::1;::::0;55114:24;::::1;;;::::0;55090:5;;55122:2:::1;55114:24:::0;55122:2;55114:24;55090:5;55122:2;55114:24;::::1;;;;;;55106:33;;;::::0;::::1;13504:339:::0;13699:41;13718:12;:10;:12::i;:::-;13732:7;13699:18;:41::i;:::-;13691:103;;;;-1:-1:-1;;;13691:103:0;;;;;;;:::i;:::-;13807:28;13817:4;13823:2;13827:7;13807:9;:28::i;49560:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23390:256::-;23487:7;23523:23;23540:5;23523:16;:23::i;:::-;23515:5;:31;23507:87;;;;-1:-1:-1;;;23507:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;23612:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;23390:256::o;54736:129::-;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;54799:6:::1;:14:::0;;;54840:2:::1;::::0;54832:24:::1;::::0;-1:-1:-1;;;;;54840:2:0;;::::1;::::0;54832:24;::::1;;;::::0;54808:5;;54840:2:::1;54832:24:::0;54840:2;54832:24;54808:5;54840:2;54832:24;::::1;;;;;;54824:33;;;::::0;::::1;13914:185:::0;14052:39;14069:4;14075:2;14079:7;14052:39;;;;;;;;;;;;:16;:39::i;23912:233::-;23987:7;24023:30;:28;:30::i;:::-;24015:5;:38;24007:95;;;;-1:-1:-1;;;24007:95:0;;;;;;;:::i;:::-;24120:10;24131:5;24120:17;;;;;;-1:-1:-1;;;24120:17:0;;;;;;;;;;;;;;;;;24113:24;;23912:233;;;:::o;50749:90::-;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;50818:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;54454:129::-:0;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;54517:6:::1;:14:::0;;;54558:2:::1;::::0;54550:24:::1;::::0;-1:-1:-1;;;;;54558:2:0;;::::1;::::0;54550:24;::::1;;;::::0;54526:5;;54558:2:::1;54550:24:::0;54558:2;54550:24;54526:5;54558:2;54550:24;::::1;;;;;;54542:33;;;::::0;::::1;10749:239:::0;10821:7;10857:16;;;:7;:16;;;;;;-1:-1:-1;;;;;10857:16:0;10892:19;10884:73;;;;-1:-1:-1;;;10884:73:0;;;;;;;:::i;49703:21::-;;;;;;;:::i;51681:542::-;50664:10;50652:23;;;;:11;:23;;;;;;;;50630:91;;;;-1:-1:-1;;;50630:91:0;;;;;;;:::i;:::-;51773:14:::1;51790:13;:11;:13::i;:::-;51822:14;::::0;51773:30;;-1:-1:-1;51822:14:0::1;::::0;::::1;;;51814:23;;;::::0;::::1;;51872:24;;51856:12;:40;;;;51848:85;;;;-1:-1:-1::0;;;51848:85:0::1;;;;;;;:::i;:::-;51983:10;::::0;51952:26:::1;:6:::0;:26:::1;::::0;::::1;:10;:26::i;:::-;:41;;51944:80;;;;-1:-1:-1::0;;;51944:80:0::1;;;;;;;:::i;:::-;52072:9;52056:12;;52043;:25;;;;;;:::i;:::-;:38;;52035:69;;;;-1:-1:-1::0;;;52035:69:0::1;;;;;;;:::i;:::-;52122:9;52117:99;52137:12;52133:16;;:1;:16;52117:99;;;52171:33;52181:10;52193;52202:1:::0;52193:6;:10:::1;:::i;:::-;52171:9;:33::i;:::-;52151:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52117:99;;10479:208:::0;10551:7;-1:-1:-1;;;;;10579:19:0;;10571:74;;;;-1:-1:-1;;;10571:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;10663:16:0;;;;;:9;:16;;;;;;;10479:208::o;48452:94::-;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;48517:21:::1;48535:1;48517:9;:21::i;:::-;48452:94::o:0;52848:380::-;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;52939:12;;52978:8:::1;::::0;52971:15;::::1;;52962:64;;;;-1:-1:-1::0;;;52962:64:0::1;;;;;;;:::i;:::-;53039:16;53058:13;:11;:13::i;:::-;53039:32;;53087:9;53082:95;53107:3;53103:1;:7;53082:95;;;53132:33;53142:5;53148:1;53142:8;;;;;;-1:-1:-1::0;;;53142:8:0::1;;;;;;;;;;;;;;;53163:1;53152:8;:12;;;;:::i;53132:33::-;53112:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53082:95;;;-1:-1:-1::0;53200:8:0::1;::::0;:19:::1;::::0;53214:3;53200:12:::1;:19::i;:::-;53189:8;:30:::0;-1:-1:-1;;;52848:380:0:o;49733:43::-;;;;;;;;;;;;;;;:::o;51576:91::-;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;51648:11:::1;::::0;;-1:-1:-1;;51633:26:0;::::1;51648:11;::::0;;::::1;51647:12;51633:26;::::0;;51576:91::o;47801:87::-;47874:6;;-1:-1:-1;;;;;47874:6:0;47801:87;:::o;51365:199::-;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;51443:14:::1;::::0;;::::1;;::::0;;::::1;::::0;::::1;51442:15;51425:32:::0;::::1;-1:-1:-1::0;;51425:32:0;;::::1;::::0;;;::::1;::::0;;;;51474:14;::::1;;:36:::0;::::1;;;-1:-1:-1::0;51492:13:0::1;::::0;:18;51474:36:::1;51470:87;;;51527:18;:16;:18::i;50964:90::-:0;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;51030:5:::1;:16:::0;50964:90::o;11224:104::-;11280:13;11313:7;11306:14;;;;;:::i;51064:81::-;51132:5;;51064:81;:::o;51163:192::-;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;51255:9:::1;51250:98;51274:5;:12;51270:1;:16;51250:98;;;51332:4;51308:11;:21;51320:5;51326:1;51320:8;;;;;;-1:-1:-1::0;;;51320:8:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;51308:21:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;51308:21:0;:28;;-1:-1:-1;;51308:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;51288:3;::::1;::::0;::::1;:::i;:::-;;;;51250:98;;52231:476:::0;50458:11;;;;50450:20;;;;;;52311:14:::1;52328:13;:11;:13::i;:::-;52311:30;;52376:17;;52360:12;:33;;52352:74;;;;-1:-1:-1::0;;;52352:74:0::1;;;;;;;:::i;:::-;49257:4;52445:26;:6:::0;52457:12;52445:10:::1;:26::i;:::-;:39;;52437:73;;;;-1:-1:-1::0;;;52437:73:0::1;;;;;;;:::i;:::-;52551:9;52542:5;;52529:12;:18;;;;:::i;:::-;:31;;52521:63;;;;-1:-1:-1::0;;;52521:63:0::1;;;;;;;:::i;:::-;52602:9;52597:103;52621:12;52617:1;:16;52597:103;;;52655:33;52665:10;52677;52686:1:::0;52677:6;:10:::1;:::i;52655:33::-;52635:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52597:103;;12907:295:::0;13022:12;:10;:12::i;:::-;-1:-1:-1;;;;;13010:24:0;:8;-1:-1:-1;;;;;13010:24:0;;;13002:62;;;;-1:-1:-1;;;13002:62:0;;;;;;;:::i;:::-;13122:8;13077:18;:32;13096:12;:10;:12::i;:::-;-1:-1:-1;;;;;13077:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;13077:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;13077:53:0;;;;;;;;;;;13161:12;:10;:12::i;:::-;-1:-1:-1;;;;;13146:48:0;;13185:8;13146:48;;;;;;:::i;:::-;;;;;;;;12907:295;;:::o;14170:328::-;14345:41;14364:12;:10;:12::i;:::-;14378:7;14345:18;:41::i;:::-;14337:103;;;;-1:-1:-1;;;14337:103:0;;;;;;;:::i;:::-;14451:39;14465:4;14471:2;14475:7;14484:5;14451:13;:39::i;:::-;14170:328;;;;:::o;54010:144::-;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;54128:2:::1;::::0;54120:25:::1;::::0;54080:21:::1;::::0;-1:-1:-1;;;;;54128:2:0::1;::::0;54120:25;::::1;;;::::0;54080:21;;54062:15:::1;54120:25:::0;54062:15;54120:25;54080:21;54128:2;54120:25;::::1;;;;;;54112:34;;;::::0;::::1;54313:129:::0;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;54376:6:::1;:14:::0;;;54417:2:::1;::::0;54409:24:::1;::::0;-1:-1:-1;;;;;54417:2:0;;::::1;::::0;54409:24;::::1;;;::::0;54385:5;;54417:2:::1;54409:24:::0;54417:2;54409:24;54385:5;54417:2;54409:24;::::1;;;;;;54401:33;;;::::0;::::1;54172:129:::0;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;54235:6:::1;:14:::0;;;54276:2:::1;::::0;54268:24:::1;::::0;-1:-1:-1;;;;;54276:2:0;;::::1;::::0;54268:24;::::1;;;::::0;54244:5;;54276:2:::1;54268:24:::0;54276:2;54268:24;54244:5;54276:2;54268:24;::::1;;;;;;54260:33;;;::::0;::::1;11399:334:::0;11472:13;11506:16;11514:7;11506;:16::i;:::-;11498:76;;;;-1:-1:-1;;;11498:76:0;;;;;;;:::i;:::-;11587:21;11611:10;:8;:10::i;:::-;11587:34;;11663:1;11645:7;11639:21;:25;:86;;;;;;;;;;;;;;;;;11691:7;11700:18;:7;:16;:18::i;:::-;11674:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11639:86;11632:93;11399:334;-1:-1:-1;;;11399:334:0:o;49599:28::-;;;;:::o;49221:40::-;49257:4;49221:40;:::o;13273:164::-;-1:-1:-1;;;;;13394:25:0;;;13370:4;13394:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;13273:164::o;53236:756::-;53290:13;;:18;53282:60;;;;-1:-1:-1;;;53282:60:0;;;;;;;:::i;:::-;53420:19;53474:16;53492:15;53457:51;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;53457:51:0;;;;;;;;;53447:62;;53457:51;53447:62;;;;;-1:-1:-1;53541:17:0;53555:3;53447:62;53541:17;:::i;:::-;53536:23;;:1;:23;:::i;:::-;53521:38;;53673:11;53658:12;:26;53654:74;;;-1:-1:-1;53715:1:0;53654:74;53740:17;53760:26;53775:11;53760:12;:26;:::i;:::-;53740:46;-1:-1:-1;53813:38:0;49257:4;53818:20;;53813:38;:::i;:::-;53797:13;:54;;;53901:84;;53956:13;;:17;;53972:1;53956:17;:::i;:::-;53940:13;:33;53236:756;;:::o;48701:192::-;48032:12;:10;:12::i;:::-;-1:-1:-1;;;;;48021:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48021:23:0;;48013:68;;;;-1:-1:-1;;;48013:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48790:22:0;::::1;48782:73;;;;-1:-1:-1::0;;;48782:73:0::1;;;;;;;:::i;:::-;48866:19;48876:8;48866:9;:19::i;23082:224::-:0;23184:4;-1:-1:-1;;;;;;23208:50:0;;-1:-1:-1;;;23208:50:0;;:90;;;23262:36;23286:11;23262:23;:36::i;16008:127::-;16073:4;16097:16;;;:7;:16;;;;;;-1:-1:-1;;;;;16097:16:0;:30;;;16008:127::o;672:98::-;752:10;672:98;:::o;19990:174::-;20065:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;20065:29:0;-1:-1:-1;;;;;20065:29:0;;;;;;;;:24;;20119:23;20065:24;20119:14;:23::i;:::-;-1:-1:-1;;;;;20110:46:0;;;;;;;;;;;19990:174;;:::o;16302:348::-;16395:4;16420:16;16428:7;16420;:16::i;:::-;16412:73;;;;-1:-1:-1;;;16412:73:0;;;;;;;:::i;:::-;16496:13;16512:23;16527:7;16512:14;:23::i;:::-;16496:39;;16565:5;-1:-1:-1;;;;;16554:16:0;:7;-1:-1:-1;;;;;16554:16:0;;:51;;;;16598:7;-1:-1:-1;;;;;16574:31:0;:20;16586:7;16574:11;:20::i;:::-;-1:-1:-1;;;;;16574:31:0;;16554:51;:87;;;;16609:32;16626:5;16633:7;16609:16;:32::i;:::-;16546:96;16302:348;-1:-1:-1;;;;16302:348:0:o;19294:578::-;19453:4;-1:-1:-1;;;;;19426:31:0;:23;19441:7;19426:14;:23::i;:::-;-1:-1:-1;;;;;19426:31:0;;19418:85;;;;-1:-1:-1;;;19418:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19522:16:0;;19514:65;;;;-1:-1:-1;;;19514:65:0;;;;;;;:::i;:::-;19592:39;19613:4;19619:2;19623:7;19592:20;:39::i;:::-;19696:29;19713:1;19717:7;19696:8;:29::i;:::-;-1:-1:-1;;;;;19738:15:0;;;;;;:9;:15;;;;;:20;;19757:1;;19738:15;:20;;19757:1;;19738:20;:::i;:::-;;;;-1:-1:-1;;;;;;;19769:13:0;;;;;;:9;:13;;;;;:18;;19786:1;;19769:13;:18;;19786:1;;19769:18;:::i;:::-;;;;-1:-1:-1;;19798:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;19798:21:0;-1:-1:-1;;;;;19798:21:0;;;;;;;;;19837:27;;19798:16;;19837:27;;;;;;;19294:578;;;:::o;41802:98::-;41860:7;41887:5;41891:1;41887;:5;:::i;16992:110::-;17068:26;17078:2;17082:7;17068:26;;;;;;;;;;;;:9;:26::i;48901:173::-;48976:6;;;-1:-1:-1;;;;;48993:17:0;;;-1:-1:-1;;;;;;48993:17:0;;;;;;;49026:40;;48976:6;;;48993:17;48976:6;;49026:40;;48957:16;;49026:40;48901:173;;:::o;42183:98::-;42241:7;42268:5;42272:1;42268;:5;:::i;15380:315::-;15537:28;15547:4;15553:2;15557:7;15537:9;:28::i;:::-;15584:48;15607:4;15613:2;15617:7;15626:5;15584:22;:48::i;:::-;15576:111;;;;-1:-1:-1;;;15576:111:0;;;;;;;:::i;50847:107::-;50906:13;50939:7;50932:14;;;;;:::i;29489:723::-;29545:13;29766:10;29762:53;;-1:-1:-1;29793:10:0;;;;;;;;;;;;-1:-1:-1;;;29793:10:0;;;;;;29762:53;29840:5;29825:12;29881:78;29888:9;;29881:78;;29914:8;;;;:::i;:::-;;-1:-1:-1;29937:10:0;;-1:-1:-1;29945:2:0;29937:10;;:::i;:::-;;;29881:78;;;29969:19;30001:6;29991:17;;;;;;-1:-1:-1;;;29991:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29991:17:0;;29969:39;;30019:154;30026:10;;30019:154;;30053:11;30063:1;30053:11;;:::i;:::-;;-1:-1:-1;30122:10:0;30130:2;30122:5;:10;:::i;:::-;30109:24;;:2;:24;:::i;:::-;30096:39;;30079:6;30086;30079:14;;;;;;-1:-1:-1;;;30079:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;30079:56:0;;;;;;;;-1:-1:-1;30150:11:0;30159:2;30150:11;;:::i;:::-;;;30019:154;;10110:305;10212:4;-1:-1:-1;;;;;;10249:40:0;;-1:-1:-1;;;10249:40:0;;:105;;-1:-1:-1;;;;;;;10306:48:0;;-1:-1:-1;;;10306:48:0;10249:105;:158;;;;10371:36;10395:11;10371:23;:36::i;55159:204::-;55310:45;55337:4;55343:2;55347:7;55310:26;:45::i;17329:321::-;17459:18;17465:2;17469:7;17459:5;:18::i;:::-;17510:54;17541:1;17545:2;17549:7;17558:5;17510:22;:54::i;:::-;17488:154;;;;-1:-1:-1;;;17488:154:0;;;;;;;:::i;20729:803::-;20884:4;20905:15;:2;-1:-1:-1;;;;;20905:13:0;;:15::i;:::-;20901:624;;;20957:2;-1:-1:-1;;;;;20941:36:0;;20978:12;:10;:12::i;:::-;20992:4;20998:7;21007:5;20941:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20941:72:0;;;;;;;;-1:-1:-1;;20941:72:0;;;;;;;;;;;;:::i;:::-;;;20937:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21187:13:0;;21183:272;;21230:60;;-1:-1:-1;;;21230:60:0;;;;;;;:::i;21183:272::-;21405:6;21399:13;21390:6;21386:2;21382:15;21375:38;20937:533;-1:-1:-1;;;;;;21064:55:0;-1:-1:-1;;;21064:55:0;;-1:-1:-1;21057:62:0;;20901:624;-1:-1:-1;21509:4:0;20729:803;;;;;;:::o;8690:157::-;-1:-1:-1;;;;;;8799:40:0;;-1:-1:-1;;;8799:40:0;8690:157;;;:::o;24758:589::-;24902:45;24929:4;24935:2;24939:7;24902:26;:45::i;:::-;-1:-1:-1;;;;;24964:18:0;;24960:187;;24999:40;25031:7;24999:31;:40::i;:::-;24960:187;;;25069:2;-1:-1:-1;;;;;25061:10:0;:4;-1:-1:-1;;;;;25061:10:0;;25057:90;;25088:47;25121:4;25127:7;25088:32;:47::i;:::-;-1:-1:-1;;;;;25161:16:0;;25157:183;;25194:45;25231:7;25194:36;:45::i;:::-;25157:183;;;25267:4;-1:-1:-1;;;;;25261:10:0;:2;-1:-1:-1;;;;;25261:10:0;;25257:83;;25288:40;25316:2;25320:7;25288:27;:40::i;17986:382::-;-1:-1:-1;;;;;18066:16:0;;18058:61;;;;-1:-1:-1;;;18058:61:0;;;;;;;:::i;:::-;18139:16;18147:7;18139;:16::i;:::-;18138:17;18130:58;;;;-1:-1:-1;;;18130:58:0;;;;;;;:::i;:::-;18201:45;18230:1;18234:2;18238:7;18201:20;:45::i;:::-;-1:-1:-1;;;;;18259:13:0;;;;;;:9;:13;;;;;:18;;18276:1;;18259:13;:18;;18276:1;;18259:18;:::i;:::-;;;;-1:-1:-1;;18288:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;18288:21:0;-1:-1:-1;;;;;18288:21:0;;;;;;;;18327:33;;18288:16;;;18327:33;;18288:16;;18327:33;17986:382;;:::o;31956:387::-;32279:20;32327:8;;;31956:387::o;26070:164::-;26174:10;:17;;26147:24;;;;:15;:24;;;;;:44;;;26202:24;;;;;;;;;;;;26070:164::o;26861:988::-;27127:22;27177:1;27152:22;27169:4;27152:16;:22::i;:::-;:26;;;;:::i;:::-;27189:18;27210:26;;;:17;:26;;;;;;27127:51;;-1:-1:-1;27343:28:0;;;27339:328;;-1:-1:-1;;;;;27410:18:0;;27388:19;27410:18;;;:12;:18;;;;;;;;:34;;;;;;;;;27461:30;;;;;;:44;;;27578:30;;:17;:30;;;;;:43;;;27339:328;-1:-1:-1;27763:26:0;;;;:17;:26;;;;;;;;27756:33;;;-1:-1:-1;;;;;27807:18:0;;;;;:12;:18;;;;;:34;;;;;;;27800:41;26861:988::o;28144:1079::-;28422:10;:17;28397:22;;28422:21;;28442:1;;28422:21;:::i;:::-;28454:18;28475:24;;;:15;:24;;;;;;28848:10;:26;;28397:46;;-1:-1:-1;28475:24:0;;28397:46;;28848:26;;;;-1:-1:-1;;;28848:26:0;;;;;;;;;;;;;;;;;28826:48;;28912:11;28887:10;28898;28887:22;;;;;;-1:-1:-1;;;28887:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;28992:28;;;:15;:28;;;;;;;:41;;;29164:24;;;;;29157:31;29199:10;:16;;;;;-1:-1:-1;;;29199:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;28144:1079;;;;:::o;25648:221::-;25733:14;25750:20;25767:2;25750:16;:20::i;:::-;-1:-1:-1;;;;;25781:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;25826:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;25648:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:409:1;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:1;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:175::-;498:20;;-1:-1:-1;;;;;547:31:1;;537:42;;527:2;;593:1;590;583:12;608:198;;720:2;708:9;699:7;695:23;691:32;688:2;;;741:6;733;726:22;688:2;769:31;790:9;769:31;:::i;811:274::-;;;940:2;928:9;919:7;915:23;911:32;908:2;;;961:6;953;946:22;908:2;989:31;1010:9;989:31;:::i;:::-;979:41;;1039:40;1075:2;1064:9;1060:18;1039:40;:::i;:::-;1029:50;;898:187;;;;;:::o;1090:342::-;;;;1236:2;1224:9;1215:7;1211:23;1207:32;1204:2;;;1257:6;1249;1242:22;1204:2;1285:31;1306:9;1285:31;:::i;:::-;1275:41;;1335:40;1371:2;1360:9;1356:18;1335:40;:::i;:::-;1325:50;;1422:2;1411:9;1407:18;1394:32;1384:42;;1194:238;;;;;:::o;1437:702::-;;;;;1609:3;1597:9;1588:7;1584:23;1580:33;1577:2;;;1631:6;1623;1616:22;1577:2;1659:31;1680:9;1659:31;:::i;:::-;1649:41;;1709:40;1745:2;1734:9;1730:18;1709:40;:::i;:::-;1699:50;;1796:2;1785:9;1781:18;1768:32;1758:42;;1851:2;1840:9;1836:18;1823:32;1878:18;1870:6;1867:30;1864:2;;;1915:6;1907;1900:22;1864:2;1943:22;;1996:4;1988:13;;1984:27;-1:-1:-1;1974:2:1;;2030:6;2022;2015:22;1974:2;2058:75;2125:7;2120:2;2107:16;2102:2;2098;2094:11;2058:75;:::i;:::-;2048:85;;;1567:572;;;;;;;:::o;2144:369::-;;;2270:2;2258:9;2249:7;2245:23;2241:32;2238:2;;;2291:6;2283;2276:22;2238:2;2319:31;2340:9;2319:31;:::i;:::-;2309:41;;2400:2;2389:9;2385:18;2372:32;2447:5;2440:13;2433:21;2426:5;2423:32;2413:2;;2474:6;2466;2459:22;2413:2;2502:5;2492:15;;;2228:285;;;;;:::o;2518:266::-;;;2647:2;2635:9;2626:7;2622:23;2618:32;2615:2;;;2668:6;2660;2653:22;2615:2;2696:31;2717:9;2696:31;:::i;:::-;2686:41;2774:2;2759:18;;;;2746:32;;-1:-1:-1;;;2605:179:1:o;2789:1010::-;;2904:2;2947;2935:9;2926:7;2922:23;2918:32;2915:2;;;2968:6;2960;2953:22;2915:2;3013:9;3000:23;3042:18;3083:2;3075:6;3072:14;3069:2;;;3104:6;3096;3089:22;3069:2;3147:6;3136:9;3132:22;3122:32;;3192:7;3185:4;3181:2;3177:13;3173:27;3163:2;;3219:6;3211;3204:22;3163:2;3260;3247:16;3282:2;3278;3275:10;3272:2;;;3288:18;;:::i;:::-;3335:2;3331;3327:11;3317:21;;3358:27;3381:2;3377;3373:11;3358:27;:::i;:::-;3419:15;;;3450:12;;;;3482:11;;;3512;;;3508:20;;3505:33;-1:-1:-1;3502:2:1;;;3556:6;3548;3541:22;3502:2;3583:6;3574:15;;3598:171;3612:2;3609:1;3606:9;3598:171;;;3669:25;3690:3;3669:25;:::i;:::-;3657:38;;3630:1;3623:9;;;;;3715:12;;;;3747;;3598:171;;;-1:-1:-1;3788:5:1;2884:915;-1:-1:-1;;;;;;;;2884:915:1:o;3804:257::-;;3915:2;3903:9;3894:7;3890:23;3886:32;3883:2;;;3936:6;3928;3921:22;3883:2;3980:9;3967:23;3999:32;4025:5;3999:32;:::i;4066:261::-;;4188:2;4176:9;4167:7;4163:23;4159:32;4156:2;;;4209:6;4201;4194:22;4156:2;4246:9;4240:16;4265:32;4291:5;4265:32;:::i;4332:482::-;;4454:2;4442:9;4433:7;4429:23;4425:32;4422:2;;;4475:6;4467;4460:22;4422:2;4520:9;4507:23;4553:18;4545:6;4542:30;4539:2;;;4590:6;4582;4575:22;4539:2;4618:22;;4671:4;4663:13;;4659:27;-1:-1:-1;4649:2:1;;4705:6;4697;4690:22;4649:2;4733:75;4800:7;4795:2;4782:16;4777:2;4773;4769:11;4733:75;:::i;4819:190::-;;4931:2;4919:9;4910:7;4906:23;4902:32;4899:2;;;4952:6;4944;4937:22;4899:2;-1:-1:-1;4980:23:1;;4889:120;-1:-1:-1;4889:120:1:o;5014:289::-;;5124:2;5112:9;5103:7;5099:23;5095:32;5092:2;;;5145:6;5137;5130:22;5092:2;5189:9;5176:23;5239:4;5232:5;5228:16;5221:5;5218:27;5208:2;;5264:6;5256;5249:22;5308:259;;5389:5;5383:12;5416:6;5411:3;5404:19;5432:63;5488:6;5481:4;5476:3;5472:14;5465:4;5458:5;5454:16;5432:63;:::i;:::-;5549:2;5528:15;-1:-1:-1;;5524:29:1;5515:39;;;;5556:4;5511:50;;5359:208;-1:-1:-1;;5359:208:1:o;5572:470::-;;5789:6;5783:13;5805:53;5851:6;5846:3;5839:4;5831:6;5827:17;5805:53;:::i;:::-;5921:13;;5880:16;;;;5943:57;5921:13;5880:16;5977:4;5965:17;;5943:57;:::i;:::-;6016:20;;5759:283;-1:-1:-1;;;;5759:283:1:o;6047:247::-;6204:19;;;6248:2;6239:12;;6232:28;6285:2;6276:12;;6194:100::o;6299:203::-;-1:-1:-1;;;;;6463:32:1;;;;6445:51;;6433:2;6418:18;;6400:102::o;6507:490::-;-1:-1:-1;;;;;6776:15:1;;;6758:34;;6828:15;;6823:2;6808:18;;6801:43;6875:2;6860:18;;6853:34;;;6923:3;6918:2;6903:18;;6896:31;;;6507:490;;6944:47;;6971:19;;6963:6;6944:47;:::i;:::-;6936:55;6710:287;-1:-1:-1;;;;;;6710:287:1:o;7002:187::-;7167:14;;7160:22;7142:41;;7130:2;7115:18;;7097:92::o;7194:221::-;;7343:2;7332:9;7325:21;7363:46;7405:2;7394:9;7390:18;7382:6;7363:46;:::i;7420:397::-;7622:2;7604:21;;;7661:2;7641:18;;;7634:30;7700:34;7695:2;7680:18;;7673:62;-1:-1:-1;;;7766:2:1;7751:18;;7744:31;7807:3;7792:19;;7594:223::o;7822:407::-;8024:2;8006:21;;;8063:2;8043:18;;;8036:30;8102:34;8097:2;8082:18;;8075:62;-1:-1:-1;;;8168:2:1;8153:18;;8146:41;8219:3;8204:19;;7996:233::o;8234:414::-;8436:2;8418:21;;;8475:2;8455:18;;;8448:30;8514:34;8509:2;8494:18;;8487:62;-1:-1:-1;;;8580:2:1;8565:18;;8558:48;8638:3;8623:19;;8408:240::o;8653:402::-;8855:2;8837:21;;;8894:2;8874:18;;;8867:30;8933:34;8928:2;8913:18;;8906:62;-1:-1:-1;;;8999:2:1;8984:18;;8977:36;9045:3;9030:19;;8827:228::o;9060:352::-;9262:2;9244:21;;;9301:2;9281:18;;;9274:30;9340;9335:2;9320:18;;9313:58;9403:2;9388:18;;9234:178::o;9417:353::-;9619:2;9601:21;;;9658:2;9638:18;;;9631:30;9697:31;9692:2;9677:18;;9670:59;9761:2;9746:18;;9591:179::o;9775:400::-;9977:2;9959:21;;;10016:2;9996:18;;;9989:30;10055:34;10050:2;10035:18;;10028:62;-1:-1:-1;;;10121:2:1;10106:18;;10099:34;10165:3;10150:19;;9949:226::o;10180:349::-;10382:2;10364:21;;;10421:2;10401:18;;;10394:30;10460:27;10455:2;10440:18;;10433:55;10520:2;10505:18;;10354:175::o;10534:351::-;10736:2;10718:21;;;10775:2;10755:18;;;10748:30;10814:29;10809:2;10794:18;;10787:57;10876:2;10861:18;;10708:177::o;10890:408::-;11092:2;11074:21;;;11131:2;11111:18;;;11104:30;11170:34;11165:2;11150:18;;11143:62;-1:-1:-1;;;11236:2:1;11221:18;;11214:42;11288:3;11273:19;;11064:234::o;11303:353::-;11505:2;11487:21;;;11544:2;11524:18;;;11517:30;11583:31;11578:2;11563:18;;11556:59;11647:2;11632:18;;11477:179::o;11661:420::-;11863:2;11845:21;;;11902:2;11882:18;;;11875:30;11941:34;11936:2;11921:18;;11914:62;12012:26;12007:2;11992:18;;11985:54;12071:3;12056:19;;11835:246::o;12086:406::-;12288:2;12270:21;;;12327:2;12307:18;;;12300:30;12366:34;12361:2;12346:18;;12339:62;-1:-1:-1;;;12432:2:1;12417:18;;12410:40;12482:3;12467:19;;12260:232::o;12497:405::-;12699:2;12681:21;;;12738:2;12718:18;;;12711:30;12777:34;12772:2;12757:18;;12750:62;-1:-1:-1;;;12843:2:1;12828:18;;12821:39;12892:3;12877:19;;12671:231::o;12907:356::-;13109:2;13091:21;;;13128:18;;;13121:30;13187:34;13182:2;13167:18;;13160:62;13254:2;13239:18;;13081:182::o;13268:352::-;13470:2;13452:21;;;13509:2;13489:18;;;13482:30;13548;13543:2;13528:18;;13521:58;13611:2;13596:18;;13442:178::o;13625:408::-;13827:2;13809:21;;;13866:2;13846:18;;;13839:30;13905:34;13900:2;13885:18;;13878:62;-1:-1:-1;;;13971:2:1;13956:18;;13949:42;14023:3;14008:19;;13799:234::o;14038:356::-;14240:2;14222:21;;;14259:18;;;14252:30;14318:34;14313:2;14298:18;;14291:62;14385:2;14370:18;;14212:182::o;14399:405::-;14601:2;14583:21;;;14640:2;14620:18;;;14613:30;14679:34;14674:2;14659:18;;14652:62;-1:-1:-1;;;14745:2:1;14730:18;;14723:39;14794:3;14779:19;;14573:231::o;14809:411::-;15011:2;14993:21;;;15050:2;15030:18;;;15023:30;15089:34;15084:2;15069:18;;15062:62;-1:-1:-1;;;15155:2:1;15140:18;;15133:45;15210:3;15195:19;;14983:237::o;15225:397::-;15427:2;15409:21;;;15466:2;15446:18;;;15439:30;15505:34;15500:2;15485:18;;15478:62;-1:-1:-1;;;15571:2:1;15556:18;;15549:31;15612:3;15597:19;;15399:223::o;15627:346::-;15829:2;15811:21;;;15868:2;15848:18;;;15841:30;-1:-1:-1;;;15902:2:1;15887:18;;15880:52;15964:2;15949:18;;15801:172::o;15978:399::-;16180:2;16162:21;;;16219:2;16199:18;;;16192:30;16258:34;16253:2;16238:18;;16231:62;-1:-1:-1;;;16324:2:1;16309:18;;16302:33;16367:3;16352:19;;16152:225::o;16382:413::-;16584:2;16566:21;;;16623:2;16603:18;;;16596:30;16662:34;16657:2;16642:18;;16635:62;-1:-1:-1;;;16728:2:1;16713:18;;16706:47;16785:3;16770:19;;16556:239::o;16800:408::-;17002:2;16984:21;;;17041:2;17021:18;;;17014:30;17080:34;17075:2;17060:18;;17053:62;-1:-1:-1;;;17146:2:1;17131:18;;17124:42;17198:3;17183:19;;16974:234::o;17213:343::-;17415:2;17397:21;;;17454:2;17434:18;;;17427:30;-1:-1:-1;;;17488:2:1;17473:18;;17466:49;17547:2;17532:18;;17387:169::o;17561:177::-;17707:25;;;17695:2;17680:18;;17662:76::o;17743:251::-;17813:2;17807:9;17843:17;;;17890:18;17875:34;;17911:22;;;17872:62;17869:2;;;17937:18;;:::i;:::-;17973:2;17966:22;17787:207;;-1:-1:-1;17787:207:1:o;17999:128::-;;18070:1;18066:6;18063:1;18060:13;18057:2;;;18076:18;;:::i;:::-;-1:-1:-1;18112:9:1;;18047:80::o;18132:120::-;;18198:1;18188:2;;18203:18;;:::i;:::-;-1:-1:-1;18237:9:1;;18178:74::o;18257:168::-;;18363:1;18359;18355:6;18351:14;18348:1;18345:21;18340:1;18333:9;18326:17;18322:45;18319:2;;;18370:18;;:::i;:::-;-1:-1:-1;18410:9:1;;18309:116::o;18430:125::-;;18498:1;18495;18492:8;18489:2;;;18503:18;;:::i;:::-;-1:-1:-1;18540:9:1;;18479:76::o;18560:258::-;18632:1;18642:113;18656:6;18653:1;18650:13;18642:113;;;18732:11;;;18726:18;18713:11;;;18706:39;18678:2;18671:10;18642:113;;;18773:6;18770:1;18767:13;18764:2;;;-1:-1:-1;;18808:1:1;18790:16;;18783:27;18613:205::o;18823:380::-;18908:1;18898:12;;18955:1;18945:12;;;18966:2;;19020:4;19012:6;19008:17;18998:27;;18966:2;19073;19065:6;19062:14;19042:18;19039:38;19036:2;;;19119:10;19114:3;19110:20;19107:1;19100:31;19154:4;19151:1;19144:15;19182:4;19179:1;19172:15;19036:2;;18878:325;;;:::o;19208:135::-;;-1:-1:-1;;19268:17:1;;19265:2;;;19288:18;;:::i;:::-;-1:-1:-1;19335:1:1;19324:13;;19255:88::o;19348:112::-;;19406:1;19396:2;;19411:18;;:::i;:::-;-1:-1:-1;19445:9:1;;19386:74::o;19465:127::-;19526:10;19521:3;19517:20;19514:1;19507:31;19557:4;19554:1;19547:15;19581:4;19578:1;19571:15;19597:127;19658:10;19653:3;19649:20;19646:1;19639:31;19689:4;19686:1;19679:15;19713:4;19710:1;19703:15;19729:127;19790:10;19785:3;19781:20;19778:1;19771:31;19821:4;19818:1;19811:15;19845:4;19842:1;19835:15;19861:133;-1:-1:-1;;;;;;19937:32:1;;19927:43;;19917:2;;19984:1;19981;19974:12

Swarm Source

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