ETH Price: $3,473.05 (+4.18%)

Token

BabyBoomerNFT (BMR)
 

Overview

Max Total Supply

0 BMR

Holders

819

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 BMR
0x7768fbc67afecf2b4caee9d1841ad14637d13652
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BabyBoomerNFT

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 11: BabyBoomerNFT.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

import "./ERC721.sol";
import "./Ownable.sol";

contract BabyBoomerNFT is ERC721, Ownable {
    
    uint[3] private tokenStats;
    uint[3] private presalesStats;
    uint[3] private mainsalesStats;
    uint public tokenQuota;
    uint public lastTokenMinted;

    uint public mintPrice;
    uint public redeemPrice;
    
    uint public state; 
    
    address[501] private presaleAllowlist;
    
    uint[10000] private mintLog;
    uint[10000] private redeemLog;

    mapping(address => uint) private addressQuotaLog;
    
    constructor() ERC721("BabyBoomerNFT", "BMR") {
        tokenStats = [10000, 0, 0];
        presalesStats = [500, 0, 0];
        mainsalesStats = [9500, 0, 0];
        tokenQuota = 100;
        lastTokenMinted = 500;
        mintPrice = 0.125 ether;
        redeemPrice = 0.08 ether;
        state = 0;
    }
    
    modifier quotaLeft {
        require(addressQuotaLog[msg.sender] <= tokenQuota, "This account has exceeded its quota"); _;
    }
    
    function getStats(uint forState) public view onlyOwner returns (uint[3] memory) {
        if (forState ==  1) {
            return presalesStats;
        } else if (forState == 2 || forState == 3) {
            return mainsalesStats;
        } else {
            return tokenStats;
        }
    }

    function setPresaleAllowlist(address[501] memory allowlist) public onlyOwner {
        presaleAllowlist = allowlist;
    }
    
    function getPresaleAllowlist() public view onlyOwner returns (address[501] memory) {
        return presaleAllowlist;
    }

    function getMyPresaleTokenId() public view returns (uint) {
        uint tokenId = 0;
        for (uint i=0; i<presaleAllowlist.length; i++) {
            if (presaleAllowlist[i] == msg.sender) {
                tokenId = i;
                break;
            }
        }
        return tokenId;
    }

    function getState() public view returns (string memory) {
        if (state == 1) {
            return "presale";
        } else if (state == 2) {
            return "mint";
        } else if (state == 3) {
            return "redeem";
        } else {
            return "inactive";
        }
    }

    function setState(uint newState) public onlyOwner {
        if (newState == 1) {
            state = 1;
        } else if (newState == 2) {
            state = 2;
        } else if (newState == 3) {
            state = 3;
        } else {
            state = 0;
        }
    }

    function currentBalance() public view onlyOwner returns (uint256) {
        return address(this).balance;
    }
    
    function withdrawBalance() public onlyOwner {
        uint withdrawAmount_50 = address(this).balance * 50 / 100;
        uint withdrawAmount_48 = address(this).balance * 48 / 100;
        uint withdrawAmount_2 = address(this).balance * 2 / 100;
        payable(0x22af82800A32e1191A8FF4b527D23530140CaAfA).transfer(withdrawAmount_48);
        payable(0x5344F3bBB45541988a7d44651922c5575FBc8E17).transfer(withdrawAmount_50);
        payable(0x02Ee1B9F5f3C5fb2aa14b78Dc301b618f5f93C22).transfer(withdrawAmount_2);
    }
    
    function _mintBox(uint quantity) private quotaLeft {
        require(state == 1 || state == 2, "Minting is not open");
        if (state == 1) {
            require(mintLog[quantity] == 0, "This token has already been minted");
            require(presaleAllowlist[quantity] == msg.sender, "The supplied tokenId is not reserved for this wallet address");
            _safeMint(msg.sender, quantity);
            addressQuotaLog[msg.sender] = addressQuotaLog[msg.sender] + 1;
            mintLog[quantity] = 1;
            tokenStats[1] = tokenStats[1] + 1;
            presalesStats[1] = presalesStats[1] + 1;
            emit Minted(msg.sender, quantity);
        } else if (state == 2) {
            require(quantity == 2 || quantity == 5 || quantity == 10, "Invalid quantity supplied");
            for (uint i=0; i<quantity; i++) {
                lastTokenMinted = lastTokenMinted + 1;
                _safeMint(msg.sender, lastTokenMinted);
                addressQuotaLog[msg.sender] = addressQuotaLog[msg.sender] + 1;
                mintLog[lastTokenMinted] = 1;
                tokenStats[1] = tokenStats[1] + 1;
                mainsalesStats[1] = mainsalesStats[1] + 1;
                emit Minted(msg.sender, lastTokenMinted);
            }
        }
    }
    
    function mint(uint quantity) public payable quotaLeft {
        if (state == 1) {
            require(msg.value == mintPrice, "Incorrect amount supplied");
        } else if (state == 2) {
            require(msg.value == mintPrice * quantity, "Incorrect amount supplied");
        }
        _mintBox(quantity);
    }
    
    function ownerMint(uint quantity) public quotaLeft onlyOwner {
        _mintBox(quantity);
    }
    
    function _redeem(uint tokenId) public payable {
        require(state == 3, "Redemption is not currently enabled");
        require(redeemLog[tokenId] == 0, "This token has already been redeemed");
        redeemLog[tokenId] = 1;
        tokenStats[2] = tokenStats[2] + 1;
        if (tokenId <= presalesStats[0]) {
            presalesStats[2] = presalesStats[2] + 1;
        } else {
            mainsalesStats[2] = mainsalesStats[2] + 1;
        }
    }
    
    function redeem(uint tokenId) public payable {
        require(msg.value == redeemPrice, "The amount offered is not the correct redeem price");
        _redeem(tokenId);
    }
    
    function ownerRedeem(uint tokenId) public onlyOwner {
        _redeem(tokenId);
    }
    
    function unRedeem(uint tokenId) public onlyOwner {
        require(redeemLog[tokenId] > 0, "This is not a valid tokenId, or has not yet been redeemed");
        redeemLog[tokenId] = 0;
        tokenStats[2] = tokenStats[2] - 1;
        if (tokenId <= presalesStats[0]) {
            presalesStats[2] = presalesStats[2] - 1;
        } else {
            mainsalesStats[2] = mainsalesStats[2] - 1;
        }
    }
    
    function isRedeemed(uint tokenId) public view returns(uint) {
        return redeemLog[tokenId];
    }
    
    event PermanentURI(string _value, uint256 indexed _id);
    event Minted(address sender, uint tokenId);
    
    function contractURI() public pure returns (string memory) {
        return "https://babyboomernft.com/data/babyboomernft.json";
    }
    
    function _baseURI() internal pure override returns (string memory) {
        return "";
    }
    
    function tokenURI(uint256 tokenId) public pure override returns (string memory) {
        return string(abi.encodePacked("https://babyboomernft.com/meta/", uint2str(tokenId)));
    }

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

File 1 of 11: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 3 of 11: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 4 of 11: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 5 of 11: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 6 of 11: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 7 of 11: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 11: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

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

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

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

File 9 of 11: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 10 of 11: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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 11 of 11: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Minted","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":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"PermanentURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"_redeem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"currentBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMyPresaleTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPresaleAllowlist","outputs":[{"internalType":"address[501]","name":"","type":"address[501]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getState","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"forState","type":"uint256"}],"name":"getStats","outputs":[{"internalType":"uint256[3]","name":"","type":"uint256[3]"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isRedeemed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTokenMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","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":"tokenId","type":"uint256"}],"name":"ownerRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"redeem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"redeemPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[501]","name":"allowlist","type":"address[501]"}],"name":"setPresaleAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newState","type":"uint256"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenQuota","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":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604080518082018252600d81526c1098589e509bdbdb595c939195609a1b6020808301918252835180850190945260038452622126a960e91b9084015281519192916200006291600091620001a9565b50805162000078906001906020840190620001a9565b505050620000956200008f6200015360201b60201c565b62000157565b60408051606081018252612710815260006020820181905291810191909152620000c490600790600362000238565b50604080516060810182526101f4815260006020820181905291810191909152620000f490600a90600362000238565b506040805160608101825261251c8152600060208201819052918101919091526200012490600d90600362000238565b5060646010556101f46011556701bc16d674ec800060125567011c37937e0800006013556000601455620002c3565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001b79062000286565b90600052602060002090601f016020900481019282620001db576000855562000226565b82601f10620001f657805160ff191683800117855562000226565b8280016001018555821562000226579182015b828111156200022657825182559160200191906001019062000209565b50620002349291506200026f565b5090565b826003810192821562000226579160200282015b8281111562000226578251829061ffff169055916020019190600101906200024c565b5b8082111562000234576000815560010162000270565b6002810460018216806200029b57607f821691505b60208210811415620002bd57634e487b7160e01b600052602260045260246000fd5b50919050565b61287d80620002d36000396000f3fe60806040526004361061021a5760003560e01c80637a233fb311610123578063c19d93fb116100ab578063e8a3d4851161006f578063e8a3d485146105d0578063e985e9c5146105e5578063eec1c1fa1461062e578063f19e75d41461064e578063f2fde38b1461066e5761021a565b8063c19d93fb14610552578063c87b56dd14610568578063ce845d1d14610588578063db006a751461059d578063e437d1a7146105b05761021a565b806395e049fc116100f257806395e049fc146104ca578063a0712d68146104df578063a22cb465146104f2578063a9e966b714610512578063b88d4fde146105325761021a565b80637a233fb3146104545780637b3039651461046a5780638da5cb5b1461049757806395d89b41146104b55761021a565b806328a3dd2c116101a65780635fd8c710116101755780635fd8c710146103d45780636352211e146103e95780636817c76c1461040957806370a082311461041f578063715018a61461043f5761021a565b806328a3dd2c1461035f57806332d33cd01461037257806339955b151461039257806342842e0e146103b45761021a565b8063095ea7b3116101ed578063095ea7b3146102d2578063168cd7ae146102f45780631865c57d1461030a57806323b872dd1461031f578063244afe691461033f5761021a565b806301ffc9a71461021f57806306fdde0314610254578063081812fc1461027657806309274072146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a3660046123fe565b61068e565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106a1565b60405161024b9190612560565b34801561028257600080fd5b50610296610291366004612436565b610734565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102c460115481565b60405190815260200161024b565b3480156102de57600080fd5b506102f26102ed366004612365565b6107ce565b005b34801561030057600080fd5b506102c460105481565b34801561031657600080fd5b506102696108e4565b34801561032b57600080fd5b506102f261033a366004612238565b610994565b34801561034b57600080fd5b506102f261035a366004612436565b6109c5565b6102f261036d366004612436565b6109fb565b34801561037e57600080fd5b506102c461038d366004612436565b610b42565b34801561039e57600080fd5b506103a7610b6f565b60405161024b91906124fc565b3480156103c057600080fd5b506102f26103cf366004612238565b610be0565b3480156103e057600080fd5b506102f2610bfb565b3480156103f557600080fd5b50610296610404366004612436565b610d42565b34801561041557600080fd5b506102c460125481565b34801561042b57600080fd5b506102c461043a3660046121e5565b610db9565b34801561044b57600080fd5b506102f2610e40565b34801561046057600080fd5b506102c460135481565b34801561047657600080fd5b5061048a610485366004612436565b610e76565b60405161024b9190612538565b3480156104a357600080fd5b506006546001600160a01b0316610296565b3480156104c157600080fd5b50610269610f5a565b3480156104d657600080fd5b506102c4610f69565b6102f26104ed366004612436565b610fcc565b3480156104fe57600080fd5b506102f261050d36600461232b565b6110c7565b34801561051e57600080fd5b506102f261052d366004612436565b611199565b34801561053e57600080fd5b506102f261054d366004612273565b611204565b34801561055e57600080fd5b506102c460145481565b34801561057457600080fd5b50610269610583366004612436565b611236565b34801561059457600080fd5b506102c4611267565b6102f26105ab366004612436565b611299565b3480156105bc57600080fd5b506102f26105cb366004612436565b611305565b3480156105dc57600080fd5b50610269611429565b3480156105f157600080fd5b5061023f610600366004612206565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561063a57600080fd5b506102f261064936600461238e565b611449565b34801561065a57600080fd5b506102f2610669366004612436565b611485565b34801561067a57600080fd5b506102f26106893660046121e5565b6114e1565b600061069982611579565b90505b919050565b6060600080546106b09061277e565b80601f01602080910402602001604051908101604052809291908181526020018280546106dc9061277e565b80156107295780601f106106fe57610100808354040283529160200191610729565b820191906000526020600020905b81548152906001019060200180831161070c57829003601f168201915b505050505090505b90565b6000818152600260205260408120546001600160a01b03166107b25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107d982610d42565b9050806001600160a01b0316836001600160a01b031614156108475760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107a9565b336001600160a01b038216148061086357506108638133610600565b6108d55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107a9565b6108df83836115c9565b505050565b606060145460011415610915575060408051808201909152600781526670726573616c6560c81b6020820152610731565b6014546002141561094157506040805180820190915260048152631b5a5b9d60e21b6020820152610731565b6014546003141561096f575060408051808201909152600681526572656465656d60d01b6020820152610731565b50604080518082019091526008815267696e61637469766560c01b6020820152610731565b61099e3382611637565b6109ba5760405162461bcd60e51b81526004016107a99061263d565b6108df83838361172e565b6006546001600160a01b031633146109ef5760405162461bcd60e51b81526004016107a9906125c5565b6109f8816109fb565b50565b601454600314610a595760405162461bcd60e51b815260206004820152602360248201527f526564656d7074696f6e206973206e6f742063757272656e746c7920656e61626044820152621b195960ea1b60648201526084016107a9565b61291a816127108110610a7c57634e487b7160e01b600052603260045260246000fd5b015415610ad75760405162461bcd60e51b8152602060048201526024808201527f5468697320746f6b656e2068617320616c7265616479206265656e2072656465604482015263195b595960e21b60648201526084016107a9565b600161291a826127108110610afc57634e487b7160e01b600052603260045260246000fd5b0155600954610b0c9060016126bf565b600955600a548111610b2e57600c54610b269060016126bf565b600c556109f8565b600f54610b3c9060016126bf565b600f5550565b600061291a826127108110610b6757634e487b7160e01b600052603260045260246000fd5b015492915050565b610b77612122565b6006546001600160a01b03163314610ba15760405162461bcd60e51b81526004016107a9906125c5565b60408051613ea0810191829052906015906101f59082845b81546001600160a01b03168152600190910190602001808311610bb9575050505050905090565b6108df83838360405180602001604052806000815250611204565b6006546001600160a01b03163314610c255760405162461bcd60e51b81526004016107a9906125c5565b60006064610c3447603261271c565b610c3e91906126fc565b905060006064610c4f47603061271c565b610c5991906126fc565b905060006064610c6a47600261271c565b610c7491906126fc565b6040519091507322af82800a32e1191a8ff4b527d23530140caafa9083156108fc029084906000818181858888f19350505050158015610cb8573d6000803e3d6000fd5b50604051735344f3bbb45541988a7d44651922c5575fbc8e179084156108fc029085906000818181858888f19350505050158015610cfa573d6000803e3d6000fd5b506040517302ee1b9f5f3c5fb2aa14b78dc301b618f5f93c229082156108fc029083906000818181858888f19350505050158015610d3c573d6000803e3d6000fd5b50505050565b6000818152600260205260408120546001600160a01b0316806106995760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107a9565b60006001600160a01b038216610e245760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107a9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610e6a5760405162461bcd60e51b81526004016107a9906125c5565b610e7460006118d9565b565b610e7e612142565b6006546001600160a01b03163314610ea85760405162461bcd60e51b81526004016107a9906125c5565b8160011415610ee65760408051606081019182905290600a9060039082845b815481526020019060010190808311610ec7575050505050905061069c565b8160021480610ef55750816003145b15610f2a57604080516060810191829052600d805482529091600390600e60208501808311610ec7575050505050905061069c565b6040805160608101918290526007805482529091600390600860208501808311610ec7575050505050905061069c565b6060600180546106b09061277e565b600080805b6101f5811015610fc657336015826101f58110610f9b57634e487b7160e01b600052603260045260246000fd5b01546001600160a01b03161415610fb457809150610fc6565b80610fbe816127b9565b915050610f6e565b50905090565b60105433600090815261502a60205260409020541115610ffe5760405162461bcd60e51b81526004016107a9906125fa565b6014546001141561105b5760125434146110565760405162461bcd60e51b8152602060048201526019602482015278125b98dbdc9c9958dd08185b5bdd5b9d081cdd5c1c1b1a5959603a1b60448201526064016107a9565b6110be565b601454600214156110be5780601254611074919061271c565b34146110be5760405162461bcd60e51b8152602060048201526019602482015278125b98dbdc9c9958dd08185b5bdd5b9d081cdd5c1c1b1a5959603a1b60448201526064016107a9565b6109f88161192b565b6001600160a01b0382163314156111205760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107a9565b3360008181526005602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161118d911515815260200190565b60405180910390a35050565b6006546001600160a01b031633146111c35760405162461bcd60e51b81526004016107a9906125c5565b80600114156111d65760016014556109f8565b80600214156111e95760026014556109f8565b80600314156111fc5760036014556109f8565b600060145550565b61120e3383611637565b61122a5760405162461bcd60e51b81526004016107a99061263d565b610d3c84848484611cfc565b606061124182611d2f565b604051602001611251919061247a565b6040516020818303038152906040529050919050565b6006546000906001600160a01b031633146112945760405162461bcd60e51b81526004016107a9906125c5565b504790565b60135434146109ef5760405162461bcd60e51b815260206004820152603260248201527f54686520616d6f756e74206f666665726564206973206e6f742074686520636f60448201527172726563742072656465656d20707269636560701b60648201526084016107a9565b6006546001600160a01b0316331461132f5760405162461bcd60e51b81526004016107a9906125c5565b600061291a82612710811061135457634e487b7160e01b600052603260045260246000fd5b0154116113c95760405162461bcd60e51b815260206004820152603960248201527f54686973206973206e6f7420612076616c696420746f6b656e49642c206f722060448201527f686173206e6f7420796574206265656e2072656465656d65640000000000000060648201526084016107a9565b600061291a8261271081106113ee57634e487b7160e01b600052603260045260246000fd5b01556009546113ff9060019061273b565b600955600a54811161141a57600c54610b269060019061273b565b600f54610b3c9060019061273b565b606060405180606001604052806031815260200161281760319139905090565b6006546001600160a01b031633146114735760405162461bcd60e51b81526004016107a9906125c5565b6114816015826101f5612160565b5050565b60105433600090815261502a602052604090205411156114b75760405162461bcd60e51b81526004016107a9906125fa565b6006546001600160a01b031633146110be5760405162461bcd60e51b81526004016107a9906125c5565b6006546001600160a01b0316331461150b5760405162461bcd60e51b81526004016107a9906125c5565b6001600160a01b0381166115705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a9565b6109f8816118d9565b60006001600160e01b031982166380ac58cd60e01b14806115aa57506001600160e01b03198216635b5e139f60e01b145b8061069957506301ffc9a760e01b6001600160e01b0319831614610699565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115fe82610d42565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166116b05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107a9565b60006116bb83610d42565b9050806001600160a01b0316846001600160a01b031614806116f65750836001600160a01b03166116eb84610734565b6001600160a01b0316145b8061172657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661174182610d42565b6001600160a01b0316146117a95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107a9565b6001600160a01b03821661180b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107a9565b611816838383611e75565b6118216000826115c9565b6001600160a01b038316600090815260036020526040812080546001929061184a90849061273b565b90915550506001600160a01b03821660009081526003602052604081208054600192906118789084906126bf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60105433600090815261502a6020526040902054111561195d5760405162461bcd60e51b81526004016107a9906125fa565b6014546001148061197057506014546002145b6119b25760405162461bcd60e51b815260206004820152601360248201527226b4b73a34b7339034b9903737ba1037b832b760691b60448201526064016107a9565b60145460011415611b995761020a8161271081106119e057634e487b7160e01b600052603260045260246000fd5b015415611a3a5760405162461bcd60e51b815260206004820152602260248201527f5468697320746f6b656e2068617320616c7265616479206265656e206d696e74604482015261195960f21b60648201526084016107a9565b336015826101f58110611a5d57634e487b7160e01b600052603260045260246000fd5b01546001600160a01b031614611adb5760405162461bcd60e51b815260206004820152603c60248201527f54686520737570706c69656420746f6b656e4964206973206e6f74207265736560448201527f7276656420666f7220746869732077616c6c657420616464726573730000000060648201526084016107a9565b611ae53382611e7a565b33600090815261502a6020526040902054611b019060016126bf565b33600090815261502a6020526040902055600161020a826127108110611b3757634e487b7160e01b600052603260045260246000fd5b0155600854611b479060016126bf565b600855600b54611b589060016126bf565b600b5560408051338152602081018390527f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe910160405180910390a16109f8565b601454600214156109f8578060021480611bb35750806005145b80611bbe575080600a145b611c0a5760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207175616e7469747920737570706c6965640000000000000060448201526064016107a9565b60005b8181101561148157601154611c239060016126bf565b6011819055611c33903390611e7a565b33600090815261502a6020526040902054611c4f9060016126bf565b33600090815261502a602052604090205560115460019061020a906127108110611c8957634e487b7160e01b600052603260045260246000fd5b0155600854611c999060016126bf565b600855600e54611caa9060016126bf565b600e556011546040805133815260208101929092527f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe910160405180910390a180611cf4816127b9565b915050611c0d565b611d0784848461172e565b611d1384848484611e94565b610d3c5760405162461bcd60e51b81526004016107a990612573565b606081611d5457506040805180820190915260018152600360fc1b602082015261069c565b8160005b8115611d7e5780611d68816127b9565b9150611d779050600a836126fc565b9150611d58565b60008167ffffffffffffffff811115611da757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611dd1576020820181803683370190505b509050815b8515611e6c57611de760018261273b565b90506000611df6600a886126fc565b611e0190600a61271c565b611e0b908861273b565b611e169060306126d7565b905060008160f81b905080848481518110611e4157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611e63600a896126fc565b97505050611dd6565b50949350505050565b6108df565b611481828260405180602001604052806000815250611fa1565b60006001600160a01b0384163b15611f9657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ed89033908990889088906004016124bf565b602060405180830381600087803b158015611ef257600080fd5b505af1925050508015611f22575060408051601f3d908101601f19168201909252611f1f9181019061241a565b60015b611f7c573d808015611f50576040519150601f19603f3d011682016040523d82523d6000602084013e611f55565b606091505b508051611f745760405162461bcd60e51b81526004016107a990612573565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611726565b506001949350505050565b611fab8383611fd4565b611fb86000848484611e94565b6108df5760405162461bcd60e51b81526004016107a990612573565b6001600160a01b03821661202a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107a9565b6000818152600260205260409020546001600160a01b03161561208f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107a9565b61209b60008383611e75565b6001600160a01b03821660009081526003602052604081208054600192906120c49084906126bf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60405180613ea001604052806101f5906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b826101f581019282156121a9579160200282015b828111156121a957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612174565b506121b59291506121b9565b5090565b5b808211156121b557600081556001016121ba565b80356001600160a01b038116811461069c57600080fd5b6000602082840312156121f6578081fd5b6121ff826121ce565b9392505050565b60008060408385031215612218578081fd5b612221836121ce565b915061222f602084016121ce565b90509250929050565b60008060006060848603121561224c578081fd5b612255846121ce565b9250612263602085016121ce565b9150604084013590509250925092565b60008060008060808587031215612288578081fd5b612291856121ce565b935060206122a08187016121ce565b935060408601359250606086013567ffffffffffffffff808211156122c3578384fd5b818801915088601f8301126122d6578384fd5b8135818111156122e8576122e86127ea565b6122fa601f8201601f1916850161268e565b9150808252898482850101111561230f578485fd5b8084840185840137810190920192909252939692955090935050565b6000806040838503121561233d578182fd5b612346836121ce565b91506020830135801515811461235a578182fd5b809150509250929050565b60008060408385031215612377578182fd5b612380836121ce565b946020939093013593505050565b6000613ea08083850312156123a1578182fd5b83601f8401126123af578182fd5b6123b88161268e565b80848684870111156123c8578485fd5b8493505b6101f58410156123f4576123df816121ce565b835260019390930192602092830192016123cc565b5095945050505050565b60006020828403121561240f578081fd5b81356121ff81612800565b60006020828403121561242b578081fd5b81516121ff81612800565b600060208284031215612447578081fd5b5035919050565b60008151808452612466816020860160208601612752565b601f01601f19169290920160200192915050565b60007f68747470733a2f2f62616279626f6f6d65726e66742e636f6d2f6d6574612f00825282516124b281601f850160208701612752565b91909101601f0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124f29083018461244e565b9695505050505050565b613ea08101818360005b6101f581101561252f5781516001600160a01b0316835260209283019290910190600101612506565b50505092915050565b60608101818360005b600381101561252f578151835260209283019290910190600101612541565b6000602082526121ff602083018461244e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526023908201527f54686973206163636f756e7420686173206578636565646564206974732071756040820152626f746160e81b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156126b7576126b76127ea565b604052919050565b600082198211156126d2576126d26127d4565b500190565b600060ff821660ff84168060ff038211156126f4576126f46127d4565b019392505050565b60008261271757634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612736576127366127d4565b500290565b60008282101561274d5761274d6127d4565b500390565b60005b8381101561276d578181015183820152602001612755565b83811115610d3c5750506000910152565b60028104600182168061279257607f821691505b602082108114156127b357634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127cd576127cd6127d4565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146109f857600080fdfe68747470733a2f2f62616279626f6f6d65726e66742e636f6d2f646174612f62616279626f6f6d65726e66742e6a736f6ea26469706673582212202724d6053bf9a4fbfc72bf275f987b266a697b6cd54f9c667c6af74e746fc3d664736f6c63430008020033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80637a233fb311610123578063c19d93fb116100ab578063e8a3d4851161006f578063e8a3d485146105d0578063e985e9c5146105e5578063eec1c1fa1461062e578063f19e75d41461064e578063f2fde38b1461066e5761021a565b8063c19d93fb14610552578063c87b56dd14610568578063ce845d1d14610588578063db006a751461059d578063e437d1a7146105b05761021a565b806395e049fc116100f257806395e049fc146104ca578063a0712d68146104df578063a22cb465146104f2578063a9e966b714610512578063b88d4fde146105325761021a565b80637a233fb3146104545780637b3039651461046a5780638da5cb5b1461049757806395d89b41146104b55761021a565b806328a3dd2c116101a65780635fd8c710116101755780635fd8c710146103d45780636352211e146103e95780636817c76c1461040957806370a082311461041f578063715018a61461043f5761021a565b806328a3dd2c1461035f57806332d33cd01461037257806339955b151461039257806342842e0e146103b45761021a565b8063095ea7b3116101ed578063095ea7b3146102d2578063168cd7ae146102f45780631865c57d1461030a57806323b872dd1461031f578063244afe691461033f5761021a565b806301ffc9a71461021f57806306fdde0314610254578063081812fc1461027657806309274072146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a3660046123fe565b61068e565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106a1565b60405161024b9190612560565b34801561028257600080fd5b50610296610291366004612436565b610734565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102c460115481565b60405190815260200161024b565b3480156102de57600080fd5b506102f26102ed366004612365565b6107ce565b005b34801561030057600080fd5b506102c460105481565b34801561031657600080fd5b506102696108e4565b34801561032b57600080fd5b506102f261033a366004612238565b610994565b34801561034b57600080fd5b506102f261035a366004612436565b6109c5565b6102f261036d366004612436565b6109fb565b34801561037e57600080fd5b506102c461038d366004612436565b610b42565b34801561039e57600080fd5b506103a7610b6f565b60405161024b91906124fc565b3480156103c057600080fd5b506102f26103cf366004612238565b610be0565b3480156103e057600080fd5b506102f2610bfb565b3480156103f557600080fd5b50610296610404366004612436565b610d42565b34801561041557600080fd5b506102c460125481565b34801561042b57600080fd5b506102c461043a3660046121e5565b610db9565b34801561044b57600080fd5b506102f2610e40565b34801561046057600080fd5b506102c460135481565b34801561047657600080fd5b5061048a610485366004612436565b610e76565b60405161024b9190612538565b3480156104a357600080fd5b506006546001600160a01b0316610296565b3480156104c157600080fd5b50610269610f5a565b3480156104d657600080fd5b506102c4610f69565b6102f26104ed366004612436565b610fcc565b3480156104fe57600080fd5b506102f261050d36600461232b565b6110c7565b34801561051e57600080fd5b506102f261052d366004612436565b611199565b34801561053e57600080fd5b506102f261054d366004612273565b611204565b34801561055e57600080fd5b506102c460145481565b34801561057457600080fd5b50610269610583366004612436565b611236565b34801561059457600080fd5b506102c4611267565b6102f26105ab366004612436565b611299565b3480156105bc57600080fd5b506102f26105cb366004612436565b611305565b3480156105dc57600080fd5b50610269611429565b3480156105f157600080fd5b5061023f610600366004612206565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561063a57600080fd5b506102f261064936600461238e565b611449565b34801561065a57600080fd5b506102f2610669366004612436565b611485565b34801561067a57600080fd5b506102f26106893660046121e5565b6114e1565b600061069982611579565b90505b919050565b6060600080546106b09061277e565b80601f01602080910402602001604051908101604052809291908181526020018280546106dc9061277e565b80156107295780601f106106fe57610100808354040283529160200191610729565b820191906000526020600020905b81548152906001019060200180831161070c57829003601f168201915b505050505090505b90565b6000818152600260205260408120546001600160a01b03166107b25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107d982610d42565b9050806001600160a01b0316836001600160a01b031614156108475760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107a9565b336001600160a01b038216148061086357506108638133610600565b6108d55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107a9565b6108df83836115c9565b505050565b606060145460011415610915575060408051808201909152600781526670726573616c6560c81b6020820152610731565b6014546002141561094157506040805180820190915260048152631b5a5b9d60e21b6020820152610731565b6014546003141561096f575060408051808201909152600681526572656465656d60d01b6020820152610731565b50604080518082019091526008815267696e61637469766560c01b6020820152610731565b61099e3382611637565b6109ba5760405162461bcd60e51b81526004016107a99061263d565b6108df83838361172e565b6006546001600160a01b031633146109ef5760405162461bcd60e51b81526004016107a9906125c5565b6109f8816109fb565b50565b601454600314610a595760405162461bcd60e51b815260206004820152602360248201527f526564656d7074696f6e206973206e6f742063757272656e746c7920656e61626044820152621b195960ea1b60648201526084016107a9565b61291a816127108110610a7c57634e487b7160e01b600052603260045260246000fd5b015415610ad75760405162461bcd60e51b8152602060048201526024808201527f5468697320746f6b656e2068617320616c7265616479206265656e2072656465604482015263195b595960e21b60648201526084016107a9565b600161291a826127108110610afc57634e487b7160e01b600052603260045260246000fd5b0155600954610b0c9060016126bf565b600955600a548111610b2e57600c54610b269060016126bf565b600c556109f8565b600f54610b3c9060016126bf565b600f5550565b600061291a826127108110610b6757634e487b7160e01b600052603260045260246000fd5b015492915050565b610b77612122565b6006546001600160a01b03163314610ba15760405162461bcd60e51b81526004016107a9906125c5565b60408051613ea0810191829052906015906101f59082845b81546001600160a01b03168152600190910190602001808311610bb9575050505050905090565b6108df83838360405180602001604052806000815250611204565b6006546001600160a01b03163314610c255760405162461bcd60e51b81526004016107a9906125c5565b60006064610c3447603261271c565b610c3e91906126fc565b905060006064610c4f47603061271c565b610c5991906126fc565b905060006064610c6a47600261271c565b610c7491906126fc565b6040519091507322af82800a32e1191a8ff4b527d23530140caafa9083156108fc029084906000818181858888f19350505050158015610cb8573d6000803e3d6000fd5b50604051735344f3bbb45541988a7d44651922c5575fbc8e179084156108fc029085906000818181858888f19350505050158015610cfa573d6000803e3d6000fd5b506040517302ee1b9f5f3c5fb2aa14b78dc301b618f5f93c229082156108fc029083906000818181858888f19350505050158015610d3c573d6000803e3d6000fd5b50505050565b6000818152600260205260408120546001600160a01b0316806106995760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107a9565b60006001600160a01b038216610e245760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107a9565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610e6a5760405162461bcd60e51b81526004016107a9906125c5565b610e7460006118d9565b565b610e7e612142565b6006546001600160a01b03163314610ea85760405162461bcd60e51b81526004016107a9906125c5565b8160011415610ee65760408051606081019182905290600a9060039082845b815481526020019060010190808311610ec7575050505050905061069c565b8160021480610ef55750816003145b15610f2a57604080516060810191829052600d805482529091600390600e60208501808311610ec7575050505050905061069c565b6040805160608101918290526007805482529091600390600860208501808311610ec7575050505050905061069c565b6060600180546106b09061277e565b600080805b6101f5811015610fc657336015826101f58110610f9b57634e487b7160e01b600052603260045260246000fd5b01546001600160a01b03161415610fb457809150610fc6565b80610fbe816127b9565b915050610f6e565b50905090565b60105433600090815261502a60205260409020541115610ffe5760405162461bcd60e51b81526004016107a9906125fa565b6014546001141561105b5760125434146110565760405162461bcd60e51b8152602060048201526019602482015278125b98dbdc9c9958dd08185b5bdd5b9d081cdd5c1c1b1a5959603a1b60448201526064016107a9565b6110be565b601454600214156110be5780601254611074919061271c565b34146110be5760405162461bcd60e51b8152602060048201526019602482015278125b98dbdc9c9958dd08185b5bdd5b9d081cdd5c1c1b1a5959603a1b60448201526064016107a9565b6109f88161192b565b6001600160a01b0382163314156111205760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107a9565b3360008181526005602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161118d911515815260200190565b60405180910390a35050565b6006546001600160a01b031633146111c35760405162461bcd60e51b81526004016107a9906125c5565b80600114156111d65760016014556109f8565b80600214156111e95760026014556109f8565b80600314156111fc5760036014556109f8565b600060145550565b61120e3383611637565b61122a5760405162461bcd60e51b81526004016107a99061263d565b610d3c84848484611cfc565b606061124182611d2f565b604051602001611251919061247a565b6040516020818303038152906040529050919050565b6006546000906001600160a01b031633146112945760405162461bcd60e51b81526004016107a9906125c5565b504790565b60135434146109ef5760405162461bcd60e51b815260206004820152603260248201527f54686520616d6f756e74206f666665726564206973206e6f742074686520636f60448201527172726563742072656465656d20707269636560701b60648201526084016107a9565b6006546001600160a01b0316331461132f5760405162461bcd60e51b81526004016107a9906125c5565b600061291a82612710811061135457634e487b7160e01b600052603260045260246000fd5b0154116113c95760405162461bcd60e51b815260206004820152603960248201527f54686973206973206e6f7420612076616c696420746f6b656e49642c206f722060448201527f686173206e6f7420796574206265656e2072656465656d65640000000000000060648201526084016107a9565b600061291a8261271081106113ee57634e487b7160e01b600052603260045260246000fd5b01556009546113ff9060019061273b565b600955600a54811161141a57600c54610b269060019061273b565b600f54610b3c9060019061273b565b606060405180606001604052806031815260200161281760319139905090565b6006546001600160a01b031633146114735760405162461bcd60e51b81526004016107a9906125c5565b6114816015826101f5612160565b5050565b60105433600090815261502a602052604090205411156114b75760405162461bcd60e51b81526004016107a9906125fa565b6006546001600160a01b031633146110be5760405162461bcd60e51b81526004016107a9906125c5565b6006546001600160a01b0316331461150b5760405162461bcd60e51b81526004016107a9906125c5565b6001600160a01b0381166115705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107a9565b6109f8816118d9565b60006001600160e01b031982166380ac58cd60e01b14806115aa57506001600160e01b03198216635b5e139f60e01b145b8061069957506301ffc9a760e01b6001600160e01b0319831614610699565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906115fe82610d42565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166116b05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107a9565b60006116bb83610d42565b9050806001600160a01b0316846001600160a01b031614806116f65750836001600160a01b03166116eb84610734565b6001600160a01b0316145b8061172657506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661174182610d42565b6001600160a01b0316146117a95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107a9565b6001600160a01b03821661180b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107a9565b611816838383611e75565b6118216000826115c9565b6001600160a01b038316600090815260036020526040812080546001929061184a90849061273b565b90915550506001600160a01b03821660009081526003602052604081208054600192906118789084906126bf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60105433600090815261502a6020526040902054111561195d5760405162461bcd60e51b81526004016107a9906125fa565b6014546001148061197057506014546002145b6119b25760405162461bcd60e51b815260206004820152601360248201527226b4b73a34b7339034b9903737ba1037b832b760691b60448201526064016107a9565b60145460011415611b995761020a8161271081106119e057634e487b7160e01b600052603260045260246000fd5b015415611a3a5760405162461bcd60e51b815260206004820152602260248201527f5468697320746f6b656e2068617320616c7265616479206265656e206d696e74604482015261195960f21b60648201526084016107a9565b336015826101f58110611a5d57634e487b7160e01b600052603260045260246000fd5b01546001600160a01b031614611adb5760405162461bcd60e51b815260206004820152603c60248201527f54686520737570706c69656420746f6b656e4964206973206e6f74207265736560448201527f7276656420666f7220746869732077616c6c657420616464726573730000000060648201526084016107a9565b611ae53382611e7a565b33600090815261502a6020526040902054611b019060016126bf565b33600090815261502a6020526040902055600161020a826127108110611b3757634e487b7160e01b600052603260045260246000fd5b0155600854611b479060016126bf565b600855600b54611b589060016126bf565b600b5560408051338152602081018390527f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe910160405180910390a16109f8565b601454600214156109f8578060021480611bb35750806005145b80611bbe575080600a145b611c0a5760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964207175616e7469747920737570706c6965640000000000000060448201526064016107a9565b60005b8181101561148157601154611c239060016126bf565b6011819055611c33903390611e7a565b33600090815261502a6020526040902054611c4f9060016126bf565b33600090815261502a602052604090205560115460019061020a906127108110611c8957634e487b7160e01b600052603260045260246000fd5b0155600854611c999060016126bf565b600855600e54611caa9060016126bf565b600e556011546040805133815260208101929092527f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe910160405180910390a180611cf4816127b9565b915050611c0d565b611d0784848461172e565b611d1384848484611e94565b610d3c5760405162461bcd60e51b81526004016107a990612573565b606081611d5457506040805180820190915260018152600360fc1b602082015261069c565b8160005b8115611d7e5780611d68816127b9565b9150611d779050600a836126fc565b9150611d58565b60008167ffffffffffffffff811115611da757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611dd1576020820181803683370190505b509050815b8515611e6c57611de760018261273b565b90506000611df6600a886126fc565b611e0190600a61271c565b611e0b908861273b565b611e169060306126d7565b905060008160f81b905080848481518110611e4157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611e63600a896126fc565b97505050611dd6565b50949350505050565b6108df565b611481828260405180602001604052806000815250611fa1565b60006001600160a01b0384163b15611f9657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ed89033908990889088906004016124bf565b602060405180830381600087803b158015611ef257600080fd5b505af1925050508015611f22575060408051601f3d908101601f19168201909252611f1f9181019061241a565b60015b611f7c573d808015611f50576040519150601f19603f3d011682016040523d82523d6000602084013e611f55565b606091505b508051611f745760405162461bcd60e51b81526004016107a990612573565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611726565b506001949350505050565b611fab8383611fd4565b611fb86000848484611e94565b6108df5760405162461bcd60e51b81526004016107a990612573565b6001600160a01b03821661202a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107a9565b6000818152600260205260409020546001600160a01b03161561208f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107a9565b61209b60008383611e75565b6001600160a01b03821660009081526003602052604081208054600192906120c49084906126bf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60405180613ea001604052806101f5906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b826101f581019282156121a9579160200282015b828111156121a957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612174565b506121b59291506121b9565b5090565b5b808211156121b557600081556001016121ba565b80356001600160a01b038116811461069c57600080fd5b6000602082840312156121f6578081fd5b6121ff826121ce565b9392505050565b60008060408385031215612218578081fd5b612221836121ce565b915061222f602084016121ce565b90509250929050565b60008060006060848603121561224c578081fd5b612255846121ce565b9250612263602085016121ce565b9150604084013590509250925092565b60008060008060808587031215612288578081fd5b612291856121ce565b935060206122a08187016121ce565b935060408601359250606086013567ffffffffffffffff808211156122c3578384fd5b818801915088601f8301126122d6578384fd5b8135818111156122e8576122e86127ea565b6122fa601f8201601f1916850161268e565b9150808252898482850101111561230f578485fd5b8084840185840137810190920192909252939692955090935050565b6000806040838503121561233d578182fd5b612346836121ce565b91506020830135801515811461235a578182fd5b809150509250929050565b60008060408385031215612377578182fd5b612380836121ce565b946020939093013593505050565b6000613ea08083850312156123a1578182fd5b83601f8401126123af578182fd5b6123b88161268e565b80848684870111156123c8578485fd5b8493505b6101f58410156123f4576123df816121ce565b835260019390930192602092830192016123cc565b5095945050505050565b60006020828403121561240f578081fd5b81356121ff81612800565b60006020828403121561242b578081fd5b81516121ff81612800565b600060208284031215612447578081fd5b5035919050565b60008151808452612466816020860160208601612752565b601f01601f19169290920160200192915050565b60007f68747470733a2f2f62616279626f6f6d65726e66742e636f6d2f6d6574612f00825282516124b281601f850160208701612752565b91909101601f0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906124f29083018461244e565b9695505050505050565b613ea08101818360005b6101f581101561252f5781516001600160a01b0316835260209283019290910190600101612506565b50505092915050565b60608101818360005b600381101561252f578151835260209283019290910190600101612541565b6000602082526121ff602083018461244e565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526023908201527f54686973206163636f756e7420686173206578636565646564206974732071756040820152626f746160e81b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156126b7576126b76127ea565b604052919050565b600082198211156126d2576126d26127d4565b500190565b600060ff821660ff84168060ff038211156126f4576126f46127d4565b019392505050565b60008261271757634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612736576127366127d4565b500290565b60008282101561274d5761274d6127d4565b500390565b60005b8381101561276d578181015183820152602001612755565b83811115610d3c5750506000910152565b60028104600182168061279257607f821691505b602082108114156127b357634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127cd576127cd6127d4565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146109f857600080fdfe68747470733a2f2f62616279626f6f6d65726e66742e636f6d2f646174612f62616279626f6f6d65726e66742e6a736f6ea26469706673582212202724d6053bf9a4fbfc72bf275f987b266a697b6cd54f9c667c6af74e746fc3d664736f6c63430008020033

Deployed Bytecode Sourcemap

105:7592:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7503:187;;;;;;;;;;-1:-1:-1;7503:187:1;;;;;:::i;:::-;;:::i;:::-;;;6999:14:11;;6992:22;6974:41;;6962:2;6947:18;7503:187:1;;;;;;;;2349:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3950:217::-;;;;;;;;;;-1:-1:-1;3950:217:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4985:32:11;;;4967:51;;4955:2;4940:18;3950:217:4;4922:102:11;289:27:1;;;;;;;;;;;;;;;;;;;17308:25:11;;;17296:2;17281:18;289:27:1;17263:76:11;3488:401:4;;;;;;;;;;-1:-1:-1;3488:401:4;;;;;:::i;:::-;;:::i;:::-;;261:22:1;;;;;;;;;;;;;;;;1915:299;;;;;;;;;;;;;:::i;4814:330:4:-;;;;;;;;;;-1:-1:-1;4814:330:4;;;;;:::i;:::-;;:::i;5513:85:1:-;;;;;;;;;;-1:-1:-1;5513:85:1;;;;;:::i;:::-;;:::i;4862:456::-;;;;;;:::i;:::-;;:::i;6029:102::-;;;;;;;;;;-1:-1:-1;6029:102:1;;;;;:::i;:::-;;:::i;1479:123::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5210:179:4:-;;;;;;;;;;-1:-1:-1;5210:179:4;;;;;:::i;:::-;;:::i;2624:516:1:-;;;;;;;;;;;;;:::i;2052:235:4:-;;;;;;;;;;-1:-1:-1;2052:235:4;;;;;:::i;:::-;;:::i;323:21:1:-;;;;;;;;;;;;;;;;1790:205:4;;;;;;;;;;-1:-1:-1;1790:205:4;;;;;:::i;:::-;;:::i;1598:92:9:-;;;;;;;;;;;;;:::i;350:23:1:-;;;;;;;;;;;;;;;;1044:297;;;;;;;;;;-1:-1:-1;1044:297:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;966:85:9:-;;;;;;;;;;-1:-1:-1;1038:6:9;;-1:-1:-1;;;;;1038:6:9;966:85;;2511:102:4;;;;;;;;;;;;;:::i;1608:301:1:-;;;;;;;;;;;;;:::i;4429:317::-;;;;;;:::i;:::-;;:::i;4234:290:4:-;;;;;;;;;;-1:-1:-1;4234:290:4;;;;;:::i;:::-;;:::i;2220:277:1:-;;;;;;;;;;-1:-1:-1;2220:277:1;;;;;:::i;:::-;;:::i;5455:320:4:-;;;;;;;;;;-1:-1:-1;5455:320:4;;;;;:::i;:::-;;:::i;384:17:1:-;;;;;;;;;;;;;;;;6501:182;;;;;;;;;;-1:-1:-1;6501:182:1;;;;;:::i;:::-;;:::i;2503:111::-;;;;;;;;;;;;;:::i;5328:175::-;;;;;;:::i;:::-;;:::i;5608:411::-;;;;;;;;;;-1:-1:-1;5608:411:1;;;;;:::i;:::-;;:::i;6254:134::-;;;;;;;;;;;;;:::i;4590:162:4:-;;;;;;;;;;-1:-1:-1;4590:162:4;;;;;:::i;:::-;-1:-1:-1;;;;;4710:25:4;;;4687:4;4710:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4590:162;1347:122:1;;;;;;;;;;-1:-1:-1;1347:122:1;;;;;:::i;:::-;;:::i;4756:96::-;;;;;;;;;;-1:-1:-1;4756:96:1;;;;;:::i;:::-;;:::i;1839:189:9:-;;;;;;;;;;-1:-1:-1;1839:189:9;;;;;:::i;:::-;;:::i;7503:187:1:-;7620:4;7647:36;7671:11;7647:23;:36::i;:::-;7640:43;;7503:187;;;;:::o;2349:98:4:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;;:::o;3950:217::-;4026:7;7335:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7335:16:4;4045:73;;;;-1:-1:-1;;;4045:73:4;;13348:2:11;4045:73:4;;;13330:21:11;13387:2;13367:18;;;13360:30;13426:34;13406:18;;;13399:62;-1:-1:-1;;;13477:18:11;;;13470:42;13529:19;;4045:73:4;;;;;;;;;-1:-1:-1;4136:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4136:24:4;;3950:217::o;3488:401::-;3568:13;3584:23;3599:7;3584:14;:23::i;:::-;3568:39;;3631:5;-1:-1:-1;;;;;3625:11:4;:2;-1:-1:-1;;;;;3625:11:4;;;3617:57;;;;-1:-1:-1;;;3617:57:4;;14936:2:11;3617:57:4;;;14918:21:11;14975:2;14955:18;;;14948:30;15014:34;14994:18;;;14987:62;-1:-1:-1;;;15065:18:11;;;15058:31;15106:19;;3617:57:4;14908:223:11;3617:57:4;666:10:2;-1:-1:-1;;;;;3706:21:4;;;;:62;;-1:-1:-1;3731:37:4;3748:5;666:10:2;3755:12:4;587:96:2;3731:37:4;3685:165;;;;-1:-1:-1;;;3685:165:4;;11741:2:11;3685:165:4;;;11723:21:11;11780:2;11760:18;;;11753:30;11819:34;11799:18;;;11792:62;11890:26;11870:18;;;11863:54;11934:19;;3685:165:4;11713:246:11;3685:165:4;3861:21;3870:2;3874:7;3861:8;:21::i;:::-;3488:401;;;:::o;1915:299:1:-;1956:13;1985:5;;1994:1;1985:10;1981:227;;;-1:-1:-1;2011:16:1;;;;;;;;;;;;-1:-1:-1;;;2011:16:1;;;;;;1981:227;2048:5;;2057:1;2048:10;2044:164;;;-1:-1:-1;2074:13:1;;;;;;;;;;;;-1:-1:-1;;;2074:13:1;;;;;;2044:164;2108:5;;2117:1;2108:10;2104:104;;;-1:-1:-1;2134:15:1;;;;;;;;;;;;-1:-1:-1;;;2134:15:1;;;;;;2104:104;-1:-1:-1;2180:17:1;;;;;;;;;;;;-1:-1:-1;;;2180:17:1;;;;;;4814:330:4;5003:41;666:10:2;5036:7:4;5003:18;:41::i;:::-;4995:103;;;;-1:-1:-1;;;4995:103:4;;;;;;;:::i;:::-;5109:28;5119:4;5125:2;5129:7;5109:9;:28::i;5513:85:1:-;1038:6:9;;-1:-1:-1;;;;;1038:6:9;666:10:2;1178:23:9;1170:68;;;;-1:-1:-1;;;1170:68:9;;;;;;;:::i;:::-;5575:16:1::1;5583:7;5575;:16::i;:::-;5513:85:::0;:::o;4862:456::-;4926:5;;4935:1;4926:10;4918:58;;;;-1:-1:-1;;;4918:58:1;;10102:2:11;4918:58:1;;;10084:21:11;10141:2;10121:18;;;10114:30;10180:34;10160:18;;;10153:62;-1:-1:-1;;;10231:18:11;;;10224:33;10274:19;;4918:58:1;10074:225:11;4918:58:1;4994:9;5004:7;4994:18;;;;;-1:-1:-1;;;4994:18:1;;;;;;;;;;;:23;4986:72;;;;-1:-1:-1;;;4986:72:1;;16959:2:11;4986:72:1;;;16941:21:11;16998:2;16978:18;;;16971:30;17037:34;17017:18;;;17010:62;-1:-1:-1;;;17088:18:11;;;17081:34;17132:19;;4986:72:1;16931:226:11;4986:72:1;5089:1;5068:9;5078:7;5068:18;;;;;-1:-1:-1;;;5068:18:1;;;;;;;;;;:22;5116:13;;:17;;5132:1;5116:17;:::i;:::-;5100:13;:33;5158:13;:16;5147:27;;5143:169;;5209:16;;:20;;5228:1;5209:20;:::i;:::-;5190:16;:39;5143:169;;;5280:17;;:21;;5300:1;5280:21;:::i;:::-;5260:17;:41;-1:-1:-1;4862:456:1:o;6029:102::-;6083:4;6106:9;6116:7;6106:18;;;;;-1:-1:-1;;;6106:18:1;;;;;;;;;;;;6029:102;-1:-1:-1;;6029:102:1:o;1479:123::-;1541:19;;:::i;:::-;1038:6:9;;-1:-1:-1;;;;;1038:6:9;666:10:2;1178:23:9;1170:68;;;;-1:-1:-1;;;1170:68:9;;;;;;;:::i;:::-;1572:23:1::1;::::0;;;;::::1;::::0;;;;;1579:16:::1;::::0;1572:23:::1;::::0;1579:16;1572:23;::::1;::::0;;-1:-1:-1;;;;;1572:23:1::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;1479:123:::0;:::o;5210:179:4:-;5343:39;5360:4;5366:2;5370:7;5343:39;;;;;;;;;;;;:16;:39::i;2624:516:1:-;1038:6:9;;-1:-1:-1;;;;;1038:6:9;666:10:2;1178:23:9;1170:68;;;;-1:-1:-1;;;1170:68:9;;;;;;;:::i;:::-;2678:22:1::1;2732:3;2703:26;:21;2727:2;2703:26;:::i;:::-;:32;;;;:::i;:::-;2678:57:::0;-1:-1:-1;2745:22:1::1;2799:3;2770:26;:21;2794:2;2770:26;:::i;:::-;:32;;;;:::i;:::-;2745:57:::0;-1:-1:-1;2812:21:1::1;2864:3;2836:25;:21;2860:1;2836:25;:::i;:::-;:31;;;;:::i;:::-;2877:79;::::0;2812:55;;-1:-1:-1;2885:42:1::1;::::0;2877:79;::::1;;;::::0;2938:17;;2877:79:::1;::::0;;;2938:17;2885:42;2877:79;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;2966:79:1::1;::::0;2974:42:::1;::::0;2966:79;::::1;;;::::0;3027:17;;2966:79:::1;::::0;;;3027:17;2974:42;2966:79;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;3055:78:1::1;::::0;3063:42:::1;::::0;3055:78;::::1;;;::::0;3116:16;;3055:78:::1;::::0;;;3116:16;3063:42;3055:78;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;1248:1:9;;;2624:516:1:o:0;2052:235:4:-;2124:7;2159:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2159:16:4;2193:19;2185:73;;;;-1:-1:-1;;;2185:73:4;;12577:2:11;2185:73:4;;;12559:21:11;12616:2;12596:18;;;12589:30;12655:34;12635:18;;;12628:62;-1:-1:-1;;;12706:18:11;;;12699:39;12755:19;;2185:73:4;12549:231:11;1790:205:4;1862:7;-1:-1:-1;;;;;1889:19:4;;1881:74;;;;-1:-1:-1;;;1881:74:4;;12166:2:11;1881:74:4;;;12148:21:11;12205:2;12185:18;;;12178:30;12244:34;12224:18;;;12217:62;-1:-1:-1;;;12295:18:11;;;12288:40;12345:19;;1881:74:4;12138:232:11;1881:74:4;-1:-1:-1;;;;;;1972:16:4;;;;;:9;:16;;;;;;;1790:205::o;1598:92:9:-;1038:6;;-1:-1:-1;;;;;1038:6:9;666:10:2;1178:23:9;1170:68;;;;-1:-1:-1;;;1170:68:9;;;;;;;:::i;:::-;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;1044:297:1:-;1108:14;;:::i;:::-;1038:6:9;;-1:-1:-1;;;;;1038:6:9;666:10:2;1178:23:9;1170:68;;;;-1:-1:-1;;;1170:68:9;;;;;;;:::i;:::-;1138:8:1::1;1151:1;1138:14;1134:201;;;1168:20;::::0;;;;::::1;::::0;;;;;1175:13:::1;::::0;1168:20:::1;::::0;1175:13;1168:20;::::1;;;;;;;;;;;;;;;;;;;;;;;;;1134:201;1209:8;1221:1;1209:13;:30;;;;1226:8;1238:1;1226:13;1209:30;1205:130;;;1255:21;::::0;;;;::::1;::::0;;;;1262:14:::1;1255:21:::0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;;;;;;;;;;;;1205:130;1307:17;::::0;;;;::::1;::::0;;;;1314:10:::1;1307:17:::0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;;;;;;;;;;;;2511:102:4::0;2567:13;2599:7;2592:14;;;;;:::i;1608:301:1:-;1660:4;;;1702:177;1719:23;1717:1;:25;1702:177;;;1790:10;1767:16;1784:1;1767:19;;;;;-1:-1:-1;;;1767:19:1;;;;;;;;;;;-1:-1:-1;;;;;1767:19:1;:33;1763:106;;;1830:1;1820:11;;1849:5;;1763:106;1744:3;;;;:::i;:::-;;;;1702:177;;;-1:-1:-1;1895:7:1;-1:-1:-1;1608:301:1;:::o;4429:317::-;974:10;;959;943:27;;;;:15;:27;;;;;;:41;;935:89;;;;-1:-1:-1;;;935:89:1;;;;;;;:::i;:::-;4497:5:::1;;4506:1;4497:10;4493:219;;;4544:9;;4531;:22;4523:60;;;::::0;-1:-1:-1;;;4523:60:1;;7452:2:11;4523:60:1::1;::::0;::::1;7434:21:11::0;7491:2;7471:18;;;7464:30;-1:-1:-1;;;7510:18:11;;;7503:55;7575:18;;4523:60:1::1;7424:175:11::0;4523:60:1::1;4493:219;;;4604:5;;4613:1;4604:10;4600:112;;;4663:8;4651:9;;:20;;;;:::i;:::-;4638:9;:33;4630:71;;;::::0;-1:-1:-1;;;4630:71:1;;7452:2:11;4630:71:1::1;::::0;::::1;7434:21:11::0;7491:2;7471:18;;;7464:30;-1:-1:-1;;;7510:18:11;;;7503:55;7575:18;;4630:71:1::1;7424:175:11::0;4630:71:1::1;4721:18;4730:8;4721;:18::i;4234:290:4:-:0;-1:-1:-1;;;;;4336:24:4;;666:10:2;4336:24:4;;4328:62;;;;-1:-1:-1;;;4328:62:4;;9748:2:11;4328:62:4;;;9730:21:11;9787:2;9767:18;;;9760:30;9826:27;9806:18;;;9799:55;9871:18;;4328:62:4;9720:175:11;4328:62:4;666:10:2;4401:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;4401:42:4;;;;;;;;;;:53;;-1:-1:-1;;4401:53:4;;;;;;;:42;-1:-1:-1;;;;;4469:48:4;;4508:8;4469:48;;;;6999:14:11;6992:22;6974:41;;6962:2;6947:18;;6929:92;4469:48:4;;;;;;;;4234:290;;:::o;2220:277:1:-;1038:6:9;;-1:-1:-1;;;;;1038:6:9;666:10:2;1178:23:9;1170:68;;;;-1:-1:-1;;;1170:68:9;;;;;;;:::i;:::-;2284:8:1::1;2296:1;2284:13;2280:211;;;2321:1;2313:5;:9:::0;2280:211:::1;;;2343:8;2355:1;2343:13;2339:152;;;2380:1;2372:5;:9:::0;2339:152:::1;;;2402:8;2414:1;2402:13;2398:93;;;2439:1;2431:5;:9:::0;2398:93:::1;;;2479:1;2471:5;:9:::0;2220:277;:::o;5455:320:4:-;5624:41;666:10:2;5657:7:4;5624:18;:41::i;:::-;5616:103;;;;-1:-1:-1;;;5616:103:4;;;;;;;:::i;:::-;5729:39;5743:4;5749:2;5753:7;5762:5;5729:13;:39::i;6501:182:1:-;6566:13;6657:17;6666:7;6657:8;:17::i;:::-;6605:70;;;;;;;;:::i;:::-;;;;;;;;;;;;;6591:85;;6501:182;;;:::o;2503:111::-;1038:6:9;;2560:7:1;;-1:-1:-1;;;;;1038:6:9;666:10:2;1178:23:9;1170:68;;;;-1:-1:-1;;;1170:68:9;;;;;;;:::i;:::-;-1:-1:-1;2586:21:1::1;2503:111:::0;:::o;5328:175::-;5404:11;;5391:9;:24;5383:87;;;;-1:-1:-1;;;5383:87:1;;10919:2:11;5383:87:1;;;10901:21:11;10958:2;10938:18;;;10931:30;10997:34;10977:18;;;10970:62;-1:-1:-1;;;11048:18:11;;;11041:48;11106:19;;5383:87:1;10891:240:11;5608:411:1;1038:6:9;;-1:-1:-1;;;;;1038:6:9;666:10:2;1178:23:9;1170:68;;;;-1:-1:-1;;;1170:68:9;;;;;;;:::i;:::-;5696:1:1::1;5675:9;5685:7;5675:18;;;;;-1:-1:-1::0;;;5675:18:1::1;;;;;;;;;;;:22;5667:92;;;::::0;-1:-1:-1;;;5667:92:1;;16104:2:11;5667:92:1::1;::::0;::::1;16086:21:11::0;16143:2;16123:18;;;16116:30;16182:34;16162:18;;;16155:62;16253:27;16233:18;;;16226:55;16298:19;;5667:92:1::1;16076:247:11::0;5667:92:1::1;5790:1;5769:9;5779:7;5769:18;;;;;-1:-1:-1::0;;;5769:18:1::1;;;;;;;;;;:22:::0;5817:13;;:17:::1;::::0;5833:1:::1;::::0;5817:17:::1;:::i;:::-;5801:13:::0;:33;5859:13:::1;:16:::0;5848:27;::::1;5844:169;;5910:16:::0;;:20:::1;::::0;5929:1:::1;::::0;5910:20:::1;:::i;5844:169::-;5981:17:::0;;:21:::1;::::0;6001:1:::1;::::0;5981:21:::1;:::i;6254:134::-:0;6298:13;6323:58;;;;;;;;;;;;;;;;;;;6254:134;:::o;1347:122::-;1038:6:9;;-1:-1:-1;;;;;1038:6:9;666:10:2;1178:23:9;1170:68;;;;-1:-1:-1;;;1170:68:9;;;;;;;:::i;:::-;1434:28:1::1;:16;1453:9:::0;1434:28:::1;;:::i;:::-;;1347:122:::0;:::o;4756:96::-;974:10;;959;943:27;;;;:15;:27;;;;;;:41;;935:89;;;;-1:-1:-1;;;935:89:1;;;;;;;:::i;:::-;1038:6:9;;-1:-1:-1;;;;;1038:6:9;666:10:2;1178:23:9::1;1170:68;;;;-1:-1:-1::0;;;1170:68:9::1;;;;;;;:::i;1839:189::-:0;1038:6;;-1:-1:-1;;;;;1038:6:9;666:10:2;1178:23:9;1170:68;;;;-1:-1:-1;;;1170:68:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;1927:22:9;::::1;1919:73;;;::::0;-1:-1:-1;;;1919:73:9;;8579:2:11;1919:73:9::1;::::0;::::1;8561:21:11::0;8618:2;8598:18;;;8591:30;8657:34;8637:18;;;8630:62;-1:-1:-1;;;8708:18:11;;;8701:36;8754:19;;1919:73:9::1;8551:228:11::0;1919:73:9::1;2002:19;2012:8;2002:9;:19::i;1431:300:4:-:0;1533:4;-1:-1:-1;;;;;;1568:40:4;;-1:-1:-1;;;1568:40:4;;:104;;-1:-1:-1;;;;;;;1624:48:4;;-1:-1:-1;;;1624:48:4;1568:104;:156;;;-1:-1:-1;;;;;;;;;;871:40:3;;;1688:36:4;763:155:3;11098:171:4;11172:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11172:29:4;-1:-1:-1;;;;;11172:29:4;;;;;;;;:24;;11225:23;11172:24;11225:14;:23::i;:::-;-1:-1:-1;;;;;11216:46:4;;;;;;;;;;;11098:171;;:::o;7530:344::-;7623:4;7335:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7335:16:4;7639:73;;;;-1:-1:-1;;;7639:73:4;;10506:2:11;7639:73:4;;;10488:21:11;10545:2;10525:18;;;10518:30;10584:34;10564:18;;;10557:62;-1:-1:-1;;;10635:18:11;;;10628:42;10687:19;;7639:73:4;10478:234:11;7639:73:4;7722:13;7738:23;7753:7;7738:14;:23::i;:::-;7722:39;;7790:5;-1:-1:-1;;;;;7779:16:4;:7;-1:-1:-1;;;;;7779:16:4;;:51;;;;7823:7;-1:-1:-1;;;;;7799:31:4;:20;7811:7;7799:11;:20::i;:::-;-1:-1:-1;;;;;7799:31:4;;7779:51;:87;;;-1:-1:-1;;;;;;4710:25:4;;;4687:4;4710:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7834:32;7771:96;7530:344;-1:-1:-1;;;;7530:344:4:o;10427:560::-;10581:4;-1:-1:-1;;;;;10554:31:4;:23;10569:7;10554:14;:23::i;:::-;-1:-1:-1;;;;;10554:31:4;;10546:85;;;;-1:-1:-1;;;10546:85:4;;14122:2:11;10546:85:4;;;14104:21:11;14161:2;14141:18;;;14134:30;14200:34;14180:18;;;14173:62;-1:-1:-1;;;14251:18:11;;;14244:39;14300:19;;10546:85:4;14094:231:11;10546:85:4;-1:-1:-1;;;;;10649:16:4;;10641:65;;;;-1:-1:-1;;;10641:65:4;;9343:2:11;10641:65:4;;;9325:21:11;9382:2;9362:18;;;9355:30;9421:34;9401:18;;;9394:62;-1:-1:-1;;;9472:18:11;;;9465:34;9516:19;;10641:65:4;9315:226:11;10641:65:4;10717:39;10738:4;10744:2;10748:7;10717:20;:39::i;:::-;10818:29;10835:1;10839:7;10818:8;:29::i;:::-;-1:-1:-1;;;;;10858:15:4;;;;;;:9;:15;;;;;:20;;10877:1;;10858:15;:20;;10877:1;;10858:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10888:13:4;;;;;;:9;:13;;;;;:18;;10905:1;;10888:13;:18;;10905:1;;10888:18;:::i;:::-;;;;-1:-1:-1;;10916:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10916:21:4;-1:-1:-1;;;;;10916:21:4;;;;;;;;;10953:27;;10916:16;;10953:27;;;;;;;10427:560;;;:::o;2034:169:9:-;2108:6;;;-1:-1:-1;;;;;2124:17:9;;;-1:-1:-1;;;;;;2124:17:9;;;;;;;2156:40;;2108:6;;;2124:17;2108:6;;2156:40;;2089:16;;2156:40;2034:169;;:::o;3150:1269:1:-;974:10;;959;943:27;;;;:15;:27;;;;;;:41;;935:89;;;;-1:-1:-1;;;935:89:1;;;;;;;:::i;:::-;3219:5:::1;;3228:1;3219:10;:24;;;;3233:5;;3242:1;3233:10;3219:24;3211:56;;;::::0;-1:-1:-1;;;3211:56:1;;15338:2:11;3211:56:1::1;::::0;::::1;15320:21:11::0;15377:2;15357:18;;;15350:30;-1:-1:-1;;;15396:18:11;;;15389:49;15455:18;;3211:56:1::1;15310:169:11::0;3211:56:1::1;3281:5;;3290:1;3281:10;3277:1136;;;3315:7;3323:8;3315:17;;;;;-1:-1:-1::0;;;3315:17:1::1;;;;;;;;;;::::0;:22;3307:69:::1;;;::::0;-1:-1:-1;;;3307:69:1;;11338:2:11;3307:69:1::1;::::0;::::1;11320:21:11::0;11377:2;11357:18;;;11350:30;11416:34;11396:18;;;11389:62;-1:-1:-1;;;11467:18:11;;;11460:32;11509:19;;3307:69:1::1;11310:224:11::0;3307:69:1::1;3428:10;3398:16;3415:8:::0;3398:26:::1;::::0;::::1;;;-1:-1:-1::0;;;3398:26:1::1;;;;;;;;;;::::0;-1:-1:-1;;;;;3398:26:1::1;:40;3390:113;;;::::0;-1:-1:-1;;;3390:113:1;;16530:2:11;3390:113:1::1;::::0;::::1;16512:21:11::0;16569:2;16549:18;;;16542:30;16608:34;16588:18;;;16581:62;16679:30;16659:18;;;16652:58;16727:19;;3390:113:1::1;16502:250:11::0;3390:113:1::1;3517:31;3527:10;3539:8;3517:9;:31::i;:::-;3608:10;3592:27;::::0;;;:15:::1;:27;::::0;;;;;:31:::1;::::0;3622:1:::1;3592:31;:::i;:::-;3578:10;3562:27;::::0;;;:15:::1;:27;::::0;;;;:61;3657:1:::1;3637:7;3645:8:::0;3637:17:::1;::::0;::::1;;;-1:-1:-1::0;;;3637:17:1::1;;;;;;;;;;:21:::0;3688:13;;:17:::1;::::0;3699:1:::1;3688:17;:::i;:::-;3672:13:::0;:33;3738:16;;:20:::1;::::0;3683:1:::1;3738:20;:::i;:::-;3719:16:::0;:39;3777:28:::1;::::0;;3784:10:::1;5696:51:11::0;;5778:2;5763:18;;5756:34;;;3777:28:1::1;::::0;5669:18:11;3777:28:1::1;;;;;;;3277:1136;;;3826:5;;3835:1;3826:10;3822:591;;;3860:8;3872:1;3860:13;:30;;;;3877:8;3889:1;3877:13;3860:30;:48;;;;3894:8;3906:2;3894:14;3860:48;3852:86;;;::::0;-1:-1:-1;;;3852:86:1;;7806:2:11;3852:86:1::1;::::0;::::1;7788:21:11::0;7845:2;7825:18;;;7818:30;7884:27;7864:18;;;7857:55;7929:18;;3852:86:1::1;7778:175:11::0;3852:86:1::1;3957:6;3952:451;3969:8;3967:1;:10;3952:451;;;4020:15;::::0;:19:::1;::::0;4038:1:::1;4020:19;:::i;:::-;4002:15;:37:::0;;;4057:38:::1;::::0;4067:10:::1;::::0;4057:9:::1;:38::i;:::-;4159:10;4143:27;::::0;;;:15:::1;:27;::::0;;;;;:31:::1;::::0;4173:1:::1;4143:31;:::i;:::-;4129:10;4113:27;::::0;;;:15:::1;:27;::::0;;;;:61;4200:15:::1;::::0;4219:1:::1;::::0;4192:7:::1;::::0;:24:::1;::::0;::::1;;;-1:-1:-1::0;;;4192:24:1::1;;;;;;;;;;:28:::0;4254:13;;:17:::1;::::0;4265:1:::1;4254:17;:::i;:::-;4238:13:::0;:33;4309:17;;:21:::1;::::0;4249:1:::1;4309:21;:::i;:::-;4289:17:::0;:41;4372:15:::1;::::0;4353:35:::1;::::0;;4360:10:::1;5696:51:11::0;;5778:2;5763:18;;5756:34;;;;4353:35:1::1;::::0;5669:18:11;4353:35:1::1;;;;;;;3979:3:::0;::::1;::::0;::::1;:::i;:::-;;;;3952:451;;6637:307:4::0;6788:28;6798:4;6804:2;6808:7;6788:9;:28::i;:::-;6834:48;6857:4;6863:2;6867:7;6876:5;6834:22;:48::i;:::-;6826:111;;;;-1:-1:-1;;;6826:111:4;;;;;;;:::i;6689:553:1:-;6739:27;6782:7;6778:48;;-1:-1:-1;6805:10:1;;;;;;;;;;;;-1:-1:-1;;;6805:10:1;;;;;;6778:48;6844:2;6835:6;6874:66;6881:6;;6874:66;;6903:5;;;;:::i;:::-;;-1:-1:-1;6922:7:1;;-1:-1:-1;6927:2:1;6922:7;;:::i;:::-;;;6874:66;;;6949:17;6979:3;6969:14;;;;;;-1:-1:-1;;;6969:14:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6969:14:1;-1:-1:-1;6949:34:1;-1:-1:-1;7002:3:1;7015:192;7022:7;;7015:192;;7049:3;7051:1;7049;:3;:::i;:::-;7045:7;-1:-1:-1;7066:10:1;7096:7;7101:2;7096;:7;:::i;:::-;:12;;7106:2;7096:12;:::i;:::-;7091:17;;:2;:17;:::i;:::-;7080:29;;:2;:29;:::i;:::-;7066:44;;7124:9;7143:4;7136:12;;7124:24;;7172:2;7162:4;7167:1;7162:7;;;;;;-1:-1:-1;;;7162:7:1;;;;;;;;;;;;:12;-1:-1:-1;;;;;7162:12:1;;;;;;;;-1:-1:-1;7188:8:1;7194:2;7188:8;;:::i;:::-;;;7015:192;;;;;-1:-1:-1;7230:4:1;6689:553;-1:-1:-1;;;;6689:553:1:o;7316:181::-;7445:45;3488:401:4;8204:108;8279:26;8289:2;8293:7;8279:26;;;;;;;;;;;;:9;:26::i;11822:778::-;11972:4;-1:-1:-1;;;;;11992:13:4;;1034:20:0;1080:8;11988:606:4;;12027:72;;-1:-1:-1;;;12027:72:4;;-1:-1:-1;;;;;12027:36:4;;;;;:72;;666:10:2;;12078:4:4;;12084:7;;12093:5;;12027:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12027:72:4;;;;;;;;-1:-1:-1;;12027:72:4;;;;;;;;;;;;:::i;:::-;;;12023:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12266:13:4;;12262:266;;12308:60;;-1:-1:-1;;;12308:60:4;;;;;;;:::i;12262:266::-;12480:6;12474:13;12465:6;12461:2;12457:15;12450:38;12023:519;-1:-1:-1;;;;;;12149:51:4;-1:-1:-1;;;12149:51:4;;-1:-1:-1;12142:58:4;;11988:606;-1:-1:-1;12579:4:4;11822:778;;;;;;:::o;8533:311::-;8658:18;8664:2;8668:7;8658:5;:18::i;:::-;8707:54;8738:1;8742:2;8746:7;8755:5;8707:22;:54::i;:::-;8686:151;;;;-1:-1:-1;;;8686:151:4;;;;;;;:::i;9166:372::-;-1:-1:-1;;;;;9245:16:4;;9237:61;;;;-1:-1:-1;;;9237:61:4;;12987:2:11;9237:61:4;;;12969:21:11;;;13006:18;;;12999:30;13065:34;13045:18;;;13038:62;13117:18;;9237:61:4;12959:182:11;9237:61:4;7312:4;7335:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7335:16:4;:30;9308:58;;;;-1:-1:-1;;;9308:58:4;;8986:2:11;9308:58:4;;;8968:21:11;9025:2;9005:18;;;8998:30;9064;9044:18;;;9037:58;9112:18;;9308:58:4;8958:178:11;9308:58:4;9377:45;9406:1;9410:2;9414:7;9377:20;:45::i;:::-;-1:-1:-1;;;;;9433:13:4;;;;;;:9;:13;;;;;:18;;9450:1;;9433:13;:18;;9450:1;;9433:18;:::i;:::-;;;;-1:-1:-1;;9461:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9461:21:4;-1:-1:-1;;;;;9461:21:4;;;;;;;;9498:33;;9461:16;;;9498:33;;9461:16;;9498:33;9166:372;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:11;82:20;;-1:-1:-1;;;;;131:31:11;;121:42;;111:2;;177:1;174;167:12;192:196;;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;:::-;343:39;262:126;-1:-1:-1;;;262:126:11:o;393:270::-;;;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:338::-;;;;814:2;802:9;793:7;789:23;785:32;782:2;;;835:6;827;820:22;782:2;863:29;882:9;863:29;:::i;:::-;853:39;;911:38;945:2;934:9;930:18;911:38;:::i;:::-;901:48;;996:2;985:9;981:18;968:32;958:42;;772:234;;;;;:::o;1011:1025::-;;;;;1183:3;1171:9;1162:7;1158:23;1154:33;1151:2;;;1205:6;1197;1190:22;1151:2;1233:29;1252:9;1233:29;:::i;:::-;1223:39;;1281:2;1302:38;1336:2;1325:9;1321:18;1302:38;:::i;:::-;1292:48;;1387:2;1376:9;1372:18;1359:32;1349:42;;1442:2;1431:9;1427:18;1414:32;1465:18;1506:2;1498:6;1495:14;1492:2;;;1527:6;1519;1512:22;1492:2;1570:6;1559:9;1555:22;1545:32;;1615:7;1608:4;1604:2;1600:13;1596:27;1586:2;;1642:6;1634;1627:22;1586:2;1683;1670:16;1705:2;1701;1698:10;1695:2;;;1711:18;;:::i;:::-;1753:53;1796:2;1777:13;;-1:-1:-1;;1773:27:11;1769:36;;1753:53;:::i;:::-;1740:66;;1829:2;1822:5;1815:17;1869:7;1864:2;1859;1855;1851:11;1847:20;1844:33;1841:2;;;1895:6;1887;1880:22;1841:2;1955;1950;1946;1942:11;1937:2;1930:5;1926:14;1913:45;1978:14;;1974:23;;;1967:39;;;;1141:895;;;;-1:-1:-1;1141:895:11;;-1:-1:-1;;1141:895:11:o;2041:367::-;;;2167:2;2155:9;2146:7;2142:23;2138:32;2135:2;;;2188:6;2180;2173:22;2135:2;2216:29;2235:9;2216:29;:::i;:::-;2206:39;;2295:2;2284:9;2280:18;2267:32;2342:5;2335:13;2328:21;2321:5;2318:32;2308:2;;2369:6;2361;2354:22;2308:2;2397:5;2387:15;;;2125:283;;;;;:::o;2413:264::-;;;2542:2;2530:9;2521:7;2517:23;2513:32;2510:2;;;2563:6;2555;2548:22;2510:2;2591:29;2610:9;2591:29;:::i;:::-;2581:39;2667:2;2652:18;;;;2639:32;;-1:-1:-1;;;2500:177:11:o;2682:698::-;;2797:5;2843:2;2831:9;2822:7;2818:23;2814:32;2811:2;;;2864:6;2856;2849:22;2811:2;2918:7;2911:4;2900:9;2896:20;2892:34;2882:2;;2945:6;2937;2930:22;2882:2;2974:19;2990:2;2974:19;:::i;:::-;3015:3;3038:9;3082:7;3077:2;3066:9;3062:18;3059:31;3056:2;;;3108:6;3100;3093:22;3056:2;3135:6;3126:15;;3150:200;3164:6;3161:1;3158:13;3150:200;;;3225:23;3244:3;3225:23;:::i;:::-;3213:36;;3186:1;3179:9;;;;;3272:4;3296:12;;;;3328;3150:200;;;-1:-1:-1;3369:5:11;2777:603;-1:-1:-1;;;;;2777:603:11:o;3385:255::-;;3496:2;3484:9;3475:7;3471:23;3467:32;3464:2;;;3517:6;3509;3502:22;3464:2;3561:9;3548:23;3580:30;3604:5;3580:30;:::i;3645:259::-;;3767:2;3755:9;3746:7;3742:23;3738:32;3735:2;;;3788:6;3780;3773:22;3735:2;3825:9;3819:16;3844:30;3868:5;3844:30;:::i;3909:190::-;;4021:2;4009:9;4000:7;3996:23;3992:32;3989:2;;;4042:6;4034;4027:22;3989:2;-1:-1:-1;4070:23:11;;3979:120;-1:-1:-1;3979:120:11:o;4104:257::-;;4183:5;4177:12;4210:6;4205:3;4198:19;4226:63;4282:6;4275:4;4270:3;4266:14;4259:4;4252:5;4248:16;4226:63;:::i;:::-;4343:2;4322:15;-1:-1:-1;;4318:29:11;4309:39;;;;4350:4;4305:50;;4153:208;-1:-1:-1;;4153:208:11:o;4366:450::-;;4628:33;4623:3;4616:46;4691:6;4685:13;4707:62;4762:6;4757:2;4752:3;4748:12;4741:4;4733:6;4729:17;4707:62;:::i;:::-;4789:16;;;;4807:2;4785:25;;4606:210;-1:-1:-1;;4606:210:11:o;5029:488::-;-1:-1:-1;;;;;5298:15:11;;;5280:34;;5350:15;;5345:2;5330:18;;5323:43;5397:2;5382:18;;5375:34;;;5445:3;5440:2;5425:18;;5418:31;;;5029:488;;5466:45;;5491:19;;5483:6;5466:45;:::i;:::-;5458:53;5232:285;-1:-1:-1;;;;;;5232:285:11:o;5801:529::-;5985:5;5970:21;;5974:9;6068:6;5801:529;6102:222;6116:6;6113:1;6110:13;6102:222;;;6181:13;;-1:-1:-1;;;;;6177:39:11;6165:52;;6240:4;6264:12;;;;6299:15;;;;6213:1;6131:9;6102:222;;;6106:3;;;5952:378;;;;:::o;6335:494::-;6515:2;6500:18;;6504:9;6595:6;6335:494;6629:194;6643:4;6640:1;6637:11;6629:194;;;6702:13;;6690:26;;6739:4;6763:12;;;;6798:15;;;;6663:1;6656:9;6629:194;;7026:219;;7175:2;7164:9;7157:21;7195:44;7235:2;7224:9;7220:18;7212:6;7195:44;:::i;7958:414::-;8160:2;8142:21;;;8199:2;8179:18;;;8172:30;8238:34;8233:2;8218:18;;8211:62;-1:-1:-1;;;8304:2:11;8289:18;;8282:48;8362:3;8347:19;;8132:240::o;13559:356::-;13761:2;13743:21;;;13780:18;;;13773:30;13839:34;13834:2;13819:18;;13812:62;13906:2;13891:18;;13733:182::o;14330:399::-;14532:2;14514:21;;;14571:2;14551:18;;;14544:30;14610:34;14605:2;14590:18;;14583:62;-1:-1:-1;;;14676:2:11;14661:18;;14654:33;14719:3;14704:19;;14504:225::o;15484:413::-;15686:2;15668:21;;;15725:2;15705:18;;;15698:30;15764:34;15759:2;15744:18;;15737:62;-1:-1:-1;;;15830:2:11;15815:18;;15808:47;15887:3;15872:19;;15658:239::o;17344:275::-;17415:2;17409:9;17480:2;17461:13;;-1:-1:-1;;17457:27:11;17445:40;;17515:18;17500:34;;17536:22;;;17497:62;17494:2;;;17562:18;;:::i;:::-;17598:2;17591:22;17389:230;;-1:-1:-1;17389:230:11:o;17624:128::-;;17695:1;17691:6;17688:1;17685:13;17682:2;;;17701:18;;:::i;:::-;-1:-1:-1;17737:9:11;;17672:80::o;17757:204::-;;17831:4;17828:1;17824:12;17863:4;17860:1;17856:12;17898:3;17892:4;17888:14;17883:3;17880:23;17877:2;;;17906:18;;:::i;:::-;17942:13;;17803:158;-1:-1:-1;;;17803:158:11:o;17966:217::-;;18032:1;18022:2;;-1:-1:-1;;;18057:31:11;;18111:4;18108:1;18101:15;18139:4;18064:1;18129:15;18022:2;-1:-1:-1;18168:9:11;;18012:171::o;18188:168::-;;18294:1;18290;18286:6;18282:14;18279:1;18276:21;18271:1;18264:9;18257:17;18253:45;18250:2;;;18301:18;;:::i;:::-;-1:-1:-1;18341:9:11;;18240:116::o;18361:125::-;;18429:1;18426;18423:8;18420:2;;;18434:18;;:::i;:::-;-1:-1:-1;18471:9:11;;18410:76::o;18491:258::-;18563:1;18573:113;18587:6;18584:1;18581:13;18573:113;;;18663:11;;;18657:18;18644:11;;;18637:39;18609:2;18602:10;18573:113;;;18704:6;18701:1;18698:13;18695:2;;;-1:-1:-1;;18739:1:11;18721:16;;18714:27;18544:205::o;18754:380::-;18839:1;18829:12;;18886:1;18876:12;;;18897:2;;18951:4;18943:6;18939:17;18929:27;;18897:2;19004;18996:6;18993:14;18973:18;18970:38;18967:2;;;19050:10;19045:3;19041:20;19038:1;19031:31;19085:4;19082:1;19075:15;19113:4;19110:1;19103:15;18967:2;;18809:325;;;:::o;19139:135::-;;-1:-1:-1;;19199:17:11;;19196:2;;;19219:18;;:::i;:::-;-1:-1:-1;19266:1:11;19255:13;;19186:88::o;19279:127::-;19340:10;19335:3;19331:20;19328:1;19321:31;19371:4;19368:1;19361:15;19395:4;19392:1;19385:15;19411:127;19472:10;19467:3;19463:20;19460:1;19453:31;19503:4;19500:1;19493:15;19527:4;19524:1;19517:15;19543:131;-1:-1:-1;;;;;;19617:32:11;;19607:43;;19597:2;;19664:1;19661;19654:12

Swarm Source

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