ETH Price: $3,184.84 (+1.64%)
Gas: 6 Gwei

Token

DINOCITY (DINOCITY)
 

Overview

Max Total Supply

1,399 DINOCITY

Holders

499

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 DINOCITY
0x3c0c713419b2be829bb33ac26572a033d3d4767d
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:
DINOCITY

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-15
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: erc721a/contracts/ERC721A.sol



pragma solidity ^0.8.0;









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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal _nextTokenId;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert('ERC721A: unable to get token of owner by index');
    }

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

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        for (uint256 curr = tokenId; ; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: 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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _nextTokenId;
    }

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _nextTokenId;
        require(to != address(0), 'ERC721A: mint to the zero address');
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), 'ERC721A: token already minted');
        require(quantity > 0, 'ERC721A: quantity must be greater 0');

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                'ERC721A: transfer to non ERC721Receiver implementer'
            );
            updatedIndex++;
        }

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

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

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

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;
        }

        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(prevOwnership.addr, prevOwnership.startTimestamp);
            }
        }

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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


pragma solidity ^0.8.0;

contract DINOCITY is ERC721A, Ownable {
  using Strings for uint256;
  uint256 public mintPrice = 0.008 ether;
  uint256 public supply = 1278;
  string private baseURI = "ipfs://QmUMWzwpCLZn7EYqRDRKAZ8LCbJNm7i7Z5cC1kSAv/";
  uint8 public phase = 1;
  uint8 public maxBuy = 5;


  mapping(address => uint8)  public walletBuys;

  constructor() ERC721A("DINOCITY", "DINOCITY") {
  }

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

  function wlAirDrop(address[] calldata _addresses, uint256 quantity) public onlyOwner {
    for (uint i=0; i<_addresses.length; i++) {
      _safeMint(_addresses[i], quantity);
    }
  }

  function mint(uint256 quantity) external payable {
    require(phase >= 2, "Sale has not started");
    require(totalSupply() + quantity <= supply, "You can't mint more then the total supply");
    require(walletBuys[msg.sender] + quantity <= maxBuy, "Buy limit reached");
    require(msg.value >= mintPrice * quantity, "Insufficient funds");

    _safeMint(msg.sender, quantity);
  }


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

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

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

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



  function setPhase(uint8 _phase) public onlyOwner {
    phase = _phase;
  }

  function setMaxBuy(uint8 _maxBuy) external onlyOwner {
      maxBuy = _maxBuy;
  }

  function winnersReserve(uint256 _supply) external onlyOwner {
      supply = _supply;
  }




  function getContractBalance () external view onlyOwner returns (uint256) {
    return address(this).balance;
  }

  function withdrawAll() external onlyOwner{
        uint256 balance = address(this).balance;
        require(balance > 0, "Insufficent balance");
        
        address[2] memory addresses = [
            0x2616d07e7751ef337D39B166254D1d84f84F1157,
            0x2616d07e7751ef337D39B166254D1d84f84F1157 
        ];

        uint32[5] memory shares = [
            uint32(50),
            uint32(40),
            uint32(330),
            uint32(330),
            uint32(250)
        ];

        for (uint32 i = 0; i < addresses.length; i++) {
            uint256 amount = i == addresses.length - 1 ? address(this).balance : balance * shares[i] / 1000;
            _widthdraw(addresses[i], amount);
        }
  }
 
  //Withdraw balance from contract
  function _widthdraw(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{ value: _amount }("");
        require(success, "Failed to withdraw Ether");
  }

}

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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","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":"maxBuy","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxBuy","type":"uint8"}],"name":"setMaxBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_phase","type":"uint8"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","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":"address","name":"","type":"address"}],"name":"walletBuys","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"winnersReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"wlAirDrop","outputs":[],"stateMutability":"nonpayable","type":"function"}]

661c6bf5263400006008556104fe60095560e060405260316080818152906200274b60a03980516200003a91600a916020909101906200011c565b50600b805461ffff19166105011790553480156200005757600080fd5b5060408051808201825260088082526744494e4f4349545960c01b6020808401828152855180870190965292855284015281519192916200009b916001916200011c565b508051620000b19060029060208401906200011c565b5050600160005550620000c433620000ca565b620001ff565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200012a90620001c2565b90600052602060002090601f0160209004810192826200014e576000855562000199565b82601f106200016957805160ff191683800117855562000199565b8280016001018555821562000199579182015b82811115620001995782518255916020019190600101906200017c565b50620001a7929150620001ab565b5090565b5b80821115620001a75760008155600101620001ac565b600181811c90821680620001d757607f821691505b60208210811415620001f957634e487b7160e01b600052602260045260246000fd5b50919050565b61253c806200020f6000396000f3fe6080604052600436106101f95760003560e01c8063714c53981161010d578063b88d4fde116100a0578063dbdf2dc01161006f578063dbdf2dc014610583578063dea96c98146105a3578063e985e9c5146105d3578063f2fde38b1461061c578063f4a0a5281461063c57600080fd5b8063b88d4fde14610503578063be2f20db14610523578063c03afb5914610543578063c87b56dd1461056357600080fd5b806395d89b41116100dc57806395d89b41146104a1578063a0712d68146104b6578063a22cb465146104c9578063b1c9fe6e146104e957600080fd5b8063714c539814610444578063715018a614610459578063853828b61461046e5780638da5cb5b1461048357600080fd5b80632f745c59116101905780636352211e1161015f5780636352211e146103a85780636817c76c146103c85780636f9fb98a146103de57806370a08231146103f357806370db69d61461041357600080fd5b80632f745c591461032857806342842e0e146103485780634f6ccce71461036857806355f804b31461038857600080fd5b8063095ea7b3116101cc578063095ea7b3146102b157806318160ddd146102d357806323b872dd146102e85780632590c67a1461030857600080fd5b806301ffc9a7146101fe578063047fc9aa1461023357806306fdde0314610257578063081812fc14610279575b600080fd5b34801561020a57600080fd5b5061021e610219366004611e36565b61065c565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b5061024960095481565b60405190815260200161022a565b34801561026357600080fd5b5061026c6106c9565b60405161022a9190611eb2565b34801561028557600080fd5b50610299610294366004611ec5565b61075b565b6040516001600160a01b03909116815260200161022a565b3480156102bd57600080fd5b506102d16102cc366004611efa565b6107eb565b005b3480156102df57600080fd5b50610249610903565b3480156102f457600080fd5b506102d1610303366004611f24565b610919565b34801561031457600080fd5b506102d1610323366004611ec5565b610924565b34801561033457600080fd5b50610249610343366004611efa565b610953565b34801561035457600080fd5b506102d1610363366004611f24565b610acb565b34801561037457600080fd5b50610249610383366004611ec5565b610ae6565b34801561039457600080fd5b506102d16103a3366004611fec565b610b4e565b3480156103b457600080fd5b506102996103c3366004611ec5565b610b8f565b3480156103d457600080fd5b5061024960085481565b3480156103ea57600080fd5b50610249610ba1565b3480156103ff57600080fd5b5061024961040e366004612035565b610bd3565b34801561041f57600080fd5b50600b5461043290610100900460ff1681565b60405160ff909116815260200161022a565b34801561045057600080fd5b5061026c610c64565b34801561046557600080fd5b506102d1610c73565b34801561047a57600080fd5b506102d1610ca9565b34801561048f57600080fd5b506007546001600160a01b0316610299565b3480156104ad57600080fd5b5061026c610e1d565b6102d16104c4366004611ec5565b610e2c565b3480156104d557600080fd5b506102d16104e4366004612050565b610fbc565b3480156104f557600080fd5b50600b546104329060ff1681565b34801561050f57600080fd5b506102d161051e36600461208c565b611081565b34801561052f57600080fd5b506102d161053e366004612108565b6110b4565b34801561054f57600080fd5b506102d161055e366004612183565b61112b565b34801561056f57600080fd5b5061026c61057e366004611ec5565b61116b565b34801561058f57600080fd5b506102d161059e366004612183565b611238565b3480156105af57600080fd5b506104326105be366004612035565b600c6020526000908152604090205460ff1681565b3480156105df57600080fd5b5061021e6105ee3660046121a6565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561062857600080fd5b506102d1610637366004612035565b61127e565b34801561064857600080fd5b506102d1610657366004611ec5565b611316565b60006001600160e01b031982166380ac58cd60e01b148061068d57506001600160e01b03198216635b5e139f60e01b145b806106a857506001600160e01b0319821663780e9d6360e01b145b806106c357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546106d8906121d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610704906121d9565b80156107515780601f1061072657610100808354040283529160200191610751565b820191906000526020600020905b81548152906001019060200180831161073457829003601f168201915b5050505050905090565b6000610768826000541190565b6107cf5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006107f682610b8f565b9050806001600160a01b0316836001600160a01b031614156108655760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016107c6565b336001600160a01b0382161480610881575061088181336105ee565b6108f35760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016107c6565b6108fe838383611345565b505050565b60006001600054610914919061222a565b905090565b6108fe8383836113a1565b6007546001600160a01b0316331461094e5760405162461bcd60e51b81526004016107c690612241565b600955565b600061095e83610bd3565b82106109b75760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016107c6565b60006109c1610903565b905060008060005b83811015610a6b576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610a1c57805192505b876001600160a01b0316836001600160a01b03161415610a585786841415610a4a575093506106c392505050565b83610a5481612276565b9450505b5080610a6381612276565b9150506109c9565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016107c6565b6108fe83838360405180602001604052806000815250611081565b6000610af0610903565b8210610b4a5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016107c6565b5090565b6007546001600160a01b03163314610b785760405162461bcd60e51b81526004016107c690612241565b8051610b8b90600a906020840190611d90565b5050565b6000610b9a826116e8565b5192915050565b6007546000906001600160a01b03163314610bce5760405162461bcd60e51b81526004016107c690612241565b504790565b60006001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016107c6565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6060600a80546106d8906121d9565b6007546001600160a01b03163314610c9d5760405162461bcd60e51b81526004016107c690612241565b610ca760006117c8565b565b6007546001600160a01b03163314610cd35760405162461bcd60e51b81526004016107c690612241565b4780610d175760405162461bcd60e51b8152602060048201526013602482015272496e737566666963656e742062616c616e636560681b60448201526064016107c6565b604080518082018252732616d07e7751ef337d39b166254d1d84f84f1157808252602080830191909152825160a0810184526032815260289181019190915261014a928101839052606081019290925260fa60808301529060005b60028163ffffffff161015610e17576000610d8f6001600261222a565b8263ffffffff1614610dda576103e8838363ffffffff1660058110610db657610db6612291565b6020020151610dcb9063ffffffff16876122a7565b610dd591906122dc565b610ddc565b475b9050610e04848363ffffffff1660028110610df957610df9612291565b60200201518261181a565b5080610e0f816122f0565b915050610d72565b50505050565b6060600280546106d8906121d9565b600b54600260ff9091161015610e7b5760405162461bcd60e51b815260206004820152601460248201527314d85b19481a185cc81b9bdd081cdd185c9d195960621b60448201526064016107c6565b60095481610e87610903565b610e919190612314565b1115610ef15760405162461bcd60e51b815260206004820152602960248201527f596f752063616e2774206d696e74206d6f7265207468656e2074686520746f74604482015268616c20737570706c7960b81b60648201526084016107c6565b600b54336000908152600c602052604090205460ff610100909204821691610f1b91849116612314565b1115610f5d5760405162461bcd60e51b8152602060048201526011602482015270109d5e481b1a5b5a5d081c995858da1959607a1b60448201526064016107c6565b80600854610f6b91906122a7565b341015610faf5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016107c6565b610fb933826118bd565b50565b6001600160a01b0382163314156110155760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016107c6565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61108c8484846113a1565b611098848484846118d7565b610e175760405162461bcd60e51b81526004016107c69061232c565b6007546001600160a01b031633146110de5760405162461bcd60e51b81526004016107c690612241565b60005b82811015610e17576111198484838181106110fe576110fe612291565b90506020020160208101906111139190612035565b836118bd565b8061112381612276565b9150506110e1565b6007546001600160a01b031633146111555760405162461bcd60e51b81526004016107c690612241565b600b805460ff191660ff92909216919091179055565b6060611178826000541190565b6111dc5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107c6565b6000600a80546111eb906121d9565b90501161120757604051806020016040528060008152506106c3565b600a611212836119d6565b60405160200161122392919061239b565b60405160208183030381529060405292915050565b6007546001600160a01b031633146112625760405162461bcd60e51b81526004016107c690612241565b600b805460ff9092166101000261ff0019909216919091179055565b6007546001600160a01b031633146112a85760405162461bcd60e51b81526004016107c690612241565b6001600160a01b03811661130d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107c6565b610fb9816117c8565b6007546001600160a01b031633146113405760405162461bcd60e51b81526004016107c690612241565b600855565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006113ac826116e8565b80519091506000906001600160a01b0316336001600160a01b031614806113e35750336113d88461075b565b6001600160a01b0316145b806113f5575081516113f590336105ee565b90508061145f5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016107c6565b846001600160a01b031682600001516001600160a01b0316146114d35760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016107c6565b6001600160a01b0384166115375760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107c6565b6115476000848460000151611345565b6001600160a01b03858116600090815260046020908152604080832080546fffffffffffffffffffffffffffffffff198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255825180840184529182524267ffffffffffffffff9081168386019081528a8752600390955292852091518254945196166001600160e01b031990941693909317600160a01b9590921694909402179092559061160c908590612314565b6000818152600360205260409020549091506001600160a01b031661169e57611636816000541190565b1561169e5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611707826000541190565b6117665760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016107c6565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156117b5579392505050565b50806117c081612456565b915050611768565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611867576040519150601f19603f3d011682016040523d82523d6000602084013e61186c565b606091505b50509050806108fe5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f207769746864726177204574686572000000000000000060448201526064016107c6565b610b8b828260405180602001604052806000815250611ad4565b60006001600160a01b0384163b156119ca57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061191b90339089908890889060040161246d565b6020604051808303816000875af1925050508015611956575060408051601f3d908101601f19168201909252611953918101906124aa565b60015b6119b0573d808015611984576040519150601f19603f3d011682016040523d82523d6000602084013e611989565b606091505b5080516119a85760405162461bcd60e51b81526004016107c69061232c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119ce565b5060015b949350505050565b6060816119fa5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a245780611a0e81612276565b9150611a1d9050600a836122dc565b91506119fe565b60008167ffffffffffffffff811115611a3f57611a3f611f60565b6040519080825280601f01601f191660200182016040528015611a69576020820181803683370190505b5090505b84156119ce57611a7e60018361222a565b9150611a8b600a866124c7565b611a96906030612314565b60f81b818381518110611aab57611aab612291565b60200101906001600160f81b031916908160001a905350611acd600a866122dc565b9450611a6d565b6000546001600160a01b038416611b375760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107c6565b611b42816000541190565b15611b8f5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016107c6565b60008311611beb5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a207175616e74697479206d7573742062652067726561746560448201526207220360ec1b60648201526084016107c6565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190611c479087906124db565b6001600160801b03168152602001858360200151611c6591906124db565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015611d855760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611d4960008884886118d7565b611d655760405162461bcd60e51b81526004016107c69061232c565b81611d6f81612276565b9250508080611d7d90612276565b915050611cfc565b5060008190556116e0565b828054611d9c906121d9565b90600052602060002090601f016020900481019282611dbe5760008555611e04565b82601f10611dd757805160ff1916838001178555611e04565b82800160010185558215611e04579182015b82811115611e04578251825591602001919060010190611de9565b50610b4a9291505b80821115610b4a5760008155600101611e0c565b6001600160e01b031981168114610fb957600080fd5b600060208284031215611e4857600080fd5b8135611e5381611e20565b9392505050565b60005b83811015611e75578181015183820152602001611e5d565b83811115610e175750506000910152565b60008151808452611e9e816020860160208601611e5a565b601f01601f19169290920160200192915050565b602081526000611e536020830184611e86565b600060208284031215611ed757600080fd5b5035919050565b80356001600160a01b0381168114611ef557600080fd5b919050565b60008060408385031215611f0d57600080fd5b611f1683611ede565b946020939093013593505050565b600080600060608486031215611f3957600080fd5b611f4284611ede565b9250611f5060208501611ede565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611f9157611f91611f60565b604051601f8501601f19908116603f01168101908282118183101715611fb957611fb9611f60565b81604052809350858152868686011115611fd257600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611ffe57600080fd5b813567ffffffffffffffff81111561201557600080fd5b8201601f8101841361202657600080fd5b6119ce84823560208401611f76565b60006020828403121561204757600080fd5b611e5382611ede565b6000806040838503121561206357600080fd5b61206c83611ede565b91506020830135801515811461208157600080fd5b809150509250929050565b600080600080608085870312156120a257600080fd5b6120ab85611ede565b93506120b960208601611ede565b925060408501359150606085013567ffffffffffffffff8111156120dc57600080fd5b8501601f810187136120ed57600080fd5b6120fc87823560208401611f76565b91505092959194509250565b60008060006040848603121561211d57600080fd5b833567ffffffffffffffff8082111561213557600080fd5b818601915086601f83011261214957600080fd5b81358181111561215857600080fd5b8760208260051b850101111561216d57600080fd5b6020928301989097509590910135949350505050565b60006020828403121561219557600080fd5b813560ff81168114611e5357600080fd5b600080604083850312156121b957600080fd5b6121c283611ede565b91506121d060208401611ede565b90509250929050565b600181811c908216806121ed57607f821691505b6020821081141561220e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561223c5761223c612214565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060001982141561228a5761228a612214565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156122c1576122c1612214565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826122eb576122eb6122c6565b500490565b600063ffffffff8083168181141561230a5761230a612214565b6001019392505050565b6000821982111561232757612327612214565b500190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008151612391818560208601611e5a565b9290920192915050565b600080845481600182811c9150808316806123b757607f831692505b60208084108214156123d757634e487b7160e01b86526022600452602486fd5b8180156123eb57600181146123fc57612429565b60ff19861689528489019650612429565b60008b81526020902060005b868110156124215781548b820152908501908301612408565b505084890196505b50505050505061244d61243c828661237f565b64173539b7b760d91b815260050190565b95945050505050565b60008161246557612465612214565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124a090830184611e86565b9695505050505050565b6000602082840312156124bc57600080fd5b8151611e5381611e20565b6000826124d6576124d66122c6565b500690565b60006001600160801b038083168185168083038211156124fd576124fd612214565b0194935050505056fea2646970667358221220dc3060b8ba3b9bafb2116dcd611025d2814fb574375398c014327d3c799564a364736f6c634300080c0033697066733a2f2f516d554d577a7770434c5a6e374559715244524b415a384c43624a4e6d3769375a356343316b5341762f

Deployed Bytecode

0x6080604052600436106101f95760003560e01c8063714c53981161010d578063b88d4fde116100a0578063dbdf2dc01161006f578063dbdf2dc014610583578063dea96c98146105a3578063e985e9c5146105d3578063f2fde38b1461061c578063f4a0a5281461063c57600080fd5b8063b88d4fde14610503578063be2f20db14610523578063c03afb5914610543578063c87b56dd1461056357600080fd5b806395d89b41116100dc57806395d89b41146104a1578063a0712d68146104b6578063a22cb465146104c9578063b1c9fe6e146104e957600080fd5b8063714c539814610444578063715018a614610459578063853828b61461046e5780638da5cb5b1461048357600080fd5b80632f745c59116101905780636352211e1161015f5780636352211e146103a85780636817c76c146103c85780636f9fb98a146103de57806370a08231146103f357806370db69d61461041357600080fd5b80632f745c591461032857806342842e0e146103485780634f6ccce71461036857806355f804b31461038857600080fd5b8063095ea7b3116101cc578063095ea7b3146102b157806318160ddd146102d357806323b872dd146102e85780632590c67a1461030857600080fd5b806301ffc9a7146101fe578063047fc9aa1461023357806306fdde0314610257578063081812fc14610279575b600080fd5b34801561020a57600080fd5b5061021e610219366004611e36565b61065c565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b5061024960095481565b60405190815260200161022a565b34801561026357600080fd5b5061026c6106c9565b60405161022a9190611eb2565b34801561028557600080fd5b50610299610294366004611ec5565b61075b565b6040516001600160a01b03909116815260200161022a565b3480156102bd57600080fd5b506102d16102cc366004611efa565b6107eb565b005b3480156102df57600080fd5b50610249610903565b3480156102f457600080fd5b506102d1610303366004611f24565b610919565b34801561031457600080fd5b506102d1610323366004611ec5565b610924565b34801561033457600080fd5b50610249610343366004611efa565b610953565b34801561035457600080fd5b506102d1610363366004611f24565b610acb565b34801561037457600080fd5b50610249610383366004611ec5565b610ae6565b34801561039457600080fd5b506102d16103a3366004611fec565b610b4e565b3480156103b457600080fd5b506102996103c3366004611ec5565b610b8f565b3480156103d457600080fd5b5061024960085481565b3480156103ea57600080fd5b50610249610ba1565b3480156103ff57600080fd5b5061024961040e366004612035565b610bd3565b34801561041f57600080fd5b50600b5461043290610100900460ff1681565b60405160ff909116815260200161022a565b34801561045057600080fd5b5061026c610c64565b34801561046557600080fd5b506102d1610c73565b34801561047a57600080fd5b506102d1610ca9565b34801561048f57600080fd5b506007546001600160a01b0316610299565b3480156104ad57600080fd5b5061026c610e1d565b6102d16104c4366004611ec5565b610e2c565b3480156104d557600080fd5b506102d16104e4366004612050565b610fbc565b3480156104f557600080fd5b50600b546104329060ff1681565b34801561050f57600080fd5b506102d161051e36600461208c565b611081565b34801561052f57600080fd5b506102d161053e366004612108565b6110b4565b34801561054f57600080fd5b506102d161055e366004612183565b61112b565b34801561056f57600080fd5b5061026c61057e366004611ec5565b61116b565b34801561058f57600080fd5b506102d161059e366004612183565b611238565b3480156105af57600080fd5b506104326105be366004612035565b600c6020526000908152604090205460ff1681565b3480156105df57600080fd5b5061021e6105ee3660046121a6565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561062857600080fd5b506102d1610637366004612035565b61127e565b34801561064857600080fd5b506102d1610657366004611ec5565b611316565b60006001600160e01b031982166380ac58cd60e01b148061068d57506001600160e01b03198216635b5e139f60e01b145b806106a857506001600160e01b0319821663780e9d6360e01b145b806106c357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546106d8906121d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610704906121d9565b80156107515780601f1061072657610100808354040283529160200191610751565b820191906000526020600020905b81548152906001019060200180831161073457829003601f168201915b5050505050905090565b6000610768826000541190565b6107cf5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006107f682610b8f565b9050806001600160a01b0316836001600160a01b031614156108655760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b60648201526084016107c6565b336001600160a01b0382161480610881575061088181336105ee565b6108f35760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c0000000000000060648201526084016107c6565b6108fe838383611345565b505050565b60006001600054610914919061222a565b905090565b6108fe8383836113a1565b6007546001600160a01b0316331461094e5760405162461bcd60e51b81526004016107c690612241565b600955565b600061095e83610bd3565b82106109b75760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b60648201526084016107c6565b60006109c1610903565b905060008060005b83811015610a6b576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610a1c57805192505b876001600160a01b0316836001600160a01b03161415610a585786841415610a4a575093506106c392505050565b83610a5481612276565b9450505b5080610a6381612276565b9150506109c9565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b60648201526084016107c6565b6108fe83838360405180602001604052806000815250611081565b6000610af0610903565b8210610b4a5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b60648201526084016107c6565b5090565b6007546001600160a01b03163314610b785760405162461bcd60e51b81526004016107c690612241565b8051610b8b90600a906020840190611d90565b5050565b6000610b9a826116e8565b5192915050565b6007546000906001600160a01b03163314610bce5760405162461bcd60e51b81526004016107c690612241565b504790565b60006001600160a01b038216610c3f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084016107c6565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6060600a80546106d8906121d9565b6007546001600160a01b03163314610c9d5760405162461bcd60e51b81526004016107c690612241565b610ca760006117c8565b565b6007546001600160a01b03163314610cd35760405162461bcd60e51b81526004016107c690612241565b4780610d175760405162461bcd60e51b8152602060048201526013602482015272496e737566666963656e742062616c616e636560681b60448201526064016107c6565b604080518082018252732616d07e7751ef337d39b166254d1d84f84f1157808252602080830191909152825160a0810184526032815260289181019190915261014a928101839052606081019290925260fa60808301529060005b60028163ffffffff161015610e17576000610d8f6001600261222a565b8263ffffffff1614610dda576103e8838363ffffffff1660058110610db657610db6612291565b6020020151610dcb9063ffffffff16876122a7565b610dd591906122dc565b610ddc565b475b9050610e04848363ffffffff1660028110610df957610df9612291565b60200201518261181a565b5080610e0f816122f0565b915050610d72565b50505050565b6060600280546106d8906121d9565b600b54600260ff9091161015610e7b5760405162461bcd60e51b815260206004820152601460248201527314d85b19481a185cc81b9bdd081cdd185c9d195960621b60448201526064016107c6565b60095481610e87610903565b610e919190612314565b1115610ef15760405162461bcd60e51b815260206004820152602960248201527f596f752063616e2774206d696e74206d6f7265207468656e2074686520746f74604482015268616c20737570706c7960b81b60648201526084016107c6565b600b54336000908152600c602052604090205460ff610100909204821691610f1b91849116612314565b1115610f5d5760405162461bcd60e51b8152602060048201526011602482015270109d5e481b1a5b5a5d081c995858da1959607a1b60448201526064016107c6565b80600854610f6b91906122a7565b341015610faf5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016107c6565b610fb933826118bd565b50565b6001600160a01b0382163314156110155760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c657200000000000060448201526064016107c6565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61108c8484846113a1565b611098848484846118d7565b610e175760405162461bcd60e51b81526004016107c69061232c565b6007546001600160a01b031633146110de5760405162461bcd60e51b81526004016107c690612241565b60005b82811015610e17576111198484838181106110fe576110fe612291565b90506020020160208101906111139190612035565b836118bd565b8061112381612276565b9150506110e1565b6007546001600160a01b031633146111555760405162461bcd60e51b81526004016107c690612241565b600b805460ff191660ff92909216919091179055565b6060611178826000541190565b6111dc5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107c6565b6000600a80546111eb906121d9565b90501161120757604051806020016040528060008152506106c3565b600a611212836119d6565b60405160200161122392919061239b565b60405160208183030381529060405292915050565b6007546001600160a01b031633146112625760405162461bcd60e51b81526004016107c690612241565b600b805460ff9092166101000261ff0019909216919091179055565b6007546001600160a01b031633146112a85760405162461bcd60e51b81526004016107c690612241565b6001600160a01b03811661130d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107c6565b610fb9816117c8565b6007546001600160a01b031633146113405760405162461bcd60e51b81526004016107c690612241565b600855565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006113ac826116e8565b80519091506000906001600160a01b0316336001600160a01b031614806113e35750336113d88461075b565b6001600160a01b0316145b806113f5575081516113f590336105ee565b90508061145f5760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016107c6565b846001600160a01b031682600001516001600160a01b0316146114d35760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b60648201526084016107c6565b6001600160a01b0384166115375760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107c6565b6115476000848460000151611345565b6001600160a01b03858116600090815260046020908152604080832080546fffffffffffffffffffffffffffffffff198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255825180840184529182524267ffffffffffffffff9081168386019081528a8752600390955292852091518254945196166001600160e01b031990941693909317600160a01b9590921694909402179092559061160c908590612314565b6000818152600360205260409020549091506001600160a01b031661169e57611636816000541190565b1561169e5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b6040805180820190915260008082526020820152611707826000541190565b6117665760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b60648201526084016107c6565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156117b5579392505050565b50806117c081612456565b915050611768565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611867576040519150601f19603f3d011682016040523d82523d6000602084013e61186c565b606091505b50509050806108fe5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f207769746864726177204574686572000000000000000060448201526064016107c6565b610b8b828260405180602001604052806000815250611ad4565b60006001600160a01b0384163b156119ca57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061191b90339089908890889060040161246d565b6020604051808303816000875af1925050508015611956575060408051601f3d908101601f19168201909252611953918101906124aa565b60015b6119b0573d808015611984576040519150601f19603f3d011682016040523d82523d6000602084013e611989565b606091505b5080516119a85760405162461bcd60e51b81526004016107c69061232c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119ce565b5060015b949350505050565b6060816119fa5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a245780611a0e81612276565b9150611a1d9050600a836122dc565b91506119fe565b60008167ffffffffffffffff811115611a3f57611a3f611f60565b6040519080825280601f01601f191660200182016040528015611a69576020820181803683370190505b5090505b84156119ce57611a7e60018361222a565b9150611a8b600a866124c7565b611a96906030612314565b60f81b818381518110611aab57611aab612291565b60200101906001600160f81b031916908160001a905350611acd600a866122dc565b9450611a6d565b6000546001600160a01b038416611b375760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107c6565b611b42816000541190565b15611b8f5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e74656400000060448201526064016107c6565b60008311611beb5760405162461bcd60e51b815260206004820152602360248201527f455243373231413a207175616e74697479206d7573742062652067726561746560448201526207220360ec1b60648201526084016107c6565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190611c479087906124db565b6001600160801b03168152602001858360200151611c6591906124db565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b0297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015611d855760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611d4960008884886118d7565b611d655760405162461bcd60e51b81526004016107c69061232c565b81611d6f81612276565b9250508080611d7d90612276565b915050611cfc565b5060008190556116e0565b828054611d9c906121d9565b90600052602060002090601f016020900481019282611dbe5760008555611e04565b82601f10611dd757805160ff1916838001178555611e04565b82800160010185558215611e04579182015b82811115611e04578251825591602001919060010190611de9565b50610b4a9291505b80821115610b4a5760008155600101611e0c565b6001600160e01b031981168114610fb957600080fd5b600060208284031215611e4857600080fd5b8135611e5381611e20565b9392505050565b60005b83811015611e75578181015183820152602001611e5d565b83811115610e175750506000910152565b60008151808452611e9e816020860160208601611e5a565b601f01601f19169290920160200192915050565b602081526000611e536020830184611e86565b600060208284031215611ed757600080fd5b5035919050565b80356001600160a01b0381168114611ef557600080fd5b919050565b60008060408385031215611f0d57600080fd5b611f1683611ede565b946020939093013593505050565b600080600060608486031215611f3957600080fd5b611f4284611ede565b9250611f5060208501611ede565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611f9157611f91611f60565b604051601f8501601f19908116603f01168101908282118183101715611fb957611fb9611f60565b81604052809350858152868686011115611fd257600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611ffe57600080fd5b813567ffffffffffffffff81111561201557600080fd5b8201601f8101841361202657600080fd5b6119ce84823560208401611f76565b60006020828403121561204757600080fd5b611e5382611ede565b6000806040838503121561206357600080fd5b61206c83611ede565b91506020830135801515811461208157600080fd5b809150509250929050565b600080600080608085870312156120a257600080fd5b6120ab85611ede565b93506120b960208601611ede565b925060408501359150606085013567ffffffffffffffff8111156120dc57600080fd5b8501601f810187136120ed57600080fd5b6120fc87823560208401611f76565b91505092959194509250565b60008060006040848603121561211d57600080fd5b833567ffffffffffffffff8082111561213557600080fd5b818601915086601f83011261214957600080fd5b81358181111561215857600080fd5b8760208260051b850101111561216d57600080fd5b6020928301989097509590910135949350505050565b60006020828403121561219557600080fd5b813560ff81168114611e5357600080fd5b600080604083850312156121b957600080fd5b6121c283611ede565b91506121d060208401611ede565b90509250929050565b600181811c908216806121ed57607f821691505b6020821081141561220e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561223c5761223c612214565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060001982141561228a5761228a612214565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156122c1576122c1612214565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826122eb576122eb6122c6565b500490565b600063ffffffff8083168181141561230a5761230a612214565b6001019392505050565b6000821982111561232757612327612214565b500190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008151612391818560208601611e5a565b9290920192915050565b600080845481600182811c9150808316806123b757607f831692505b60208084108214156123d757634e487b7160e01b86526022600452602486fd5b8180156123eb57600181146123fc57612429565b60ff19861689528489019650612429565b60008b81526020902060005b868110156124215781548b820152908501908301612408565b505084890196505b50505050505061244d61243c828661237f565b64173539b7b760d91b815260050190565b95945050505050565b60008161246557612465612214565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124a090830184611e86565b9695505050505050565b6000602082840312156124bc57600080fd5b8151611e5381611e20565b6000826124d6576124d66122c6565b500690565b60006001600160801b038083168185168083038211156124fd576124fd612214565b0194935050505056fea2646970667358221220dc3060b8ba3b9bafb2116dcd611025d2814fb574375398c014327d3c799564a364736f6c634300080c0033

Deployed Bytecode Sourcemap

41380:3047:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24309:372;;;;;;;;;;-1:-1:-1;24309:372:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;24309:372:0;;;;;;;;41496:28;;;;;;;;;;;;;;;;;;;738:25:1;;;726:2;711:18;41496:28:0;592:177:1;25936:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27497:214::-;;;;;;;;;;-1:-1:-1;27497:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1896:32:1;;;1878:51;;1866:2;1851:18;27497:214:0;1732:203:1;27018:413:0;;;;;;;;;;-1:-1:-1;27018:413:0;;;;;:::i;:::-;;:::i;:::-;;22746:104;;;;;;;;;;;;;:::i;28373:162::-;;;;;;;;;;-1:-1:-1;28373:162:0;;;;;:::i;:::-;;:::i;43234:91::-;;;;;;;;;;-1:-1:-1;43234:91:0;;;;;:::i;:::-;;:::i;23414:823::-;;;;;;;;;;-1:-1:-1;23414:823:0;;;;;:::i;:::-;;:::i;28606:177::-;;;;;;;;;;-1:-1:-1;28606:177:0;;;;;:::i;:::-;;:::i;22927:187::-;;;;;;;;;;-1:-1:-1;22927:187:0;;;;;:::i;:::-;;:::i;42857:94::-;;;;;;;;;;-1:-1:-1;42857:94:0;;;;;:::i;:::-;;:::i;25745:124::-;;;;;;;;;;-1:-1:-1;25745:124:0;;;;;:::i;:::-;;:::i;41453:38::-;;;;;;;;;;;;;;;;43337:114;;;;;;;;;;;;;:::i;24745:221::-;;;;;;;;;;-1:-1:-1;24745:221:0;;;;;:::i;:::-;;:::i;41637:23::-;;;;;;;;;;-1:-1:-1;41637:23:0;;;;;;;;;;;;;;4298:4:1;4286:17;;;4268:36;;4256:2;4241:18;41637:23:0;4126:184:1;42666:85:0;;;;;;;;;;;;;:::i;38010:103::-;;;;;;;;;;;;;:::i;43457:733::-;;;;;;;;;;;;;:::i;37359:87::-;;;;;;;;;;-1:-1:-1;37432:6:0;;-1:-1:-1;;;;;37432:6:0;37359:87;;26105:104;;;;;;;;;;;;;:::i;42267:391::-;;;;;;:::i;:::-;;:::i;27783:288::-;;;;;;;;;;-1:-1:-1;27783:288:0;;;;;:::i;:::-;;:::i;41610:22::-;;;;;;;;;;-1:-1:-1;41610:22:0;;;;;;;;28854:355;;;;;;;;;;-1:-1:-1;28854:355:0;;;;;:::i;:::-;;:::i;42072:189::-;;;;;;;;;;-1:-1:-1;42072:189:0;;;;;:::i;:::-;;:::i;43062:76::-;;;;;;;;;;-1:-1:-1;43062:76:0;;;;;:::i;:::-;;:::i;41778:288::-;;;;;;;;;;-1:-1:-1;41778:288:0;;;;;:::i;:::-;;:::i;43144:84::-;;;;;;;;;;-1:-1:-1;43144:84:0;;;;;:::i;:::-;;:::i;41669:44::-;;;;;;;;;;-1:-1:-1;41669:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28142:164;;;;;;;;;;-1:-1:-1;28142:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;28263:25:0;;;28239:4;28263:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28142:164;38268:201;;;;;;;;;;-1:-1:-1;38268:201:0;;;;;:::i;:::-;;:::i;42957:95::-;;;;;;;;;;-1:-1:-1;42957:95:0;;;;;:::i;:::-;;:::i;24309:372::-;24411:4;-1:-1:-1;;;;;;24448:40:0;;-1:-1:-1;;;24448:40:0;;:105;;-1:-1:-1;;;;;;;24505:48:0;;-1:-1:-1;;;24505:48:0;24448:105;:172;;;-1:-1:-1;;;;;;;24570:50:0;;-1:-1:-1;;;24570:50:0;24448:172;:225;;;-1:-1:-1;;;;;;;;;;13230:40:0;;;24637:36;24428:245;24309:372;-1:-1:-1;;24309:372:0:o;25936:100::-;25990:13;26023:5;26016:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25936:100;:::o;27497:214::-;27565:7;27593:16;27601:7;29521:4;29555:12;-1:-1:-1;29545:22:0;29464:111;27593:16;27585:74;;;;-1:-1:-1;;;27585:74:0;;7159:2:1;27585:74:0;;;7141:21:1;7198:2;7178:18;;;7171:30;7237:34;7217:18;;;7210:62;-1:-1:-1;;;7288:18:1;;;7281:43;7341:19;;27585:74:0;;;;;;;;;-1:-1:-1;27679:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27679:24:0;;27497:214::o;27018:413::-;27091:13;27107:24;27123:7;27107:15;:24::i;:::-;27091:40;;27156:5;-1:-1:-1;;;;;27150:11:0;:2;-1:-1:-1;;;;;27150:11:0;;;27142:58;;;;-1:-1:-1;;;27142:58:0;;7573:2:1;27142:58:0;;;7555:21:1;7612:2;7592:18;;;7585:30;7651:34;7631:18;;;7624:62;-1:-1:-1;;;7702:18:1;;;7695:32;7744:19;;27142:58:0;7371:398:1;27142:58:0;20792:10;-1:-1:-1;;;;;27235:21:0;;;;:62;;-1:-1:-1;27260:37:0;27277:5;20792:10;28142:164;:::i;27260:37::-;27213:169;;;;-1:-1:-1;;;27213:169:0;;7976:2:1;27213:169:0;;;7958:21:1;8015:2;7995:18;;;7988:30;8054:34;8034:18;;;8027:62;8125:27;8105:18;;;8098:55;8170:19;;27213:169:0;7774:421:1;27213:169:0;27395:28;27404:2;27408:7;27417:5;27395:8;:28::i;:::-;27080:351;27018:413;;:::o;22746:104::-;22799:7;22841:1;22826:12;;:16;;;;:::i;:::-;22819:23;;22746:104;:::o;28373:162::-;28499:28;28509:4;28515:2;28519:7;28499:9;:28::i;43234:91::-;37432:6;;-1:-1:-1;;;;;37432:6:0;20792:10;37579:23;37571:68;;;;-1:-1:-1;;;37571:68:0;;;;;;;:::i;:::-;43303:6:::1;:16:::0;43234:91::o;23414:823::-;23503:7;23539:16;23549:5;23539:9;:16::i;:::-;23531:5;:24;23523:71;;;;-1:-1:-1;;;23523:71:0;;9025:2:1;23523:71:0;;;9007:21:1;9064:2;9044:18;;;9037:30;9103:34;9083:18;;;9076:62;-1:-1:-1;;;9154:18:1;;;9147:32;9196:19;;23523:71:0;8823:398:1;23523:71:0;23605:22;23630:13;:11;:13::i;:::-;23605:38;;23654:19;23688:25;23742:9;23737:426;23761:14;23757:1;:18;23737:426;;;23797:31;23831:14;;;:11;:14;;;;;;;;;23797:48;;;;;;;;;-1:-1:-1;;;;;23797:48:0;;;;;-1:-1:-1;;;23797:48:0;;;;;;;;;;;;23864:28;23860:103;;23933:14;;;-1:-1:-1;23860:103:0;24002:5;-1:-1:-1;;;;;23981:26:0;:17;-1:-1:-1;;;;;23981:26:0;;23977:175;;;24047:5;24032:11;:20;24028:77;;;-1:-1:-1;24084:1:0;-1:-1:-1;24077:8:0;;-1:-1:-1;;;24077:8:0;24028:77;24123:13;;;;:::i;:::-;;;;23977:175;-1:-1:-1;23777:3:0;;;;:::i;:::-;;;;23737:426;;;-1:-1:-1;24173:56:0;;-1:-1:-1;;;24173:56:0;;9568:2:1;24173:56:0;;;9550:21:1;9607:2;9587:18;;;9580:30;9646:34;9626:18;;;9619:62;-1:-1:-1;;;9697:18:1;;;9690:44;9751:19;;24173:56:0;9366:410:1;28606:177:0;28736:39;28753:4;28759:2;28763:7;28736:39;;;;;;;;;;;;:16;:39::i;22927:187::-;22994:7;23030:13;:11;:13::i;:::-;23022:5;:21;23014:69;;;;-1:-1:-1;;;23014:69:0;;9983:2:1;23014:69:0;;;9965:21:1;10022:2;10002:18;;;9995:30;10061:34;10041:18;;;10034:62;-1:-1:-1;;;10112:18:1;;;10105:33;10155:19;;23014:69:0;9781:399:1;23014:69:0;-1:-1:-1;23101:5:0;22927:187::o;42857:94::-;37432:6;;-1:-1:-1;;;;;37432:6:0;20792:10;37579:23;37571:68;;;;-1:-1:-1;;;37571:68:0;;;;;;;:::i;:::-;42927:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;42857:94:::0;:::o;25745:124::-;25809:7;25836:20;25848:7;25836:11;:20::i;:::-;:25;;25745:124;-1:-1:-1;;25745:124:0:o;43337:114::-;37432:6;;43401:7;;-1:-1:-1;;;;;37432:6:0;20792:10;37579:23;37571:68;;;;-1:-1:-1;;;37571:68:0;;;;;;;:::i;:::-;-1:-1:-1;43424:21:0::1;43337:114:::0;:::o;24745:221::-;24809:7;-1:-1:-1;;;;;24837:19:0;;24829:75;;;;-1:-1:-1;;;24829:75:0;;10387:2:1;24829:75:0;;;10369:21:1;10426:2;10406:18;;;10399:30;10465:34;10445:18;;;10438:62;-1:-1:-1;;;10516:18:1;;;10509:41;10567:19;;24829:75:0;10185:407:1;24829:75:0;-1:-1:-1;;;;;;24930:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;24930:27:0;;24745:221::o;42666:85::-;42709:13;42738:7;42731:14;;;;;:::i;38010:103::-;37432:6;;-1:-1:-1;;;;;37432:6:0;20792:10;37579:23;37571:68;;;;-1:-1:-1;;;37571:68:0;;;;;;;:::i;:::-;38075:30:::1;38102:1;38075:18;:30::i;:::-;38010:103::o:0;43457:733::-;37432:6;;-1:-1:-1;;;;;37432:6:0;20792:10;37579:23;37571:68;;;;-1:-1:-1;;;37571:68:0;;;;;;;:::i;:::-;43527:21:::1;43567:11:::0;43559:43:::1;;;::::0;-1:-1:-1;;;43559:43:0;;10799:2:1;43559:43:0::1;::::0;::::1;10781:21:1::0;10838:2;10818:18;;;10811:30;-1:-1:-1;;;10857:18:1;;;10850:49;10916:18;;43559:43:0::1;10597:343:1::0;43559:43:0::1;43623:156;::::0;;;;::::1;::::0;;43668:42:::1;43623:156:::0;;;::::1;::::0;;::::1;::::0;;;;43792:165;;::::1;::::0;::::1;::::0;;43840:2:::1;43792:165:::0;;43865:2:::1;43792:165:::0;;::::1;::::0;;;;43890:3:::1;43792:165:::0;;;;;;;;;;;;;43942:3:::1;43792:165:::0;;;;43623:156;:27:::1;43970:215;43993:16;43989:1;:20;;;43970:215;;;44031:14;44053:20;44072:1;44053:16;:20;:::i;:::-;44048:1;:25;;;:78;;44122:4;44110:6;44117:1;44110:9;;;;;;;;;:::i;:::-;;;;::::0;44100:19:::1;::::0;::::1;;:7:::0;:19:::1;:::i;:::-;:26;;;;:::i;:::-;44048:78;;;44076:21;44048:78;44031:95;;44141:32;44152:9;44162:1;44152:12;;;;;;;;;:::i;:::-;;;;;44166:6;44141:10;:32::i;:::-;-1:-1:-1::0;44011:3:0;::::1;::::0;::::1;:::i;:::-;;;;43970:215;;;;43498:692;;;43457:733::o:0;26105:104::-;26161:13;26194:7;26187:14;;;;;:::i;42267:391::-;42331:5;;42340:1;42331:5;;;;:10;;42323:43;;;;-1:-1:-1;;;42323:43:0;;11915:2:1;42323:43:0;;;11897:21:1;11954:2;11934:18;;;11927:30;-1:-1:-1;;;11973:18:1;;;11966:50;12033:18;;42323:43:0;11713:344:1;42323:43:0;42409:6;;42397:8;42381:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:34;;42373:88;;;;-1:-1:-1;;;42373:88:0;;12397:2:1;42373:88:0;;;12379:21:1;12436:2;12416:18;;;12409:30;12475:34;12455:18;;;12448:62;-1:-1:-1;;;12526:18:1;;;12519:39;12575:19;;42373:88:0;12195:405:1;42373:88:0;42513:6;;42487:10;42476:22;;;;:10;:22;;;;;;42513:6;;;;;;;;42476:33;;42501:8;;42476:22;:33;:::i;:::-;:43;;42468:73;;;;-1:-1:-1;;;42468:73:0;;12807:2:1;42468:73:0;;;12789:21:1;12846:2;12826:18;;;12819:30;-1:-1:-1;;;12865:18:1;;;12858:47;12922:18;;42468:73:0;12605:341:1;42468:73:0;42581:8;42569:9;;:20;;;;:::i;:::-;42556:9;:33;;42548:64;;;;-1:-1:-1;;;42548:64:0;;13153:2:1;42548:64:0;;;13135:21:1;13192:2;13172:18;;;13165:30;-1:-1:-1;;;13211:18:1;;;13204:48;13269:18;;42548:64:0;12951:342:1;42548:64:0;42621:31;42631:10;42643:8;42621:9;:31::i;:::-;42267:391;:::o;27783:288::-;-1:-1:-1;;;;;27878:24:0;;20792:10;27878:24;;27870:63;;;;-1:-1:-1;;;27870:63:0;;13500:2:1;27870:63:0;;;13482:21:1;13539:2;13519:18;;;13512:30;13578:28;13558:18;;;13551:56;13624:18;;27870:63:0;13298:350:1;27870:63:0;20792:10;27946:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27946:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;27946:53:0;;;;;;;;;;28015:48;;540:41:1;;;27946:42:0;;20792:10;28015:48;;513:18:1;28015:48:0;;;;;;;27783:288;;:::o;28854:355::-;29013:28;29023:4;29029:2;29033:7;29013:9;:28::i;:::-;29074:48;29097:4;29103:2;29107:7;29116:5;29074:22;:48::i;:::-;29052:149;;;;-1:-1:-1;;;29052:149:0;;;;;;;:::i;42072:189::-;37432:6;;-1:-1:-1;;;;;37432:6:0;20792:10;37579:23;37571:68;;;;-1:-1:-1;;;37571:68:0;;;;;;;:::i;:::-;42169:6:::1;42164:92;42179:19:::0;;::::1;42164:92;;;42214:34;42224:10;;42235:1;42224:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;42239:8;42214:9;:34::i;:::-;42200:3:::0;::::1;::::0;::::1;:::i;:::-;;;;42164:92;;43062:76:::0;37432:6;;-1:-1:-1;;;;;37432:6:0;20792:10;37579:23;37571:68;;;;-1:-1:-1;;;37571:68:0;;;;;;;:::i;:::-;43118:5:::1;:14:::0;;-1:-1:-1;;43118:14:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;43062:76::o;41778:288::-;41851:13;41881:16;41889:7;29521:4;29555:12;-1:-1:-1;29545:22:0;29464:111;41881:16;41873:76;;;;-1:-1:-1;;;41873:76:0;;14275:2:1;41873:76:0;;;14257:21:1;14314:2;14294:18;;;14287:30;14353:34;14333:18;;;14326:62;-1:-1:-1;;;14404:18:1;;;14397:45;14459:19;;41873:76:0;14073:411:1;41873:76:0;41989:1;41971:7;41965:21;;;;;:::i;:::-;;;:25;:95;;;;;;;;;;;;;;;;;42017:7;42026:18;:7;:16;:18::i;:::-;42000:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41958:102;41778:288;-1:-1:-1;;41778:288:0:o;43144:84::-;37432:6;;-1:-1:-1;;;;;37432:6:0;20792:10;37579:23;37571:68;;;;-1:-1:-1;;;37571:68:0;;;;;;;:::i;:::-;43206:6:::1;:16:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;43206:16:0;;::::1;::::0;;;::::1;::::0;;43144:84::o;38268:201::-;37432:6;;-1:-1:-1;;;;;37432:6:0;20792:10;37579:23;37571:68;;;;-1:-1:-1;;;37571:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38357:22:0;::::1;38349:73;;;::::0;-1:-1:-1;;;38349:73:0;;16431:2:1;38349:73:0::1;::::0;::::1;16413:21:1::0;16470:2;16450:18;;;16443:30;16509:34;16489:18;;;16482:62;-1:-1:-1;;;16560:18:1;;;16553:36;16606:19;;38349:73:0::1;16229:402:1::0;38349:73:0::1;38433:28;38452:8;38433:18;:28::i;42957:95::-:0;37432:6;;-1:-1:-1;;;;;37432:6:0;20792:10;37579:23;37571:68;;;;-1:-1:-1;;;37571:68:0;;;;;;;:::i;:::-;43025:9:::1;:21:::0;42957:95::o;33508:196::-;33623:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;33623:29:0;-1:-1:-1;;;;;33623:29:0;;;;;;;;;33668:28;;33623:24;;33668:28;;;;;;;33508:196;;;:::o;31607:1783::-;31722:35;31760:20;31772:7;31760:11;:20::i;:::-;31835:18;;31722:58;;-1:-1:-1;31793:22:0;;-1:-1:-1;;;;;31819:34:0;20792:10;-1:-1:-1;;;;;31819:34:0;;:87;;;-1:-1:-1;20792:10:0;31870:20;31882:7;31870:11;:20::i;:::-;-1:-1:-1;;;;;31870:36:0;;31819:87;:154;;;-1:-1:-1;31940:18:0;;31923:50;;20792:10;28142:164;:::i;31923:50::-;31793:181;;31995:17;31987:80;;;;-1:-1:-1;;;31987:80:0;;16838:2:1;31987:80:0;;;16820:21:1;16877:2;16857:18;;;16850:30;16916:34;16896:18;;;16889:62;-1:-1:-1;;;16967:18:1;;;16960:48;17025:19;;31987:80:0;16636:414:1;31987:80:0;32110:4;-1:-1:-1;;;;;32088:26:0;:13;:18;;;-1:-1:-1;;;;;32088:26:0;;32080:77;;;;-1:-1:-1;;;32080:77:0;;17257:2:1;32080:77:0;;;17239:21:1;17296:2;17276:18;;;17269:30;17335:34;17315:18;;;17308:62;-1:-1:-1;;;17386:18:1;;;17379:36;17432:19;;32080:77:0;17055:402:1;32080:77:0;-1:-1:-1;;;;;32176:16:0;;32168:66;;;;-1:-1:-1;;;32168:66:0;;17664:2:1;32168:66:0;;;17646:21:1;17703:2;17683:18;;;17676:30;17742:34;17722:18;;;17715:62;-1:-1:-1;;;17793:18:1;;;17786:35;17838:19;;32168:66:0;17462:401:1;32168:66:0;32355:49;32372:1;32376:7;32385:13;:18;;;32355:8;:49::i;:::-;-1:-1:-1;;;;;32609:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;32609:31:0;;;-1:-1:-1;;;;;32609:31:0;;;-1:-1:-1;;32609:31:0;;;;;;;32655:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;32655:29:0;;;;;;;;;;;;;32731:43;;;;;;;;;;32757:15;32731:43;;;;;;;;;;32708:20;;;:11;:20;;;;;;:66;;;;;;;;-1:-1:-1;;;;;;32708:66:0;;;;;;;-1:-1:-1;;;32708:66:0;;;;;;;;;;;;32609:18;33036:11;;32708:20;;33036:11;:::i;:::-;33103:1;33062:24;;;:11;:24;;;;;:29;33014:33;;-1:-1:-1;;;;;;33062:29:0;33058:227;;33126:20;33134:11;29521:4;29555:12;-1:-1:-1;29545:22:0;29464:111;33126:20;33122:152;;;33194:64;;;;;;;;33209:18;;-1:-1:-1;;;;;33194:64:0;;;;;;33229:28;;;;33194:64;;;;;;;;;;-1:-1:-1;33167:24:0;;;:11;:24;;;;;;;:91;;;;;;;;;-1:-1:-1;;;33167:91:0;-1:-1:-1;;;;;;33167:91:0;;;;;;;;;;;;33122:152;33321:7;33317:2;-1:-1:-1;;;;;33302:27:0;33311:4;-1:-1:-1;;;;;33302:27:0;;;;;;;;;;;33340:42;31711:1679;;;31607:1783;;;:::o;25211:472::-;-1:-1:-1;;;;;;;;;;;;;;;;;25314:16:0;25322:7;29521:4;29555:12;-1:-1:-1;29545:22:0;29464:111;25314:16;25306:71;;;;-1:-1:-1;;;25306:71:0;;18070:2:1;25306:71:0;;;18052:21:1;18109:2;18089:18;;;18082:30;18148:34;18128:18;;;18121:62;-1:-1:-1;;;18199:18:1;;;18192:40;18249:19;;25306:71:0;17868:406:1;25306:71:0;25410:7;25390:216;25444:31;25478:17;;;:11;:17;;;;;;;;;25444:51;;;;;;;;;-1:-1:-1;;;;;25444:51:0;;;;;-1:-1:-1;;;25444:51:0;;;;;;;;;;;;25514:28;25510:85;;25570:9;25211:472;-1:-1:-1;;;25211:472:0:o;25510:85::-;-1:-1:-1;25421:6:0;;;;:::i;:::-;;;;25390:216;;38629:191;38722:6;;;-1:-1:-1;;;;;38739:17:0;;;-1:-1:-1;;;;;;38739:17:0;;;;;;;38772:40;;38722:6;;;38739:17;38722:6;;38772:40;;38703:16;;38772:40;38692:128;38629:191;:::o;44233:189::-;44308:12;44326:8;-1:-1:-1;;;;;44326:13:0;44348:7;44326:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44307:54;;;44380:7;44372:44;;;;-1:-1:-1;;;44372:44:0;;19248:2:1;44372:44:0;;;19230:21:1;19287:2;19267:18;;;19260:30;19326:26;19306:18;;;19299:54;19370:18;;44372:44:0;19046:348:1;29583:104:0;29652:27;29662:2;29666:8;29652:27;;;;;;;;;;;;:9;:27::i;34269:804::-;34424:4;-1:-1:-1;;;;;34445:13:0;;3300:20;3348:8;34441:625;;34481:72;;-1:-1:-1;;;34481:72:0;;-1:-1:-1;;;;;34481:36:0;;;;;:72;;20792:10;;34532:4;;34538:7;;34547:5;;34481:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34481:72:0;;;;;;;;-1:-1:-1;;34481:72:0;;;;;;;;;;;;:::i;:::-;;;34477:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34727:13:0;;34723:273;;34770:61;;-1:-1:-1;;;34770:61:0;;;;;;;:::i;34723:273::-;34946:6;34940:13;34931:6;34927:2;34923:15;34916:38;34477:534;-1:-1:-1;;;;;;34604:55:0;-1:-1:-1;;;34604:55:0;;-1:-1:-1;34597:62:0;;34441:625;-1:-1:-1;35050:4:0;34441:625;34269:804;;;;;;:::o;398:723::-;454:13;675:10;671:53;;-1:-1:-1;;702:10:0;;;;;;;;;;;;-1:-1:-1;;;702:10:0;;;;;398:723::o;671:53::-;749:5;734:12;790:78;797:9;;790:78;;823:8;;;;:::i;:::-;;-1:-1:-1;846:10:0;;-1:-1:-1;854:2:0;846:10;;:::i;:::-;;;790:78;;;878:19;910:6;900:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;900:17:0;;878:39;;928:154;935:10;;928:154;;962:11;972:1;962:11;;:::i;:::-;;-1:-1:-1;1031:10:0;1039:2;1031:5;:10;:::i;:::-;1018:24;;:2;:24;:::i;:::-;1005:39;;988:6;995;988:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;988:56:0;;;;;;;;-1:-1:-1;1059:11:0;1068:2;1059:11;;:::i;:::-;;;928:154;;29964:1389;30087:20;30110:12;-1:-1:-1;;;;;30141:16:0;;30133:62;;;;-1:-1:-1;;;30133:62:0;;20477:2:1;30133:62:0;;;20459:21:1;20516:2;20496:18;;;20489:30;20555:34;20535:18;;;20528:62;-1:-1:-1;;;20606:18:1;;;20599:31;20647:19;;30133:62:0;20275:397:1;30133:62:0;30340:21;30348:12;29521:4;29555:12;-1:-1:-1;29545:22:0;29464:111;30340:21;30339:22;30331:64;;;;-1:-1:-1;;;30331:64:0;;20879:2:1;30331:64:0;;;20861:21:1;20918:2;20898:18;;;20891:30;20957:31;20937:18;;;20930:59;21006:18;;30331:64:0;20677:353:1;30331:64:0;30425:1;30414:8;:12;30406:60;;;;-1:-1:-1;;;30406:60:0;;21237:2:1;30406:60:0;;;21219:21:1;21276:2;21256:18;;;21249:30;21315:34;21295:18;;;21288:62;-1:-1:-1;;;21366:18:1;;;21359:33;21409:19;;30406:60:0;21035:399:1;30406:60:0;-1:-1:-1;;;;;30586:16:0;;30553:30;30586:16;;;:12;:16;;;;;;;;;30553:49;;;;;;;;;-1:-1:-1;;;;;30553:49:0;;;;;-1:-1:-1;;;30553:49:0;;;;;;;;;;;30632:135;;;;;;;;30658:19;;30553:49;;30632:135;;;30658:39;;30688:8;;30658:39;:::i;:::-;-1:-1:-1;;;;;30632:135:0;;;;;30747:8;30712:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;30632:135:0;;;;;;-1:-1:-1;;;;;30613:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;30613:154:0;;;;;;;;;;;;30806:43;;;;;;;;;;;30832:15;30806:43;;;;;;;;30778:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;30778:71:0;-1:-1:-1;;;;;;30778:71:0;;;;;;;;;;;;;;;;;;30790:12;;30910:325;30934:8;30930:1;:12;30910:325;;;30969:38;;30994:12;;-1:-1:-1;;;;;30969:38:0;;;30986:1;;30969:38;;30986:1;;30969:38;31048:59;31079:1;31083:2;31087:12;31101:5;31048:22;:59::i;:::-;31022:172;;;;-1:-1:-1;;;31022:172:0;;;;;;;:::i;:::-;31209:14;;;;:::i;:::-;;;;30944:3;;;;;:::i;:::-;;;;30910:325;;;-1:-1:-1;31247:12:0;:27;;;31285:60;43457:733;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:1;1004:16;;997:27;774:258::o;1037:269::-;1090:3;1128:5;1122:12;1155:6;1150:3;1143:19;1171:63;1227:6;1220:4;1215:3;1211:14;1204:4;1197:5;1193:16;1171:63;:::i;:::-;1288:2;1267:15;-1:-1:-1;;1263:29:1;1254:39;;;;1295:4;1250:50;;1037:269;-1:-1:-1;;1037:269:1:o;1311:231::-;1460:2;1449:9;1442:21;1423:4;1480:56;1532:2;1521:9;1517:18;1509:6;1480:56;:::i;1547:180::-;1606:6;1659:2;1647:9;1638:7;1634:23;1630:32;1627:52;;;1675:1;1672;1665:12;1627:52;-1:-1:-1;1698:23:1;;1547:180;-1:-1:-1;1547:180:1:o;1940:173::-;2008:20;;-1:-1:-1;;;;;2057:31:1;;2047:42;;2037:70;;2103:1;2100;2093:12;2037:70;1940:173;;;:::o;2118:254::-;2186:6;2194;2247:2;2235:9;2226:7;2222:23;2218:32;2215:52;;;2263:1;2260;2253:12;2215:52;2286:29;2305:9;2286:29;:::i;:::-;2276:39;2362:2;2347:18;;;;2334:32;;-1:-1:-1;;;2118:254:1:o;2377:328::-;2454:6;2462;2470;2523:2;2511:9;2502:7;2498:23;2494:32;2491:52;;;2539:1;2536;2529:12;2491:52;2562:29;2581:9;2562:29;:::i;:::-;2552:39;;2610:38;2644:2;2633:9;2629:18;2610:38;:::i;:::-;2600:48;;2695:2;2684:9;2680:18;2667:32;2657:42;;2377:328;;;;;:::o;2710:127::-;2771:10;2766:3;2762:20;2759:1;2752:31;2802:4;2799:1;2792:15;2826:4;2823:1;2816:15;2842:632;2907:5;2937:18;2978:2;2970:6;2967:14;2964:40;;;2984:18;;:::i;:::-;3059:2;3053:9;3027:2;3113:15;;-1:-1:-1;;3109:24:1;;;3135:2;3105:33;3101:42;3089:55;;;3159:18;;;3179:22;;;3156:46;3153:72;;;3205:18;;:::i;:::-;3245:10;3241:2;3234:22;3274:6;3265:15;;3304:6;3296;3289:22;3344:3;3335:6;3330:3;3326:16;3323:25;3320:45;;;3361:1;3358;3351:12;3320:45;3411:6;3406:3;3399:4;3391:6;3387:17;3374:44;3466:1;3459:4;3450:6;3442;3438:19;3434:30;3427:41;;;;2842:632;;;;;:::o;3479:451::-;3548:6;3601:2;3589:9;3580:7;3576:23;3572:32;3569:52;;;3617:1;3614;3607:12;3569:52;3657:9;3644:23;3690:18;3682:6;3679:30;3676:50;;;3722:1;3719;3712:12;3676:50;3745:22;;3798:4;3790:13;;3786:27;-1:-1:-1;3776:55:1;;3827:1;3824;3817:12;3776:55;3850:74;3916:7;3911:2;3898:16;3893:2;3889;3885:11;3850:74;:::i;3935:186::-;3994:6;4047:2;4035:9;4026:7;4022:23;4018:32;4015:52;;;4063:1;4060;4053:12;4015:52;4086:29;4105:9;4086:29;:::i;4315:347::-;4380:6;4388;4441:2;4429:9;4420:7;4416:23;4412:32;4409:52;;;4457:1;4454;4447:12;4409:52;4480:29;4499:9;4480:29;:::i;:::-;4470:39;;4559:2;4548:9;4544:18;4531:32;4606:5;4599:13;4592:21;4585:5;4582:32;4572:60;;4628:1;4625;4618:12;4572:60;4651:5;4641:15;;;4315:347;;;;;:::o;4667:667::-;4762:6;4770;4778;4786;4839:3;4827:9;4818:7;4814:23;4810:33;4807:53;;;4856:1;4853;4846:12;4807:53;4879:29;4898:9;4879:29;:::i;:::-;4869:39;;4927:38;4961:2;4950:9;4946:18;4927:38;:::i;:::-;4917:48;;5012:2;5001:9;4997:18;4984:32;4974:42;;5067:2;5056:9;5052:18;5039:32;5094:18;5086:6;5083:30;5080:50;;;5126:1;5123;5116:12;5080:50;5149:22;;5202:4;5194:13;;5190:27;-1:-1:-1;5180:55:1;;5231:1;5228;5221:12;5180:55;5254:74;5320:7;5315:2;5302:16;5297:2;5293;5289:11;5254:74;:::i;:::-;5244:84;;;4667:667;;;;;;;:::o;5339:689::-;5434:6;5442;5450;5503:2;5491:9;5482:7;5478:23;5474:32;5471:52;;;5519:1;5516;5509:12;5471:52;5559:9;5546:23;5588:18;5629:2;5621:6;5618:14;5615:34;;;5645:1;5642;5635:12;5615:34;5683:6;5672:9;5668:22;5658:32;;5728:7;5721:4;5717:2;5713:13;5709:27;5699:55;;5750:1;5747;5740:12;5699:55;5790:2;5777:16;5816:2;5808:6;5805:14;5802:34;;;5832:1;5829;5822:12;5802:34;5887:7;5880:4;5870:6;5867:1;5863:14;5859:2;5855:23;5851:34;5848:47;5845:67;;;5908:1;5905;5898:12;5845:67;5939:4;5931:13;;;;5963:6;;-1:-1:-1;6001:20:1;;;;5988:34;;5339:689;-1:-1:-1;;;;5339:689:1:o;6033:269::-;6090:6;6143:2;6131:9;6122:7;6118:23;6114:32;6111:52;;;6159:1;6156;6149:12;6111:52;6198:9;6185:23;6248:4;6241:5;6237:16;6230:5;6227:27;6217:55;;6268:1;6265;6258:12;6307:260;6375:6;6383;6436:2;6424:9;6415:7;6411:23;6407:32;6404:52;;;6452:1;6449;6442:12;6404:52;6475:29;6494:9;6475:29;:::i;:::-;6465:39;;6523:38;6557:2;6546:9;6542:18;6523:38;:::i;:::-;6513:48;;6307:260;;;;;:::o;6572:380::-;6651:1;6647:12;;;;6694;;;6715:61;;6769:4;6761:6;6757:17;6747:27;;6715:61;6822:2;6814:6;6811:14;6791:18;6788:38;6785:161;;;6868:10;6863:3;6859:20;6856:1;6849:31;6903:4;6900:1;6893:15;6931:4;6928:1;6921:15;6785:161;;6572:380;;;:::o;8200:127::-;8261:10;8256:3;8252:20;8249:1;8242:31;8292:4;8289:1;8282:15;8316:4;8313:1;8306:15;8332:125;8372:4;8400:1;8397;8394:8;8391:34;;;8405:18;;:::i;:::-;-1:-1:-1;8442:9:1;;8332:125::o;8462:356::-;8664:2;8646:21;;;8683:18;;;8676:30;8742:34;8737:2;8722:18;;8715:62;8809:2;8794:18;;8462:356::o;9226:135::-;9265:3;-1:-1:-1;;9286:17:1;;9283:43;;;9306:18;;:::i;:::-;-1:-1:-1;9353:1:1;9342:13;;9226:135::o;10945:127::-;11006:10;11001:3;10997:20;10994:1;10987:31;11037:4;11034:1;11027:15;11061:4;11058:1;11051:15;11077:168;11117:7;11183:1;11179;11175:6;11171:14;11168:1;11165:21;11160:1;11153:9;11146:17;11142:45;11139:71;;;11190:18;;:::i;:::-;-1:-1:-1;11230:9:1;;11077:168::o;11250:127::-;11311:10;11306:3;11302:20;11299:1;11292:31;11342:4;11339:1;11332:15;11366:4;11363:1;11356:15;11382:120;11422:1;11448;11438:35;;11453:18;;:::i;:::-;-1:-1:-1;11487:9:1;;11382:120::o;11507:201::-;11545:3;11573:10;11618:2;11611:5;11607:14;11645:2;11636:7;11633:15;11630:41;;;11651:18;;:::i;:::-;11700:1;11687:15;;11507:201;-1:-1:-1;;;11507:201:1:o;12062:128::-;12102:3;12133:1;12129:6;12126:1;12123:13;12120:39;;;12139:18;;:::i;:::-;-1:-1:-1;12175:9:1;;12062:128::o;13653:415::-;13855:2;13837:21;;;13894:2;13874:18;;;13867:30;13933:34;13928:2;13913:18;;13906:62;-1:-1:-1;;;13999:2:1;13984:18;;13977:49;14058:3;14043:19;;13653:415::o;14615:185::-;14657:3;14695:5;14689:12;14710:52;14755:6;14750:3;14743:4;14736:5;14732:16;14710:52;:::i;:::-;14778:16;;;;;14615:185;-1:-1:-1;;14615:185:1:o;14923:1301::-;15200:3;15229:1;15262:6;15256:13;15292:3;15314:1;15342:9;15338:2;15334:18;15324:28;;15402:2;15391:9;15387:18;15424;15414:61;;15468:4;15460:6;15456:17;15446:27;;15414:61;15494:2;15542;15534:6;15531:14;15511:18;15508:38;15505:165;;;-1:-1:-1;;;15569:33:1;;15625:4;15622:1;15615:15;15655:4;15576:3;15643:17;15505:165;15686:18;15713:104;;;;15831:1;15826:320;;;;15679:467;;15713:104;-1:-1:-1;;15746:24:1;;15734:37;;15791:16;;;;-1:-1:-1;15713:104:1;;15826:320;14562:1;14555:14;;;14599:4;14586:18;;15921:1;15935:165;15949:6;15946:1;15943:13;15935:165;;;16027:14;;16014:11;;;16007:35;16070:16;;;;15964:10;;15935:165;;;15939:3;;16129:6;16124:3;16120:16;16113:23;;15679:467;;;;;;;16162:56;16187:30;16213:3;16205:6;16187:30;:::i;:::-;-1:-1:-1;;;14865:20:1;;14910:1;14901:11;;14805:113;16162:56;16155:63;14923:1301;-1:-1:-1;;;;;14923:1301:1:o;18279:136::-;18318:3;18346:5;18336:39;;18355:18;;:::i;:::-;-1:-1:-1;;;18391:18:1;;18279:136::o;19399:500::-;-1:-1:-1;;;;;19668:15:1;;;19650:34;;19720:15;;19715:2;19700:18;;19693:43;19767:2;19752:18;;19745:34;;;19815:3;19810:2;19795:18;;19788:31;;;19593:4;;19836:57;;19873:19;;19865:6;19836:57;:::i;:::-;19828:65;19399:500;-1:-1:-1;;;;;;19399:500:1:o;19904:249::-;19973:6;20026:2;20014:9;20005:7;20001:23;19997:32;19994:52;;;20042:1;20039;20032:12;19994:52;20074:9;20068:16;20093:30;20117:5;20093:30;:::i;20158:112::-;20190:1;20216;20206:35;;20221:18;;:::i;:::-;-1:-1:-1;20255:9:1;;20158:112::o;21439:253::-;21479:3;-1:-1:-1;;;;;21568:2:1;21565:1;21561:10;21598:2;21595:1;21591:10;21629:3;21625:2;21621:12;21616:3;21613:21;21610:47;;;21637:18;;:::i;:::-;21673:13;;21439:253;-1:-1:-1;;;;21439:253:1:o

Swarm Source

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