ETH Price: $3,267.09 (+0.18%)
Gas: 3 Gwei

Token

Evolved Camels (EC)
 

Overview

Max Total Supply

822 EC

Holders

226

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 EC
0xddd6578aaa0010808bb13b95c9838c440f8b682e
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Evolved Camels is a collection of 2,222 camels featuring top-tier art and focused on building The Oasis.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EvolvedCamels

Compiler Version
v0.8.9+commit.e5eed63a

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-01
*/

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

pragma solidity ^0.8.9;

/**
 * @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/Context.sol



pragma solidity ^0.8.9;

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

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

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



pragma solidity ^0.8.9;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.9;

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

pragma solidity ^0.8.9;

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



pragma solidity ^0.8.9;

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



pragma solidity ^0.8.9;


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



pragma solidity ^0.8.9;


/**
 * @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/IERC721Metadata.sol



pragma solidity ^0.8.9;


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

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

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


pragma solidity >=0.8.9;
// to enable certain compiler features



contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    
    //Mapping para atribuirle un URI para cada token
    mapping(uint256 => string) internal id_to_URI;

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {  }

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

pragma solidity ^0.8.9;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


pragma solidity ^0.8.9;

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

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


// Creator: Chiru Labs

pragma solidity ^0.8.9;

/**
 * @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 - 1 (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 currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @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;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.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);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; 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 virtual override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public 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 < currentIndex;
    }

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

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

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            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.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

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

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = 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 {}
}
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)


contract EvolvedCamels is ERC721A, Ownable {
    
    using Strings for uint256;
    
    //declares the maximum amount of tokens that can be minted, total and in presale
    uint256 public maxTotalTokens;
    
    //initial part of the URI for the metadata
    string private _currentBaseURI;
        
    //cost of mints depending on state of sale    
    uint private mintCostPresale = 0.06 ether;
    uint private mintCostPublicSale = 0.08 ether;
    
    //maximum amount of mints allowed per person
    uint256 public maxMintPresale = 2;
    uint256 public maxMintPublicSale = 3;
    
    //the amount of reserved mints that have currently been executed by creator and giveaways
    uint private _reservedMints;
    
    //the maximum amount of reserved mints allowed for creator and giveaways
    uint private maxReservedMints = 222;
    
    //dummy address that we use to sign the mint transaction to make sure it is valid
    address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c;
    
    uint256 internal presaleLaunchTime;
    uint256 internal publicSaleLaunchTime;
    uint256 internal revealTime;

    //dictates if sale is paused or not
    bool private paused_;

    //dictates if OG Sale is open
    bool private OGpaused_;

    //amount of mints that each address has executed
    mapping(address => uint256) public mintsPerAddress;

    //amount of OG mints that each address has executed
    mapping(address => uint256) private OGmintsPerAddress;

    IERC721 private CrazyCamels;
    
    //current state os sale
    enum State {NoSale, Presale, PublicSale}

    //defines the uri for when the NFTs have not been yet revealed
    string public unrevealedURI;
    
    //declaring initial values for variables
    constructor() ERC721A('Evolved Camels', 'EC') {
        maxTotalTokens = 2222;

        CrazyCamels = IERC721(0x062c74E593CE3C6574F126A1a35Ab55Dffdd63A6);  //0x062c74E593CE3C6574F126A1a35Ab55Dffdd63A6

        unrevealedURI = "ipfs://.../";
    }
    
    //in case somebody accidentaly sends funds or transaction to contract
    receive() payable external {}
    fallback() payable external {
        revert();
    }
    
    //visualize baseURI
    function _baseURI() internal view virtual override returns (string memory) {
        return _currentBaseURI;
    }
    
    //change baseURI in case needed for IPFS
    function changeBaseURI(string memory baseURI_) public onlyOwner {
        _currentBaseURI = baseURI_;
    }

    function changeUnrevealedURI(string memory unrevealedURI_) public onlyOwner {
        unrevealedURI = unrevealedURI_;
    }

    function switchToPresale() public onlyOwner {
        require(saleState() == State.NoSale, 'Sale is already Open!');
        presaleLaunchTime = block.timestamp;
    }

    function switchToPublicSale() public onlyOwner {
        require(saleState() == State.Presale, 'Sale must be in Presale!');
        publicSaleLaunchTime = block.timestamp;
    }
    
    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) {
        require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' );
        _;
    }
 
    /* 
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _add Address of agent with access
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(address(this), _add));
        return dummy == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s);
    }

    //mint a @param number of NFTs in public sale
    function OGSaleMint(uint256 number) public {
        require(!OGpaused_, "Sale is closed!");
        require(totalSupply() + number <= maxTotalTokens - (maxReservedMints - _reservedMints), "Not enough NFTs left to mint..");
        require(OGmintsPerAddress[msg.sender] + number <= CrazyCamels.balanceOf(msg.sender), "1 Mint per Crazy Camel NFT Owned!");
        
        _safeMint(msg.sender, number);
        OGmintsPerAddress[msg.sender] += number;

    }
    
    //mint a @param number of NFTs in presale
    function presaleMint(uint256 number, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v,  _r, _s) public payable {
        require(!paused_, "Sale is paused!");
        State saleState_ = saleState();
        require(saleState_ == State.Presale, "Sale in not open yet!");
        require(totalSupply() + number <= maxTotalTokens - (maxReservedMints - _reservedMints), "Not enough NFTs left to mint..");
        require(mintsPerAddress[msg.sender] + number <= maxMintPresale, "Maximum Mints per Address exceeded!");
        require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs");
        
        _safeMint(msg.sender, number);
        mintsPerAddress[msg.sender] += number;

    }

    //mint a @param number of NFTs in public sale
    function publicSaleMint(uint256 number) public payable {
        require(!paused_, "Sale is paused!");
        State saleState_ = saleState();
        require(saleState_ == State.PublicSale, "Public Sale in not open yet!");
        require(totalSupply() + number <= maxTotalTokens - (maxReservedMints - _reservedMints), "Not enough NFTs left to mint..");
        require(mintsPerAddress[msg.sender] + number <= maxMintPublicSale, "Maximum Mints per Address exceeded!");
        require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs!");

        _safeMint(msg.sender, number);
        mintsPerAddress[msg.sender] += number;
    }
    
    function tokenURI(uint256 tokenId_) public view virtual override returns (string memory) {
        require(_exists(tokenId_), "ERC721Metadata: URI query for nonexistent token");
        
        //check to see that 24 hours have passed since beginning of publicsale launch
        if (revealTime == 0) {
            return unrevealedURI;
        }
        
        else {
            string memory baseURI = _baseURI();
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId_.toString(), '.json')) : "";
        }    
    }
    
    //reserved NFTs for creator
    function reservedMint(uint number, address recipient) public onlyOwner {
        require(_reservedMints + number <= maxReservedMints, "Not enough Reserved NFTs left to mint..");

        _safeMint(recipient, number);
        mintsPerAddress[recipient] += number;
        _reservedMints += number; 
        
    }
    
    //se the current account balance
    function accountBalance() public onlyOwner view returns(uint) {
        return address(this).balance;
    }
    
    //retrieve all funds recieved from minting
    function withdraw() public onlyOwner {
        uint256 balance = accountBalance();
        require(balance > 0, 'No Funds to withdraw, Balance is 0');

        _withdraw(payable(0x256390D941187F536Dd56Ba224e779786c6265A0), (balance * 66) / 100); 
        _withdraw(payable(0xF22305ad50E7b36A81EF08d0995Ef3F3788b20F0), accountBalance()); 
    }
    
    //send the percentage of funds to a shareholder´s wallet
    function _withdraw(address payable account, uint256 amount) internal {
        (bool sent, ) = account.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }
    
    //change the dummy account used for signing transactions
    function changeDummy(address _dummy) public onlyOwner {
        dummy = _dummy;
    }
    
    //to see the total amount of reserved mints left 
    function reservedMintsLeft() public onlyOwner view returns(uint) {
        return maxReservedMints - _reservedMints;
    }
    
    //see current state of sale
    //see the current state of the sale
    function saleState() public view returns(State){
        if (presaleLaunchTime == 0) {
            return State.NoSale;
        }
        else if (publicSaleLaunchTime == 0) {
            return State.Presale;
        }
        else {
            return State.PublicSale;
        }
    }
    
    //gets the cost of current mint
    function mintCost() public view returns(uint) {
        State saleState_ = saleState();
        if (saleState_ != State.PublicSale) {
            return mintCostPresale;
        }
        else {
            return mintCostPublicSale;
        }
    }

    //ability to change the mint cost of the current sale
    function changeMintCost(uint256 newCost) public onlyOwner {
        State saleState_ = saleState();
        if (saleState_ != State.PublicSale) {
            mintCostPresale = newCost;
        }
        else {
            mintCostPublicSale = newCost;
        }
    }

    //ability to change the max mint of the current sale
    function changeMaxMint(uint256 newMax) public onlyOwner {
        require(newMax > 0, "Max Mint cannot be 0!");
        State saleState_ = saleState();
        if (saleState_ != State.PublicSale) {
            maxMintPresale = newMax;
        }
        else {
            maxMintPublicSale = newMax;
        }
    }

    //add to the total amount of nft that are able to be minted
    function addTokens(uint number) public onlyOwner {
        require(number > 0, "Cannot add 0 tokens!");
        maxTotalTokens += number;
    }

    //see when NFTs will be revealed
    function timeOfReveal() public view returns(uint256) {
        require(revealTime != 0, 'NFT Reveal Time has not been determined yet!');
        return revealTime;
    }

    function reveal() public onlyOwner {
        require(revealTime == 0, "Collection has already been revealed!");
        revealTime = block.timestamp;
    }

    function isPaused() public view returns(bool) {
        return paused_;
    }

    function togglePause() public onlyOwner {
        paused_ = !paused_;
    }

    function isOGPaused() public view returns(bool){
        return OGpaused_;
    }

    function toggleOGPause() public onlyOwner {
        OGpaused_ = !OGpaused_;
    }    

    function OGMintsLeft(address account) public view returns(uint) {
        if (OGmintsPerAddress[account] >= CrazyCamels.balanceOf(account)) {
            return 0;
        }
        else {
            return CrazyCamels.balanceOf(account) - OGmintsPerAddress[account];
        }
    }

    function balanceOfCrazyCamels(address account) public view returns(uint) {
        return CrazyCamels.balanceOf(account);
    }
    
    function changeCrazyCamels(address newCrazyCamels) public onlyOwner {
        require(newCrazyCamels != address(0), "Cannot be the 0 address!");
        CrazyCamels = IERC721(newCrazyCamels);
    }
   

}

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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OGMintsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"OGSaleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"addTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOfCrazyCamels","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCrazyCamels","type":"address"}],"name":"changeCrazyCamels","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dummy","type":"address"}],"name":"changeDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"changeMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"changeMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"changeUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOGPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPublicSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddress","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":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reservedMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMintsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","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":[],"name":"saleState","outputs":[{"internalType":"enum EvolvedCamels.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchToPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchToPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeOfReveal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleOGPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405266d529ae9e860000600a5567011c37937e080000600b556002600c556003600d5560de600f55601080546001600160a01b0319167380e4929c869102140e69550bbecc20bed61b080c1790553480156200005d57600080fd5b50604080518082018252600e81526d45766f6c7665642043616d656c7360901b602080830191825283518085019094526002845261454360f01b908401528151919291620000ae916001916200019e565b508051620000c49060029060208401906200019e565b505050620000e1620000db6200014860201b60201c565b6200014c565b6108ae600855601780546001600160a01b03191673062c74e593ce3c6574f126a1a35ab55dffdd63a617905560408051808201909152600b8082526a697066733a2f2f2e2e2e2f60a81b602090920191825262000141916018916200019e565b5062000281565b3390565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001ac9062000244565b90600052602060002090601f016020900481019282620001d057600085556200021b565b82601f10620001eb57805160ff19168380011785556200021b565b828001600101855582156200021b579182015b828111156200021b578251825591602001919060010190620001fe565b50620002299291506200022d565b5090565b5b808211156200022957600081556001016200022e565b600181811c908216806200025957607f821691505b602082108114156200027b57634e487b7160e01b600052602260045260246000fd5b50919050565b61333680620002916000396000f3fe6080604052600436106102e85760003560e01c80637035bf1811610190578063b88d4fde116100dc578063dcd4e73211610095578063f2fde38b1161006f578063f2fde38b1461087d578063f8ccc3ce1461089d578063ff984994146108bd578063ffcd55a8146108d257600080fd5b8063dcd4e7321461080c578063e985e9c51461081f578063eab417821461086857600080fd5b8063b88d4fde14610762578063bdb4b84814610782578063c4ae316814610797578063c4d8b9df146107ac578063c6ed8990146107cc578063c87b56dd146107ec57600080fd5b806395d89b4111610149578063af1035de11610123578063af1035de14610702578063b0a1c1c414610722578063b187bd2614610737578063b3ab66b01461074f57600080fd5b806395d89b41146106b8578063a22cb465146106cd578063a475b5dd146106ed57600080fd5b80637035bf181461061b57806370a0823114610630578063715018a6146106505780637c76f698146106655780637f1921ef1461067a5780638da5cb5b1461069a57600080fd5b80633023eba61161024f5780634520e916116102085780634f6ccce7116101e25780634f6ccce7146105a35780635a4dd61c146105c3578063603f4d52146105d95780636352211e146105fb57600080fd5b80634520e9161461055c57806345cb2e521461057157806346e0d1ab1461058e57600080fd5b80633023eba61461049a57806332624114146104c757806339a0c6f9146104e75780633b478c2c146105075780633ccfd60b1461052757806342842e0e1461053c57600080fd5b806318160ddd116102a157806318160ddd146103e557806318df64031461040457806319734c8b1461042457806320c63e3b1461043a57806323b872dd1461045a5780632f745c591461047a57600080fd5b80630191a657146102f457806301ffc9a71461031657806306fdde031461034b578063081812fc1461036d578063092cd34a146103a5578063095ea7b3146103c557600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004612c6c565b6108e8565b005b34801561032257600080fd5b50610336610331366004612c9d565b61093d565b60405190151581526020015b60405180910390f35b34801561035757600080fd5b506103606109aa565b6040516103429190612d12565b34801561037957600080fd5b5061038d610388366004612d25565b610a3c565b6040516001600160a01b039091168152602001610342565b3480156103b157600080fd5b506103146103c0366004612d25565b610ac7565b3480156103d157600080fd5b506103146103e0366004612d3e565b610c7f565b3480156103f157600080fd5b506000545b604051908152602001610342565b34801561041057600080fd5b5061031461041f366004612d68565b610d97565b34801561043057600080fd5b506103f6600d5481565b34801561044657600080fd5b50610314610455366004612d25565b610e84565b34801561046657600080fd5b50610314610475366004612d94565b610f2b565b34801561048657600080fd5b506103f6610495366004612d3e565b610f36565b3480156104a657600080fd5b506103f66104b5366004612c6c565b60156020526000908152604090205481565b3480156104d357600080fd5b506103366104e2366004612de1565b611093565b3480156104f357600080fd5b50610314610502366004612eaf565b61119f565b34801561051357600080fd5b506103f6610522366004612c6c565b6111dc565b34801561053357600080fd5b5061031461131e565b34801561054857600080fd5b50610314610557366004612d94565b611406565b34801561056857600080fd5b506103f6611421565b34801561057d57600080fd5b50601454610100900460ff16610336565b34801561059a57600080fd5b50610314611463565b3480156105af57600080fd5b506103f66105be366004612d25565b6114aa565b3480156105cf57600080fd5b506103f660085481565b3480156105e557600080fd5b506105ee61150c565b6040516103429190612f0e565b34801561060757600080fd5b5061038d610616366004612d25565b611532565b34801561062757600080fd5b50610360611544565b34801561063c57600080fd5b506103f661064b366004612c6c565b6115d2565b34801561065c57600080fd5b50610314611663565b34801561067157600080fd5b506103f6611699565b34801561068657600080fd5b50610314610695366004612d25565b61170a565b3480156106a657600080fd5b506007546001600160a01b031661038d565b3480156106c457600080fd5b50610360611765565b3480156106d957600080fd5b506103146106e8366004612f36565b611774565b3480156106f957600080fd5b50610314611839565b34801561070e57600080fd5b5061031461071d366004612c6c565b6118c7565b34801561072e57600080fd5b506103f6611969565b34801561074357600080fd5b5060145460ff16610336565b61031461075d366004612d25565b61199b565b34801561076e57600080fd5b5061031461077d366004612f72565b611b7d565b34801561078e57600080fd5b506103f6611bb6565b3480156107a357600080fd5b50610314611bec565b3480156107b857600080fd5b506103146107c7366004612eaf565b611c2a565b3480156107d857600080fd5b506103146107e7366004612d25565b611c67565b3480156107f857600080fd5b50610360610807366004612d25565b611cea565b61031461081a366004612fee565b611e50565b34801561082b57600080fd5b5061033661083a366004613014565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561087457600080fd5b50610314612087565b34801561088957600080fd5b50610314610898366004612c6c565b612117565b3480156108a957600080fd5b506103f66108b8366004612c6c565b6121af565b3480156108c957600080fd5b5061031461222d565b3480156108de57600080fd5b506103f6600c5481565b6007546001600160a01b0316331461091b5760405162461bcd60e51b81526004016109129061303e565b60405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b148061096e57506001600160e01b03198216635b5e139f60e01b145b8061098957506001600160e01b0319821663780e9d6360e01b145b806109a457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546109b990613073565b80601f01602080910402602001604051908101604052809291908181526020018280546109e590613073565b8015610a325780601f10610a0757610100808354040283529160200191610a32565b820191906000526020600020905b815481529060010190602001808311610a1557829003601f168201915b5050505050905090565b6000610a49826000541190565b610aab5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610912565b506000908152600560205260409020546001600160a01b031690565b601454610100900460ff1615610b115760405162461bcd60e51b815260206004820152600f60248201526e53616c6520697320636c6f7365642160881b6044820152606401610912565b600e54600f54610b2191906130c4565b600854610b2e91906130c4565b81610b3860005490565b610b4291906130db565b1115610b605760405162461bcd60e51b8152600401610912906130f3565b6017546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610ba357600080fd5b505afa158015610bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdb919061312a565b33600090815260166020526040902054610bf69083906130db565b1115610c4e5760405162461bcd60e51b815260206004820152602160248201527f31204d696e7420706572204372617a792043616d656c204e4654204f776e65646044820152602160f81b6064820152608401610912565b610c5833826122c5565b3360009081526016602052604081208054839290610c779084906130db565b909155505050565b6000610c8a82611532565b9050806001600160a01b0316836001600160a01b03161415610cf95760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610912565b336001600160a01b0382161480610d155750610d15813361083a565b610d875760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610912565b610d928383836122df565b505050565b6007546001600160a01b03163314610dc15760405162461bcd60e51b81526004016109129061303e565b600f5482600e54610dd291906130db565b1115610e305760405162461bcd60e51b815260206004820152602760248201527f4e6f7420656e6f756768205265736572766564204e465473206c65667420746f6044820152661036b4b73a171760c91b6064820152608401610912565b610e3a81836122c5565b6001600160a01b03811660009081526015602052604081208054849290610e629084906130db565b9250508190555081600e6000828254610e7b91906130db565b90915550505050565b6007546001600160a01b03163314610eae5760405162461bcd60e51b81526004016109129061303e565b60008111610ef65760405162461bcd60e51b81526020600482015260156024820152744d6178204d696e742063616e6e6f7420626520302160581b6044820152606401610912565b6000610f0061150c565b90506002816002811115610f1657610f16612ef8565b14610f215750600c55565b600d8290555b5050565b610d9283838361233b565b6000610f41836115d2565b8210610f9a5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610912565b600080549080805b83811015611033576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610ff557805192505b876001600160a01b0316836001600160a01b0316141561102a5786841415611023575093506109a492505050565b6001909301925b50600101610fa2565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610912565b6040516bffffffffffffffffffffffff1930606090811b8216602084015286901b166034820152600090819060480160405160208183030381529060405280519060200120905060018160405160200161111991907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611177573d6000803e3d6000fd5b5050604051601f1901516010546001600160a01b03908116911614925050505b949350505050565b6007546001600160a01b031633146111c95760405162461bcd60e51b81526004016109129061303e565b8051610f27906009906020840190612bc5565b6017546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125a919061312a565b6001600160a01b0383166000908152601660205260409020541061128057506000919050565b6001600160a01b03828116600081815260166020526040908190205460175491516370a0823160e01b815260048101939093529216906370a082319060240160206040518083038186803b1580156112d757600080fd5b505afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f919061312a565b6109a491906130c4565b919050565b6007546001600160a01b031633146113485760405162461bcd60e51b81526004016109129061303e565b6000611352611969565b9050600081116113af5760405162461bcd60e51b815260206004820152602260248201527f4e6f2046756e647320746f2077697468647261772c2042616c616e6365206973604482015261020360f41b6064820152608401610912565b6113e373256390d941187f536dd56ba224e779786c6265a060646113d4846042613143565b6113de9190613178565b612620565b61140373f22305ad50e7b36a81ef08d0995ef3f3788b20f06113de611969565b50565b610d9283838360405180602001604052806000815250611b7d565b6007546000906001600160a01b0316331461144e5760405162461bcd60e51b81526004016109129061303e565b600e54600f5461145e91906130c4565b905090565b6007546001600160a01b0316331461148d5760405162461bcd60e51b81526004016109129061303e565b6014805461ff001981166101009182900460ff1615909102179055565b6000805482106115085760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610912565b5090565b60006011546000141561151f5750600090565b60125461152c5750600190565b50600290565b600061153d826126ba565b5192915050565b6018805461155190613073565b80601f016020809104026020016040519081016040528092919081815260200182805461157d90613073565b80156115ca5780601f1061159f576101008083540402835291602001916115ca565b820191906000526020600020905b8154815290600101906020018083116115ad57829003601f168201915b505050505081565b60006001600160a01b03821661163e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610912565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b0316331461168d5760405162461bcd60e51b81526004016109129061303e565b6116976000612791565b565b6000601354600014156117035760405162461bcd60e51b815260206004820152602c60248201527f4e46542052657665616c2054696d6520686173206e6f74206265656e2064657460448201526b65726d696e6564207965742160a01b6064820152608401610912565b5060135490565b6007546001600160a01b031633146117345760405162461bcd60e51b81526004016109129061303e565b600061173e61150c565b9050600281600281111561175457611754612ef8565b1461175f5750600a55565b50600b55565b6060600280546109b990613073565b6001600160a01b0382163314156117cd5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610912565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146118635760405162461bcd60e51b81526004016109129061303e565b601354156118c15760405162461bcd60e51b815260206004820152602560248201527f436f6c6c656374696f6e2068617320616c7265616479206265656e2072657665604482015264616c65642160d81b6064820152608401610912565b42601355565b6007546001600160a01b031633146118f15760405162461bcd60e51b81526004016109129061303e565b6001600160a01b0381166119475760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420626520746865203020616464726573732100000000000000006044820152606401610912565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6007546000906001600160a01b031633146119965760405162461bcd60e51b81526004016109129061303e565b504790565b60145460ff16156119e05760405162461bcd60e51b815260206004820152600f60248201526e53616c65206973207061757365642160881b6044820152606401610912565b60006119ea61150c565b90506002816002811115611a0057611a00612ef8565b14611a4d5760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632053616c6520696e206e6f74206f70656e2079657421000000006044820152606401610912565b600e54600f54611a5d91906130c4565b600854611a6a91906130c4565b82611a7460005490565b611a7e91906130db565b1115611a9c5760405162461bcd60e51b8152600401610912906130f3565b600d5433600090815260156020526040902054611aba9084906130db565b1115611ad85760405162461bcd60e51b81526004016109129061318c565b81611ae1611bb6565b611aeb9190613143565b341015611b545760405162461bcd60e51b815260206004820152603160248201527f4e6f742073756666696369656e7420457468657220746f206d696e74207468696044820152707320616d6f756e74206f66204e4654732160781b6064820152608401610912565b611b5e33836122c5565b3360009081526015602052604081208054849290610e7b9084906130db565b611b8884848461233b565b611b94848484846127e3565b611bb05760405162461bcd60e51b8152600401610912906131cf565b50505050565b600080611bc161150c565b90506002816002811115611bd757611bd7612ef8565b14611be4575050600a5490565b5050600b5490565b6007546001600160a01b03163314611c165760405162461bcd60e51b81526004016109129061303e565b6014805460ff19811660ff90911615179055565b6007546001600160a01b03163314611c545760405162461bcd60e51b81526004016109129061303e565b8051610f27906018906020840190612bc5565b6007546001600160a01b03163314611c915760405162461bcd60e51b81526004016109129061303e565b60008111611cd85760405162461bcd60e51b815260206004820152601460248201527343616e6e6f7420616464203020746f6b656e732160601b6044820152606401610912565b8060086000828254610c7791906130db565b6060611cf7826000541190565b611d5b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610912565b601354611df45760188054611d6f90613073565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9b90613073565b8015611de85780601f10611dbd57610100808354040283529160200191611de8565b820191906000526020600020905b815481529060010190602001808311611dcb57829003601f168201915b50505050509050919050565b6000611dfe6128ed565b90506000815111611e1e5760405180602001604052806000815250611e49565b80611e28846128fc565b604051602001611e39929190613222565b6040516020818303038152906040525b9392505050565b828282611e5f33848484611093565b611e9f5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964205369676e617475726560781b6044820152606401610912565b60145460ff1615611ee45760405162461bcd60e51b815260206004820152600f60248201526e53616c65206973207061757365642160881b6044820152606401610912565b6000611eee61150c565b90506001816002811115611f0457611f04612ef8565b14611f495760405162461bcd60e51b815260206004820152601560248201527453616c6520696e206e6f74206f70656e207965742160581b6044820152606401610912565b600e54600f54611f5991906130c4565b600854611f6691906130c4565b88611f7060005490565b611f7a91906130db565b1115611f985760405162461bcd60e51b8152600401610912906130f3565b600c5433600090815260156020526040902054611fb6908a906130db565b1115611fd45760405162461bcd60e51b81526004016109129061318c565b87611fdd611bb6565b611fe79190613143565b34101561204f5760405162461bcd60e51b815260206004820152603060248201527f4e6f742073756666696369656e7420457468657220746f206d696e742074686960448201526f7320616d6f756e74206f66204e46547360801b6064820152608401610912565b61205933896122c5565b33600090815260156020526040812080548a92906120789084906130db565b90915550505050505050505050565b6007546001600160a01b031633146120b15760405162461bcd60e51b81526004016109129061303e565b60006120bb61150c565b60028111156120cc576120cc612ef8565b146121115760405162461bcd60e51b815260206004820152601560248201527453616c6520697320616c7265616479204f70656e2160581b6044820152606401610912565b42601155565b6007546001600160a01b031633146121415760405162461bcd60e51b81526004016109129061303e565b6001600160a01b0381166121a65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610912565b61140381612791565b6017546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b1580156121f557600080fd5b505afa158015612209573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a4919061312a565b6007546001600160a01b031633146122575760405162461bcd60e51b81526004016109129061303e565b600161226161150c565b600281111561227257612272612ef8565b146122bf5760405162461bcd60e51b815260206004820152601860248201527f53616c65206d75737420626520696e2050726573616c652100000000000000006044820152606401610912565b42601255565b610f278282604051806020016040528060008152506129fa565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612346826126ba565b80519091506000906001600160a01b0316336001600160a01b0316148061237d57503361237284610a3c565b6001600160a01b0316145b8061238f5750815161238f903361083a565b9050806123f95760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610912565b846001600160a01b031682600001516001600160a01b03161461246d5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610912565b6001600160a01b0384166124d15760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610912565b6124e160008484600001516122df565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff16021790559086018083529120549091166125d657612589816000541190565b156125d6578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461266d576040519150601f19603f3d011682016040523d82523d6000602084013e612672565b606091505b5050905080610d925760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610912565b60408051808201909152600080825260208201526126d9826000541190565b6127385760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610912565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612787579392505050565b506000190161273a565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156128e557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612827903390899088908890600401613261565b602060405180830381600087803b15801561284157600080fd5b505af1925050508015612871575060408051601f3d908101601f1916820190925261286e9181019061329e565b60015b6128cb573d80801561289f576040519150601f19603f3d011682016040523d82523d6000602084013e6128a4565b606091505b5080516128c35760405162461bcd60e51b8152600401610912906131cf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611197565b506001611197565b6060600980546109b990613073565b6060816129205750506040805180820190915260018152600360fc1b602082015290565b8160005b811561294a5780612934816132bb565b91506129439050600a83613178565b9150612924565b60008167ffffffffffffffff81111561296557612965612e23565b6040519080825280601f01601f19166020018201604052801561298f576020820181803683370190505b5090505b8415611197576129a46001836130c4565b91506129b1600a866132d6565b6129bc9060306130db565b60f81b8183815181106129d1576129d16132ea565b60200101906001600160f81b031916908160001a9053506129f3600a86613178565b9450612993565b610d9283838360016000546001600160a01b038516612a655760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610912565b83612ac35760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610912565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b85811015612bbc5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612bb057612b9460008884886127e3565b612bb05760405162461bcd60e51b8152600401610912906131cf565b60019182019101612b41565b50600055612619565b828054612bd190613073565b90600052602060002090601f016020900481019282612bf35760008555612c39565b82601f10612c0c57805160ff1916838001178555612c39565b82800160010185558215612c39579182015b82811115612c39578251825591602001919060010190612c1e565b506115089291505b808211156115085760008155600101612c41565b80356001600160a01b038116811461131957600080fd5b600060208284031215612c7e57600080fd5b611e4982612c55565b6001600160e01b03198116811461140357600080fd5b600060208284031215612caf57600080fd5b8135611e4981612c87565b60005b83811015612cd5578181015183820152602001612cbd565b83811115611bb05750506000910152565b60008151808452612cfe816020860160208601612cba565b601f01601f19169290920160200192915050565b602081526000611e496020830184612ce6565b600060208284031215612d3757600080fd5b5035919050565b60008060408385031215612d5157600080fd5b612d5a83612c55565b946020939093013593505050565b60008060408385031215612d7b57600080fd5b82359150612d8b60208401612c55565b90509250929050565b600080600060608486031215612da957600080fd5b612db284612c55565b9250612dc060208501612c55565b9150604084013590509250925092565b803560ff8116811461131957600080fd5b60008060008060808587031215612df757600080fd5b612e0085612c55565b9350612e0e60208601612dd0565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612e5457612e54612e23565b604051601f8501601f19908116603f01168101908282118183101715612e7c57612e7c612e23565b81604052809350858152868686011115612e9557600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612ec157600080fd5b813567ffffffffffffffff811115612ed857600080fd5b8201601f81018413612ee957600080fd5b61119784823560208401612e39565b634e487b7160e01b600052602160045260246000fd5b6020810160038310612f3057634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215612f4957600080fd5b612f5283612c55565b915060208301358015158114612f6757600080fd5b809150509250929050565b60008060008060808587031215612f8857600080fd5b612f9185612c55565b9350612f9f60208601612c55565b925060408501359150606085013567ffffffffffffffff811115612fc257600080fd5b8501601f81018713612fd357600080fd5b612fe287823560208401612e39565b91505092959194509250565b6000806000806080858703121561300457600080fd5b84359350612e0e60208601612dd0565b6000806040838503121561302757600080fd5b61303083612c55565b9150612d8b60208401612c55565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061308757607f821691505b602082108114156130a857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156130d6576130d66130ae565b500390565b600082198211156130ee576130ee6130ae565b500190565b6020808252601e908201527f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000604082015260600190565b60006020828403121561313c57600080fd5b5051919050565b600081600019048311821515161561315d5761315d6130ae565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261318757613187613162565b500490565b60208082526023908201527f4d6178696d756d204d696e74732070657220416464726573732065786365656460408201526265642160e81b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351613234818460208801612cba565b835190830190613248818360208801612cba565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061329490830184612ce6565b9695505050505050565b6000602082840312156132b057600080fd5b8151611e4981612c87565b60006000198214156132cf576132cf6130ae565b5060010190565b6000826132e5576132e5613162565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220462e65485a491786d1f035036b29302870b9162be7aa9e37bfa615116084cbca64736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102e85760003560e01c80637035bf1811610190578063b88d4fde116100dc578063dcd4e73211610095578063f2fde38b1161006f578063f2fde38b1461087d578063f8ccc3ce1461089d578063ff984994146108bd578063ffcd55a8146108d257600080fd5b8063dcd4e7321461080c578063e985e9c51461081f578063eab417821461086857600080fd5b8063b88d4fde14610762578063bdb4b84814610782578063c4ae316814610797578063c4d8b9df146107ac578063c6ed8990146107cc578063c87b56dd146107ec57600080fd5b806395d89b4111610149578063af1035de11610123578063af1035de14610702578063b0a1c1c414610722578063b187bd2614610737578063b3ab66b01461074f57600080fd5b806395d89b41146106b8578063a22cb465146106cd578063a475b5dd146106ed57600080fd5b80637035bf181461061b57806370a0823114610630578063715018a6146106505780637c76f698146106655780637f1921ef1461067a5780638da5cb5b1461069a57600080fd5b80633023eba61161024f5780634520e916116102085780634f6ccce7116101e25780634f6ccce7146105a35780635a4dd61c146105c3578063603f4d52146105d95780636352211e146105fb57600080fd5b80634520e9161461055c57806345cb2e521461057157806346e0d1ab1461058e57600080fd5b80633023eba61461049a57806332624114146104c757806339a0c6f9146104e75780633b478c2c146105075780633ccfd60b1461052757806342842e0e1461053c57600080fd5b806318160ddd116102a157806318160ddd146103e557806318df64031461040457806319734c8b1461042457806320c63e3b1461043a57806323b872dd1461045a5780632f745c591461047a57600080fd5b80630191a657146102f457806301ffc9a71461031657806306fdde031461034b578063081812fc1461036d578063092cd34a146103a5578063095ea7b3146103c557600080fd5b366102ef57005b600080fd5b34801561030057600080fd5b5061031461030f366004612c6c565b6108e8565b005b34801561032257600080fd5b50610336610331366004612c9d565b61093d565b60405190151581526020015b60405180910390f35b34801561035757600080fd5b506103606109aa565b6040516103429190612d12565b34801561037957600080fd5b5061038d610388366004612d25565b610a3c565b6040516001600160a01b039091168152602001610342565b3480156103b157600080fd5b506103146103c0366004612d25565b610ac7565b3480156103d157600080fd5b506103146103e0366004612d3e565b610c7f565b3480156103f157600080fd5b506000545b604051908152602001610342565b34801561041057600080fd5b5061031461041f366004612d68565b610d97565b34801561043057600080fd5b506103f6600d5481565b34801561044657600080fd5b50610314610455366004612d25565b610e84565b34801561046657600080fd5b50610314610475366004612d94565b610f2b565b34801561048657600080fd5b506103f6610495366004612d3e565b610f36565b3480156104a657600080fd5b506103f66104b5366004612c6c565b60156020526000908152604090205481565b3480156104d357600080fd5b506103366104e2366004612de1565b611093565b3480156104f357600080fd5b50610314610502366004612eaf565b61119f565b34801561051357600080fd5b506103f6610522366004612c6c565b6111dc565b34801561053357600080fd5b5061031461131e565b34801561054857600080fd5b50610314610557366004612d94565b611406565b34801561056857600080fd5b506103f6611421565b34801561057d57600080fd5b50601454610100900460ff16610336565b34801561059a57600080fd5b50610314611463565b3480156105af57600080fd5b506103f66105be366004612d25565b6114aa565b3480156105cf57600080fd5b506103f660085481565b3480156105e557600080fd5b506105ee61150c565b6040516103429190612f0e565b34801561060757600080fd5b5061038d610616366004612d25565b611532565b34801561062757600080fd5b50610360611544565b34801561063c57600080fd5b506103f661064b366004612c6c565b6115d2565b34801561065c57600080fd5b50610314611663565b34801561067157600080fd5b506103f6611699565b34801561068657600080fd5b50610314610695366004612d25565b61170a565b3480156106a657600080fd5b506007546001600160a01b031661038d565b3480156106c457600080fd5b50610360611765565b3480156106d957600080fd5b506103146106e8366004612f36565b611774565b3480156106f957600080fd5b50610314611839565b34801561070e57600080fd5b5061031461071d366004612c6c565b6118c7565b34801561072e57600080fd5b506103f6611969565b34801561074357600080fd5b5060145460ff16610336565b61031461075d366004612d25565b61199b565b34801561076e57600080fd5b5061031461077d366004612f72565b611b7d565b34801561078e57600080fd5b506103f6611bb6565b3480156107a357600080fd5b50610314611bec565b3480156107b857600080fd5b506103146107c7366004612eaf565b611c2a565b3480156107d857600080fd5b506103146107e7366004612d25565b611c67565b3480156107f857600080fd5b50610360610807366004612d25565b611cea565b61031461081a366004612fee565b611e50565b34801561082b57600080fd5b5061033661083a366004613014565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561087457600080fd5b50610314612087565b34801561088957600080fd5b50610314610898366004612c6c565b612117565b3480156108a957600080fd5b506103f66108b8366004612c6c565b6121af565b3480156108c957600080fd5b5061031461222d565b3480156108de57600080fd5b506103f6600c5481565b6007546001600160a01b0316331461091b5760405162461bcd60e51b81526004016109129061303e565b60405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b148061096e57506001600160e01b03198216635b5e139f60e01b145b8061098957506001600160e01b0319821663780e9d6360e01b145b806109a457506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546109b990613073565b80601f01602080910402602001604051908101604052809291908181526020018280546109e590613073565b8015610a325780601f10610a0757610100808354040283529160200191610a32565b820191906000526020600020905b815481529060010190602001808311610a1557829003601f168201915b5050505050905090565b6000610a49826000541190565b610aab5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610912565b506000908152600560205260409020546001600160a01b031690565b601454610100900460ff1615610b115760405162461bcd60e51b815260206004820152600f60248201526e53616c6520697320636c6f7365642160881b6044820152606401610912565b600e54600f54610b2191906130c4565b600854610b2e91906130c4565b81610b3860005490565b610b4291906130db565b1115610b605760405162461bcd60e51b8152600401610912906130f3565b6017546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610ba357600080fd5b505afa158015610bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdb919061312a565b33600090815260166020526040902054610bf69083906130db565b1115610c4e5760405162461bcd60e51b815260206004820152602160248201527f31204d696e7420706572204372617a792043616d656c204e4654204f776e65646044820152602160f81b6064820152608401610912565b610c5833826122c5565b3360009081526016602052604081208054839290610c779084906130db565b909155505050565b6000610c8a82611532565b9050806001600160a01b0316836001600160a01b03161415610cf95760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610912565b336001600160a01b0382161480610d155750610d15813361083a565b610d875760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610912565b610d928383836122df565b505050565b6007546001600160a01b03163314610dc15760405162461bcd60e51b81526004016109129061303e565b600f5482600e54610dd291906130db565b1115610e305760405162461bcd60e51b815260206004820152602760248201527f4e6f7420656e6f756768205265736572766564204e465473206c65667420746f6044820152661036b4b73a171760c91b6064820152608401610912565b610e3a81836122c5565b6001600160a01b03811660009081526015602052604081208054849290610e629084906130db565b9250508190555081600e6000828254610e7b91906130db565b90915550505050565b6007546001600160a01b03163314610eae5760405162461bcd60e51b81526004016109129061303e565b60008111610ef65760405162461bcd60e51b81526020600482015260156024820152744d6178204d696e742063616e6e6f7420626520302160581b6044820152606401610912565b6000610f0061150c565b90506002816002811115610f1657610f16612ef8565b14610f215750600c55565b600d8290555b5050565b610d9283838361233b565b6000610f41836115d2565b8210610f9a5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610912565b600080549080805b83811015611033576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610ff557805192505b876001600160a01b0316836001600160a01b0316141561102a5786841415611023575093506109a492505050565b6001909301925b50600101610fa2565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610912565b6040516bffffffffffffffffffffffff1930606090811b8216602084015286901b166034820152600090819060480160405160208183030381529060405280519060200120905060018160405160200161111991907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611177573d6000803e3d6000fd5b5050604051601f1901516010546001600160a01b03908116911614925050505b949350505050565b6007546001600160a01b031633146111c95760405162461bcd60e51b81526004016109129061303e565b8051610f27906009906020840190612bc5565b6017546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125a919061312a565b6001600160a01b0383166000908152601660205260409020541061128057506000919050565b6001600160a01b03828116600081815260166020526040908190205460175491516370a0823160e01b815260048101939093529216906370a082319060240160206040518083038186803b1580156112d757600080fd5b505afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f919061312a565b6109a491906130c4565b919050565b6007546001600160a01b031633146113485760405162461bcd60e51b81526004016109129061303e565b6000611352611969565b9050600081116113af5760405162461bcd60e51b815260206004820152602260248201527f4e6f2046756e647320746f2077697468647261772c2042616c616e6365206973604482015261020360f41b6064820152608401610912565b6113e373256390d941187f536dd56ba224e779786c6265a060646113d4846042613143565b6113de9190613178565b612620565b61140373f22305ad50e7b36a81ef08d0995ef3f3788b20f06113de611969565b50565b610d9283838360405180602001604052806000815250611b7d565b6007546000906001600160a01b0316331461144e5760405162461bcd60e51b81526004016109129061303e565b600e54600f5461145e91906130c4565b905090565b6007546001600160a01b0316331461148d5760405162461bcd60e51b81526004016109129061303e565b6014805461ff001981166101009182900460ff1615909102179055565b6000805482106115085760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610912565b5090565b60006011546000141561151f5750600090565b60125461152c5750600190565b50600290565b600061153d826126ba565b5192915050565b6018805461155190613073565b80601f016020809104026020016040519081016040528092919081815260200182805461157d90613073565b80156115ca5780601f1061159f576101008083540402835291602001916115ca565b820191906000526020600020905b8154815290600101906020018083116115ad57829003601f168201915b505050505081565b60006001600160a01b03821661163e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610912565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b0316331461168d5760405162461bcd60e51b81526004016109129061303e565b6116976000612791565b565b6000601354600014156117035760405162461bcd60e51b815260206004820152602c60248201527f4e46542052657665616c2054696d6520686173206e6f74206265656e2064657460448201526b65726d696e6564207965742160a01b6064820152608401610912565b5060135490565b6007546001600160a01b031633146117345760405162461bcd60e51b81526004016109129061303e565b600061173e61150c565b9050600281600281111561175457611754612ef8565b1461175f5750600a55565b50600b55565b6060600280546109b990613073565b6001600160a01b0382163314156117cd5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610912565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6007546001600160a01b031633146118635760405162461bcd60e51b81526004016109129061303e565b601354156118c15760405162461bcd60e51b815260206004820152602560248201527f436f6c6c656374696f6e2068617320616c7265616479206265656e2072657665604482015264616c65642160d81b6064820152608401610912565b42601355565b6007546001600160a01b031633146118f15760405162461bcd60e51b81526004016109129061303e565b6001600160a01b0381166119475760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420626520746865203020616464726573732100000000000000006044820152606401610912565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6007546000906001600160a01b031633146119965760405162461bcd60e51b81526004016109129061303e565b504790565b60145460ff16156119e05760405162461bcd60e51b815260206004820152600f60248201526e53616c65206973207061757365642160881b6044820152606401610912565b60006119ea61150c565b90506002816002811115611a0057611a00612ef8565b14611a4d5760405162461bcd60e51b815260206004820152601c60248201527f5075626c69632053616c6520696e206e6f74206f70656e2079657421000000006044820152606401610912565b600e54600f54611a5d91906130c4565b600854611a6a91906130c4565b82611a7460005490565b611a7e91906130db565b1115611a9c5760405162461bcd60e51b8152600401610912906130f3565b600d5433600090815260156020526040902054611aba9084906130db565b1115611ad85760405162461bcd60e51b81526004016109129061318c565b81611ae1611bb6565b611aeb9190613143565b341015611b545760405162461bcd60e51b815260206004820152603160248201527f4e6f742073756666696369656e7420457468657220746f206d696e74207468696044820152707320616d6f756e74206f66204e4654732160781b6064820152608401610912565b611b5e33836122c5565b3360009081526015602052604081208054849290610e7b9084906130db565b611b8884848461233b565b611b94848484846127e3565b611bb05760405162461bcd60e51b8152600401610912906131cf565b50505050565b600080611bc161150c565b90506002816002811115611bd757611bd7612ef8565b14611be4575050600a5490565b5050600b5490565b6007546001600160a01b03163314611c165760405162461bcd60e51b81526004016109129061303e565b6014805460ff19811660ff90911615179055565b6007546001600160a01b03163314611c545760405162461bcd60e51b81526004016109129061303e565b8051610f27906018906020840190612bc5565b6007546001600160a01b03163314611c915760405162461bcd60e51b81526004016109129061303e565b60008111611cd85760405162461bcd60e51b815260206004820152601460248201527343616e6e6f7420616464203020746f6b656e732160601b6044820152606401610912565b8060086000828254610c7791906130db565b6060611cf7826000541190565b611d5b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610912565b601354611df45760188054611d6f90613073565b80601f0160208091040260200160405190810160405280929190818152602001828054611d9b90613073565b8015611de85780601f10611dbd57610100808354040283529160200191611de8565b820191906000526020600020905b815481529060010190602001808311611dcb57829003601f168201915b50505050509050919050565b6000611dfe6128ed565b90506000815111611e1e5760405180602001604052806000815250611e49565b80611e28846128fc565b604051602001611e39929190613222565b6040516020818303038152906040525b9392505050565b828282611e5f33848484611093565b611e9f5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964205369676e617475726560781b6044820152606401610912565b60145460ff1615611ee45760405162461bcd60e51b815260206004820152600f60248201526e53616c65206973207061757365642160881b6044820152606401610912565b6000611eee61150c565b90506001816002811115611f0457611f04612ef8565b14611f495760405162461bcd60e51b815260206004820152601560248201527453616c6520696e206e6f74206f70656e207965742160581b6044820152606401610912565b600e54600f54611f5991906130c4565b600854611f6691906130c4565b88611f7060005490565b611f7a91906130db565b1115611f985760405162461bcd60e51b8152600401610912906130f3565b600c5433600090815260156020526040902054611fb6908a906130db565b1115611fd45760405162461bcd60e51b81526004016109129061318c565b87611fdd611bb6565b611fe79190613143565b34101561204f5760405162461bcd60e51b815260206004820152603060248201527f4e6f742073756666696369656e7420457468657220746f206d696e742074686960448201526f7320616d6f756e74206f66204e46547360801b6064820152608401610912565b61205933896122c5565b33600090815260156020526040812080548a92906120789084906130db565b90915550505050505050505050565b6007546001600160a01b031633146120b15760405162461bcd60e51b81526004016109129061303e565b60006120bb61150c565b60028111156120cc576120cc612ef8565b146121115760405162461bcd60e51b815260206004820152601560248201527453616c6520697320616c7265616479204f70656e2160581b6044820152606401610912565b42601155565b6007546001600160a01b031633146121415760405162461bcd60e51b81526004016109129061303e565b6001600160a01b0381166121a65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610912565b61140381612791565b6017546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b1580156121f557600080fd5b505afa158015612209573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a4919061312a565b6007546001600160a01b031633146122575760405162461bcd60e51b81526004016109129061303e565b600161226161150c565b600281111561227257612272612ef8565b146122bf5760405162461bcd60e51b815260206004820152601860248201527f53616c65206d75737420626520696e2050726573616c652100000000000000006044820152606401610912565b42601255565b610f278282604051806020016040528060008152506129fa565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000612346826126ba565b80519091506000906001600160a01b0316336001600160a01b0316148061237d57503361237284610a3c565b6001600160a01b0316145b8061238f5750815161238f903361083a565b9050806123f95760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610912565b846001600160a01b031682600001516001600160a01b03161461246d5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610912565b6001600160a01b0384166124d15760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610912565b6124e160008484600001516122df565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b4267ffffffffffffffff16021790559086018083529120549091166125d657612589816000541190565b156125d6578251600082815260036020908152604090912080549186015167ffffffffffffffff16600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461266d576040519150601f19603f3d011682016040523d82523d6000602084013e612672565b606091505b5050905080610d925760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610912565b60408051808201909152600080825260208201526126d9826000541190565b6127385760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610912565b815b6000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215612787579392505050565b506000190161273a565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b156128e557604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612827903390899088908890600401613261565b602060405180830381600087803b15801561284157600080fd5b505af1925050508015612871575060408051601f3d908101601f1916820190925261286e9181019061329e565b60015b6128cb573d80801561289f576040519150601f19603f3d011682016040523d82523d6000602084013e6128a4565b606091505b5080516128c35760405162461bcd60e51b8152600401610912906131cf565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611197565b506001611197565b6060600980546109b990613073565b6060816129205750506040805180820190915260018152600360fc1b602082015290565b8160005b811561294a5780612934816132bb565b91506129439050600a83613178565b9150612924565b60008167ffffffffffffffff81111561296557612965612e23565b6040519080825280601f01601f19166020018201604052801561298f576020820181803683370190505b5090505b8415611197576129a46001836130c4565b91506129b1600a866132d6565b6129bc9060306130db565b60f81b8183815181106129d1576129d16132ea565b60200101906001600160f81b031916908160001a9053506129f3600a86613178565b9450612993565b610d9283838360016000546001600160a01b038516612a655760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610912565b83612ac35760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610912565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b4267ffffffffffffffff16021790915581905b85811015612bbc5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48315612bb057612b9460008884886127e3565b612bb05760405162461bcd60e51b8152600401610912906131cf565b60019182019101612b41565b50600055612619565b828054612bd190613073565b90600052602060002090601f016020900481019282612bf35760008555612c39565b82601f10612c0c57805160ff1916838001178555612c39565b82800160010185558215612c39579182015b82811115612c39578251825591602001919060010190612c1e565b506115089291505b808211156115085760008155600101612c41565b80356001600160a01b038116811461131957600080fd5b600060208284031215612c7e57600080fd5b611e4982612c55565b6001600160e01b03198116811461140357600080fd5b600060208284031215612caf57600080fd5b8135611e4981612c87565b60005b83811015612cd5578181015183820152602001612cbd565b83811115611bb05750506000910152565b60008151808452612cfe816020860160208601612cba565b601f01601f19169290920160200192915050565b602081526000611e496020830184612ce6565b600060208284031215612d3757600080fd5b5035919050565b60008060408385031215612d5157600080fd5b612d5a83612c55565b946020939093013593505050565b60008060408385031215612d7b57600080fd5b82359150612d8b60208401612c55565b90509250929050565b600080600060608486031215612da957600080fd5b612db284612c55565b9250612dc060208501612c55565b9150604084013590509250925092565b803560ff8116811461131957600080fd5b60008060008060808587031215612df757600080fd5b612e0085612c55565b9350612e0e60208601612dd0565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115612e5457612e54612e23565b604051601f8501601f19908116603f01168101908282118183101715612e7c57612e7c612e23565b81604052809350858152868686011115612e9557600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215612ec157600080fd5b813567ffffffffffffffff811115612ed857600080fd5b8201601f81018413612ee957600080fd5b61119784823560208401612e39565b634e487b7160e01b600052602160045260246000fd5b6020810160038310612f3057634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215612f4957600080fd5b612f5283612c55565b915060208301358015158114612f6757600080fd5b809150509250929050565b60008060008060808587031215612f8857600080fd5b612f9185612c55565b9350612f9f60208601612c55565b925060408501359150606085013567ffffffffffffffff811115612fc257600080fd5b8501601f81018713612fd357600080fd5b612fe287823560208401612e39565b91505092959194509250565b6000806000806080858703121561300457600080fd5b84359350612e0e60208601612dd0565b6000806040838503121561302757600080fd5b61303083612c55565b9150612d8b60208401612c55565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061308757607f821691505b602082108114156130a857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156130d6576130d66130ae565b500390565b600082198211156130ee576130ee6130ae565b500190565b6020808252601e908201527f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000604082015260600190565b60006020828403121561313c57600080fd5b5051919050565b600081600019048311821515161561315d5761315d6130ae565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261318757613187613162565b500490565b60208082526023908201527f4d6178696d756d204d696e74732070657220416464726573732065786365656460408201526265642160e81b606082015260800190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351613234818460208801612cba565b835190830190613248818360208801612cba565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061329490830184612ce6565b9695505050505050565b6000602082840312156132b057600080fd5b8151611e4981612c87565b60006000198214156132cf576132cf6130ae565b5060010190565b6000826132e5576132e5613162565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220462e65485a491786d1f035036b29302870b9162be7aa9e37bfa615116084cbca64736f6c63430008090033

Deployed Bytecode Sourcemap

54949:11155:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57162:8;;;54949:11155;;;;;;57162:8;;;62787:87;;;;;;;;;;-1:-1:-1;62787:87:0;;;;;:::i;:::-;;:::i;:::-;;41710:372;;;;;;;;;;-1:-1:-1;41710:372:0;;;;;:::i;:::-;;:::i;:::-;;;934:14:1;;927:22;909:41;;897:2;882:18;41710:372:0;;;;;;;;43596:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;45158:214::-;;;;;;;;;;-1:-1:-1;45158:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2061:32:1;;;2043:51;;2031:2;2016:18;45158:214:0;1897:203:1;58951:466:0;;;;;;;;;;-1:-1:-1;58951:466:0;;;;;:::i;:::-;;:::i;44679:413::-;;;;;;;;;;-1:-1:-1;44679:413:0;;;;;:::i;:::-;;:::i;39959:108::-;;;;;;;;;;-1:-1:-1;40020:7:0;40047:12;39959:108;;;2510:25:1;;;2498:2;2483:18;39959:108:0;2364:177:1;61568:319:0;;;;;;;;;;-1:-1:-1;61568:319:0;;;;;:::i;:::-;;:::i;55513:36::-;;;;;;;;;;;;;;;;64162:324;;;;;;;;;;-1:-1:-1;64162:324:0;;;;;:::i;:::-;;:::i;46034:170::-;;;;;;;;;;-1:-1:-1;46034:170:0;;;;;:::i;:::-;;:::i;40631:1007::-;;;;;;;;;;-1:-1:-1;40631:1007:0;;;;;:::i;:::-;;:::i;56300:50::-;;;;;;;;;;-1:-1:-1;56300:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;58586:306;;;;;;;;;;-1:-1:-1;58586:306:0;;;;;:::i;:::-;;:::i;57389:109::-;;;;;;;;;;-1:-1:-1;57389:109:0;;;;;:::i;:::-;;:::i;65454:291::-;;;;;;;;;;-1:-1:-1;65454:291:0;;;;;:::i;:::-;;:::i;62106:349::-;;;;;;;;;;;;;:::i;46275:185::-;;;;;;;;;;-1:-1:-1;46275:185:0;;;;;:::i;:::-;;:::i;62941:124::-;;;;;;;;;;;;;:::i;65269:82::-;;;;;;;;;;-1:-1:-1;65334:9:0;;;;;;;65269:82;;65359:83;;;;;;;;;;;;;:::i;40144:187::-;;;;;;;;;;-1:-1:-1;40144:187:0;;;;;:::i;:::-;;:::i;55129:29::-;;;;;;;;;;;;;;;;63151:297;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43405:124::-;;;;;;;;;;-1:-1:-1;43405:124:0;;;;;:::i;:::-;;:::i;56663:27::-;;;;;;;;;;;;;:::i;42146:221::-;;;;;;;;;;-1:-1:-1;42146:221:0;;;;;:::i;:::-;;:::i;4591:94::-;;;;;;;;;;;;;:::i;64751:172::-;;;;;;;;;;;;;:::i;63821:275::-;;;;;;;;;;-1:-1:-1;63821:275:0;;;;;:::i;:::-;;:::i;3940:87::-;;;;;;;;;;-1:-1:-1;4013:6:0;;-1:-1:-1;;;;;4013:6:0;3940:87;;43765:104;;;;;;;;;;;;;:::i;45444:288::-;;;;;;;;;;-1:-1:-1;45444:288:0;;;;;:::i;:::-;;:::i;64931:158::-;;;;;;;;;;;;;:::i;65894:200::-;;;;;;;;;;-1:-1:-1;65894:200:0;;;;;:::i;:::-;;:::i;61937:109::-;;;;;;;;;;;;;:::i;65097:79::-;;;;;;;;;;-1:-1:-1;65161:7:0;;;;65097:79;;60267:676;;;;;;:::i;:::-;;:::i;46531:355::-;;;;;;;;;;-1:-1:-1;46531:355:0;;;;;:::i;:::-;;:::i;63497:257::-;;;;;;;;;;;;;:::i;65184:77::-;;;;;;;;;;;;;:::i;57506:125::-;;;;;;;;;;-1:-1:-1;57506:125:0;;;;;:::i;:::-;;:::i;64559:146::-;;;;;;;;;;-1:-1:-1;64559:146:0;;;;;:::i;:::-;;:::i;60955:568::-;;;;;;;;;;-1:-1:-1;60955:568:0;;;;;:::i;:::-;;:::i;59476:732::-;;;;;;:::i;:::-;;:::i;45803:164::-;;;;;;;;;;-1:-1:-1;45803:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;45924:25:0;;;45900:4;45924:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45803:164;57639:170;;;;;;;;;;;;;:::i;4840:192::-;;;;;;;;;;-1:-1:-1;4840:192:0;;;;;:::i;:::-;;:::i;65753:129::-;;;;;;;;;;-1:-1:-1;65753:129:0;;;;;:::i;:::-;;:::i;57817:180::-;;;;;;;;;;;;;:::i;55473:33::-;;;;;;;;;;;;;;;;62787:87;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;;;;;;;;;62852:5:::1;:14:::0;;-1:-1:-1;;;;;;62852:14:0::1;-1:-1:-1::0;;;;;62852:14:0;;;::::1;::::0;;;::::1;::::0;;62787:87::o;41710:372::-;41812:4;-1:-1:-1;;;;;;41849:40:0;;-1:-1:-1;;;41849:40:0;;:105;;-1:-1:-1;;;;;;;41906:48:0;;-1:-1:-1;;;41906:48:0;41849:105;:172;;;-1:-1:-1;;;;;;;41971:50:0;;-1:-1:-1;;;41971:50:0;41849:172;:225;;;-1:-1:-1;;;;;;;;;;16031:40:0;;;42038:36;41829:245;41710:372;-1:-1:-1;;41710:372:0:o;43596:100::-;43650:13;43683:5;43676:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43596:100;:::o;45158:214::-;45226:7;45254:16;45262:7;47198:4;47232:12;-1:-1:-1;47222:22:0;47141:111;45254:16;45246:74;;;;-1:-1:-1;;;45246:74:0;;8026:2:1;45246:74:0;;;8008:21:1;8065:2;8045:18;;;8038:30;8104:34;8084:18;;;8077:62;-1:-1:-1;;;8155:18:1;;;8148:43;8208:19;;45246:74:0;7824:409:1;45246:74:0;-1:-1:-1;45340:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;45340:24:0;;45158:214::o;58951:466::-;59014:9;;;;;;;59013:10;59005:38;;;;-1:-1:-1;;;59005:38:0;;8440:2:1;59005:38:0;;;8422:21:1;8479:2;8459:18;;;8452:30;-1:-1:-1;;;8498:18:1;;;8491:45;8553:18;;59005:38:0;8238:339:1;59005:38:0;59125:14;;59106:16;;:33;;;;:::i;:::-;59088:14;;:52;;;;:::i;:::-;59078:6;59062:13;40020:7;40047:12;;39959:108;59062:13;:22;;;;:::i;:::-;:78;;59054:121;;;;-1:-1:-1;;;59054:121:0;;;;;;;:::i;:::-;59236:11;;:33;;-1:-1:-1;;;59236:33:0;;59258:10;59236:33;;;2043:51:1;-1:-1:-1;;;;;59236:11:0;;;;:21;;2016:18:1;;59236:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59212:10;59194:29;;;;:17;:29;;;;;;:38;;59226:6;;59194:38;:::i;:::-;:75;;59186:121;;;;-1:-1:-1;;;59186:121:0;;9727:2:1;59186:121:0;;;9709:21:1;9766:2;9746:18;;;9739:30;9805:34;9785:18;;;9778:62;-1:-1:-1;;;9856:18:1;;;9849:31;9897:19;;59186:121:0;9525:397:1;59186:121:0;59328:29;59338:10;59350:6;59328:9;:29::i;:::-;59386:10;59368:29;;;;:17;:29;;;;;:39;;59401:6;;59368:29;:39;;59401:6;;59368:39;:::i;:::-;;;;-1:-1:-1;;;58951:466:0:o;44679:413::-;44752:13;44768:24;44784:7;44768:15;:24::i;:::-;44752:40;;44817:5;-1:-1:-1;;;;;44811:11:0;:2;-1:-1:-1;;;;;44811:11:0;;;44803:58;;;;-1:-1:-1;;;44803:58:0;;10129:2:1;44803:58:0;;;10111:21:1;10168:2;10148:18;;;10141:30;10207:34;10187:18;;;10180:62;-1:-1:-1;;;10258:18:1;;;10251:32;10300:19;;44803:58:0;9927:398:1;44803:58:0;2808:10;-1:-1:-1;;;;;44896:21:0;;;;:62;;-1:-1:-1;44921:37:0;44938:5;2808:10;45803:164;:::i;44921:37::-;44874:169;;;;-1:-1:-1;;;44874:169:0;;10532:2:1;44874:169:0;;;10514:21:1;10571:2;10551:18;;;10544:30;10610:34;10590:18;;;10583:62;10681:27;10661:18;;;10654:55;10726:19;;44874:169:0;10330:421:1;44874:169:0;45056:28;45065:2;45069:7;45078:5;45056:8;:28::i;:::-;44741:351;44679:413;;:::o;61568:319::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;61685:16:::1;;61675:6;61658:14;;:23;;;;:::i;:::-;:43;;61650:95;;;::::0;-1:-1:-1;;;61650:95:0;;10958:2:1;61650:95:0::1;::::0;::::1;10940:21:1::0;10997:2;10977:18;;;10970:30;11036:34;11016:18;;;11009:62;-1:-1:-1;;;11087:18:1;;;11080:37;11134:19;;61650:95:0::1;10756:403:1::0;61650:95:0::1;61758:28;61768:9;61779:6;61758:9;:28::i;:::-;-1:-1:-1::0;;;;;61797:26:0;::::1;;::::0;;;:15:::1;:26;::::0;;;;:36;;61827:6;;61797:26;:36:::1;::::0;61827:6;;61797:36:::1;:::i;:::-;;;;;;;;61862:6;61844:14;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;61568:319:0:o;64162:324::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;64246:1:::1;64237:6;:10;64229:44;;;::::0;-1:-1:-1;;;64229:44:0;;11366:2:1;64229:44:0::1;::::0;::::1;11348:21:1::0;11405:2;11385:18;;;11378:30;-1:-1:-1;;;11424:18:1;;;11417:51;11485:18;;64229:44:0::1;11164:345:1::0;64229:44:0::1;64284:16;64303:11;:9;:11::i;:::-;64284:30:::0;-1:-1:-1;64343:16:0::1;64329:10;:30;;;;;;;;:::i;:::-;;64325:154;;-1:-1:-1::0;64376:14:0::1;:23:::0;64162:324::o;64325:154::-:1;64441:17;:26:::0;;;64325:154:::1;64218:268;64162:324:::0;:::o;46034:170::-;46168:28;46178:4;46184:2;46188:7;46168:9;:28::i;40631:1007::-;40720:7;40756:16;40766:5;40756:9;:16::i;:::-;40748:5;:24;40740:71;;;;-1:-1:-1;;;40740:71:0;;11716:2:1;40740:71:0;;;11698:21:1;11755:2;11735:18;;;11728:30;11794:34;11774:18;;;11767:62;-1:-1:-1;;;11845:18:1;;;11838:32;11887:19;;40740:71:0;11514:398:1;40740:71:0;40822:22;40047:12;;;40822:22;;41085:466;41105:14;41101:1;:18;41085:466;;;41145:31;41179:14;;;:11;:14;;;;;;;;;41145:48;;;;;;;;;-1:-1:-1;;;;;41145:48:0;;;;;-1:-1:-1;;;41145:48:0;;;;;;;;;;;;41216:28;41212:111;;41289:14;;;-1:-1:-1;41212:111:0;41366:5;-1:-1:-1;;;;;41345:26:0;:17;-1:-1:-1;;;;;41345:26:0;;41341:195;;;41415:5;41400:11;:20;41396:85;;;-1:-1:-1;41456:1:0;-1:-1:-1;41449:8:0;;-1:-1:-1;;;41449:8:0;41396:85;41503:13;;;;;41341:195;-1:-1:-1;41121:3:0;;41085:466;;;-1:-1:-1;41574:56:0;;-1:-1:-1;;;41574:56:0;;12119:2:1;41574:56:0;;;12101:21:1;12158:2;12138:18;;;12131:30;12197:34;12177:18;;;12170:62;-1:-1:-1;;;12248:18:1;;;12241:44;12302:19;;41574:56:0;11917:410:1;58586:306:0;58727:37;;-1:-1:-1;;58752:4:0;12559:2:1;12555:15;;;12551:24;;58727:37:0;;;12539::1;12610:15;;;12606:24;12592:12;;;12585:46;58685:4:0;;;;12647:12:1;;58727:37:0;;;;;;;;;;;;58717:48;;;;;;58702:63;;58792:92;58865:4;58812:58;;;;;;;12912:66:1;12900:79;;13004:2;12995:12;;12988:28;;;;13041:2;13032:12;;12670:380;58812:58:0;;;;-1:-1:-1;;58812:58:0;;;;;;;;;58802:69;;58812:58;58802:69;;;;58792:92;;;;;;;;;13282:25:1;13355:4;13343:17;;13323:18;;;13316:45;13377:18;;;13370:34;;;13420:18;;;13413:34;;;13254:19;;58792:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58792:92:0;;-1:-1:-1;;58792:92:0;;58783:5;;-1:-1:-1;;;;;58783:5:0;;;:101;;;;-1:-1:-1;;;58586:306:0;;;;;;;:::o;57389:109::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;57464:26;;::::1;::::0;:15:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;65454:291::-:0;65563:11;;:30;;-1:-1:-1;;;65563:30:0;;-1:-1:-1;;;;;2061:32:1;;;65563:30:0;;;2043:51:1;65512:4:0;;65563:11;;:21;;2016:18:1;;65563:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;65533:26:0;;;;;;:17;:26;;;;;;:60;65529:209;;-1:-1:-1;65617:1:0;;65454:291;-1:-1:-1;65454:291:0:o;65529:209::-;-1:-1:-1;;;;;65700:26:0;;;;;;;:17;:26;;;;;;;;65667:11;;:30;;-1:-1:-1;;;65667:30:0;;;;;2043:51:1;;;;65700:26:0;65667:11;;:21;;2016:18:1;;65667:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;65529:209::-;65454:291;;;:::o;62106:349::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;62154:15:::1;62172:16;:14;:16::i;:::-;62154:34;;62217:1;62207:7;:11;62199:58;;;::::0;-1:-1:-1;;;62199:58:0;;13660:2:1;62199:58:0::1;::::0;::::1;13642:21:1::0;13699:2;13679:18;;;13672:30;13738:34;13718:18;;;13711:62;-1:-1:-1;;;13789:18:1;;;13782:32;13831:19;;62199:58:0::1;13458:398:1::0;62199:58:0::1;62270:84;62288:42;62350:3;62334:12;:7:::0;62344:2:::1;62334:12;:::i;:::-;62333:20;;;;:::i;:::-;62270:9;:84::i;:::-;62366:80;62384:42;62429:16;:14;:16::i;62366:80::-;62143:312;62106:349::o:0;46275:185::-;46413:39;46430:4;46436:2;46440:7;46413:39;;;;;;;;;;;;:16;:39::i;62941:124::-;4013:6;;63000:4;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;63043:14:::1;;63024:16;;:33;;;;:::i;:::-;63017:40;;62941:124:::0;:::o;65359:83::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;65425:9:::1;::::0;;-1:-1:-1;;65412:22:0;::::1;65425:9;::::0;;;::::1;;;65424:10;65412:22:::0;;::::1;;::::0;;65359:83::o;40144:187::-;40211:7;40047:12;;40239:5;:21;40231:69;;;;-1:-1:-1;;;40231:69:0;;14493:2:1;40231:69:0;;;14475:21:1;14532:2;14512:18;;;14505:30;14571:34;14551:18;;;14544:62;-1:-1:-1;;;14622:18:1;;;14615:33;14665:19;;40231:69:0;14291:399:1;40231:69:0;-1:-1:-1;40318:5:0;40144:187::o;63151:297::-;63192:5;63213:17;;63234:1;63213:22;63209:232;;;-1:-1:-1;63259:12:0;;63151:297::o;63209:232::-;63302:20;;63298:143;;-1:-1:-1;63351:13:0;;63151:297::o;63298:143::-;-1:-1:-1;63413:16:0;;63151:297::o;43405:124::-;43469:7;43496:20;43508:7;43496:11;:20::i;:::-;:25;;43405:124;-1:-1:-1;;43405:124:0:o;56663:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42146:221::-;42210:7;-1:-1:-1;;;;;42238:19:0;;42230:75;;;;-1:-1:-1;;;42230:75:0;;14897:2:1;42230:75:0;;;14879:21:1;14936:2;14916:18;;;14909:30;14975:34;14955:18;;;14948:62;-1:-1:-1;;;15026:18:1;;;15019:41;15077:19;;42230:75:0;14695:407:1;42230:75:0;-1:-1:-1;;;;;;42331:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;42331:27:0;;42146:221::o;4591:94::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;4656:21:::1;4674:1;4656:9;:21::i;:::-;4591:94::o:0;64751:172::-;64795:7;64823:10;;64837:1;64823:15;;64815:72;;;;-1:-1:-1;;;64815:72:0;;15309:2:1;64815:72:0;;;15291:21:1;15348:2;15328:18;;;15321:30;15387:34;15367:18;;;15360:62;-1:-1:-1;;;15438:18:1;;;15431:42;15490:19;;64815:72:0;15107:408:1;64815:72:0;-1:-1:-1;64905:10:0;;;64751:172::o;63821:275::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;63890:16:::1;63909:11;:9;:11::i;:::-;63890:30:::0;-1:-1:-1;63949:16:0::1;63935:10;:30;;;;;;;;:::i;:::-;;63931:158;;-1:-1:-1::0;63982:15:0::1;:25:::0;64162:324::o;63931:158::-:1;-1:-1:-1::0;64049:18:0::1;:28:::0;63821:275::o;43765:104::-;43821:13;43854:7;43847:14;;;;;:::i;45444:288::-;-1:-1:-1;;;;;45539:24:0;;2808:10;45539:24;;45531:63;;;;-1:-1:-1;;;45531:63:0;;15722:2:1;45531:63:0;;;15704:21:1;15761:2;15741:18;;;15734:30;15800:28;15780:18;;;15773:56;15846:18;;45531:63:0;15520:350:1;45531:63:0;2808:10;45607:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;45607:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;45607:53:0;;;;;;;;;;45676:48;;909:41:1;;;45607:42:0;;2808:10;45676:48;;882:18:1;45676:48:0;;;;;;;45444:288;;:::o;64931:158::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;64985:10:::1;::::0;:15;64977:65:::1;;;::::0;-1:-1:-1;;;64977:65:0;;16077:2:1;64977:65:0::1;::::0;::::1;16059:21:1::0;16116:2;16096:18;;;16089:30;16155:34;16135:18;;;16128:62;-1:-1:-1;;;16206:18:1;;;16199:35;16251:19;;64977:65:0::1;15875:401:1::0;64977:65:0::1;65066:15;65053:10;:28:::0;64931:158::o;65894:200::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65981:28:0;::::1;65973:65;;;::::0;-1:-1:-1;;;65973:65:0;;16483:2:1;65973:65:0::1;::::0;::::1;16465:21:1::0;16522:2;16502:18;;;16495:30;16561:26;16541:18;;;16534:54;16605:18;;65973:65:0::1;16281:348:1::0;65973:65:0::1;66049:11;:37:::0;;-1:-1:-1;;;;;;66049:37:0::1;-1:-1:-1::0;;;;;66049:37:0;;;::::1;::::0;;;::::1;::::0;;65894:200::o;61937:109::-;4013:6;;61993:4;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;-1:-1:-1;62017:21:0::1;61937:109:::0;:::o;60267:676::-;60342:7;;;;60341:8;60333:36;;;;-1:-1:-1;;;60333:36:0;;16836:2:1;60333:36:0;;;16818:21:1;16875:2;16855:18;;;16848:30;-1:-1:-1;;;16894:18:1;;;16887:45;16949:18;;60333:36:0;16634:339:1;60333:36:0;60380:16;60399:11;:9;:11::i;:::-;60380:30;-1:-1:-1;60443:16:0;60429:10;:30;;;;;;;;:::i;:::-;;60421:71;;;;-1:-1:-1;;;60421:71:0;;17180:2:1;60421:71:0;;;17162:21:1;17219:2;17199:18;;;17192:30;17258;17238:18;;;17231:58;17306:18;;60421:71:0;16978:352:1;60421:71:0;60574:14;;60555:16;;:33;;;;:::i;:::-;60537:14;;:52;;;;:::i;:::-;60527:6;60511:13;40020:7;40047:12;;39959:108;60511:13;:22;;;;:::i;:::-;:78;;60503:121;;;;-1:-1:-1;;;60503:121:0;;;;;;;:::i;:::-;60683:17;;60659:10;60643:27;;;;:15;:27;;;;;;:36;;60673:6;;60643:36;:::i;:::-;:57;;60635:105;;;;-1:-1:-1;;;60635:105:0;;;;;;;:::i;:::-;60785:6;60772:10;:8;:10::i;:::-;:19;;;;:::i;:::-;60759:9;:32;;60751:94;;;;-1:-1:-1;;;60751:94:0;;17941:2:1;60751:94:0;;;17923:21:1;17980:2;17960:18;;;17953:30;18019:34;17999:18;;;17992:62;-1:-1:-1;;;18070:18:1;;;18063:47;18127:19;;60751:94:0;17739:413:1;60751:94:0;60858:29;60868:10;60880:6;60858:9;:29::i;:::-;60914:10;60898:27;;;;:15;:27;;;;;:37;;60929:6;;60898:27;:37;;60929:6;;60898:37;:::i;46531:355::-;46690:28;46700:4;46706:2;46710:7;46690:9;:28::i;:::-;46751:48;46774:4;46780:2;46784:7;46793:5;46751:22;:48::i;:::-;46729:149;;;;-1:-1:-1;;;46729:149:0;;;;;;;:::i;:::-;46531:355;;;;:::o;63497:257::-;63537:4;63554:16;63573:11;:9;:11::i;:::-;63554:30;-1:-1:-1;63613:16:0;63599:10;:30;;;;;;;;:::i;:::-;;63595:152;;-1:-1:-1;;63653:15:0;;;63497:257::o;63595:152::-;-1:-1:-1;;63717:18:0;;;63497:257::o;65184:77::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;65246:7:::1;::::0;;-1:-1:-1;;65235:18:0;::::1;65246:7;::::0;;::::1;65245:8;65235:18;::::0;;65184:77::o;57506:125::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;57593:30;;::::1;::::0;:13:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;64559:146::-:0;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;64636:1:::1;64627:6;:10;64619:43;;;::::0;-1:-1:-1;;;64619:43:0;;18779:2:1;64619:43:0::1;::::0;::::1;18761:21:1::0;18818:2;18798:18;;;18791:30;-1:-1:-1;;;18837:18:1;;;18830:50;18897:18;;64619:43:0::1;18577:344:1::0;64619:43:0::1;64691:6;64673:14;;:24;;;;;;;:::i;60955:568::-:0;61029:13;61063:17;61071:8;47198:4;47232:12;-1:-1:-1;47222:22:0;47141:111;61063:17;61055:77;;;;-1:-1:-1;;;61055:77:0;;19128:2:1;61055:77:0;;;19110:21:1;19167:2;19147:18;;;19140:30;19206:34;19186:18;;;19179:62;-1:-1:-1;;;19257:18:1;;;19250:45;19312:19;;61055:77:0;18926:411:1;61055:77:0;61244:10;;61240:272;;61283:13;61276:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60955:568;;;:::o;61240:272::-;61348:21;61372:10;:8;:10::i;:::-;61348:34;;61428:1;61410:7;61404:21;:25;:96;;;;;;;;;;;;;;;;;61456:7;61465:19;:8;:17;:19::i;:::-;61439:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61404:96;61397:103;60955:568;-1:-1:-1;;;60955:568:0:o;59476:732::-;59563:2;59568;59572;58088:41;58109:10;58120:2;58123;58126;58088:20;:41::i;:::-;58079:73;;;;-1:-1:-1;;;58079:73:0;;20186:2:1;58079:73:0;;;20168:21:1;20225:2;20205:18;;;20198:30;-1:-1:-1;;;20244:18:1;;;20237:47;20301:18;;58079:73:0;19984:341:1;58079:73:0;59611:7:::1;::::0;::::1;;59610:8;59602:36;;;::::0;-1:-1:-1;;;59602:36:0;;16836:2:1;59602:36:0::1;::::0;::::1;16818:21:1::0;16875:2;16855:18;;;16848:30;-1:-1:-1;;;16894:18:1;;;16887:45;16949:18;;59602:36:0::1;16634:339:1::0;59602:36:0::1;59649:16;59668:11;:9;:11::i;:::-;59649:30:::0;-1:-1:-1;59712:13:0::1;59698:10;:27;;;;;;;;:::i;:::-;;59690:61;;;::::0;-1:-1:-1;;;59690:61:0;;20532:2:1;59690:61:0::1;::::0;::::1;20514:21:1::0;20571:2;20551:18;;;20544:30;-1:-1:-1;;;20590:18:1;;;20583:51;20651:18;;59690:61:0::1;20330:345:1::0;59690:61:0::1;59833:14;;59814:16;;:33;;;;:::i;:::-;59796:14;;:52;;;;:::i;:::-;59786:6;59770:13;40020:7:::0;40047:12;;39959:108;59770:13:::1;:22;;;;:::i;:::-;:78;;59762:121;;;;-1:-1:-1::0;;;59762:121:0::1;;;;;;;:::i;:::-;59942:14;::::0;59918:10:::1;59902:27;::::0;;;:15:::1;:27;::::0;;;;;:36:::1;::::0;59932:6;;59902:36:::1;:::i;:::-;:54;;59894:102;;;;-1:-1:-1::0;;;59894:102:0::1;;;;;;;:::i;:::-;60041:6;60028:10;:8;:10::i;:::-;:19;;;;:::i;:::-;60015:9;:32;;60007:93;;;::::0;-1:-1:-1;;;60007:93:0;;20882:2:1;60007:93:0::1;::::0;::::1;20864:21:1::0;20921:2;20901:18;;;20894:30;20960:34;20940:18;;;20933:62;-1:-1:-1;;;21011:18:1;;;21004:46;21067:19;;60007:93:0::1;20680:412:1::0;60007:93:0::1;60121:29;60131:10;60143:6;60121:9;:29::i;:::-;60177:10;60161:27;::::0;;;:15:::1;:27;::::0;;;;:37;;60192:6;;60161:27;:37:::1;::::0;60192:6;;60161:37:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;;59476:732:0:o;57639:170::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;57717:12:::1;57702:11;:9;:11::i;:::-;:27;;;;;;;;:::i;:::-;;57694:61;;;::::0;-1:-1:-1;;;57694:61:0;;21299:2:1;57694:61:0::1;::::0;::::1;21281:21:1::0;21338:2;21318:18;;;21311:30;-1:-1:-1;;;21357:18:1;;;21350:51;21418:18;;57694:61:0::1;21097:345:1::0;57694:61:0::1;57786:15;57766:17;:35:::0;57639:170::o;4840:192::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4929:22:0;::::1;4921:73;;;::::0;-1:-1:-1;;;4921:73:0;;21649:2:1;4921:73:0::1;::::0;::::1;21631:21:1::0;21688:2;21668:18;;;21661:30;21727:34;21707:18;;;21700:62;-1:-1:-1;;;21778:18:1;;;21771:36;21824:19;;4921:73:0::1;21447:402:1::0;4921:73:0::1;5005:19;5015:8;5005:9;:19::i;65753:129::-:0;65844:11;;:30;;-1:-1:-1;;;65844:30:0;;-1:-1:-1;;;;;2061:32:1;;;65844:30:0;;;2043:51:1;65820:4:0;;65844:11;;:21;;2016:18:1;;65844:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;57817:180::-;4013:6;;-1:-1:-1;;;;;4013:6:0;2808:10;4160:23;4152:68;;;;-1:-1:-1;;;4152:68:0;;;;;;;:::i;:::-;57898:13:::1;57883:11;:9;:11::i;:::-;:28;;;;;;;;:::i;:::-;;57875:65;;;::::0;-1:-1:-1;;;57875:65:0;;22056:2:1;57875:65:0::1;::::0;::::1;22038:21:1::0;22095:2;22075:18;;;22068:30;22134:26;22114:18;;;22107:54;22178:18;;57875:65:0::1;21854:348:1::0;57875:65:0::1;57974:15;57951:20;:38:::0;57817:180::o;47260:104::-;47329:27;47339:2;47343:8;47329:27;;;;;;;;;;;;:9;:27::i;52061:196::-;52176:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;52176:29:0;-1:-1:-1;;;;;52176:29:0;;;;;;;;;52221:28;;52176:24;;52221:28;;;;;;;52061:196;;;:::o;49941:2002::-;50056:35;50094:20;50106:7;50094:11;:20::i;:::-;50169:18;;50056:58;;-1:-1:-1;50127:22:0;;-1:-1:-1;;;;;50153:34:0;2808:10;-1:-1:-1;;;;;50153:34:0;;:87;;;-1:-1:-1;2808:10:0;50204:20;50216:7;50204:11;:20::i;:::-;-1:-1:-1;;;;;50204:36:0;;50153:87;:154;;;-1:-1:-1;50274:18:0;;50257:50;;2808:10;45803:164;:::i;50257:50::-;50127:181;;50329:17;50321:80;;;;-1:-1:-1;;;50321:80:0;;22409:2:1;50321:80:0;;;22391:21:1;22448:2;22428:18;;;22421:30;22487:34;22467:18;;;22460:62;-1:-1:-1;;;22538:18:1;;;22531:48;22596:19;;50321:80:0;22207:414:1;50321:80:0;50444:4;-1:-1:-1;;;;;50422:26:0;:13;:18;;;-1:-1:-1;;;;;50422:26:0;;50414:77;;;;-1:-1:-1;;;50414:77:0;;22828:2:1;50414:77:0;;;22810:21:1;22867:2;22847:18;;;22840:30;22906:34;22886:18;;;22879:62;-1:-1:-1;;;22957:18:1;;;22950:36;23003:19;;50414:77:0;22626:402:1;50414:77:0;-1:-1:-1;;;;;50510:16:0;;50502:66;;;;-1:-1:-1;;;50502:66:0;;23235:2:1;50502:66:0;;;23217:21:1;23274:2;23254:18;;;23247:30;23313:34;23293:18;;;23286:62;-1:-1:-1;;;23364:18:1;;;23357:35;23409:19;;50502:66:0;23033:401:1;50502:66:0;50689:49;50706:1;50710:7;50719:13;:18;;;50689:8;:49::i;:::-;-1:-1:-1;;;;;51034:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;51034:31:0;;;-1:-1:-1;;;;;51034:31:0;;;-1:-1:-1;;51034:31:0;;;;;;;51080:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;51080:29:0;;;;;;;;;;;;;51126:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;51171:61:0;;;;-1:-1:-1;;;51216:15:0;51171:61;;;;;;51506:11;;;51536:24;;;;;:29;51506:11;;51536:29;51532:295;;51604:20;51612:11;47198:4;47232:12;-1:-1:-1;47222:22:0;47141:111;51604:20;51600:212;;;51681:18;;;51649:24;;;:11;:24;;;;;;;;:50;;51764:28;;;;51722:70;;-1:-1:-1;;;51722:70:0;-1:-1:-1;;;;;;51722:70:0;;;-1:-1:-1;;;;;51649:50:0;;;51722:70;;;;;;;51600:212;51009:829;51874:7;51870:2;-1:-1:-1;;;;;51855:27:0;51864:4;-1:-1:-1;;;;;51855:27:0;;;;;;;;;;;51893:42;50045:1898;;49941:2002;;;:::o;62530:183::-;62611:9;62626:7;-1:-1:-1;;;;;62626:12:0;62646:6;62626:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62610:47;;;62676:4;62668:37;;;;-1:-1:-1;;;62668:37:0;;23851:2:1;62668:37:0;;;23833:21:1;23890:2;23870:18;;;23863:30;-1:-1:-1;;;23909:18:1;;;23902:50;23969:18;;62668:37:0;23649:344:1;42806:537:0;-1:-1:-1;;;;;;;;;;;;;;;;;42909:16:0;42917:7;47198:4;47232:12;-1:-1:-1;47222:22:0;47141:111;42909:16;42901:71;;;;-1:-1:-1;;;42901:71:0;;24200:2:1;42901:71:0;;;24182:21:1;24239:2;24219:18;;;24212:30;24278:34;24258:18;;;24251:62;-1:-1:-1;;;24329:18:1;;;24322:40;24379:19;;42901:71:0;23998:406:1;42901:71:0;43030:7;43010:245;43077:31;43111:17;;;:11;:17;;;;;;;;;43077:51;;;;;;;;;-1:-1:-1;;;;;43077:51:0;;;;;-1:-1:-1;;;43077:51:0;;;;;;;;;;;;43151:28;43147:93;;43211:9;42806:537;-1:-1:-1;;;42806:537:0:o;43147:93::-;-1:-1:-1;;;43050:6:0;43010:245;;5040:173;5115:6;;;-1:-1:-1;;;;;5132:17:0;;;-1:-1:-1;;;;;;5132:17:0;;;;;;;5165:40;;5115:6;;;5132:17;5115:6;;5165:40;;5096:16;;5165:40;5085:128;5040:173;:::o;52822:804::-;52977:4;-1:-1:-1;;;;;52998:13:0;;6309:20;6357:8;52994:625;;53034:72;;-1:-1:-1;;;53034:72:0;;-1:-1:-1;;;;;53034:36:0;;;;;:72;;2808:10;;53085:4;;53091:7;;53100:5;;53034:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53034:72:0;;;;;;;;-1:-1:-1;;53034:72:0;;;;;;;;;;;;:::i;:::-;;;53030:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53280:13:0;;53276:273;;53323:61;;-1:-1:-1;;;53323:61:0;;;;;;;:::i;53276:273::-;53499:6;53493:13;53484:6;53480:2;53476:15;53469:38;53030:534;-1:-1:-1;;;;;;53157:55:0;-1:-1:-1;;;53157:55:0;;-1:-1:-1;53150:62:0;;52994:625;-1:-1:-1;53603:4:0;53596:11;;57215:116;57275:13;57308:15;57301:22;;;;;:::i;344:723::-;400:13;621:10;617:53;;-1:-1:-1;;648:10:0;;;;;;;;;;;;-1:-1:-1;;;648:10:0;;;;;344:723::o;617:53::-;695:5;680:12;736:78;743:9;;736:78;;769:8;;;;:::i;:::-;;-1:-1:-1;792:10:0;;-1:-1:-1;800:2:0;792:10;;:::i;:::-;;;736:78;;;824:19;856:6;846:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;846:17:0;;824:39;;874:154;881:10;;874:154;;908:11;918:1;908:11;;:::i;:::-;;-1:-1:-1;977:10:0;985:2;977:5;:10;:::i;:::-;964:24;;:2;:24;:::i;:::-;951:39;;934:6;941;934:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;934:56:0;;;;;;;;-1:-1:-1;1005:11:0;1014:2;1005:11;;:::i;:::-;;;874:154;;47727:163;47850:32;47856:2;47860:8;47870:5;47877:4;48288:20;48311:12;-1:-1:-1;;;;;48342:16:0;;48334:62;;;;-1:-1:-1;;;48334:62:0;;26164:2:1;48334:62:0;;;26146:21:1;26203:2;26183:18;;;26176:30;26242:34;26222:18;;;26215:62;-1:-1:-1;;;26293:18:1;;;26286:31;26334:19;;48334:62:0;25962:397:1;48334:62:0;48415:13;48407:66;;;;-1:-1:-1;;;48407:66:0;;26566:2:1;48407:66:0;;;26548:21:1;26605:2;26585:18;;;26578:30;26644:34;26624:18;;;26617:62;-1:-1:-1;;;26695:18:1;;;26688:38;26743:19;;48407:66:0;26364:404:1;48407:66:0;-1:-1:-1;;;;;48825:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;48825:45:0;;-1:-1:-1;;;;;48825:45:0;;;;;;;;;;48885:50;;;;;;;;;;;;;;48952:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;49002:66:0;;;;-1:-1:-1;;;49052:15:0;49002:66;;;;;;;48952:25;;49137:415;49157:8;49153:1;:12;49137:415;;;49196:38;;49221:12;;-1:-1:-1;;;;;49196:38:0;;;49213:1;;49196:38;;49213:1;;49196:38;49257:4;49253:249;;;49320:59;49351:1;49355:2;49359:12;49373:5;49320:22;:59::i;:::-;49286:196;;;;-1:-1:-1;;;49286:196:0;;;;;;;:::i;:::-;49522:14;;;;;49167:3;49137:415;;;-1:-1:-1;49568:12:0;:27;49619:60;46531:355;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:186;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:131::-;-1:-1:-1;;;;;;457:32:1;;447:43;;437:71;;504:1;501;494:12;519:245;577:6;630:2;618:9;609:7;605:23;601:32;598:52;;;646:1;643;636:12;598:52;685:9;672:23;704:30;728:5;704:30;:::i;961:258::-;1033:1;1043:113;1057:6;1054:1;1051:13;1043:113;;;1133:11;;;1127:18;1114:11;;;1107:39;1079:2;1072:10;1043:113;;;1174:6;1171:1;1168:13;1165:48;;;-1:-1:-1;;1209:1:1;1191:16;;1184:27;961:258::o;1224:::-;1266:3;1304:5;1298:12;1331:6;1326:3;1319:19;1347:63;1403:6;1396:4;1391:3;1387:14;1380:4;1373:5;1369:16;1347:63;:::i;:::-;1464:2;1443:15;-1:-1:-1;;1439:29:1;1430:39;;;;1471:4;1426:50;;1224:258;-1:-1:-1;;1224:258:1:o;1487:220::-;1636:2;1625:9;1618:21;1599:4;1656:45;1697:2;1686:9;1682:18;1674:6;1656:45;:::i;1712:180::-;1771:6;1824:2;1812:9;1803:7;1799:23;1795:32;1792:52;;;1840:1;1837;1830:12;1792:52;-1:-1:-1;1863:23:1;;1712:180;-1:-1:-1;1712:180:1:o;2105:254::-;2173:6;2181;2234:2;2222:9;2213:7;2209:23;2205:32;2202:52;;;2250:1;2247;2240:12;2202:52;2273:29;2292:9;2273:29;:::i;:::-;2263:39;2349:2;2334:18;;;;2321:32;;-1:-1:-1;;;2105:254:1:o;2546:::-;2614:6;2622;2675:2;2663:9;2654:7;2650:23;2646:32;2643:52;;;2691:1;2688;2681:12;2643:52;2727:9;2714:23;2704:33;;2756:38;2790:2;2779:9;2775:18;2756:38;:::i;:::-;2746:48;;2546:254;;;;;:::o;2805:328::-;2882:6;2890;2898;2951:2;2939:9;2930:7;2926:23;2922:32;2919:52;;;2967:1;2964;2957:12;2919:52;2990:29;3009:9;2990:29;:::i;:::-;2980:39;;3038:38;3072:2;3061:9;3057:18;3038:38;:::i;:::-;3028:48;;3123:2;3112:9;3108:18;3095:32;3085:42;;2805:328;;;;;:::o;3138:156::-;3204:20;;3264:4;3253:16;;3243:27;;3233:55;;3284:1;3281;3274:12;3299:393;3383:6;3391;3399;3407;3460:3;3448:9;3439:7;3435:23;3431:33;3428:53;;;3477:1;3474;3467:12;3428:53;3500:29;3519:9;3500:29;:::i;:::-;3490:39;;3548:36;3580:2;3569:9;3565:18;3548:36;:::i;:::-;3299:393;;3538:46;;-1:-1:-1;;;;3631:2:1;3616:18;;3603:32;;3682:2;3667:18;3654:32;;3299:393::o;3697:127::-;3758:10;3753:3;3749:20;3746:1;3739:31;3789:4;3786:1;3779:15;3813:4;3810:1;3803:15;3829:632;3894:5;3924:18;3965:2;3957:6;3954:14;3951:40;;;3971:18;;:::i;:::-;4046:2;4040:9;4014:2;4100:15;;-1:-1:-1;;4096:24:1;;;4122:2;4092:33;4088:42;4076:55;;;4146:18;;;4166:22;;;4143:46;4140:72;;;4192:18;;:::i;:::-;4232:10;4228:2;4221:22;4261:6;4252:15;;4291:6;4283;4276:22;4331:3;4322:6;4317:3;4313:16;4310:25;4307:45;;;4348:1;4345;4338:12;4307:45;4398:6;4393:3;4386:4;4378:6;4374:17;4361:44;4453:1;4446:4;4437:6;4429;4425:19;4421:30;4414:41;;;;3829:632;;;;;:::o;4466:451::-;4535:6;4588:2;4576:9;4567:7;4563:23;4559:32;4556:52;;;4604:1;4601;4594:12;4556:52;4644:9;4631:23;4677:18;4669:6;4666:30;4663:50;;;4709:1;4706;4699:12;4663:50;4732:22;;4785:4;4777:13;;4773:27;-1:-1:-1;4763:55:1;;4814:1;4811;4804:12;4763:55;4837:74;4903:7;4898:2;4885:16;4880:2;4876;4872:11;4837:74;:::i;4922:127::-;4983:10;4978:3;4974:20;4971:1;4964:31;5014:4;5011:1;5004:15;5038:4;5035:1;5028:15;5054:338;5196:2;5181:18;;5229:1;5218:13;;5208:144;;5274:10;5269:3;5265:20;5262:1;5255:31;5309:4;5306:1;5299:15;5337:4;5334:1;5327:15;5208:144;5361:25;;;5054:338;:::o;5397:347::-;5462:6;5470;5523:2;5511:9;5502:7;5498:23;5494:32;5491:52;;;5539:1;5536;5529:12;5491:52;5562:29;5581:9;5562:29;:::i;:::-;5552:39;;5641:2;5630:9;5626:18;5613:32;5688:5;5681:13;5674:21;5667:5;5664:32;5654:60;;5710:1;5707;5700:12;5654:60;5733:5;5723:15;;;5397:347;;;;;:::o;5749:667::-;5844:6;5852;5860;5868;5921:3;5909:9;5900:7;5896:23;5892:33;5889:53;;;5938:1;5935;5928:12;5889:53;5961:29;5980:9;5961:29;:::i;:::-;5951:39;;6009:38;6043:2;6032:9;6028:18;6009:38;:::i;:::-;5999:48;;6094:2;6083:9;6079:18;6066:32;6056:42;;6149:2;6138:9;6134:18;6121:32;6176:18;6168:6;6165:30;6162:50;;;6208:1;6205;6198:12;6162:50;6231:22;;6284:4;6276:13;;6272:27;-1:-1:-1;6262:55:1;;6313:1;6310;6303:12;6262:55;6336:74;6402:7;6397:2;6384:16;6379:2;6375;6371:11;6336:74;:::i;:::-;6326:84;;;5749:667;;;;;;;:::o;6421:387::-;6505:6;6513;6521;6529;6582:3;6570:9;6561:7;6557:23;6553:33;6550:53;;;6599:1;6596;6589:12;6550:53;6635:9;6622:23;6612:33;;6664:36;6696:2;6685:9;6681:18;6664:36;:::i;6813:260::-;6881:6;6889;6942:2;6930:9;6921:7;6917:23;6913:32;6910:52;;;6958:1;6955;6948:12;6910:52;6981:29;7000:9;6981:29;:::i;:::-;6971:39;;7029:38;7063:2;7052:9;7048:18;7029:38;:::i;7078:356::-;7280:2;7262:21;;;7299:18;;;7292:30;7358:34;7353:2;7338:18;;7331:62;7425:2;7410:18;;7078:356::o;7439:380::-;7518:1;7514:12;;;;7561;;;7582:61;;7636:4;7628:6;7624:17;7614:27;;7582:61;7689:2;7681:6;7678:14;7658:18;7655:38;7652:161;;;7735:10;7730:3;7726:20;7723:1;7716:31;7770:4;7767:1;7760:15;7798:4;7795:1;7788:15;7652:161;;7439:380;;;:::o;8582:127::-;8643:10;8638:3;8634:20;8631:1;8624:31;8674:4;8671:1;8664:15;8698:4;8695:1;8688:15;8714:125;8754:4;8782:1;8779;8776:8;8773:34;;;8787:18;;:::i;:::-;-1:-1:-1;8824:9:1;;8714:125::o;8844:128::-;8884:3;8915:1;8911:6;8908:1;8905:13;8902:39;;;8921:18;;:::i;:::-;-1:-1:-1;8957:9:1;;8844:128::o;8977:354::-;9179:2;9161:21;;;9218:2;9198:18;;;9191:30;9257:32;9252:2;9237:18;;9230:60;9322:2;9307:18;;8977:354::o;9336:184::-;9406:6;9459:2;9447:9;9438:7;9434:23;9430:32;9427:52;;;9475:1;9472;9465:12;9427:52;-1:-1:-1;9498:16:1;;9336:184;-1:-1:-1;9336:184:1:o;13861:168::-;13901:7;13967:1;13963;13959:6;13955:14;13952:1;13949:21;13944:1;13937:9;13930:17;13926:45;13923:71;;;13974:18;;:::i;:::-;-1:-1:-1;14014:9:1;;13861:168::o;14034:127::-;14095:10;14090:3;14086:20;14083:1;14076:31;14126:4;14123:1;14116:15;14150:4;14147:1;14140:15;14166:120;14206:1;14232;14222:35;;14237:18;;:::i;:::-;-1:-1:-1;14271:9:1;;14166:120::o;17335:399::-;17537:2;17519:21;;;17576:2;17556:18;;;17549:30;17615:34;17610:2;17595:18;;17588:62;-1:-1:-1;;;17681:2:1;17666:18;;17659:33;17724:3;17709:19;;17335:399::o;18157:415::-;18359:2;18341:21;;;18398:2;18378:18;;;18371:30;18437:34;18432:2;18417:18;;18410:62;-1:-1:-1;;;18503:2:1;18488:18;;18481:49;18562:3;18547:19;;18157:415::o;19342:637::-;19622:3;19660:6;19654:13;19676:53;19722:6;19717:3;19710:4;19702:6;19698:17;19676:53;:::i;:::-;19792:13;;19751:16;;;;19814:57;19792:13;19751:16;19848:4;19836:17;;19814:57;:::i;:::-;-1:-1:-1;;;19893:20:1;;19922:22;;;19971:1;19960:13;;19342:637;-1:-1:-1;;;;19342:637:1:o;24825:489::-;-1:-1:-1;;;;;25094:15:1;;;25076:34;;25146:15;;25141:2;25126:18;;25119:43;25193:2;25178:18;;25171:34;;;25241:3;25236:2;25221:18;;25214:31;;;25019:4;;25262:46;;25288:19;;25280:6;25262:46;:::i;:::-;25254:54;24825:489;-1:-1:-1;;;;;;24825:489:1:o;25319:249::-;25388:6;25441:2;25429:9;25420:7;25416:23;25412:32;25409:52;;;25457:1;25454;25447:12;25409:52;25489:9;25483:16;25508:30;25532:5;25508:30;:::i;25573:135::-;25612:3;-1:-1:-1;;25633:17:1;;25630:43;;;25653:18;;:::i;:::-;-1:-1:-1;25700:1:1;25689:13;;25573:135::o;25713:112::-;25745:1;25771;25761:35;;25776:18;;:::i;:::-;-1:-1:-1;25810:9:1;;25713:112::o;25830:127::-;25891:10;25886:3;25882:20;25879:1;25872:31;25922:4;25919:1;25912:15;25946:4;25943:1;25936:15

Swarm Source

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