ETH Price: $2,628.01 (+7.33%)
Gas: 2 Gwei

Token

Basic Buns (BSCBN)
 

Overview

Max Total Supply

286 BSCBN

Holders

129

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 BSCBN
0xaf518f457828fa45b84c3597a7d02ba76b9f35b1
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:
BasicBuns

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 5 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-02
*/

// SPDX-License-Identifier: MIT
/*
(\_/)
( •_•)
/ > Basic Buns

by Christian Montoya
*/
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);
}

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


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



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




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




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





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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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




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

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

        return string(abi.encodePacked("Bunny Hold Creature"));
    }

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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




interface EmojiGardenInterface {
    function ownerOf(uint256 tokenId) external view returns (address owner);
}


contract BasicBuns is ERC721, Ownable {

    uint256 private _maxSupply = 1000; // most we will ever have - this number can be lowered but not raised
    uint256 private _basePrice = 25000000; // 0.025 ether - this number can be changed 
    uint256 private payableId = 416; // payableId + 1 = id of next token you can buy 
    uint256 private claimedAmount = 0; // increment whenever a token is claimed with a garden 
    
    // EmojiGardenInterface public emojiGardenContract = EmojiGardenInterface(0x4a15C2d191D70722552d8F67B61A36784E9d475D); // testnet 
    EmojiGardenInterface public emojiGardenContract = EmojiGardenInterface(0x690dBdf6bB1712f01b34e80c25553DB869dF8Bf9); // mainnet 

    struct bunnyData {
        string colorSwatchId;
        string colorSwatchOne;
        string colorSwatchTwo;
        string backgroundId;
        string background;
        string earId;
        string ears;
        string faceId;
        string face;
        string bodyId;
        string body;
        string animal;
        string emoji;
    }

    string[9] private _colorSwatchIds = [
        "Dusk",
        "Midnight",
        "Stealth",
        "Fire",
        "Blood",
        "Beauty",
        "Deep",
        "Slate",
        "Neon"
    ];

    string[9] private _colorSwatchOnes = [
        "#80F",
        "#306",
        "#026",
        "#e83",
        "#a00",
        "#d18",
        "#1bb",
        "#456",
        "#0cc"
    ];

    string[9] private _colorSwatchTwos = [
        "#f40",
        "#a4c",
        "#002",
        "#e52",
        "#300",
        "#300",
        "#303",
        "#123",
        "#f1f"
    ];

    string[7] private _backgroundIds = [
        "Blank",
        "Dots",
        "Chevrons",
        "Triangles",
        "Squares",
        "Diamonds",
        "Bricks"
    ];

    string[7] private _backgrounds = [
        '<pattern id="b" x="0" y="0" width="100" height="100"><rect fill="#fff" fill-opacity="0" width="100" height="100"></rect></pattern>',
        '<pattern id="b" x="0" y="0" width="30" height="30" patternUnits="userSpaceOnUse"><g fill="#fff" opacity=".15"><circle cx="15" cy="15" r="3"/><circle cy="30" r="3"/><circle cx="30" cy="30" r="3"/><circle cx="30" r="3"/><circle r="3"/></g></pattern>',
        '<pattern id="b" x="0" y="0" width="24" height="24" patternUnits="userSpaceOnUse"><polygon fill="#fff" opacity="0.15" points="24 24 12 24 18 18 24 12 24 0 24 0 12 12 0 0 0 12 6 18 12 24 24 24 "/></pattern>',
        '<pattern id="b" x="0" y="0" width="12" height="12" patternUnits="userSpaceOnUse"><polygon fill="#fff" opacity="0.15" points="0 0 12 0 0 12"/></pattern>',
        '<pattern id="b" x="0" y="0" width="40" height="40" patternUnits="userSpaceOnUse"><rect fill="#fff" opacity="0.15" x="0" y="0" width="20" height="20"/><rect fill="#fff" opacity="0.15" x="20" y="20" width="20" height="20"/></pattern>',
        '<pattern id="b" x="10" y="10" width="20" height="20" patternUnits="userSpaceOnUse"><circle fill="#fff" cx="10" cy="10" r="10" opacity="0.15"/></pattern>',
        '<pattern id="b" x="0" y="0" width="42" height="42" patternUnits="userSpaceOnUse"><g fill="none" fill-rule="evenodd"><g fill="#fff" opacity="0.15"><path d="M0 0h42v44H0V0zm1 1h40v20H1V1zM0 23h20v20H0V23zm22 0h20v20H22V23z"/></g></g></pattern>'
    ];

    string[3] private _earIds = [
        'Pointy',
        'Furry',
        'Kitty'
    ];

    string[3] private _ears = [
        '(\\__/)',
        '{\\__/}',
        '/\\_/\\'
    ];

    string[18] private _faceIds = [
        'Calm',
        'Puzzled',
        'Kitty',
        'Mischievous',
        'Happy',
        'Concerned',
        'Timid',
        'Confident',
        'Derpy',
        'Loud',
        'Disappointed',
        'Smug',
        'Skeptical',
        'Mysterious',
        'Rabid',
        'Victorious',
        'Desperate',
        'Human'
    ];

    string[18] private _faces = [
        unicode"(  •_•)",
        unicode"( • . •)",
        unicode"(=•ㅅ•)",
        unicode"( • - •)",
        unicode"( ^_^)",
        unicode"(⚆_⚆)",
        unicode"(  ' . ')",
        unicode"(˵ 'ω')",
        unicode"( • ∇ •)",
        unicode"( ° □ °)",
        unicode"( T_T)",
        unicode"(  ᵔᴥᵔ)",
        unicode"(  •̃_•̃ )",
        unicode"( ◕。◕)",
        unicode"ミ●˾☉",
        unicode"(  •̀ᴗ•́ )",
        unicode"(。•́‿•̀)",
        unicode"( ಠʖ̯ಠ)"
    ];

    string[3] private _bodyIds = [
        'Forward',
        'Paw',
        'Back'
    ];

    string[3] private _bodies = [
        unicode"/ &gt;",
        unicode"/づ",
        unicode"&lt; \\"
    ];

    string[3] private _bodiesRaw = [
        unicode"/ >",
        unicode"/づ",
        unicode"< \\"
    ];

    string[111] private _emojis = [
        unicode"💀",
        unicode"💩",
        unicode"🧳",
        unicode"🎃",
        unicode"🧵",
        unicode"🧶",
        unicode"🧦",
        unicode"🩲",
        unicode"🎩",
        unicode"💍",
        unicode"🐣",
        unicode"🐌",
        unicode"💐",
        unicode"🌸",
        unicode"🌹",
        unicode"🍀",
        unicode"🍄",
        unicode"🦀",
        unicode"🌎",
        unicode"🌞",
        unicode"🌟",
        unicode"🌪️",
        unicode"🌈",
        unicode"⛄",
        unicode"🔥",
        unicode"🎄",
        unicode"🍉",
        unicode"🍍",
        unicode"🍎",
        unicode"🍑",
        unicode"🍒",
        unicode"🍆",
        unicode"🍞",
        unicode"🧀",
        unicode"🍕",
        unicode"🌮",
        unicode"🍿",
        unicode"🍙",
        unicode"🍣",
        unicode"🥡",
        unicode"🍦",
        unicode"🍪",
        unicode"🎂",
        unicode"🧁",
        unicode"🍼",
        unicode"🍵",
        unicode"🍹",
        unicode"🍺",
        unicode"🥤",
        unicode"🧊",
        unicode"🤸",
        unicode"🏆",
        unicode"⚽",
        unicode"⚾",
        unicode"🏀",
        unicode"🏓",
        unicode"🎣",
        unicode"🎱",
        unicode"🎮",
        unicode"🎲",
        unicode"🧩",
        unicode"🎨",
        unicode"🎤",
        unicode"🎸",
        unicode"🥁",
        unicode"🎬",
        unicode"🌋",
        unicode"🚘",
        unicode"🚨",
        unicode"🪐",
        unicode"🚀",
        unicode"💌",
        unicode"💣",
        unicode"🔪",
        unicode"🧭",
        unicode"🛎️",
        unicode"⏱️",
        unicode"🧨",
        unicode"🎉",
        unicode"🧧",
        unicode"🎁",
        unicode"🕹️",
        unicode"🧸",
        unicode"💎",
        unicode"📻",
        unicode"📱",
        unicode"📟",
        unicode"💻",
        unicode"📸",
        unicode"📹",
        unicode"🔎",
        unicode"💡",
        unicode"🏮",
        unicode"📓",
        unicode"📖",
        unicode"🗞️",
        unicode"💰",
        unicode"💳",
        unicode"📦",
        unicode"🗑️",
        unicode"🔑",
        unicode"🛡️",
        unicode"🧲",
        unicode"🧪",
        unicode"💉",
        unicode"💊",
        unicode"🧹",
        unicode"🧻",
        unicode"🧯",
        unicode"💝",
        unicode"🔔"
    ];

    function memcmp(bytes memory a, bytes memory b) internal pure returns(bool){
        return (a.length == b.length) && (keccak256(a) == keccak256(b));
    }
    function strcmp(string memory a, string memory b) internal pure returns(bool){
        return memcmp(bytes(a), bytes(b));
    }
    
    function totalSupply() public view virtual returns (uint256) { 
        uint256 total = claimedAmount + (payableId-416); 
        return total; 
    }
    
    function makeBunny(uint256 tokenId) internal view returns (bunnyData memory) { 
        bunnyData memory bunny;

        // random background gradient
        uint256 rand = uint256(keccak256(abi.encodePacked(tokenId, address(this), "4"))) % _colorSwatchIds.length;
        bunny.colorSwatchId = _colorSwatchIds[rand];
        bunny.colorSwatchOne = _colorSwatchOnes[rand];
        bunny.colorSwatchTwo = _colorSwatchTwos[rand];

        // random background pattern
        rand = uint256(keccak256(abi.encodePacked(tokenId, address(this), "5"))) % _backgroundIds.length;
        bunny.backgroundId = _backgroundIds[rand];
        bunny.background = _backgrounds[rand];

        // 3 types of ears, differing rarity
        rand = uint256(keccak256(abi.encodePacked(tokenId, address(this), "1"))) % 7;
        bunny.earId = _earIds[0];
        bunny.ears = _ears[0];
        if(rand > 5) {
            bunny.earId = _earIds[2];
            bunny.ears = _ears[2];
        }
        else if(rand > 3) {
            bunny.earId = _earIds[1];
            bunny.ears = _ears[1];
        }

        // 17 types of faces, also differing rarity
        uint256 faceRange = 8;
        rand = uint256(keccak256(abi.encodePacked(tokenId, address(this)))) % 7;
        if(rand >= 5) {
            faceRange = 18;
        }
        else if(rand >= 2) {
            faceRange = 13;
        }
        rand = uint256(keccak256(abi.encodePacked(tokenId, address(this), "2"))) % faceRange;
        bunny.faceId = _faceIds[rand];
        bunny.face = _faces[rand];
        delete faceRange;

        // use face to determine if kitty or human
        bunny.animal = "Bunny";
        if(strcmp(bunny.faceId, "Human")) {
            bunny.animal = "Human";
        }
        else if(strcmp(bunny.earId,"Kitty")) {
            bunny.animal = "Kitty";
        }

        // 3 types of bodies, also differing rarity
        rand = uint256(keccak256(abi.encodePacked(tokenId, address(this), "3"))) % 9;
        bunny.bodyId = _bodyIds[0];
        bunny.body = _bodies[0];
        if(rand >= 8) {
            bunny.bodyId = _bodyIds[2];
            bunny.body = _bodies[2];
        }
        else if(rand >= 6) {
            bunny.bodyId = _bodyIds[1];
            bunny.body = _bodies[1];
        }

        // lots of possible emoji
        rand = uint256(keccak256(abi.encodePacked(address(this), tokenId))) % _emojis.length;
        bunny.emoji = _emojis[rand];
        
        return bunny; 
    }
    
    function makeSVG(bunnyData memory bunny) internal pure returns (string memory) { 
        string[14] memory parts;

        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 200 200" width="100%" height="100%">';
        parts[1] = "<style>text{font-size:32pt;font-family:'Helvetica Neue',Arial,sans-serif;font-weight:bold;text-anchor:middle}.tt{fill:#fff;white-space:pre}#stop1{stop-color:";
        parts[2] = bunny.colorSwatchOne;
        parts[3] = '}#stop2{stop-color:';
        parts[4] = bunny.colorSwatchTwo;
        parts[5] = "}</style><defs><linearGradient id='a' x1='0' x2='0' y1='0' y2='1'><stop offset='0' id='stop1' /><stop offset='1' id='stop2' /></linearGradient></defs><rect width='100%' height='100%' fill='url(#a)'/>";
        parts[6] = bunny.background;
        parts[7] = "<rect width='100%' height='100%' fill='url(#b)'/><text class='tt' x='50%' y='28%'>";
        parts[8] = bunny.ears;
        parts[9] = "</text><text class='tt' x='50%' y='56%'>";
        parts[10] = bunny.face;
        parts[11] = "</text><text x='50%' y='87%'>";
        parts[12] = bunny.body;
        parts[13] = "</text></svg>";

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6]));
        output = string(abi.encodePacked(output, parts[7], parts[8], parts[9], parts[10], parts[11], parts[12], parts[13]));

        return output;   
    }
    
    function bunnyString(uint256 tokenId) public view returns (string memory) {
        require(ownerOf(tokenId) != address(0), "ERC721: bunnyString query for nonexistent token");

        bunnyData memory bunny = makeBunny(tokenId);
        
        if(strcmp(bunny.bodyId,"Back")) {
            bunny.body = unicode"< \\"; 
            bunny.body = string(abi.encodePacked(bunny.emoji, bunny.body));
        }
        else if(strcmp(bunny.bodyId,"Forward")) { 
            bunny.body = unicode"/ >";
            bunny.body = string(abi.encodePacked(bunny.body, bunny.emoji));
        }
        else {
            bunny.body = string(abi.encodePacked(bunny.body, bunny.emoji));
        }

        return string(abi.encodePacked(bunny.ears, "\r\n", bunny.face, "\r\n", bunny.body));
    }
    
    function bunnySVG(uint256 tokenId) public view returns (string memory) { 
        require(ownerOf(tokenId) != address(0), "ERC721: bunnySVG query for nonexistent token");

        bunnyData memory bunny = makeBunny(tokenId);
        
        if(strcmp(bunny.bodyId,"Back")) {
            bunny.body = string(abi.encodePacked(bunny.emoji, "<tspan class='tt'>", bunny.body, "</tspan>"));
        }
        else {
            bunny.body = string(abi.encodePacked("<tspan class='tt'>", bunny.body, "</tspan>", bunny.emoji));
        }

        string memory output = makeSVG(bunny); 

        return output;   
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        require(ownerOf(tokenId) != address(0), "ERC721: tokenURI query for nonexistent token");

        bunnyData memory bunny = makeBunny(tokenId);  
        
        if(strcmp(bunny.bodyId,"Back")) {
            bunny.body = string(abi.encodePacked(bunny.emoji, "<tspan class='tt'>", bunny.body, "</tspan>"));
        }
        else {
            bunny.body = string(abi.encodePacked("<tspan class='tt'>", bunny.body, "</tspan>", bunny.emoji));
        }

        string memory output = makeSVG(bunny); 
        
        string[15] memory parts;

        parts[0] = '[{"trait_type":"Pattern","value":"';
        parts[1] = bunny.backgroundId;
        parts[2] = '"},{"trait_type":"Backdrop","value":"';
        parts[3] = bunny.colorSwatchId;
        parts[4] = '"},{"trait_type":"Creature","value":"';
        parts[5] = bunny.animal;
        parts[6] = '"},{"trait_type":"Ears","value":"';
        parts[7] = bunny.earId;
        parts[8] = '"},{"trait_type":"Face","value":"';
        parts[9] = bunny.faceId;
        parts[10] = '"},{"trait_type":"Body","value":"';
        parts[11] = bunny.bodyId;
        parts[12] = '"},{"trait_type":"Holding","value":"';
        parts[13] = bunny.emoji;
        parts[14] = '"}]';

        string memory json = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7]));

        json = string(abi.encodePacked(json, parts[8], parts[9], parts[10], parts[11], parts[12], parts[13], parts[14]));
        
        if(strcmp(bunny.animal, "Human")) {
        }
        else if(strcmp(bunny.earId,"Kitty") && strcmp(bunny.faceId,"Kitty")) { 
            bunny.animal = "Kitty Cat";    
        }
        else { 
            bunny.animal = string(abi.encodePacked(bunny.faceId, " ", bunny.animal));    
        }

        bunny.animal = string(abi.encodePacked(bunny.animal, ' #', toString(tokenId)));

        json = string(abi.encodePacked('{"name":"',bunny.animal,'", "description":"A cute creature generated and stored entirely on-chain.","attributes":',json));
        json = Base64.encode(bytes(string(abi.encodePacked(json, ', "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }
    
    function ownerSetPrice(uint256 priceValue) public onlyOwner { 
        _basePrice = priceValue; 
    }
    
    function mint() public payable { 
        require(msg.value >= _basePrice, "Payable amount is incorrect, please check mint price"); 
        require(_maxSupply > payableId, "Public sale is over");
        payableId = payableId + 1; 
        _safeMint( msg.sender, payableId ); 
        (bool success,) = owner().call{value: msg.value}("");
        require(success);
    }
    
    function mintMulti(uint256 amount) public payable { 
        require(_maxSupply >= (payableId + amount), "Remaining supply too low to multi-mint");
        require(msg.value >= (_basePrice * amount), "Payable amount is incorrect, please check mint price"); 
        for(uint256 i = 0; i < amount; i++) { 
            payableId = payableId + 1; 
            _safeMint( msg.sender, payableId ); 
        }
    }
    
    function claimWithGarden(uint256 tokenId) public {
        require(tokenId > 0 && tokenId <= 416, "Token ID invalid");
        require(_maxSupply > totalSupply(), "Mint is over");
        require(emojiGardenContract.ownerOf(tokenId) == msg.sender, "You need to own the Emoji Garden with this ID to claim this Basic Bun");
        claimedAmount = claimedAmount + 1; 
        _safeMint(_msgSender(), tokenId);
    }
    
    function claimWithHonoraryGarden(uint256 tokenId) public { 
        require(tokenId > 4420 && tokenId <= 4444, "Token ID invalid"); 
        require(_maxSupply > totalSupply(), "Mint is over");
        require(emojiGardenContract.ownerOf(tokenId) == msg.sender, "You need to own the Emoji Garden with this ID to claim this Basic Bun");
        tokenId = tokenId - 4054; // 4421 maps to 367, 4444 maps to 390 
        claimedAmount = claimedAmount + 1;
        _safeMint(_msgSender(), tokenId);
    }
    
    function claimToWithGarden(address recipient, uint256 tokenId) public { 
        require(tokenId > 0 && tokenId <= 416, "Token ID invalid");
        require(_maxSupply > totalSupply(), "Mint is over");
        require(emojiGardenContract.ownerOf(tokenId) == msg.sender, "You need to own the Emoji Garden with this ID to gift this Basic Bun");
        claimedAmount = claimedAmount + 1; 
        _safeMint(address(recipient), tokenId);
    }

    function multiClaimWithGardens(uint256[] memory tokenIds) public {
        require(_maxSupply > totalSupply(), "Mint is over");
        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(tokenIds[i] > 0 && tokenIds[i] <= 416, "Token ID invalid");
            require(emojiGardenContract.ownerOf(tokenIds[i]) == msg.sender, "You need to own the Emoji Garden with this ID to claim this Basic Bun");
            claimedAmount = claimedAmount + 1; 
            _safeMint(_msgSender(), tokenIds[i]);
        }
    }

    function withdraw() public onlyOwner(){
        payable(msg.sender).transfer(address(this).balance);
    }

    function maxSupply() public view returns (uint256) {
        return _maxSupply;
    }
    
    function basePrice() public view returns (uint256) {
        return _basePrice;
    }

    function reduceSupply(uint256 value) public onlyOwner(){
        require(value >= totalSupply() && value < _maxSupply, "Value not in required bounds");
        _maxSupply = value;
    }

    function endMint() public onlyOwner(){
        require(_maxSupply != totalSupply(), "Mint is already over");
        _maxSupply = totalSupply(); // this kills the mint
    }

    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }

    constructor() ERC721("Basic Buns", "BSCBN") Ownable() {}
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"basePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"bunnySVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"bunnyString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimToWithGarden","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimWithGarden","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimWithHonoraryGarden","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emojiGardenContract","outputs":[{"internalType":"contract EmojiGardenInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintMulti","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"multiClaimWithGardens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"priceValue","type":"uint256"}],"name":"ownerSetPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"reduceSupply","outputs":[],"stateMutability":"nonpayable","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6103e8600790815563017d784060089081556101a060098181556000600a55600b80546001600160a01b03191673690dbdf6bb1712f01b34e80c25553db869df8bf91790556004808352634475736b60e01b6101c05260809283526101e093845267135a591b9a59da1d60c21b6102005260a093909352610220938452660a6e8cac2d8e8d60cb1b6102405260c093909352610260828152634669726560e01b6102805260e05260056102a081815264109b1bdbd960da1b6102c0526101005260066102e09081526542656175747960d01b6103005261012052610320838152630446565760e41b610340526101405261036090815264536c61746560d81b61038052610160526103e06040526103a0918252632732b7b760e11b6103c052610180919091526200013491600c919062001a5d565b5060408051610160810182526004610120820181815263119c182360e11b610140840152825282518084018452818152631199981b60e11b6020828101919091528084019190915283518085018552828152631198191b60e11b818301528385015283518085018552828152632365383360e01b81830152606084015283518085018552828152630236130360e41b8183015260808401528351808501855282815263046c862760e31b8183015260a084015283518085018552828152631198b13160e11b8183015260c08401528351808501855282815263119a1a9b60e11b8183015260e08401528351808501909452908352632330636360e01b908301526101008101919091526200024d90601590600962001a5d565b50604080516101608101825260046101208201818152630236634360e41b610140840152825282518084018452818152632361346360e01b6020828101919091528084019190915283518085018552828152631198181960e11b8183015283850152835180850185528281526311b29a9960e11b81830152606084015283518085018552828152630233330360e41b8183018190526080850191909152845180860186528381528083019190915260a084015283518085018552828152632333303360e01b8183015260c084015283518085018552828152632331323360e01b8183015260e084015283518085019094529083526311b318b360e11b908301526101008101919091526200036690601e90600962001a5d565b506040518060e0016040528060405180604001604052806005815260200164426c616e6b60d81b815250815260200160405180604001604052806004815260200163446f747360e01b81525081526020016040518060400160405280600881526020016743686576726f6e7360c01b815250815260200160405180604001604052806009815260200168547269616e676c657360b81b8152508152602001604051806040016040528060078152602001665371756172657360c81b8152508152602001604051806040016040528060088152602001674469616d6f6e647360c01b815250815260200160405180604001604052806006815260200165427269636b7360d01b81525081525060279060076200048392919062001ab4565b50604080516101a08101909152608260e082018181528291620067ce610100840139815260200160405180610120016040528060f781526020016200664060f79139815260200160405180610100016040528060cc81526020016200648d60cc913981526020016040518060c00160405280609781526020016200673760979139815260200160405180610120016040528060e781526020016200655960e7913981526020016040518060c00160405280609881526020016200630460989139815260200160405180610120016040528060f181526020016200639c60f1913990526200057590602e90600762001ab4565b50604051806060016040528060405180604001604052806006815260200165506f696e747960d01b815250815260200160405180604001604052806005815260200164467572727960d81b8152508152602001604051806040016040528060058152602001644b6974747960d81b8152508152506035906003620005fb92919062001af9565b50604051806060016040528060405180604001604052806006815260200165285c5f5f2f2960d01b8152508152602001604051806040016040528060068152602001657b5c5f5f2f7d60d01b8152508152602001604051806040016040528060058152602001640bd717cbd760da1b81525081525060389060036200068292919062001af9565b506040805161028081018252600461024082018181526343616c6d60e01b6102608401528252825180840184526007815266141d5e9e9b195960ca1b60208281019190915280840191909152835180850185526005808252644b6974747960d81b828401528486019190915284518086018652600b81526a4d697363686965766f757360a81b8184015260608501528451808601865281815264486170707960d81b8184015260808501528451808601865260098082526810dbdb98d95c9b995960ba1b8285015260a08601919091528551808701875282815264151a5b5a5960da1b8185015260c0860152855180870187528181526810dbdb999a59195b9d60ba1b8185015260e08601528551808701875282815264446572707960d81b818501526101008601528551808701875284815263131bdd5960e21b8185015261012086015285518087018752600c81526b111a5cd85c1c1bda5b9d195960a21b818501526101408601528551808701875293845263536d756760e01b84840152610160850193909352845180860186528381526814dad95c1d1a58d85b60ba1b8184015261018085015284518086018652600a808252694d7973746572696f757360b01b828501526101a086019190915285518087018752828152641498589a5960da1b818501526101c08601528551808701875290815269566963746f72696f757360b01b818401526101e0850152845180860186529283526844657370657261746560b81b83830152610200840192909252835180850190945290835264243ab6b0b760d91b90830152610220810191909152620008e790603b90601262001b3e565b506040805161028081018252600b61024082018181526a282020e280a25fe280a22960a81b610260840152825282518084018452600c8082526b2820e280a2202e20e280a22960a01b60208381019190915280850192909252845180860186528181526b283de280a2e38585e280a22960a01b8184015284860152845180860186528181526b2820e280a2202d20e280a22960a01b8184015260608501528451808601865260068082526528205e5f5e2960d01b8285015260808601919091528551808701875260098082526828e29a865fe29a862960b81b8286015260a0870191909152865180880188528181526828202027202e20272960b81b8186015260c0870152865180880188529081526828cbb52027cf89272960b81b8185015260e086015285518087018752600e81526d2820e280a220e2888720e280a22960901b81850152610100860152855180870187528281526b2820c2b020e296a120c2b02960a01b8185015261012086015285518087018752908152652820545f542960d01b8184015261014085015284518086018652600d8082526c282020e1b594e1b4a5e1b5942960981b8285015261016086019190915285518087018752601081526f282020e280a2cc835fe280a2cc83202960801b81850152610180860152855180870187529182526b2820e29795efbda1e297952960a01b828401526101a0850191909152845180860186529283526ae3839fe2978fcbbee2988960a81b838301526101c084019290925283518085018552601280825271282020e280a2cc80e1b497e280a2cc81202960701b828401526101e0850191909152845180860186528181527128efbda1e280a2cc81e280bfe280a2cc802960701b8184015261020085015284518086019095529184526c2820e0b2a0ca96ccafe0b2a02960981b9084015261022082019290925262000ba691604d919062001b3e565b506040805160a08101825260076060820190815266119bdc9dd85c9960ca1b608083015281528151808301835260038082526250617760e81b602083810191909152808401929092528351808501855260048152634261636b60e01b928101929092529282015262000c1c91605f919062001af9565b506040805160a081018252600660608201818152652f202667743b60d01b608084015282528251808401845260048152632fe381a560e01b602082810191909152808401919091528351808501855291825265099b1d0ec81760d21b908201529181019190915262000c9390606290600362001af9565b5060405180606001604052806040518060400160405280600381526020016217901f60e91b8152508152602001604051806040016040528060048152602001632fe381a560e01b8152508152602001604051806040016040528060038152602001620f081760ea1b815250815250606590600362000d1392919062001af9565b5060408051610e20810182526004610de082018181526301e13f2560e71b610e0084015282528251808401845281815263f09f92a960e01b602082810191909152808401919091528351808501855282815263f09fa7b360e01b81830152838501528351808501855282815263f09f8e8360e01b8183015260608401528351808501855282815263f09fa7b560e01b8183015260808401528351808501855282815263784fd3db60e11b8183015260a08401528351808501855282815263784fd3d360e11b8183015260c08401528351808501855282815263784fd4d960e11b8183015260e08401528351808501855282815263f09f8ea960e01b818301526101008401528351808501855282815263f09f928d60e01b818301526101208401528351808501855282815263f09f90a360e01b8183015261014084015283518085018552828152633c27e42360e21b8183015261016084015283518085018552828152630f09f92960e41b8183015261018084015283518085018552828152631e13f19760e31b818301526101a08401528351808501855282815263f09f8cb960e01b818301526101c0840152835180850185528281526301e13f1b60e71b818301526101e084015283518085018552828152633c27e36160e21b81830152610200840152835180850185528281526301e13f4d60e71b818301526102208401528351808501855282815263784fc64760e11b818301526102408401528351808501855282815263784fc64f60e11b818301526102608401528351808501855282815263f09f8c9f60e01b8183015261028084015283518085018552600780825266f09f8caaefb88f60c81b828401526102a085019190915284518086018652838152631e13f19160e31b818401526102c08501528451808601865260038082526238a6e160ea1b828501526102e08601919091528551808701875284815263f09f94a560e01b8185015261030086015285518087018752848152633c27e3a160e21b818501526103208601528551808701875284815263f09f8d8960e01b818501526103408601528551808701875284815263f09f8d8d60e01b818501526103608601528551808701875284815263784fc6c760e11b818501526103808601528551808701875284815263f09f8d9160e01b818501526103a08601528551808701875284815263784fc6c960e11b818501526103c08601528551808701875284815263784fc6c360e11b818501526103e08601528551808701875284815263784fc6cf60e11b81850152610400860152855180870187528481526301e13f4f60e71b818501526104208601528551808701875284815263f09f8d9560e01b818501526104408601528551808701875284815263784fc65760e11b818501526104608601528551808701875284815263f09f8dbf60e01b818501526104808601528551808701875284815263f09f8d9960e01b818501526104a08601528551808701875284815263f09f8da360e01b818501526104c08601528551808701875284815263f09fa5a160e01b818501526104e08601528551808701875284815263784fc6d360e11b818501526105008601528551808701875284815263784fc6d560e11b818501526105208601528551808701875284815263784fc74160e11b818501526105408601528551808701875284815263f09fa78160e01b8185015261056086015285518087018752848152633c27e36f60e21b818501526105808601528551808701875284815263f09f8db560e01b818501526105a08601528551808701875284815263f09f8db960e01b818501526105c08601528551808701875284815263784fc6dd60e11b818501526105e086015285518087018752848152633c27e96960e21b818501526106008601528551808701875284815263784fd3c560e11b8185015261062086015285518087018752848152631e13f49760e31b818501526106408601528551808701875284815263784fc7c360e11b818501526106608601528551808701875281815262e29abd60e81b818501526106808601528551808701875290815262714d5f60e91b818401526106a0850152845180860186528381526301e13f1f60e71b818401526106c08501528451808601865283815263f09f8f9360e01b818401526106e08501528451808601865283815263f09f8ea360e01b818401526107008501528451808601865283815263f09f8eb160e01b818401526107208501528451808601865283815263784fc75760e11b818401526107408501528451808601865283815263784fc75960e11b818401526107608501528451808601865283815263f09fa7a960e01b8184015261078085015284518086018652838152631e13f1d560e31b818401526107a085015284518086018652838152633c27e3a960e21b818401526107c085015284518086018652838152631e13f1d760e31b818401526107e08501528451808601865283815263f09fa58160e01b8184015261080085015284518086018652838152633c27e3ab60e21b818401526108208501528451808601865283815263f09f8c8b60e01b8184015261084085015284518086018652838152631e13f35360e31b8184015261086085015284518086018652838152631e13f35560e31b8184015261088085015284518086018652838152630f09faa960e41b818401526108a0850152845180860186528381526301e13f3560e71b818401526108c085015284518086018652838152633c27e4a360e21b818401526108e08501528451808601865283815263f09f92a360e01b818401526109008501528451808601865283815263784fca5560e11b818401526109208501528451808601865283815263f09fa7ad60e01b818401526109408501528451808601865281815266f09f9b8eefb88f60c81b81840152610960850152845180860186526006815265e28fb1efb88f60d01b8184015261098085015284518086018652838152631e13f4f560e31b818401526109a08501528451808601865283815263f09f8e8960e01b818401526109c08501528451808601865283815263f09fa7a760e01b818401526109e08501528451808601865283815263f09f8e8160e01b81840152610a008501528451808601865281815266f09f95b9efb88f60c81b81840152610a2085015284518086018652838152631e13f4f760e31b81840152610a408501528451808601865283815263784fc94760e11b81840152610a608501528451808601865283815263f09f93bb60e01b81840152610a808501528451808601865283815263f09f93b160e01b81840152610aa08501528451808601865283815263f09f939f60e01b81840152610ac08501528451808601865283815263f09f92bb60e01b81840152610ae085015284518086018652838152631e13f27760e31b81840152610b008501528451808601865283815263f09f93b960e01b81840152610b208501528451808601865283815263784fca4760e11b81840152610b408501528451808601865283815263f09f92a160e01b81840152610b608501528451808601865283815263784fc7d760e11b81840152610b808501528451808601865283815263f09f939360e01b81840152610ba08501528451808601865283815263784fc9cb60e11b81840152610bc08501528451808601865281815266f09f979eefb88f60c81b81840152610be085015284518086018652838152630f09f92b60e41b81840152610c008501528451808601865283815263f09f92b360e01b81840152610c208501528451808601865283815263784fc9d360e11b81840152610c408501528451808601865281815266f09f9791efb88f60c81b81840152610c608501528451808601865283815263f09f949160e01b81840152610c808501528451808601865290815266f09f9ba1efb88f60c81b81830152610ca08401528351808501855282815263784fd3d960e11b81830152610cc08401528351808501855282815263784fd3d560e11b81830152610ce08401528351808501855282815263f09f928960e01b81830152610d008401528351808501855282815263784fc94560e11b81830152610d208401528351808501855282815263f09fa7b960e01b81830152610d408401528351808501855282815263f09fa7bb60e01b81830152610d608401528351808501855282815263f09fa7af60e01b81830152610d808401528351808501855282815263f09f929d60e01b81830152610da08401528351808501909452908352633c27e52560e21b90830152610dc08101919091526200197090606890606f62001b83565b503480156200197e57600080fd5b50604080518082018252600a81526942617369632042756e7360b01b6020808301918252835180850190945260058452642129a1a12760d91b908401528151919291620019ce9160009162001bc8565b508051620019e490600190602084019062001bc8565b50505062001a01620019fb62001a0760201b60201c565b62001a0b565b62001d0a565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b826009810192821562001aa2579160200282015b8281111562001aa2578251805162001a9191849160209091019062001bc8565b509160200191906001019062001a71565b5062001ab092915062001c53565b5090565b826007810192821562001aa2579160200282015b8281111562001aa2578251805162001ae891849160209091019062001bc8565b509160200191906001019062001ac8565b826003810192821562001aa2579160200282015b8281111562001aa2578251805162001b2d91849160209091019062001bc8565b509160200191906001019062001b0d565b826012810192821562001aa2579160200282015b8281111562001aa2578251805162001b7291849160209091019062001bc8565b509160200191906001019062001b52565b82606f810192821562001aa2579160200282015b8281111562001aa2578251805162001bb791849160209091019062001bc8565b509160200191906001019062001b97565b82805462001bd69062001ccd565b90600052602060002090601f01602090048101928262001bfa576000855562001c45565b82601f1062001c1557805160ff191683800117855562001c45565b8280016001018555821562001c45579182015b8281111562001c4557825182559160200191906001019062001c28565b5062001ab092915062001c74565b8082111562001ab057600062001c6a828262001c8b565b5060010162001c53565b5b8082111562001ab0576000815560010162001c75565b50805462001c999062001ccd565b6000825580601f1062001caa575050565b601f01602090049060005260206000209081019062001cca919062001c74565b50565b600181811c9082168062001ce257607f821691505b6020821081141562001d0457634e487b7160e01b600052602260045260246000fd5b50919050565b6145ea8062001d1a6000396000f3fe6080604052600436106101735760003560e01c8063017043a51461017857806301ffc9a71461018f57806306fdde03146101c457806306ff66b0146101e6578063081812fc14610206578063095ea7b31461023e5780630d3624711461025e5780631249c58b1461027e57806313d78cc91461028657806318160ddd146102a6578063185973b2146102c957806323b872dd146102e95780633ccfd60b1461030957806342842e0e1461031e57806351e5d91d1461033e5780636352211e1461035157806370a0823114610371578063715018a61461039157806380623444146103a65780638da5cb5b146103c657806395d89b41146103db578063a22cb465146103f0578063b88d4fde14610410578063bbbd40fe14610430578063be523f3214610450578063c7876ea414610470578063c87b56dd14610485578063d5abeb01146104a5578063e985e9c5146104ba578063f2fde38b146104da578063f45b537b146104fa578063f8098ec31461051a575b600080fd5b34801561018457600080fd5b5061018d61053a565b005b34801561019b57600080fd5b506101af6101aa366004613928565b6105cf565b60405190151581526020015b60405180910390f35b3480156101d057600080fd5b506101d9610621565b6040516101bb9190613e53565b3480156101f257600080fd5b5061018d610201366004613962565b6106b3565b34801561021257600080fd5b50610226610221366004613962565b6107d9565b6040516001600160a01b0390911681526020016101bb565b34801561024a57600080fd5b5061018d610259366004613850565b610861565b34801561026a57600080fd5b5061018d610279366004613850565b610972565b61018d610adb565b34801561029257600080fd5b5061018d6102a136600461387c565b610bcb565b3480156102b257600080fd5b506102bb610d6a565b6040519081526020016101bb565b3480156102d557600080fd5b5061018d6102e4366004613962565b610d8a565b3480156102f557600080fd5b5061018d610304366004613719565b610dbe565b34801561031557600080fd5b5061018d610def565b34801561032a57600080fd5b5061018d610339366004613719565b610e4a565b61018d61034c366004613962565b610e65565b34801561035d57600080fd5b5061022661036c366004613962565b610f3b565b34801561037d57600080fd5b506102bb61038c3660046136a6565b610fb2565b34801561039d57600080fd5b5061018d611039565b3480156103b257600080fd5b5061018d6103c1366004613962565b611074565b3480156103d257600080fd5b50610226611106565b3480156103e757600080fd5b506101d9611115565b3480156103fc57600080fd5b5061018d61040b36600461381d565b611124565b34801561041c57600080fd5b5061018d61042b36600461375a565b6111e5565b34801561043c57600080fd5b506101d961044b366004613962565b61121d565b34801561045c57600080fd5b506101d961046b366004613962565b611403565b34801561047c57600080fd5b506008546102bb565b34801561049157600080fd5b506101d96104a0366004613962565b611538565b3480156104b157600080fd5b506007546102bb565b3480156104c657600080fd5b506101af6104d53660046136e0565b6119f4565b3480156104e657600080fd5b5061018d6104f53660046136a6565b611a22565b34801561050657600080fd5b50600b54610226906001600160a01b031681565b34801561052657600080fd5b5061018d610535366004613962565b611abf565b33610543611106565b6001600160a01b0316146105725760405162461bcd60e51b815260040161056990613eb8565b60405180910390fd5b61057a610d6a565b60075414156105c25760405162461bcd60e51b815260206004820152601460248201527326b4b73a1034b99030b63932b0b23c9037bb32b960611b6044820152606401610569565b6105ca610d6a565b600755565b60006001600160e01b031982166380ac58cd60e01b148061060057506001600160e01b03198216635b5e139f60e01b145b8061061b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610630906140f9565b80601f016020809104026020016040519081016040528092919081815260200182805461065c906140f9565b80156106a95780601f1061067e576101008083540402835291602001916106a9565b820191906000526020600020905b81548152906001019060200180831161068c57829003601f168201915b5050505050905090565b611144811180156106c6575061115c8111155b6106e25760405162461bcd60e51b815260040161056990613eed565b6106ea610d6a565b6007541161070a5760405162461bcd60e51b815260040161056990613f17565b600b546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561074e57600080fd5b505afa158015610762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078691906136c3565b6001600160a01b0316146107ac5760405162461bcd60e51b815260040161056990613f3d565b6107b8610fd6826140b6565b9050600a5460016107c9919061406b565b600a556107d63382611bc5565b50565b60006107e482611bdf565b6108455760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610569565b506000908152600460205260409020546001600160a01b031690565b600061086c82610f3b565b9050806001600160a01b0316836001600160a01b031614156108da5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610569565b336001600160a01b03821614806108f657506108f681336119f4565b6109635760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610569565b61096d8383611bfc565b505050565b60008111801561098457506101a08111155b6109a05760405162461bcd60e51b815260040161056990613eed565b6109a8610d6a565b600754116109c85760405162461bcd60e51b815260040161056990613f17565b600b546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b158015610a0c57600080fd5b505afa158015610a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4491906136c3565b6001600160a01b031614610abc5760405162461bcd60e51b8152602060048201526044602482018190526000805160206142b1833981519152908201527f2077697468207468697320494420746f2067696674207468697320426173696360648201526310213ab760e11b608482015260a401610569565b600a54610aca90600161406b565b600a55610ad78282611bc5565b5050565b600854341015610afd5760405162461bcd60e51b815260040161056990613fe7565b60095460075411610b465760405162461bcd60e51b8152602060048201526013602482015272283ab13634b19039b0b6329034b99037bb32b960691b6044820152606401610569565b600954610b5490600161406b565b6009819055610b64903390611bc5565b6000610b6e611106565b6001600160a01b03163460405160006040518083038185875af1925050503d8060008114610bb8576040519150601f19603f3d011682016040523d82523d6000602084013e610bbd565b606091505b50509050806107d657600080fd5b610bd3610d6a565b60075411610bf35760405162461bcd60e51b815260040161056990613f17565b60005b8151811015610ad7576000828281518110610c1357610c1361418f565b6020026020010151118015610c4357506101a0828281518110610c3857610c3861418f565b602002602001015111155b610c5f5760405162461bcd60e51b815260040161056990613eed565b600b54825133916001600160a01b031690636352211e90859085908110610c8857610c8861418f565b60200260200101516040518263ffffffff1660e01b8152600401610cae91815260200190565b60206040518083038186803b158015610cc657600080fd5b505afa158015610cda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfe91906136c3565b6001600160a01b031614610d245760405162461bcd60e51b815260040161056990613f3d565b600a54610d3290600161406b565b600a55610d5833838381518110610d4b57610d4b61418f565b6020026020010151611bc5565b80610d6281614134565b915050610bf6565b6000806101a0600954610d7d91906140b6565b600a5461061b919061406b565b33610d93611106565b6001600160a01b031614610db95760405162461bcd60e51b815260040161056990613eb8565b600855565b610dc83382611c6a565b610de45760405162461bcd60e51b815260040161056990613f96565b61096d838383611d2c565b33610df8611106565b6001600160a01b031614610e1e5760405162461bcd60e51b815260040161056990613eb8565b60405133904780156108fc02916000818181858888f193505050501580156107d6573d6000803e3d6000fd5b61096d838383604051806020016040528060008152506111e5565b80600954610e73919061406b565b6007541015610ed35760405162461bcd60e51b815260206004820152602660248201527f52656d61696e696e6720737570706c7920746f6f206c6f7720746f206d756c746044820152651a4b5b5a5b9d60d21b6064820152608401610569565b80600854610ee19190614097565b341015610f005760405162461bcd60e51b815260040161056990613fe7565b60005b81811015610ad757600954610f1990600161406b565b6009819055610f29903390611bc5565b80610f3381614134565b915050610f03565b6000818152600260205260408120546001600160a01b03168061061b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610569565b60006001600160a01b03821661101d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610569565b506001600160a01b031660009081526003602052604090205490565b33611042611106565b6001600160a01b0316146110685760405162461bcd60e51b815260040161056990613eb8565b6110726000611ebc565b565b3361107d611106565b6001600160a01b0316146110a35760405162461bcd60e51b815260040161056990613eb8565b6110ab610d6a565b81101580156110bb575060075481105b6105ca5760405162461bcd60e51b815260206004820152601c60248201527b56616c7565206e6f7420696e20726571756972656420626f756e647360201b6044820152606401610569565b6006546001600160a01b031690565b606060018054610630906140f9565b6001600160a01b0382163314156111795760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610569565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111ef3383611c6a565b61120b5760405162461bcd60e51b815260040161056990613f96565b61121784848484611f0e565b50505050565b6060600061122a83610f3b565b6001600160a01b031614156112995760405162461bcd60e51b815260206004820152602f60248201527f4552433732313a2062756e6e79537472696e6720717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610569565b60006112a483611f41565b90506112d1816101200151604051806040016040528060048152602001634261636b60e01b815250612ed9565b1561132a5760408051808201825260038152620f081760ea1b6020808301919091526101408401829052610180840151925161130f939291016139a7565b60408051601f198184030181529190526101408201526113c9565b61135881610120015160405180604001604052806007815260200166119bdc9dd85c9960ca1b815250612ed9565b1561139557604080518082018252600381526217901f60e91b6020808301919091526101408401829052610180840151925161130f9391016139a7565b8061014001518161018001516040516020016113b29291906139a7565b60408051601f198184030181529190526101408201525b8060c001518161010001518261014001516040516020016113ec93929190613b4a565b604051602081830303815290604052915050919050565b6060600061141083610f3b565b6001600160a01b0316141561147c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a2062756e6e7953564720717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610569565b600061148783611f41565b90506114b4816101200151604051806040016040528060048152602001634261636b60e01b815250612ed9565b156114f1578061018001518161014001516040516020016114d6929190613c59565b60408051601f19818403018152919052610140820152611525565b80610140015181610180015160405160200161150e929190613db5565b60408051601f198184030181529190526101408201525b600061153082612eec565b949350505050565b6060600061154583610f3b565b6001600160a01b031614156115b15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20746f6b656e55524920717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610569565b60006115bc83611f41565b90506115e9816101200151604051806040016040528060048152602001634261636b60e01b815250612ed9565b156116265780610180015181610140015160405160200161160b929190613c59565b60408051601f1981840301815291905261014082015261165a565b806101400151816101800151604051602001611643929190613db5565b60408051601f198184030181529190526101408201525b600061166582612eec565b905061166f6135fb565b6040518060600160405280602281526020016143166022913981526060838101516020808401919091526040805192830190526025808352906145909083013981600260200201528251816003602002018190525060405180606001604052806025815260200161428c60259139608082015261016083015160a08201526040805160608101909152602180825261440b602083013960c082015260a083015160e0820152604080516060810190915260218082526142f5602083013961010082015260e0830151610120820152604080516060810190915260218082526143786020830139610140820152610120830151610160820152604080516060810190915260248082526142d16020830139610180828101919091528301516101a08201526040805180820182526003815262227d5d60e81b6020808301919091526101c0840191909152825181840151838501516060860151608087015160a088015160c089015160e08a015198516000996117ec99909101613a68565b60408051808303601f19018152908290526101008401516101208501516101408601516101608701516101808801516101a08901516101c08a015196985061183997899790602001613a68565b60408051601f198184030181528282526101608701518383019092526005835264243ab6b0b760d91b6020840152925061187291612ed9565b1561187c5761193c565b6118a78460a00151604051806040016040528060058152602001644b6974747960d81b815250612ed9565b80156118d957506118d98460e00151604051806040016040528060058152602001644b6974747960d81b815250612ed9565b156119095760408051808201909152600981526812da5d1d1e4810d85d60ba1b602082015261016085015261193c565b8360e00151846101600151604051602001611925929190613ba6565b60408051601f198184030181529190526101608501525b83610160015161194b87613114565b60405160200161195c929190613b0d565b60408051601f1981840301815291815261016086018290525161198491908390602001613cbb565b60405160208183030381529060405290506119c7816119a285613211565b6040516020016119b3929190613be2565b604051602081830303815290604052613211565b9050806040516020016119da9190613d70565b60408051601f198184030181529190529695505050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b33611a2b611106565b6001600160a01b031614611a515760405162461bcd60e51b815260040161056990613eb8565b6001600160a01b038116611ab65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610569565b6107d681611ebc565b600081118015611ad157506101a08111155b611aed5760405162461bcd60e51b815260040161056990613eed565b611af5610d6a565b60075411611b155760405162461bcd60e51b815260040161056990613f17565b600b546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b158015611b5957600080fd5b505afa158015611b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9191906136c3565b6001600160a01b031614611bb75760405162461bcd60e51b815260040161056990613f3d565b600a546107c990600161406b565b610ad7828260405180602001604052806000815250613376565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c3182610f3b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c7582611bdf565b611cd65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610569565b6000611ce183610f3b565b9050806001600160a01b0316846001600160a01b03161480611d1c5750836001600160a01b0316611d11846107d9565b6001600160a01b0316145b80611530575061153081856119f4565b826001600160a01b0316611d3f82610f3b565b6001600160a01b031614611da95760405162461bcd60e51b815260206004820152602b60248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526a1cc81b9bdd081bdddb995960aa1b6064820152608401610569565b6001600160a01b038216611e0b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610569565b611e16600082611bfc565b6001600160a01b0383166000908152600360205260408120805460019290611e3f9084906140b6565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e6d90849061406b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03868116918217909255915184939187169160008051602061439983398151915291a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611f19848484611d2c565b611f25848484846133a9565b6112175760405162461bcd60e51b815260040161056990613e66565b611f49613623565b611f51613623565b600060098430604051602001611f8892919091825260601b6001600160601b0319166020820152600d60fa1b603482015260350190565b6040516020818303038152906040528051906020012060001c611fab919061414f565b9050600c8160098110611fc057611fc061418f565b018054611fcc906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff8906140f9565b80156120455780601f1061201a57610100808354040283529160200191612045565b820191906000526020600020905b81548152906001019060200180831161202857829003601f168201915b505050918452506015905081600981106120615761206161418f565b01805461206d906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612099906140f9565b80156120e65780601f106120bb576101008083540402835291602001916120e6565b820191906000526020600020905b8154815290600101906020018083116120c957829003601f168201915b50505050508260200181905250601e81600981106121065761210661418f565b018054612112906140f9565b80601f016020809104026020016040519081016040528092919081815260200182805461213e906140f9565b801561218b5780601f106121605761010080835404028352916020019161218b565b820191906000526020600020905b81548152906001019060200180831161216e57829003601f168201915b50505050508260400181905250600784306040516020016121cd92919091825260601b6001600160601b0319166020820152603560f81b603482015260350190565b6040516020818303038152906040528051906020012060001c6121f0919061414f565b9050602781600781106122055761220561418f565b018054612211906140f9565b80601f016020809104026020016040519081016040528092919081815260200182805461223d906140f9565b801561228a5780601f1061225f5761010080835404028352916020019161228a565b820191906000526020600020905b81548152906001019060200180831161226d57829003601f168201915b50505050508260600181905250602e81600781106122aa576122aa61418f565b0180546122b6906140f9565b80601f01602080910402602001604051908101604052809291908181526020018280546122e2906140f9565b801561232f5780601f106123045761010080835404028352916020019161232f565b820191906000526020600020905b81548152906001019060200180831161231257829003601f168201915b505050505082608001819052506007843060405160200161237192919091825260601b6001600160601b0319166020820152603160f81b603482015260350190565b6040516020818303038152906040528051906020012060001c612394919061414f565b9050603560000180546123a6906140f9565b80601f01602080910402602001604051908101604052809291908181526020018280546123d2906140f9565b801561241f5780601f106123f45761010080835404028352916020019161241f565b820191906000526020600020905b81548152906001019060200180831161240257829003601f168201915b505050505060a083015260388054612436906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612462906140f9565b80156124af5780601f10612484576101008083540402835291602001916124af565b820191906000526020600020905b81548152906001019060200180831161249257829003601f168201915b50505050508260c0018190525060058111156125ed57603780546124d2906140f9565b80601f01602080910402602001604051908101604052809291908181526020018280546124fe906140f9565b801561254b5780601f106125205761010080835404028352916020019161254b565b820191906000526020600020905b81548152906001019060200180831161252e57829003601f168201915b505050505060a0830152603a8054612562906140f9565b80601f016020809104026020016040519081016040528092919081815260200182805461258e906140f9565b80156125db5780601f106125b0576101008083540402835291602001916125db565b820191906000526020600020905b8154815290600101906020018083116125be57829003601f168201915b50505050508260c0018190525061271a565b600381111561271a5760368054612603906140f9565b80601f016020809104026020016040519081016040528092919081815260200182805461262f906140f9565b801561267c5780601f106126515761010080835404028352916020019161267c565b820191906000526020600020905b81548152906001019060200180831161265f57829003601f168201915b505050505060a083015260398054612693906140f9565b80601f01602080910402602001604051908101604052809291908181526020018280546126bf906140f9565b801561270c5780601f106126e15761010080835404028352916020019161270c565b820191906000526020600020905b8154815290600101906020018083116126ef57829003601f168201915b50505050508260c001819052505b604051600890600790612749908790309060200191825260601b6001600160601b031916602082015260340190565b6040516020818303038152906040528051906020012060001c61276c919061414f565b91506005821061277e5750601261278a565b6002821061278a5750600d5b8085306040516020016127be92919091825260601b6001600160601b0319166020820152601960f91b603482015260350190565b6040516020818303038152906040528051906020012060001c6127e1919061414f565b9150603b82601281106127f6576127f661418f565b018054612802906140f9565b80601f016020809104026020016040519081016040528092919081815260200182805461282e906140f9565b801561287b5780601f106128505761010080835404028352916020019161287b565b820191906000526020600020905b81548152906001019060200180831161285e57829003601f168201915b50505050508360e00181905250604d826012811061289b5761289b61418f565b0180546128a7906140f9565b80601f01602080910402602001604051908101604052809291908181526020018280546128d3906140f9565b80156129205780601f106128f557610100808354040283529160200191612920565b820191906000526020600020905b81548152906001019060200180831161290357829003601f168201915b5050505050836101000181905250600090506040518060400160405280600581526020016442756e6e7960d81b8152508361016001819052506129848360e0015160405180604001604052806005815260200164243ab6b0b760d91b815250612ed9565b156129b057604080518082019091526005815264243ab6b0b760d91b6020820152610160840152612a03565b6129db8360a00151604051806040016040528060058152602001644b6974747960d81b815250612ed9565b15612a03576040805180820190915260058152644b6974747960d81b60208201526101608401525b60098530604051602001612a3892919091825260601b6001600160601b0319166020820152603360f81b603482015260350190565b6040516020818303038152906040528051906020012060001c612a5b919061414f565b9150605f6000018054612a6d906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612a99906140f9565b8015612ae65780601f10612abb57610100808354040283529160200191612ae6565b820191906000526020600020905b815481529060010190602001808311612ac957829003601f168201915b505050505061012084015260628054612afe906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2a906140f9565b8015612b775780601f10612b4c57610100808354040283529160200191612b77565b820191906000526020600020905b815481529060010190602001808311612b5a57829003601f168201915b505050505083610140018190525060088210612cb75760618054612b9a906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612bc6906140f9565b8015612c135780601f10612be857610100808354040283529160200191612c13565b820191906000526020600020905b815481529060010190602001808311612bf657829003601f168201915b505050505061012084015260648054612c2b906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612c57906140f9565b8015612ca45780601f10612c7957610100808354040283529160200191612ca4565b820191906000526020600020905b815481529060010190602001808311612c8757829003601f168201915b5050505050836101400181905250612de5565b60068210612de55760608054612ccc906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612cf8906140f9565b8015612d455780601f10612d1a57610100808354040283529160200191612d45565b820191906000526020600020905b815481529060010190602001808311612d2857829003601f168201915b505050505061012084015260638054612d5d906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612d89906140f9565b8015612dd65780601f10612dab57610100808354040283529160200191612dd6565b820191906000526020600020905b815481529060010190602001808311612db957829003601f168201915b50505050508361014001819052505b6040516001600160601b03193060601b16602082015260348101869052606f906054016040516020818303038152906040528051906020012060001c612e2b919061414f565b9150606882606f8110612e4057612e4061418f565b018054612e4c906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612e78906140f9565b8015612ec55780601f10612e9a57610100808354040283529160200191612ec5565b820191906000526020600020905b815481529060010190602001808311612ea857829003601f168201915b505050505061018084015250909392505050565b6000612ee583836134b6565b9392505050565b6060612ef661368b565b6040518060a00160405280607d81526020016141e7607d913981526040805160c08101909152609d80825261442c6020830139602082810191909152838101516040808401919091528051808201825260138152723e91b9ba37b8193db9ba37b816b1b7b637b91d60691b8184015260608401528085015160808401528051610100810190915260c780825290916144c99083013960a082015260808381015160c083015260408051918201905260528082526143b9602083013960e082015260c083015161010082015260408051606081019091526028808252614264602083013961012082015261010083015161014082015260408051808201909152601d81527f3c2f746578743e3c7465787420783d273530252720793d27383725273e000000602082015281600b602002015261014083015181600c60200201819052506040518060400160405280600d81526020016c1e17ba32bc3a1f1e17b9bb339f60991b81525081600d600e81106130715761307161418f565b602090810291909101919091528151828201516040808501516060860151608087015160a088015160c089015194516000986130b098979691016139d6565b60408051808303601f190181529082905260e08401516101008501516101208601516101408701516101608801516101808901516101a08a01519698506130fc97899790602001613a68565b60408051601f19818403018152919052949350505050565b6060816131385750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613162578061314c81614134565b915061315b9050600a83614083565b915061313c565b6000816001600160401b0381111561317c5761317c6141a5565b6040519080825280601f01601f1916602001820160405280156131a6576020820181803683370190505b5090505b8415611530576131bb6001836140b6565b91506131c8600a8661414f565b6131d390603061406b565b60f81b8183815181106131e8576131e861418f565b60200101906001600160f81b031916908160001a90535061320a600a86614083565b94506131aa565b805160609080613231575050604080516020810190915260008152919050565b6000600361324083600261406b565b61324a9190614083565b613255906004614097565b9050600061326482602061406b565b6001600160401b0381111561327b5761327b6141a5565b6040519080825280601f01601f1916602001820160405280156132a5576020820181803683370190505b5090506000604051806060016040528060408152602001614338604091399050600181016020830160005b86811015613331576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016132d0565b50600386066001811461334b576002811461335c57613368565b613d3d60f01b600119830152613368565b603d60f81b6000198301525b505050918152949350505050565b61338083836134db565b61338d60008484846133a9565b61096d5760405162461bcd60e51b815260040161056990613e66565b60006001600160a01b0384163b156134ab57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906133ed903390899088908890600401613e16565b602060405180830381600087803b15801561340757600080fd5b505af1925050508015613437575060408051601f3d908101601f1916820190925261343491810190613945565b60015b613491573d808015613465576040519150601f19603f3d011682016040523d82523d6000602084013e61346a565b606091505b5080516134895760405162461bcd60e51b815260040161056990613e66565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611530565b506001949350505050565b600081518351148015612ee55750508051602091820120825192909101919091201490565b6001600160a01b0382166135315760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610569565b61353a81611bdf565b156135865760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610569565b6001600160a01b03821660009081526003602052604081208054600192906135af90849061406b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020614399833981519152908290a45050565b604051806101e00160405280600f905b606081526020019060019003908161360b5790505090565b604051806101a00160405280606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b604080516101c0810190915260608152600d6020820161360b565b6000602082840312156136b857600080fd5b8135612ee5816141bb565b6000602082840312156136d557600080fd5b8151612ee5816141bb565b600080604083850312156136f357600080fd5b82356136fe816141bb565b9150602083013561370e816141bb565b809150509250929050565b60008060006060848603121561372e57600080fd5b8335613739816141bb565b92506020840135613749816141bb565b929592945050506040919091013590565b6000806000806080858703121561377057600080fd5b843561377b816141bb565b935060208581013561378c816141bb565b93506040860135925060608601356001600160401b03808211156137af57600080fd5b818801915088601f8301126137c357600080fd5b8135818111156137d5576137d56141a5565b6137e7601f8201601f1916850161403b565b915080825289848285010111156137fd57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561383057600080fd5b823561383b816141bb565b91506020830135801515811461370e57600080fd5b6000806040838503121561386357600080fd5b823561386e816141bb565b946020939093013593505050565b6000602080838503121561388f57600080fd5b82356001600160401b03808211156138a657600080fd5b818501915085601f8301126138ba57600080fd5b8135818111156138cc576138cc6141a5565b8060051b91506138dd84830161403b565b8181528481019084860184860187018a10156138f857600080fd5b600095505b8386101561391b5780358352600195909501949186019186016138fd565b5098975050505050505050565b60006020828403121561393a57600080fd5b8135612ee5816141d0565b60006020828403121561395757600080fd5b8151612ee5816141d0565b60006020828403121561397457600080fd5b5035919050565b600081518084526139938160208601602086016140cd565b601f01601f19169290920160200192915050565b600083516139b98184602088016140cd565b8351908301906139cd8183602088016140cd565b01949350505050565b6000885160206139e98285838e016140cd565b8951918401916139fc8184848e016140cd565b8951920191613a0e8184848d016140cd565b8851920191613a208184848c016140cd565b8751920191613a328184848b016140cd565b8651920191613a448184848a016140cd565b8551920191613a5681848489016140cd565b919091019a9950505050505050505050565b600089516020613a7b8285838f016140cd565b8a5191840191613a8e8184848f016140cd565b8a51920191613aa08184848e016140cd565b8951920191613ab28184848d016140cd565b8851920191613ac48184848c016140cd565b8751920191613ad68184848b016140cd565b8651920191613ae88184848a016140cd565b8551920191613afa81848489016140cd565b919091019b9a5050505050505050505050565b60008351613b1f8184602088016140cd565b61202360f01b9083019081528351613b3e8160028401602088016140cd565b01600201949350505050565b60008451613b5c8184602089016140cd565b61068560f11b9083018181528551909190613b7e816002850160208a016140cd565b60029201918201528351613b998160048401602088016140cd565b0160040195945050505050565b60008351613bb88184602088016140cd565b600160fd1b9083019081528351613bd68160018401602088016140cd565b01600101949350505050565b60008351613bf48184602088016140cd565b80830190507f2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b62815265185cd94d8d0b60d21b60208201528351613c3e8160268401602088016140cd565b61227d60f01b60269290910191820152602801949350505050565b60008351613c6b8184602088016140cd565b711e3a39b830b71031b630b9b99e93ba3a139f60711b9083019081528351613c9a8160128401602088016140cd565b671e17ba39b830b71f60c11b60129290910191820152601a01949350505050565b683d913730b6b2911d1160b91b81528251600090613ce08160098501602088016140cd565b7f222c20226465736372697074696f6e223a2241206375746520637265617475726009918401918201527f652067656e65726174656420616e642073746f72656420656e746972656c792060298201527737b716b1b430b4b71711161130ba3a3934b13aba32b9911d60411b60498201528351613d648160618401602088016140cd565b01606101949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613da881601d8501602087016140cd565b91909101601d0192915050565b711e3a39b830b71031b630b9b99e93ba3a139f60711b815260008351613de28160128501602088016140cd565b671e17ba39b830b71f60c11b6012918401918201528351613e0a81601a8401602088016140cd565b01601a01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613e499083018461397b565b9695505050505050565b602081526000612ee5602083018461397b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b6020808252600c908201526b26b4b73a1034b99037bb32b960a11b604082015260600190565b60208082526045908201526000805160206142b183398151915260408201527f2077697468207468697320494420746f20636c61696d207468697320426173696060820152643190213ab760d91b608082015260a00190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526034908201527f50617961626c6520616d6f756e7420697320696e636f72726563742c20706c6560408201527361736520636865636b206d696e7420707269636560601b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715614063576140636141a5565b604052919050565b6000821982111561407e5761407e614163565b500190565b60008261409257614092614179565b500490565b60008160001904831182151516156140b1576140b1614163565b500290565b6000828210156140c8576140c8614163565b500390565b60005b838110156140e85781810151838201526020016140d0565b838111156112175750506000910152565b600181811c9082168061410d57607f821691505b6020821081141561412e57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561414857614148614163565b5060010190565b60008261415e5761415e614179565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146107d657600080fd5b6001600160e01b0319811681146107d657600080fdfe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302032303020323030222077696474683d223130302522206865696768743d2231303025223e3c2f746578743e3c7465787420636c6173733d2774742720783d273530252720793d27353625273e227d2c7b2274726169745f74797065223a224372656174757265222c2276616c7565223a22596f75206e65656420746f206f776e2074686520456d6f6a692047617264656e227d2c7b2274726169745f74797065223a22486f6c64696e67222c2276616c7565223a22227d2c7b2274726169745f74797065223a2246616365222c2276616c7565223a225b7b2274726169745f74797065223a225061747465726e222c2276616c7565223a224142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f227d2c7b2274726169745f74797065223a22426f6479222c2276616c7565223a22ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef3c726563742077696474683d273130302527206865696768743d2731303025272066696c6c3d2775726c28236229272f3e3c7465787420636c6173733d2774742720783d273530252720793d27323825273e227d2c7b2274726169745f74797065223a2245617273222c2276616c7565223a223c7374796c653e746578747b666f6e742d73697a653a333270743b666f6e742d66616d696c793a2748656c766574696361204e657565272c417269616c2c73616e732d73657269663b666f6e742d7765696768743a626f6c643b746578742d616e63686f723a6d6964646c657d2e74747b66696c6c3a236666663b77686974652d73706163653a7072657d2373746f70317b73746f702d636f6c6f723a7d3c2f7374796c653e3c646566733e3c6c696e6561724772616469656e742069643d2761272078313d2730272078323d2730272079313d2730272079323d2731273e3c73746f70206f66667365743d2730272069643d2773746f703127202f3e3c73746f70206f66667365743d2731272069643d2773746f703227202f3e3c2f6c696e6561724772616469656e743e3c2f646566733e3c726563742077696474683d273130302527206865696768743d2731303025272066696c6c3d2775726c28236129272f3e227d2c7b2274726169745f74797065223a224261636b64726f70222c2276616c7565223a22a26469706673582212208d99576e558e2ff552d8f84be8a6931316601f1c005d7f19e47b68dc747922e464736f6c634300080700333c7061747465726e2069643d22622220783d2231302220793d223130222077696474683d22323022206865696768743d22323022207061747465726e556e6974733d227573657253706163654f6e557365223e3c636972636c652066696c6c3d2223666666222063783d223130222063793d2231302220723d22313022206f7061636974793d22302e3135222f3e3c2f7061747465726e3e3c7061747465726e2069643d22622220783d22302220793d2230222077696474683d22343222206865696768743d22343222207061747465726e556e6974733d227573657253706163654f6e557365223e3c672066696c6c3d226e6f6e65222066696c6c2d72756c653d226576656e6f6464223e3c672066696c6c3d222366666622206f7061636974793d22302e3135223e3c7061746820643d224d302030683432763434483056307a6d312031683430763230483156317a4d3020323368323076323048305632337a6d323220306832307632304832325632337a222f3e3c2f673e3c2f673e3c2f7061747465726e3e3c7061747465726e2069643d22622220783d22302220793d2230222077696474683d22323422206865696768743d22323422207061747465726e556e6974733d227573657253706163654f6e557365223e3c706f6c79676f6e2066696c6c3d222366666622206f7061636974793d22302e31352220706f696e74733d22323420323420313220323420313820313820323420313220323420302032342030203132203132203020302030203132203620313820313220323420323420323420222f3e3c2f7061747465726e3e3c7061747465726e2069643d22622220783d22302220793d2230222077696474683d22343022206865696768743d22343022207061747465726e556e6974733d227573657253706163654f6e557365223e3c726563742066696c6c3d222366666622206f7061636974793d22302e31352220783d22302220793d2230222077696474683d22323022206865696768743d223230222f3e3c726563742066696c6c3d222366666622206f7061636974793d22302e31352220783d2232302220793d223230222077696474683d22323022206865696768743d223230222f3e3c2f7061747465726e3e3c7061747465726e2069643d22622220783d22302220793d2230222077696474683d22333022206865696768743d22333022207061747465726e556e6974733d227573657253706163654f6e557365223e3c672066696c6c3d222366666622206f7061636974793d222e3135223e3c636972636c652063783d223135222063793d2231352220723d2233222f3e3c636972636c652063793d2233302220723d2233222f3e3c636972636c652063783d223330222063793d2233302220723d2233222f3e3c636972636c652063783d2233302220723d2233222f3e3c636972636c6520723d2233222f3e3c2f673e3c2f7061747465726e3e3c7061747465726e2069643d22622220783d22302220793d2230222077696474683d22313222206865696768743d22313222207061747465726e556e6974733d227573657253706163654f6e557365223e3c706f6c79676f6e2066696c6c3d222366666622206f7061636974793d22302e31352220706f696e74733d2230203020313220302030203132222f3e3c2f7061747465726e3e3c7061747465726e2069643d22622220783d22302220793d2230222077696474683d2231303022206865696768743d22313030223e3c726563742066696c6c3d2223666666222066696c6c2d6f7061636974793d2230222077696474683d2231303022206865696768743d22313030223e3c2f726563743e3c2f7061747465726e3e

Deployed Bytecode

0x6080604052600436106101735760003560e01c8063017043a51461017857806301ffc9a71461018f57806306fdde03146101c457806306ff66b0146101e6578063081812fc14610206578063095ea7b31461023e5780630d3624711461025e5780631249c58b1461027e57806313d78cc91461028657806318160ddd146102a6578063185973b2146102c957806323b872dd146102e95780633ccfd60b1461030957806342842e0e1461031e57806351e5d91d1461033e5780636352211e1461035157806370a0823114610371578063715018a61461039157806380623444146103a65780638da5cb5b146103c657806395d89b41146103db578063a22cb465146103f0578063b88d4fde14610410578063bbbd40fe14610430578063be523f3214610450578063c7876ea414610470578063c87b56dd14610485578063d5abeb01146104a5578063e985e9c5146104ba578063f2fde38b146104da578063f45b537b146104fa578063f8098ec31461051a575b600080fd5b34801561018457600080fd5b5061018d61053a565b005b34801561019b57600080fd5b506101af6101aa366004613928565b6105cf565b60405190151581526020015b60405180910390f35b3480156101d057600080fd5b506101d9610621565b6040516101bb9190613e53565b3480156101f257600080fd5b5061018d610201366004613962565b6106b3565b34801561021257600080fd5b50610226610221366004613962565b6107d9565b6040516001600160a01b0390911681526020016101bb565b34801561024a57600080fd5b5061018d610259366004613850565b610861565b34801561026a57600080fd5b5061018d610279366004613850565b610972565b61018d610adb565b34801561029257600080fd5b5061018d6102a136600461387c565b610bcb565b3480156102b257600080fd5b506102bb610d6a565b6040519081526020016101bb565b3480156102d557600080fd5b5061018d6102e4366004613962565b610d8a565b3480156102f557600080fd5b5061018d610304366004613719565b610dbe565b34801561031557600080fd5b5061018d610def565b34801561032a57600080fd5b5061018d610339366004613719565b610e4a565b61018d61034c366004613962565b610e65565b34801561035d57600080fd5b5061022661036c366004613962565b610f3b565b34801561037d57600080fd5b506102bb61038c3660046136a6565b610fb2565b34801561039d57600080fd5b5061018d611039565b3480156103b257600080fd5b5061018d6103c1366004613962565b611074565b3480156103d257600080fd5b50610226611106565b3480156103e757600080fd5b506101d9611115565b3480156103fc57600080fd5b5061018d61040b36600461381d565b611124565b34801561041c57600080fd5b5061018d61042b36600461375a565b6111e5565b34801561043c57600080fd5b506101d961044b366004613962565b61121d565b34801561045c57600080fd5b506101d961046b366004613962565b611403565b34801561047c57600080fd5b506008546102bb565b34801561049157600080fd5b506101d96104a0366004613962565b611538565b3480156104b157600080fd5b506007546102bb565b3480156104c657600080fd5b506101af6104d53660046136e0565b6119f4565b3480156104e657600080fd5b5061018d6104f53660046136a6565b611a22565b34801561050657600080fd5b50600b54610226906001600160a01b031681565b34801561052657600080fd5b5061018d610535366004613962565b611abf565b33610543611106565b6001600160a01b0316146105725760405162461bcd60e51b815260040161056990613eb8565b60405180910390fd5b61057a610d6a565b60075414156105c25760405162461bcd60e51b815260206004820152601460248201527326b4b73a1034b99030b63932b0b23c9037bb32b960611b6044820152606401610569565b6105ca610d6a565b600755565b60006001600160e01b031982166380ac58cd60e01b148061060057506001600160e01b03198216635b5e139f60e01b145b8061061b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610630906140f9565b80601f016020809104026020016040519081016040528092919081815260200182805461065c906140f9565b80156106a95780601f1061067e576101008083540402835291602001916106a9565b820191906000526020600020905b81548152906001019060200180831161068c57829003601f168201915b5050505050905090565b611144811180156106c6575061115c8111155b6106e25760405162461bcd60e51b815260040161056990613eed565b6106ea610d6a565b6007541161070a5760405162461bcd60e51b815260040161056990613f17565b600b546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561074e57600080fd5b505afa158015610762573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078691906136c3565b6001600160a01b0316146107ac5760405162461bcd60e51b815260040161056990613f3d565b6107b8610fd6826140b6565b9050600a5460016107c9919061406b565b600a556107d63382611bc5565b50565b60006107e482611bdf565b6108455760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610569565b506000908152600460205260409020546001600160a01b031690565b600061086c82610f3b565b9050806001600160a01b0316836001600160a01b031614156108da5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610569565b336001600160a01b03821614806108f657506108f681336119f4565b6109635760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b6064820152608401610569565b61096d8383611bfc565b505050565b60008111801561098457506101a08111155b6109a05760405162461bcd60e51b815260040161056990613eed565b6109a8610d6a565b600754116109c85760405162461bcd60e51b815260040161056990613f17565b600b546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b158015610a0c57600080fd5b505afa158015610a20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4491906136c3565b6001600160a01b031614610abc5760405162461bcd60e51b8152602060048201526044602482018190526000805160206142b1833981519152908201527f2077697468207468697320494420746f2067696674207468697320426173696360648201526310213ab760e11b608482015260a401610569565b600a54610aca90600161406b565b600a55610ad78282611bc5565b5050565b600854341015610afd5760405162461bcd60e51b815260040161056990613fe7565b60095460075411610b465760405162461bcd60e51b8152602060048201526013602482015272283ab13634b19039b0b6329034b99037bb32b960691b6044820152606401610569565b600954610b5490600161406b565b6009819055610b64903390611bc5565b6000610b6e611106565b6001600160a01b03163460405160006040518083038185875af1925050503d8060008114610bb8576040519150601f19603f3d011682016040523d82523d6000602084013e610bbd565b606091505b50509050806107d657600080fd5b610bd3610d6a565b60075411610bf35760405162461bcd60e51b815260040161056990613f17565b60005b8151811015610ad7576000828281518110610c1357610c1361418f565b6020026020010151118015610c4357506101a0828281518110610c3857610c3861418f565b602002602001015111155b610c5f5760405162461bcd60e51b815260040161056990613eed565b600b54825133916001600160a01b031690636352211e90859085908110610c8857610c8861418f565b60200260200101516040518263ffffffff1660e01b8152600401610cae91815260200190565b60206040518083038186803b158015610cc657600080fd5b505afa158015610cda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfe91906136c3565b6001600160a01b031614610d245760405162461bcd60e51b815260040161056990613f3d565b600a54610d3290600161406b565b600a55610d5833838381518110610d4b57610d4b61418f565b6020026020010151611bc5565b80610d6281614134565b915050610bf6565b6000806101a0600954610d7d91906140b6565b600a5461061b919061406b565b33610d93611106565b6001600160a01b031614610db95760405162461bcd60e51b815260040161056990613eb8565b600855565b610dc83382611c6a565b610de45760405162461bcd60e51b815260040161056990613f96565b61096d838383611d2c565b33610df8611106565b6001600160a01b031614610e1e5760405162461bcd60e51b815260040161056990613eb8565b60405133904780156108fc02916000818181858888f193505050501580156107d6573d6000803e3d6000fd5b61096d838383604051806020016040528060008152506111e5565b80600954610e73919061406b565b6007541015610ed35760405162461bcd60e51b815260206004820152602660248201527f52656d61696e696e6720737570706c7920746f6f206c6f7720746f206d756c746044820152651a4b5b5a5b9d60d21b6064820152608401610569565b80600854610ee19190614097565b341015610f005760405162461bcd60e51b815260040161056990613fe7565b60005b81811015610ad757600954610f1990600161406b565b6009819055610f29903390611bc5565b80610f3381614134565b915050610f03565b6000818152600260205260408120546001600160a01b03168061061b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610569565b60006001600160a01b03821661101d5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610569565b506001600160a01b031660009081526003602052604090205490565b33611042611106565b6001600160a01b0316146110685760405162461bcd60e51b815260040161056990613eb8565b6110726000611ebc565b565b3361107d611106565b6001600160a01b0316146110a35760405162461bcd60e51b815260040161056990613eb8565b6110ab610d6a565b81101580156110bb575060075481105b6105ca5760405162461bcd60e51b815260206004820152601c60248201527b56616c7565206e6f7420696e20726571756972656420626f756e647360201b6044820152606401610569565b6006546001600160a01b031690565b606060018054610630906140f9565b6001600160a01b0382163314156111795760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610569565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111ef3383611c6a565b61120b5760405162461bcd60e51b815260040161056990613f96565b61121784848484611f0e565b50505050565b6060600061122a83610f3b565b6001600160a01b031614156112995760405162461bcd60e51b815260206004820152602f60248201527f4552433732313a2062756e6e79537472696e6720717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610569565b60006112a483611f41565b90506112d1816101200151604051806040016040528060048152602001634261636b60e01b815250612ed9565b1561132a5760408051808201825260038152620f081760ea1b6020808301919091526101408401829052610180840151925161130f939291016139a7565b60408051601f198184030181529190526101408201526113c9565b61135881610120015160405180604001604052806007815260200166119bdc9dd85c9960ca1b815250612ed9565b1561139557604080518082018252600381526217901f60e91b6020808301919091526101408401829052610180840151925161130f9391016139a7565b8061014001518161018001516040516020016113b29291906139a7565b60408051601f198184030181529190526101408201525b8060c001518161010001518261014001516040516020016113ec93929190613b4a565b604051602081830303815290604052915050919050565b6060600061141083610f3b565b6001600160a01b0316141561147c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a2062756e6e7953564720717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610569565b600061148783611f41565b90506114b4816101200151604051806040016040528060048152602001634261636b60e01b815250612ed9565b156114f1578061018001518161014001516040516020016114d6929190613c59565b60408051601f19818403018152919052610140820152611525565b80610140015181610180015160405160200161150e929190613db5565b60408051601f198184030181529190526101408201525b600061153082612eec565b949350505050565b6060600061154583610f3b565b6001600160a01b031614156115b15760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20746f6b656e55524920717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610569565b60006115bc83611f41565b90506115e9816101200151604051806040016040528060048152602001634261636b60e01b815250612ed9565b156116265780610180015181610140015160405160200161160b929190613c59565b60408051601f1981840301815291905261014082015261165a565b806101400151816101800151604051602001611643929190613db5565b60408051601f198184030181529190526101408201525b600061166582612eec565b905061166f6135fb565b6040518060600160405280602281526020016143166022913981526060838101516020808401919091526040805192830190526025808352906145909083013981600260200201528251816003602002018190525060405180606001604052806025815260200161428c60259139608082015261016083015160a08201526040805160608101909152602180825261440b602083013960c082015260a083015160e0820152604080516060810190915260218082526142f5602083013961010082015260e0830151610120820152604080516060810190915260218082526143786020830139610140820152610120830151610160820152604080516060810190915260248082526142d16020830139610180828101919091528301516101a08201526040805180820182526003815262227d5d60e81b6020808301919091526101c0840191909152825181840151838501516060860151608087015160a088015160c089015160e08a015198516000996117ec99909101613a68565b60408051808303601f19018152908290526101008401516101208501516101408601516101608701516101808801516101a08901516101c08a015196985061183997899790602001613a68565b60408051601f198184030181528282526101608701518383019092526005835264243ab6b0b760d91b6020840152925061187291612ed9565b1561187c5761193c565b6118a78460a00151604051806040016040528060058152602001644b6974747960d81b815250612ed9565b80156118d957506118d98460e00151604051806040016040528060058152602001644b6974747960d81b815250612ed9565b156119095760408051808201909152600981526812da5d1d1e4810d85d60ba1b602082015261016085015261193c565b8360e00151846101600151604051602001611925929190613ba6565b60408051601f198184030181529190526101608501525b83610160015161194b87613114565b60405160200161195c929190613b0d565b60408051601f1981840301815291815261016086018290525161198491908390602001613cbb565b60405160208183030381529060405290506119c7816119a285613211565b6040516020016119b3929190613be2565b604051602081830303815290604052613211565b9050806040516020016119da9190613d70565b60408051601f198184030181529190529695505050505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b33611a2b611106565b6001600160a01b031614611a515760405162461bcd60e51b815260040161056990613eb8565b6001600160a01b038116611ab65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610569565b6107d681611ebc565b600081118015611ad157506101a08111155b611aed5760405162461bcd60e51b815260040161056990613eed565b611af5610d6a565b60075411611b155760405162461bcd60e51b815260040161056990613f17565b600b546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b158015611b5957600080fd5b505afa158015611b6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9191906136c3565b6001600160a01b031614611bb75760405162461bcd60e51b815260040161056990613f3d565b600a546107c990600161406b565b610ad7828260405180602001604052806000815250613376565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611c3182610f3b565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c7582611bdf565b611cd65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610569565b6000611ce183610f3b565b9050806001600160a01b0316846001600160a01b03161480611d1c5750836001600160a01b0316611d11846107d9565b6001600160a01b0316145b80611530575061153081856119f4565b826001600160a01b0316611d3f82610f3b565b6001600160a01b031614611da95760405162461bcd60e51b815260206004820152602b60248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526a1cc81b9bdd081bdddb995960aa1b6064820152608401610569565b6001600160a01b038216611e0b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610569565b611e16600082611bfc565b6001600160a01b0383166000908152600360205260408120805460019290611e3f9084906140b6565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e6d90849061406b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03868116918217909255915184939187169160008051602061439983398151915291a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611f19848484611d2c565b611f25848484846133a9565b6112175760405162461bcd60e51b815260040161056990613e66565b611f49613623565b611f51613623565b600060098430604051602001611f8892919091825260601b6001600160601b0319166020820152600d60fa1b603482015260350190565b6040516020818303038152906040528051906020012060001c611fab919061414f565b9050600c8160098110611fc057611fc061418f565b018054611fcc906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff8906140f9565b80156120455780601f1061201a57610100808354040283529160200191612045565b820191906000526020600020905b81548152906001019060200180831161202857829003601f168201915b505050918452506015905081600981106120615761206161418f565b01805461206d906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612099906140f9565b80156120e65780601f106120bb576101008083540402835291602001916120e6565b820191906000526020600020905b8154815290600101906020018083116120c957829003601f168201915b50505050508260200181905250601e81600981106121065761210661418f565b018054612112906140f9565b80601f016020809104026020016040519081016040528092919081815260200182805461213e906140f9565b801561218b5780601f106121605761010080835404028352916020019161218b565b820191906000526020600020905b81548152906001019060200180831161216e57829003601f168201915b50505050508260400181905250600784306040516020016121cd92919091825260601b6001600160601b0319166020820152603560f81b603482015260350190565b6040516020818303038152906040528051906020012060001c6121f0919061414f565b9050602781600781106122055761220561418f565b018054612211906140f9565b80601f016020809104026020016040519081016040528092919081815260200182805461223d906140f9565b801561228a5780601f1061225f5761010080835404028352916020019161228a565b820191906000526020600020905b81548152906001019060200180831161226d57829003601f168201915b50505050508260600181905250602e81600781106122aa576122aa61418f565b0180546122b6906140f9565b80601f01602080910402602001604051908101604052809291908181526020018280546122e2906140f9565b801561232f5780601f106123045761010080835404028352916020019161232f565b820191906000526020600020905b81548152906001019060200180831161231257829003601f168201915b505050505082608001819052506007843060405160200161237192919091825260601b6001600160601b0319166020820152603160f81b603482015260350190565b6040516020818303038152906040528051906020012060001c612394919061414f565b9050603560000180546123a6906140f9565b80601f01602080910402602001604051908101604052809291908181526020018280546123d2906140f9565b801561241f5780601f106123f45761010080835404028352916020019161241f565b820191906000526020600020905b81548152906001019060200180831161240257829003601f168201915b505050505060a083015260388054612436906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612462906140f9565b80156124af5780601f10612484576101008083540402835291602001916124af565b820191906000526020600020905b81548152906001019060200180831161249257829003601f168201915b50505050508260c0018190525060058111156125ed57603780546124d2906140f9565b80601f01602080910402602001604051908101604052809291908181526020018280546124fe906140f9565b801561254b5780601f106125205761010080835404028352916020019161254b565b820191906000526020600020905b81548152906001019060200180831161252e57829003601f168201915b505050505060a0830152603a8054612562906140f9565b80601f016020809104026020016040519081016040528092919081815260200182805461258e906140f9565b80156125db5780601f106125b0576101008083540402835291602001916125db565b820191906000526020600020905b8154815290600101906020018083116125be57829003601f168201915b50505050508260c0018190525061271a565b600381111561271a5760368054612603906140f9565b80601f016020809104026020016040519081016040528092919081815260200182805461262f906140f9565b801561267c5780601f106126515761010080835404028352916020019161267c565b820191906000526020600020905b81548152906001019060200180831161265f57829003601f168201915b505050505060a083015260398054612693906140f9565b80601f01602080910402602001604051908101604052809291908181526020018280546126bf906140f9565b801561270c5780601f106126e15761010080835404028352916020019161270c565b820191906000526020600020905b8154815290600101906020018083116126ef57829003601f168201915b50505050508260c001819052505b604051600890600790612749908790309060200191825260601b6001600160601b031916602082015260340190565b6040516020818303038152906040528051906020012060001c61276c919061414f565b91506005821061277e5750601261278a565b6002821061278a5750600d5b8085306040516020016127be92919091825260601b6001600160601b0319166020820152601960f91b603482015260350190565b6040516020818303038152906040528051906020012060001c6127e1919061414f565b9150603b82601281106127f6576127f661418f565b018054612802906140f9565b80601f016020809104026020016040519081016040528092919081815260200182805461282e906140f9565b801561287b5780601f106128505761010080835404028352916020019161287b565b820191906000526020600020905b81548152906001019060200180831161285e57829003601f168201915b50505050508360e00181905250604d826012811061289b5761289b61418f565b0180546128a7906140f9565b80601f01602080910402602001604051908101604052809291908181526020018280546128d3906140f9565b80156129205780601f106128f557610100808354040283529160200191612920565b820191906000526020600020905b81548152906001019060200180831161290357829003601f168201915b5050505050836101000181905250600090506040518060400160405280600581526020016442756e6e7960d81b8152508361016001819052506129848360e0015160405180604001604052806005815260200164243ab6b0b760d91b815250612ed9565b156129b057604080518082019091526005815264243ab6b0b760d91b6020820152610160840152612a03565b6129db8360a00151604051806040016040528060058152602001644b6974747960d81b815250612ed9565b15612a03576040805180820190915260058152644b6974747960d81b60208201526101608401525b60098530604051602001612a3892919091825260601b6001600160601b0319166020820152603360f81b603482015260350190565b6040516020818303038152906040528051906020012060001c612a5b919061414f565b9150605f6000018054612a6d906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612a99906140f9565b8015612ae65780601f10612abb57610100808354040283529160200191612ae6565b820191906000526020600020905b815481529060010190602001808311612ac957829003601f168201915b505050505061012084015260628054612afe906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2a906140f9565b8015612b775780601f10612b4c57610100808354040283529160200191612b77565b820191906000526020600020905b815481529060010190602001808311612b5a57829003601f168201915b505050505083610140018190525060088210612cb75760618054612b9a906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612bc6906140f9565b8015612c135780601f10612be857610100808354040283529160200191612c13565b820191906000526020600020905b815481529060010190602001808311612bf657829003601f168201915b505050505061012084015260648054612c2b906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612c57906140f9565b8015612ca45780601f10612c7957610100808354040283529160200191612ca4565b820191906000526020600020905b815481529060010190602001808311612c8757829003601f168201915b5050505050836101400181905250612de5565b60068210612de55760608054612ccc906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612cf8906140f9565b8015612d455780601f10612d1a57610100808354040283529160200191612d45565b820191906000526020600020905b815481529060010190602001808311612d2857829003601f168201915b505050505061012084015260638054612d5d906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612d89906140f9565b8015612dd65780601f10612dab57610100808354040283529160200191612dd6565b820191906000526020600020905b815481529060010190602001808311612db957829003601f168201915b50505050508361014001819052505b6040516001600160601b03193060601b16602082015260348101869052606f906054016040516020818303038152906040528051906020012060001c612e2b919061414f565b9150606882606f8110612e4057612e4061418f565b018054612e4c906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612e78906140f9565b8015612ec55780601f10612e9a57610100808354040283529160200191612ec5565b820191906000526020600020905b815481529060010190602001808311612ea857829003601f168201915b505050505061018084015250909392505050565b6000612ee583836134b6565b9392505050565b6060612ef661368b565b6040518060a00160405280607d81526020016141e7607d913981526040805160c08101909152609d80825261442c6020830139602082810191909152838101516040808401919091528051808201825260138152723e91b9ba37b8193db9ba37b816b1b7b637b91d60691b8184015260608401528085015160808401528051610100810190915260c780825290916144c99083013960a082015260808381015160c083015260408051918201905260528082526143b9602083013960e082015260c083015161010082015260408051606081019091526028808252614264602083013961012082015261010083015161014082015260408051808201909152601d81527f3c2f746578743e3c7465787420783d273530252720793d27383725273e000000602082015281600b602002015261014083015181600c60200201819052506040518060400160405280600d81526020016c1e17ba32bc3a1f1e17b9bb339f60991b81525081600d600e81106130715761307161418f565b602090810291909101919091528151828201516040808501516060860151608087015160a088015160c089015194516000986130b098979691016139d6565b60408051808303601f190181529082905260e08401516101008501516101208601516101408701516101608801516101808901516101a08a01519698506130fc97899790602001613a68565b60408051601f19818403018152919052949350505050565b6060816131385750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613162578061314c81614134565b915061315b9050600a83614083565b915061313c565b6000816001600160401b0381111561317c5761317c6141a5565b6040519080825280601f01601f1916602001820160405280156131a6576020820181803683370190505b5090505b8415611530576131bb6001836140b6565b91506131c8600a8661414f565b6131d390603061406b565b60f81b8183815181106131e8576131e861418f565b60200101906001600160f81b031916908160001a90535061320a600a86614083565b94506131aa565b805160609080613231575050604080516020810190915260008152919050565b6000600361324083600261406b565b61324a9190614083565b613255906004614097565b9050600061326482602061406b565b6001600160401b0381111561327b5761327b6141a5565b6040519080825280601f01601f1916602001820160405280156132a5576020820181803683370190505b5090506000604051806060016040528060408152602001614338604091399050600181016020830160005b86811015613331576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016132d0565b50600386066001811461334b576002811461335c57613368565b613d3d60f01b600119830152613368565b603d60f81b6000198301525b505050918152949350505050565b61338083836134db565b61338d60008484846133a9565b61096d5760405162461bcd60e51b815260040161056990613e66565b60006001600160a01b0384163b156134ab57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906133ed903390899088908890600401613e16565b602060405180830381600087803b15801561340757600080fd5b505af1925050508015613437575060408051601f3d908101601f1916820190925261343491810190613945565b60015b613491573d808015613465576040519150601f19603f3d011682016040523d82523d6000602084013e61346a565b606091505b5080516134895760405162461bcd60e51b815260040161056990613e66565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611530565b506001949350505050565b600081518351148015612ee55750508051602091820120825192909101919091201490565b6001600160a01b0382166135315760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610569565b61353a81611bdf565b156135865760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b6044820152606401610569565b6001600160a01b03821660009081526003602052604081208054600192906135af90849061406b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020614399833981519152908290a45050565b604051806101e00160405280600f905b606081526020019060019003908161360b5790505090565b604051806101a00160405280606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b604080516101c0810190915260608152600d6020820161360b565b6000602082840312156136b857600080fd5b8135612ee5816141bb565b6000602082840312156136d557600080fd5b8151612ee5816141bb565b600080604083850312156136f357600080fd5b82356136fe816141bb565b9150602083013561370e816141bb565b809150509250929050565b60008060006060848603121561372e57600080fd5b8335613739816141bb565b92506020840135613749816141bb565b929592945050506040919091013590565b6000806000806080858703121561377057600080fd5b843561377b816141bb565b935060208581013561378c816141bb565b93506040860135925060608601356001600160401b03808211156137af57600080fd5b818801915088601f8301126137c357600080fd5b8135818111156137d5576137d56141a5565b6137e7601f8201601f1916850161403b565b915080825289848285010111156137fd57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561383057600080fd5b823561383b816141bb565b91506020830135801515811461370e57600080fd5b6000806040838503121561386357600080fd5b823561386e816141bb565b946020939093013593505050565b6000602080838503121561388f57600080fd5b82356001600160401b03808211156138a657600080fd5b818501915085601f8301126138ba57600080fd5b8135818111156138cc576138cc6141a5565b8060051b91506138dd84830161403b565b8181528481019084860184860187018a10156138f857600080fd5b600095505b8386101561391b5780358352600195909501949186019186016138fd565b5098975050505050505050565b60006020828403121561393a57600080fd5b8135612ee5816141d0565b60006020828403121561395757600080fd5b8151612ee5816141d0565b60006020828403121561397457600080fd5b5035919050565b600081518084526139938160208601602086016140cd565b601f01601f19169290920160200192915050565b600083516139b98184602088016140cd565b8351908301906139cd8183602088016140cd565b01949350505050565b6000885160206139e98285838e016140cd565b8951918401916139fc8184848e016140cd565b8951920191613a0e8184848d016140cd565b8851920191613a208184848c016140cd565b8751920191613a328184848b016140cd565b8651920191613a448184848a016140cd565b8551920191613a5681848489016140cd565b919091019a9950505050505050505050565b600089516020613a7b8285838f016140cd565b8a5191840191613a8e8184848f016140cd565b8a51920191613aa08184848e016140cd565b8951920191613ab28184848d016140cd565b8851920191613ac48184848c016140cd565b8751920191613ad68184848b016140cd565b8651920191613ae88184848a016140cd565b8551920191613afa81848489016140cd565b919091019b9a5050505050505050505050565b60008351613b1f8184602088016140cd565b61202360f01b9083019081528351613b3e8160028401602088016140cd565b01600201949350505050565b60008451613b5c8184602089016140cd565b61068560f11b9083018181528551909190613b7e816002850160208a016140cd565b60029201918201528351613b998160048401602088016140cd565b0160040195945050505050565b60008351613bb88184602088016140cd565b600160fd1b9083019081528351613bd68160018401602088016140cd565b01600101949350505050565b60008351613bf48184602088016140cd565b80830190507f2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b62815265185cd94d8d0b60d21b60208201528351613c3e8160268401602088016140cd565b61227d60f01b60269290910191820152602801949350505050565b60008351613c6b8184602088016140cd565b711e3a39b830b71031b630b9b99e93ba3a139f60711b9083019081528351613c9a8160128401602088016140cd565b671e17ba39b830b71f60c11b60129290910191820152601a01949350505050565b683d913730b6b2911d1160b91b81528251600090613ce08160098501602088016140cd565b7f222c20226465736372697074696f6e223a2241206375746520637265617475726009918401918201527f652067656e65726174656420616e642073746f72656420656e746972656c792060298201527737b716b1b430b4b71711161130ba3a3934b13aba32b9911d60411b60498201528351613d648160618401602088016140cd565b01606101949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613da881601d8501602087016140cd565b91909101601d0192915050565b711e3a39b830b71031b630b9b99e93ba3a139f60711b815260008351613de28160128501602088016140cd565b671e17ba39b830b71f60c11b6012918401918201528351613e0a81601a8401602088016140cd565b01601a01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613e499083018461397b565b9695505050505050565b602081526000612ee5602083018461397b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b6020808252600c908201526b26b4b73a1034b99037bb32b960a11b604082015260600190565b60208082526045908201526000805160206142b183398151915260408201527f2077697468207468697320494420746f20636c61696d207468697320426173696060820152643190213ab760d91b608082015260a00190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526034908201527f50617961626c6520616d6f756e7420697320696e636f72726563742c20706c6560408201527361736520636865636b206d696e7420707269636560601b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715614063576140636141a5565b604052919050565b6000821982111561407e5761407e614163565b500190565b60008261409257614092614179565b500490565b60008160001904831182151516156140b1576140b1614163565b500290565b6000828210156140c8576140c8614163565b500390565b60005b838110156140e85781810151838201526020016140d0565b838111156112175750506000910152565b600181811c9082168061410d57607f821691505b6020821081141561412e57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561414857614148614163565b5060010190565b60008261415e5761415e614179565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146107d657600080fd5b6001600160e01b0319811681146107d657600080fdfe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302032303020323030222077696474683d223130302522206865696768743d2231303025223e3c2f746578743e3c7465787420636c6173733d2774742720783d273530252720793d27353625273e227d2c7b2274726169745f74797065223a224372656174757265222c2276616c7565223a22596f75206e65656420746f206f776e2074686520456d6f6a692047617264656e227d2c7b2274726169745f74797065223a22486f6c64696e67222c2276616c7565223a22227d2c7b2274726169745f74797065223a2246616365222c2276616c7565223a225b7b2274726169745f74797065223a225061747465726e222c2276616c7565223a224142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f227d2c7b2274726169745f74797065223a22426f6479222c2276616c7565223a22ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef3c726563742077696474683d273130302527206865696768743d2731303025272066696c6c3d2775726c28236229272f3e3c7465787420636c6173733d2774742720783d273530252720793d27323825273e227d2c7b2274726169745f74797065223a2245617273222c2276616c7565223a223c7374796c653e746578747b666f6e742d73697a653a333270743b666f6e742d66616d696c793a2748656c766574696361204e657565272c417269616c2c73616e732d73657269663b666f6e742d7765696768743a626f6c643b746578742d616e63686f723a6d6964646c657d2e74747b66696c6c3a236666663b77686974652d73706163653a7072657d2373746f70317b73746f702d636f6c6f723a7d3c2f7374796c653e3c646566733e3c6c696e6561724772616469656e742069643d2761272078313d2730272078323d2730272079313d2730272079323d2731273e3c73746f70206f66667365743d2730272069643d2773746f703127202f3e3c73746f70206f66667365743d2731272069643d2773746f703227202f3e3c2f6c696e6561724772616469656e743e3c2f646566733e3c726563742077696474683d273130302527206865696768743d2731303025272066696c6c3d2775726c28236129272f3e227d2c7b2274726169745f74797065223a224261636b64726f70222c2276616c7565223a22a26469706673582212208d99576e558e2ff552d8f84be8a6931316601f1c005d7f19e47b68dc747922e464736f6c63430008070033

Deployed Bytecode Sourcemap

32067:20463:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51564:176;;;;;;;;;;;;;:::i;:::-;;19897:305;;;;;;;;;;-1:-1:-1;19897:305:0;;;;;:::i;:::-;;:::i;:::-;;;18638:14:1;;18631:22;18613:41;;18601:2;18586:18;19897:305:0;;;;;;;;20842:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49543:506::-;;;;;;;;;;-1:-1:-1;49543:506:0;;;;;:::i;:::-;;:::i;22317:221::-;;;;;;;;;;-1:-1:-1;22317:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;17936:32:1;;;17918:51;;17906:2;17891:18;22317:221:0;17772:203:1;21840:411:0;;;;;;;;;;-1:-1:-1;21840:411:0;;;;;:::i;:::-;;:::i;50061:446::-;;;;;;;;;;-1:-1:-1;50061:446:0;;;;;:::i;:::-;;:::i;48294:378::-;;;:::i;50515:535::-;;;;;;;;;;-1:-1:-1;50515:535:0;;;;;:::i;:::-;;:::i;40050:153::-;;;;;;;;;;;;;:::i;:::-;;;30005:25:1;;;29993:2;29978:18;40050:153:0;29859:177:1;48178:104:0;;;;;;;;;;-1:-1:-1;48178:104:0;;;;;:::i;:::-;;:::i;23207:339::-;;;;;;;;;;-1:-1:-1;23207:339:0;;;;;:::i;:::-;;:::i;51058:108::-;;;;;;;;;;;;;:::i;23617:185::-;;;;;;;;;;-1:-1:-1;23617:185:0;;;;;:::i;:::-;;:::i;48684:416::-;;;;;;:::i;:::-;;:::i;20536:239::-;;;;;;;;;;-1:-1:-1;20536:239:0;;;;;:::i;:::-;;:::i;20266:208::-;;;;;;;;;;-1:-1:-1;20266:208:0;;;;;:::i;:::-;;:::i;7904:94::-;;;;;;;;;;;;;:::i;51368:188::-;;;;;;;;;;-1:-1:-1;51368:188:0;;;;;:::i;:::-;;:::i;7253:87::-;;;;;;;;;;;;;:::i;21011:104::-;;;;;;;;;;;;;:::i;22610:295::-;;;;;;;;;;-1:-1:-1;22610:295:0;;;;;:::i;:::-;;:::i;23873:328::-;;;;;;;;;;-1:-1:-1;23873:328:0;;;;;:::i;:::-;;:::i;44272:802::-;;;;;;;;;;-1:-1:-1;44272:802:0;;;;;:::i;:::-;;:::i;45086:627::-;;;;;;;;;;-1:-1:-1;45086:627:0;;;;;:::i;:::-;;:::i;51273:87::-;;;;;;;;;;-1:-1:-1;51342:10:0;;51273:87;;45721:2445;;;;;;;;;;-1:-1:-1;45721:2445:0;;;;;:::i;:::-;;:::i;51174:87::-;;;;;;;;;;-1:-1:-1;51243:10:0;;51174:87;;22976:164;;;;;;;;;;-1:-1:-1;22976:164:0;;;;;:::i;:::-;;:::i;8153:192::-;;;;;;;;;;-1:-1:-1;8153:192:0;;;;;:::i;:::-;;:::i;32638:114::-;;;;;;;;;;-1:-1:-1;32638:114:0;;;;-1:-1:-1;;;;;32638:114:0;;;49112:419;;;;;;;;;;-1:-1:-1;49112:419:0;;;;;:::i;:::-;;:::i;51564:176::-;6205:10;7473:7;:5;:7::i;:::-;-1:-1:-1;;;;;7473:23:0;;7465:68;;;;-1:-1:-1;;;7465:68:0;;;;;;;:::i;:::-;;;;;;;;;51634:13:::1;:11;:13::i;:::-;51620:10;;:27;;51612:60;;;::::0;-1:-1:-1;;;51612:60:0;;23763:2:1;51612:60:0::1;::::0;::::1;23745:21:1::0;23802:2;23782:18;;;23775:30;-1:-1:-1;;;23821:18:1;;;23814:50;23881:18;;51612:60:0::1;23561:344:1::0;51612:60:0::1;51696:13;:11;:13::i;:::-;51683:10;:26:::0;51564:176::o;19897:305::-;19999:4;-1:-1:-1;;;;;;20036:40:0;;-1:-1:-1;;;20036:40:0;;:105;;-1:-1:-1;;;;;;;20093:48:0;;-1:-1:-1;;;20093:48:0;20036:105;:158;;;-1:-1:-1;;;;;;;;;;18641:40:0;;;20158:36;20016:178;19897:305;-1:-1:-1;;19897:305:0:o;20842:100::-;20896:13;20929:5;20922:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20842:100;:::o;49543:506::-;49630:4;49620:7;:14;:33;;;;;49649:4;49638:7;:15;;49620:33;49612:62;;;;-1:-1:-1;;;49612:62:0;;;;;;;:::i;:::-;49707:13;:11;:13::i;:::-;49694:10;;:26;49686:51;;;;-1:-1:-1;;;49686:51:0;;;;;;;:::i;:::-;49756:19;;:36;;-1:-1:-1;;;49756:36:0;;;;;30005:25:1;;;49796:10:0;;-1:-1:-1;;;;;49756:19:0;;:27;;29978:18:1;;49756:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49756:50:0;;49748:132;;;;-1:-1:-1;;;49748:132:0;;;;;;;:::i;:::-;49901:14;49911:4;49901:7;:14;:::i;:::-;49891:24;;49981:13;;49997:1;49981:17;;;;:::i;:::-;49965:13;:33;50009:32;6205:10;50033:7;50009:9;:32::i;:::-;49543:506;:::o;22317:221::-;22393:7;22421:16;22429:7;22421;:16::i;:::-;22413:73;;;;-1:-1:-1;;;22413:73:0;;25296:2:1;22413:73:0;;;25278:21:1;25335:2;25315:18;;;25308:30;25374:34;25354:18;;;25347:62;-1:-1:-1;;;25425:18:1;;;25418:42;25477:19;;22413:73:0;25094:408:1;22413:73:0;-1:-1:-1;22506:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22506:24:0;;22317:221::o;21840:411::-;21921:13;21937:23;21952:7;21937:14;:23::i;:::-;21921:39;;21985:5;-1:-1:-1;;;;;21979:11:0;:2;-1:-1:-1;;;;;21979:11:0;;;21971:57;;;;-1:-1:-1;;;21971:57:0;;27169:2:1;21971:57:0;;;27151:21:1;27208:2;27188:18;;;27181:30;27247:34;27227:18;;;27220:62;-1:-1:-1;;;27298:18:1;;;27291:31;27339:19;;21971:57:0;26967:397:1;21971:57:0;6205:10;-1:-1:-1;;;;;22063:21:0;;;;:62;;-1:-1:-1;22088:37:0;22105:5;6205:10;22976:164;:::i;22088:37::-;22041:168;;;;-1:-1:-1;;;22041:168:0;;22517:2:1;22041:168:0;;;22499:21:1;22556:2;22536:18;;;22529:30;22595:34;22575:18;;;22568:62;-1:-1:-1;;;22646:18:1;;;22639:54;22710:19;;22041:168:0;22315:420:1;22041:168:0;22222:21;22231:2;22235:7;22222:8;:21::i;:::-;21910:341;21840:411;;:::o;50061:446::-;50161:1;50151:7;:11;:29;;;;;50177:3;50166:7;:14;;50151:29;50143:58;;;;-1:-1:-1;;;50143:58:0;;;;;;;:::i;:::-;50233:13;:11;:13::i;:::-;50220:10;;:26;50212:51;;;;-1:-1:-1;;;50212:51:0;;;;;;;:::i;:::-;50282:19;;:36;;-1:-1:-1;;;50282:36:0;;;;;30005:25:1;;;50322:10:0;;-1:-1:-1;;;;;50282:19:0;;:27;;29978:18:1;;50282:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50282:50:0;;50274:131;;;;-1:-1:-1;;;50274:131:0;;20868:2:1;50274:131:0;;;20850:21:1;20907:2;20887:18;;;20880:30;;;-1:-1:-1;;;;;;;;;;;20926:18:1;;;20919:62;21017:34;20997:18;;;20990:62;-1:-1:-1;;;21068:19:1;;;21061:35;21113:19;;50274:131:0;20666:472:1;50274:131:0;50432:13;;:17;;50448:1;50432:17;:::i;:::-;50416:13;:33;50461:38;50479:9;50491:7;50461:9;:38::i;:::-;50061:446;;:::o;48294:378::-;48358:10;;48345:9;:23;;48337:88;;;;-1:-1:-1;;;48337:88:0;;;;;;;:::i;:::-;48458:9;;48445:10;;:22;48437:54;;;;-1:-1:-1;;;48437:54:0;;28049:2:1;48437:54:0;;;28031:21:1;28088:2;28068:18;;;28061:30;-1:-1:-1;;;28107:18:1;;;28100:49;28166:18;;48437:54:0;27847:343:1;48437:54:0;48514:9;;:13;;48526:1;48514:13;:::i;:::-;48502:9;:25;;;48539:34;;48550:10;;48539:9;:34::i;:::-;48586:12;48603:7;:5;:7::i;:::-;-1:-1:-1;;;;;48603:12:0;48623:9;48603:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48585:52;;;48656:7;48648:16;;;;;50515:535;50612:13;:11;:13::i;:::-;50599:10;;:26;50591:51;;;;-1:-1:-1;;;50591:51:0;;;;;;;:::i;:::-;50658:9;50653:390;50677:8;:15;50673:1;:19;50653:390;;;50736:1;50722:8;50731:1;50722:11;;;;;;;;:::i;:::-;;;;;;;:15;:37;;;;;50756:3;50741:8;50750:1;50741:11;;;;;;;;:::i;:::-;;;;;;;:18;;50722:37;50714:66;;;;-1:-1:-1;;;50714:66:0;;;;;;;:::i;:::-;50803:19;;50831:11;;50847:10;;-1:-1:-1;;;;;50803:19:0;;:27;;50831:8;;50840:1;;50831:11;;;;;;:::i;:::-;;;;;;;50803:40;;;;;;;;;;;;;30005:25:1;;29993:2;29978:18;;29859:177;50803:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50803:54:0;;50795:136;;;;-1:-1:-1;;;50795:136:0;;;;;;;:::i;:::-;50962:13;;:17;;50978:1;50962:17;:::i;:::-;50946:13;:33;50995:36;6205:10;51019:8;51028:1;51019:11;;;;;;;;:::i;:::-;;;;;;;50995:9;:36::i;:::-;50694:3;;;;:::i;:::-;;;;50653:390;;40050:153;40102:7;40123:13;40166:3;40156:9;;:13;;;;:::i;:::-;40139;;:31;;;;:::i;48178:104::-;6205:10;7473:7;:5;:7::i;:::-;-1:-1:-1;;;;;7473:23:0;;7465:68;;;;-1:-1:-1;;;7465:68:0;;;;;;;:::i;:::-;48250:10:::1;:23:::0;48178:104::o;23207:339::-;23402:41;6205:10;23435:7;23402:18;:41::i;:::-;23394:103;;;;-1:-1:-1;;;23394:103:0;;;;;;;:::i;:::-;23510:28;23520:4;23526:2;23530:7;23510:9;:28::i;51058:108::-;6205:10;7473:7;:5;:7::i;:::-;-1:-1:-1;;;;;7473:23:0;;7465:68;;;;-1:-1:-1;;;7465:68:0;;;;;;;:::i;:::-;51107:51:::1;::::0;51115:10:::1;::::0;51136:21:::1;51107:51:::0;::::1;;;::::0;::::1;::::0;;;51136:21;51115:10;51107:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;23617:185:::0;23755:39;23772:4;23778:2;23782:7;23755:39;;;;;;;;;;;;:16;:39::i;48684:416::-;48781:6;48769:9;;:18;;;;:::i;:::-;48754:10;;:34;;48746:85;;;;-1:-1:-1;;;48746:85:0;;24889:2:1;48746:85:0;;;24871:21:1;24928:2;24908:18;;;24901:30;24967:34;24947:18;;;24940:62;-1:-1:-1;;;25018:18:1;;;25011:36;25064:19;;48746:85:0;24687:402:1;48746:85:0;48877:6;48864:10;;:19;;;;:::i;:::-;48850:9;:34;;48842:99;;;;-1:-1:-1;;;48842:99:0;;;;;;;:::i;:::-;48957:9;48953:140;48976:6;48972:1;:10;48953:140;;;49017:9;;:13;;49029:1;49017:13;:::i;:::-;49005:9;:25;;;49046:34;;49057:10;;49046:9;:34::i;:::-;48984:3;;;;:::i;:::-;;;;48953:140;;20536:239;20608:7;20644:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20644:16:0;20679:19;20671:73;;;;-1:-1:-1;;;20671:73:0;;23353:2:1;20671:73:0;;;23335:21:1;23392:2;23372:18;;;23365:30;23431:34;23411:18;;;23404:62;-1:-1:-1;;;23482:18:1;;;23475:39;23531:19;;20671:73:0;23151:405:1;20266:208:0;20338:7;-1:-1:-1;;;;;20366:19:0;;20358:74;;;;-1:-1:-1;;;20358:74:0;;22942:2:1;20358:74:0;;;22924:21:1;22981:2;22961:18;;;22954:30;23020:34;23000:18;;;22993:62;-1:-1:-1;;;23071:18:1;;;23064:40;23121:19;;20358:74:0;22740:406:1;20358:74:0;-1:-1:-1;;;;;;20450:16:0;;;;;:9;:16;;;;;;;20266:208::o;7904:94::-;6205:10;7473:7;:5;:7::i;:::-;-1:-1:-1;;;;;7473:23:0;;7465:68;;;;-1:-1:-1;;;7465:68:0;;;;;;;:::i;:::-;7969:21:::1;7987:1;7969:9;:21::i;:::-;7904:94::o:0;51368:188::-;6205:10;7473:7;:5;:7::i;:::-;-1:-1:-1;;;;;7473:23:0;;7465:68;;;;-1:-1:-1;;;7465:68:0;;;;;;;:::i;:::-;51451:13:::1;:11;:13::i;:::-;51442:5;:22;;:44;;;;;51476:10;;51468:5;:18;51442:44;51434:85;;;::::0;-1:-1:-1;;;51434:85:0;;19328:2:1;51434:85:0::1;::::0;::::1;19310:21:1::0;19367:2;19347:18;;;19340:30;-1:-1:-1;;;19386:18:1;;;19379:58;19454:18;;51434:85:0::1;19126:352:1::0;7253:87:0;7326:6;;-1:-1:-1;;;;;7326:6:0;;7253:87::o;21011:104::-;21067:13;21100:7;21093:14;;;;;:::i;22610:295::-;-1:-1:-1;;;;;22713:24:0;;6205:10;22713:24;;22705:62;;;;-1:-1:-1;;;22705:62:0;;21750:2:1;22705:62:0;;;21732:21:1;21789:2;21769:18;;;21762:30;-1:-1:-1;;;21808:18:1;;;21801:55;21873:18;;22705:62:0;21548:349:1;22705:62:0;6205:10;22780:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;22780:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;22780:53:0;;;;;;;;;;22849:48;;18613:41:1;;;22780:42:0;;6205:10;22849:48;;18586:18:1;22849:48:0;;;;;;;22610:295;;:::o;23873:328::-;24048:41;6205:10;24081:7;24048:18;:41::i;:::-;24040:103;;;;-1:-1:-1;;;24040:103:0;;;;;;;:::i;:::-;24154:39;24168:4;24174:2;24178:7;24187:5;24154:13;:39::i;:::-;23873:328;;;;:::o;44272:802::-;44331:13;44393:1;44365:16;44373:7;44365;:16::i;:::-;-1:-1:-1;;;;;44365:30:0;;;44357:90;;;;-1:-1:-1;;;44357:90:0;;24112:2:1;44357:90:0;;;24094:21:1;24151:2;24131:18;;;24124:30;24190:34;24170:18;;;24163:62;-1:-1:-1;;;24241:18:1;;;24234:45;24296:19;;44357:90:0;23910:411:1;44357:90:0;44460:22;44485:18;44495:7;44485:9;:18::i;:::-;44460:43;;44527:27;44534:5;:12;;;44527:27;;;;;;;;;;;;;-1:-1:-1;;;44527:27:0;;;:6;:27::i;:::-;44524:447;;;44571:26;;;;;;;;;;;-1:-1:-1;;;44571:26:0;;;;;;;;:10;;;:26;;;44650:11;;;;44633:41;;;;44650:11;44571:26;44633:41;;:::i;:::-;;;;-1:-1:-1;;44633:41:0;;;;;;;;;44613:10;;;:62;44524:447;;;44705:30;44712:5;:12;;;44705:30;;;;;;;;;;;;;-1:-1:-1;;;44705:30:0;;;:6;:30::i;:::-;44702:269;;;44753:25;;;;;;;;;;;-1:-1:-1;;;44753:25:0;;;;;;;;:10;;;:25;;;44842:11;;;;44813:41;;;;44842:11;44813:41;;:::i;44702:269::-;44934:5;:10;;;44946:5;:11;;;44917:41;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;44917:41:0;;;;;;;;;44897:10;;;:62;44702:269;45014:5;:10;;;45034:5;:10;;;45054:5;:10;;;44997:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44983:83;;;44272:802;;;:::o;45086:627::-;45142:13;45205:1;45177:16;45185:7;45177;:16::i;:::-;-1:-1:-1;;;;;45177:30:0;;;45169:87;;;;-1:-1:-1;;;45169:87:0;;28815:2:1;45169:87:0;;;28797:21:1;28854:2;28834:18;;;28827:30;28893:34;28873:18;;;28866:62;-1:-1:-1;;;28944:18:1;;;28937:42;28996:19;;45169:87:0;28613:408:1;45169:87:0;45269:22;45294:18;45304:7;45294:9;:18::i;:::-;45269:43;;45336:27;45343:5;:12;;;45336:27;;;;;;;;;;;;;-1:-1:-1;;;45336:27:0;;;:6;:27::i;:::-;45333:293;;;45417:5;:11;;;45452:5;:10;;;45400:75;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;45400:75:0;;;;;;;;;45380:10;;;:96;45333:293;;;45577:5;:10;;;45601:5;:11;;;45538:75;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;45538:75:0;;;;;;;;;45518:10;;;:96;45333:293;45638:20;45661:14;45669:5;45661:7;:14::i;:::-;45638:37;45086:627;-1:-1:-1;;;;45086:627:0:o;45721:2445::-;45786:13;45848:1;45820:16;45828:7;45820;:16::i;:::-;-1:-1:-1;;;;;45820:30:0;;;45812:87;;;;-1:-1:-1;;;45812:87:0;;26756:2:1;45812:87:0;;;26738:21:1;26795:2;26775:18;;;26768:30;26834:34;26814:18;;;26807:62;-1:-1:-1;;;26885:18:1;;;26878:42;26937:19;;45812:87:0;26554:408:1;45812:87:0;45912:22;45937:18;45947:7;45937:9;:18::i;:::-;45912:43;;45981:27;45988:5;:12;;;45981:27;;;;;;;;;;;;;-1:-1:-1;;;45981:27:0;;;:6;:27::i;:::-;45978:293;;;46062:5;:11;;;46097:5;:10;;;46045:75;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;46045:75:0;;;;;;;;;46025:10;;;:96;45978:293;;;46222:5;:10;;;46246:5;:11;;;46183:75;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;46183:75:0;;;;;;;;;46163:10;;;:96;45978:293;46283:20;46306:14;46314:5;46306:7;:14::i;:::-;46283:37;;46342:23;;:::i;:::-;46378:47;;;;;;;;;;;;;;;;;;;46447:18;;;;;46378:8;46436;;;:29;;;;-1:-1:-1;46476:50:0;;;;;;;;;;;;;;;;;:5;46482:1;46476:8;;;:50;46548:19;;46537:5;46543:1;46537:8;;;:30;;;;46578:50;;;;;;;;;;;;;;;;;:8;;;:50;46650:12;;;;46639:8;;;:23;46673:46;;;;;;;;;;;;;;46578:8;46673:46;;;:8;;;:46;46741:11;;;;46730:8;;;:22;46763:46;;;;;;;;;;;;;;46673:8;46763:46;;;:8;;;:46;46831:12;;;;46820:8;;;:23;46854:47;;;;;;;;;;;;;;46763:8;46854:47;;;:9;;;:47;46924:12;;;;46912:9;;;:24;46947:50;;;;;;;;;;;;;;46854:9;46947:50;;;:9;;;;:50;;;;47020:11;;;47008:9;;;:23;47042:17;;;;;;;;;;;-1:-1:-1;;;46947:9:0;47042:17;;;;;;;:9;;;:17;;;;47117:8;;47127;;;;47137;;;;47147;;;;47157;;;;47167;;;;47177;;;;47187;;;;47100:96;;-1:-1:-1;;47100:96:0;;47187:8;;47100:96;;:::i;:::-;;;;;;;-1:-1:-1;;47100:96:0;;;;;;;47247:8;;;;47257;;;;47267:9;;;;47278;;;;47289;;;;47300;;;;47311;;;;47100:96;;-1:-1:-1;47224:97:0;;47100:96;;47311:9;47247:8;47224:97;;:::i;:::-;;;;-1:-1:-1;;47224:97:0;;;;;;;;;47353:12;;;;47346:29;;;;;;;;;-1:-1:-1;;;47224:97:0;47346:29;;;47224:97;-1:-1:-1;47346:29:0;;:6;:29::i;:::-;47343:302;;;;;;47407:27;47414:5;:11;;;47407:27;;;;;;;;;;;;;-1:-1:-1;;;47407:27:0;;;:6;:27::i;:::-;:59;;;;;47438:28;47445:5;:12;;;47438:28;;;;;;;;;;;;;-1:-1:-1;;;47438:28:0;;;:6;:28::i;:::-;47404:241;;;47484:26;;;;;;;;;;;;-1:-1:-1;;;47484:26:0;;;;:12;;;:26;47404:241;;;47596:5;:12;;;47615:5;:12;;;47579:49;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;47579:49:0;;;;;;;;;47557:12;;;:72;47404:241;47696:5;:12;;;47716:17;47725:7;47716:8;:17::i;:::-;47679:55;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;47679:55:0;;;;;;;;;47657:12;;;:78;;;47762:138;;;47679:55;47895:4;;47679:55;47762:138;;:::i;:::-;;;;;;;;;;;;;47748:153;;47919:130;47963:4;48011:28;48031:6;48011:13;:28::i;:::-;47946:100;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47919:13;:130::i;:::-;47912:137;;48126:4;48076:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;48076:55:0;;;;;;;;;;45721:2445;-1:-1:-1;;;;;;45721:2445:0:o;22976:164::-;-1:-1:-1;;;;;23097:25:0;;;23073:4;23097:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;22976:164::o;8153:192::-;6205:10;7473:7;:5;:7::i;:::-;-1:-1:-1;;;;;7473:23:0;;7465:68;;;;-1:-1:-1;;;7465:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8242:22:0;::::1;8234:73;;;::::0;-1:-1:-1;;;8234:73:0;;20104:2:1;8234:73:0::1;::::0;::::1;20086:21:1::0;20143:2;20123:18;;;20116:30;20182:34;20162:18;;;20155:62;-1:-1:-1;;;20233:18:1;;;20226:36;20279:19;;8234:73:0::1;19902:402:1::0;8234:73:0::1;8318:19;8328:8;8318:9;:19::i;49112:419::-:0;49190:1;49180:7;:11;:29;;;;;49206:3;49195:7;:14;;49180:29;49172:58;;;;-1:-1:-1;;;49172:58:0;;;;;;;:::i;:::-;49262:13;:11;:13::i;:::-;49249:10;;:26;49241:51;;;;-1:-1:-1;;;49241:51:0;;;;;;;:::i;:::-;49311:19;;:36;;-1:-1:-1;;;49311:36:0;;;;;30005:25:1;;;49351:10:0;;-1:-1:-1;;;;;49311:19:0;;:27;;29978:18:1;;49311:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;49311:50:0;;49303:132;;;;-1:-1:-1;;;49303:132:0;;;;;;;:::i;:::-;49462:13;;:17;;49478:1;49462:17;:::i;26695:110::-;26771:26;26781:2;26785:7;26771:26;;;;;;;;;;;;:9;:26::i;25711:127::-;25776:4;25800:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25800:16:0;:30;;;25711:127::o;29695:174::-;29770:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29770:29:0;-1:-1:-1;;;;;29770:29:0;;;;;;;;:24;;29824:23;29770:24;29824:14;:23::i;:::-;-1:-1:-1;;;;;29815:46:0;;;;;;;;;;;29695:174;;:::o;26005:348::-;26098:4;26123:16;26131:7;26123;:16::i;:::-;26115:73;;;;-1:-1:-1;;;26115:73:0;;22104:2:1;26115:73:0;;;22086:21:1;22143:2;22123:18;;;22116:30;22182:34;22162:18;;;22155:62;-1:-1:-1;;;22233:18:1;;;22226:42;22285:19;;26115:73:0;21902:408:1;26115:73:0;26199:13;26215:23;26230:7;26215:14;:23::i;:::-;26199:39;;26268:5;-1:-1:-1;;;;;26257:16:0;:7;-1:-1:-1;;;;;26257:16:0;;:51;;;;26301:7;-1:-1:-1;;;;;26277:31:0;:20;26289:7;26277:11;:20::i;:::-;-1:-1:-1;;;;;26277:31:0;;26257:51;:87;;;;26312:32;26329:5;26336:7;26312:16;:32::i;28997:580::-;29156:4;-1:-1:-1;;;;;29129:31:0;:23;29144:7;29129:14;:23::i;:::-;-1:-1:-1;;;;;29129:31:0;;29121:87;;;;-1:-1:-1;;;29121:87:0;;29649:2:1;29121:87:0;;;29631:21:1;29688:2;29668:18;;;29661:30;29727:34;29707:18;;;29700:62;-1:-1:-1;;;29778:18:1;;;29771:41;29829:19;;29121:87:0;29447:407:1;29121:87:0;-1:-1:-1;;;;;29227:16:0;;29219:65;;;;-1:-1:-1;;;29219:65:0;;21345:2:1;29219:65:0;;;21327:21:1;21384:2;21364:18;;;21357:30;21423:34;21403:18;;;21396:62;-1:-1:-1;;;21474:18:1;;;21467:34;21518:19;;29219:65:0;21143:400:1;29219:65:0;29401:29;29418:1;29422:7;29401:8;:29::i;:::-;-1:-1:-1;;;;;29443:15:0;;;;;;:9;:15;;;;;:20;;29462:1;;29443:15;:20;;29462:1;;29443:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29474:13:0;;;;;;:9;:13;;;;;:18;;29491:1;;29474:13;:18;;29491:1;;29474:18;:::i;:::-;;;;-1:-1:-1;;29503:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29503:21:0;-1:-1:-1;;;;;29503:21:0;;;;;;;;;29542:27;;29503:16;;29542:27;;;;-1:-1:-1;;;;;;;;;;;29542:27:0;;28997:580;;;:::o;8353:173::-;8428:6;;;-1:-1:-1;;;;;8445:17:0;;;-1:-1:-1;;;;;;8445:17:0;;;;;;;8478:40;;8428:6;;;8445:17;8428:6;;8478:40;;8409:16;;8478:40;8398:128;8353:173;:::o;25083:315::-;25240:28;25250:4;25256:2;25260:7;25240:9;:28::i;:::-;25287:48;25310:4;25316:2;25320:7;25329:5;25287:22;:48::i;:::-;25279:111;;;;-1:-1:-1;;;25279:111:0;;;;;;;:::i;40215:2546::-;40274:16;;:::i;:::-;40304:22;;:::i;:::-;40378:12;40461:22;40428:7;40445:4;40411:45;;;;;;;;15900:19:1;;;15982:2;15953:15;-1:-1:-1;;;;;;15949:45:1;15944:2;15935:12;;15928:67;-1:-1:-1;;;16020:2:1;16011:12;;16004:25;16054:2;16045:12;;15642:421;40411:45:0;;;;;;;;;;;;;40401:56;;;;;;40393:65;;:90;;;;:::i;:::-;40378:105;;40516:15;40532:4;40516:21;;;;;;;:::i;:::-;;40494:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;40494:43:0;;;-1:-1:-1;40571:16:0;;-1:-1:-1;40588:4:0;40571:22;;;;;;;:::i;:::-;;40548:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:20;;:45;;;;40627:16;40644:4;40627:22;;;;;;;:::i;:::-;;40604:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:20;;:45;;;;40775:21;40742:7;40759:4;40725:45;;;;;;;;17604:19:1;;;17686:2;17657:15;-1:-1:-1;;;;;;17653:45:1;17648:2;17639:12;;17632:67;-1:-1:-1;;;17724:2:1;17715:12;;17708:25;17758:2;17749:12;;17346:421;40725:45:0;;;;;;;;;;;;;40715:56;;;;;;40707:65;;:89;;;;:::i;:::-;40700:96;;40828:14;40843:4;40828:20;;;;;;;:::i;:::-;;40807:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:18;;:41;;;;40878:12;40891:4;40878:18;;;;;;;:::i;:::-;;40859:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:16;;:37;;;;41030:1;40997:7;41014:4;40980:45;;;;;;;;17178:19:1;;;17260:2;17231:15;-1:-1:-1;;;;;;17227:45:1;17222:2;17213:12;;17206:67;-1:-1:-1;;;17298:2:1;17289:12;;17282:25;17332:2;17323:12;;16920:421;40980:45:0;;;;;;;;;;;;;40970:56;;;;;;40962:65;;:69;;;;:::i;:::-;40955:76;-1:-1:-1;41056:7:0;41064:1;41056:10;41042:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41042:11:0;;;:24;41090:5;41077:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:10;;:21;;;;41119:1;41112:4;:8;41109:215;;;41151:10;41137:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41137:11:0;;;:24;41189:8;41176:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:10;;:21;;;;41109:215;;;41234:1;41227:4;:8;41224:100;;;41266:10;41252:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41252:11:0;;;:24;41304:8;41291:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:10;;:21;;;;41224:100;41446:40;;41409:1;;41491;;41446:40;;41463:7;;41480:4;;41446:40;;15508:19:1;;;15590:2;15561:15;-1:-1:-1;;;;;;15557:45:1;15552:2;15543:12;;15536:67;15628:2;15619:12;;15351:286;41446:40:0;;;;;;;;;;;;;41436:51;;;;;;41428:60;;:64;;;;:::i;:::-;41421:71;;41514:1;41506:4;:9;41503:125;;-1:-1:-1;41544:2:0;41503:125;;;41584:1;41576:4;:9;41573:55;;-1:-1:-1;41614:2:0;41573:55;41713:9;41680:7;41697:4;41663:45;;;;;;;;16752:19:1;;;16834:2;16805:15;-1:-1:-1;;;;;;16801:45:1;16796:2;16787:12;;16780:67;-1:-1:-1;;;16872:2:1;16863:12;;16856:25;16906:2;16897:12;;16494:421;41663:45:0;;;;;;;;;;;;;41653:56;;;;;;41645:65;;:77;;;;:::i;:::-;41638:84;;41748:8;41757:4;41748:14;;;;;;;:::i;:::-;;41733:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:12;;:29;;;;41786:6;41793:4;41786:12;;;;;;;:::i;:::-;;41773:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:10;;:25;;;;41809:16;;;41890:22;;;;;;;;;;;;;-1:-1:-1;;;41890:22:0;;;:5;:12;;:22;;;;41926:29;41933:5;:12;;;41926:29;;;;;;;;;;;;;-1:-1:-1;;;41926:29:0;;;:6;:29::i;:::-;41923:179;;;41972:22;;;;;;;;;;;;-1:-1:-1;;;41972:22:0;;;;:12;;;:22;41923:179;;;42024:27;42031:5;:11;;;42024:27;;;;;;;;;;;;;-1:-1:-1;;;42024:27:0;;;:6;:27::i;:::-;42021:81;;;42068:22;;;;;;;;;;;;-1:-1:-1;;;42068:22:0;;;;:12;;;:22;42021:81;42242:1;42209:7;42226:4;42192:45;;;;;;;;16326:19:1;;;16408:2;16379:15;-1:-1:-1;;;;;;16375:45:1;16370:2;16361:12;;16354:67;-1:-1:-1;;;16446:2:1;16437:12;;16430:25;16480:2;16471:12;;16068:421;42192:45:0;;;;;;;;;;;;;42182:56;;;;;;42174:65;;:69;;;;:::i;:::-;42167:76;-1:-1:-1;42269:8:0;42278:1;42269:11;42254:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42254:12:0;;;:26;42304:7;42291:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:10;;:23;;;;42336:1;42328:4;:9;42325:225;;42369:11;42354:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42354:12:0;;;:26;42408:10;42395:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:10;;:23;;;;42325:225;;;42456:1;42448:4;:9;42445:105;;42489:11;42474:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42474:12:0;;;:26;42528:10;42515:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:10;;:23;;;;42445:105;42622:40;;-1:-1:-1;;;;;;42647:4:0;5345:2:1;5316:15;5312:45;42622:40:0;;;5300:58:1;5374:12;;;5367:28;;;42667:14:0;;5411:12:1;;42622:40:0;;;;;;;;;;;;42612:51;;;;;;42604:60;;:77;;;;:::i;:::-;42597:84;;42706:7;42714:4;42706:13;;;;;;;:::i;:::-;;42692:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42692:11:0;;;:27;-1:-1:-1;42692:11:0;;:5;-1:-1:-1;;;40215:2546:0:o;39909:129::-;39981:4;40004:26;40017:1;40027;40004:6;:26::i;:::-;39997:33;39909:129;-1:-1:-1;;;39909:129:0:o;42773:1487::-;42837:13;42864:23;;:::i;:::-;42900:138;;;;;;;;;;;;;;;;;;;43049:170;;;;;;;;;;;;;;42900:8;43049:170;;;:8;;;;:170;;;;43241:20;;;;43230:8;;;;:31;;;;43272:32;;;;;;;;;;-1:-1:-1;;;43272:32:0;;;;:8;;;:32;43326:20;;;;43315:8;;;:31;43357:212;;;;;;;;;;;;;;;;;;;:8;;;:212;43591:16;;;;;43580:8;;;:27;43618:95;;;;;;;;;;;;;43357:8;43618:95;;;:8;;;:95;43735:10;;;;43724:8;;;:21;43756:53;;;;;;;;;;;;;;43618:8;43756:53;;;:8;;;:53;43832:10;;;;43820:9;;;:22;43853:43;;;;;;;;;;;;;43756:8;43853:43;;;43756:5;43859:2;43853:9;;;:43;43919:10;;;;43907:5;43913:2;43907:9;;;:22;;;;43940:27;;;;;;;;;;;;;-1:-1:-1;;;43940:27:0;;;:5;43946:2;43940:9;;;;;;;:::i;:::-;;;;;;;;;:27;;;;44027:8;;44037;;;;44047;;;;;44057;;;;44067;;;;44077;;;;44087;;;;44010:86;;43980:20;;44010:86;;44027:8;44037;44087;44010:86;;:::i;:::-;;;;;;;-1:-1:-1;;44010:86:0;;;;;;;44149:8;;;;44159;;;;44169;;;;44179:9;;;;44190;;;;44201;;;;44212;;;;44010:86;;-1:-1:-1;44124:98:0;;44010:86;;44212:9;44149:8;44124:98;;:::i;:::-;;;;-1:-1:-1;;44124:98:0;;;;;;;;;;42773:1487;-1:-1:-1;;;;42773:1487:0:o;51748:715::-;51804:13;52017:10;52013:53;;-1:-1:-1;;52044:10:0;;;;;;;;;;;;-1:-1:-1;;;52044:10:0;;;;;51748:715::o;52013:53::-;52091:5;52076:12;52132:78;52139:9;;52132:78;;52165:8;;;;:::i;:::-;;-1:-1:-1;52188:10:0;;-1:-1:-1;52196:2:0;52188:10;;:::i;:::-;;;52132:78;;;52220:19;52252:6;-1:-1:-1;;;;;52242:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52242:17:0;;52220:39;;52270:154;52277:10;;52270:154;;52304:11;52314:1;52304:11;;:::i;:::-;;-1:-1:-1;52373:10:0;52381:2;52373:5;:10;:::i;:::-;52360:24;;:2;:24;:::i;:::-;52347:39;;52330:6;52337;52330:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;52330:56:0;;;;;;;;-1:-1:-1;52401:11:0;52410:2;52401:11;;:::i;:::-;;;52270:154;;52881:1607;52979:11;;52939:13;;53005:8;53001:23;;-1:-1:-1;;53015:9:0;;;;;;;;;-1:-1:-1;53015:9:0;;;52881:1607;-1:-1:-1;52881:1607:0:o;53001:23::-;53076:18;53114:1;53103:7;:3;53109:1;53103:7;:::i;:::-;53102:13;;;;:::i;:::-;53097:19;;:1;:19;:::i;:::-;53076:40;-1:-1:-1;53174:19:0;53206:15;53076:40;53219:2;53206:15;:::i;:::-;-1:-1:-1;;;;;53196:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53196:26:0;;53174:48;;53235:18;53256:5;;;;;;;;;;;;;;;;;53235:26;;53325:1;53318:5;53314:13;53370:2;53362:6;53358:15;53421:1;53389:777;53444:3;53441:1;53438:10;53389:777;;;53499:1;53542:12;;;;;53536:19;53637:4;53625:2;53621:14;;;;;53603:40;;53597:47;53746:2;53742:14;;;53738:25;;53724:40;;53718:47;53875:1;53871:13;;;53867:24;;53853:39;;53847:46;53995:16;;;;53981:31;;53975:38;53673:1;53669:11;;;53767:4;53714:58;;;53705:68;53798:11;;53843:57;;;53834:67;;;;53926:11;;53971:49;;53962:59;54050:3;54046:13;54079:22;;54149:1;54134:17;;;;53492:9;53389:777;;;53393:44;54198:1;54193:3;54189:11;54219:1;54214:84;;;;54317:1;54312:82;;;;54182:212;;54214:84;-1:-1:-1;;;;;54247:17:0;;54240:43;54214:84;;54312:82;-1:-1:-1;;;;;54345:17:0;;54338:41;54182:212;-1:-1:-1;;;54410:26:0;;;54417:6;52881:1607;-1:-1:-1;;;;52881:1607:0:o;27032:321::-;27162:18;27168:2;27172:7;27162:5;:18::i;:::-;27213:54;27244:1;27248:2;27252:7;27261:5;27213:22;:54::i;:::-;27191:154;;;;-1:-1:-1;;;27191:154:0;;;;;;;:::i;30434:803::-;30589:4;-1:-1:-1;;;;;30610:13:0;;11039:20;11087:8;30606:624;;30646:72;;-1:-1:-1;;;30646:72:0;;-1:-1:-1;;;;;30646:36:0;;;;;:72;;6205:10;;30697:4;;30703:7;;30712:5;;30646:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30646:72:0;;;;;;;;-1:-1:-1;;30646:72:0;;;;;;;;;;;;:::i;:::-;;;30642:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30892:13:0;;30888:272;;30935:60;;-1:-1:-1;;;30935:60:0;;;;;;;:::i;30888:272::-;31110:6;31104:13;31095:6;31091:2;31087:15;31080:38;30642:533;-1:-1:-1;;;;;;30769:55:0;-1:-1:-1;;;30769:55:0;;-1:-1:-1;30762:62:0;;30606:624;-1:-1:-1;31214:4:0;30434:803;;;;;;:::o;39746:157::-;39816:4;39852:1;:8;39840:1;:8;:20;39839:56;;;;-1:-1:-1;;39882:12:0;;;;;;;39866;;;;;;;;;;:28;;39746:157::o;27689:382::-;-1:-1:-1;;;;;27769:16:0;;27761:61;;;;-1:-1:-1;;;27761:61:0;;24528:2:1;27761:61:0;;;24510:21:1;;;24547:18;;;24540:30;24606:34;24586:18;;;24579:62;24658:18;;27761:61:0;24326:356:1;27761:61:0;27842:16;27850:7;27842;:16::i;:::-;27841:17;27833:58;;;;-1:-1:-1;;;27833:58:0;;20511:2:1;27833:58:0;;;20493:21:1;20550:2;20530:18;;;20523:30;-1:-1:-1;;;20569:18:1;;;20562:58;20637:18;;27833:58:0;20309:352:1;27833:58:0;-1:-1:-1;;;;;27962:13:0;;;;;;:9;:13;;;;;:18;;27979:1;;27962:13;:18;;27979:1;;27962:18;:::i;:::-;;;;-1:-1:-1;;27991:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;27991:21:0;-1:-1:-1;;;;;27991:21:0;;;;;;;;28030:33;;27991:16;;;-1:-1:-1;;;;;;;;;;;28030:33:0;27991:16;;28030:33;27689:382;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;14:247:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:1108::-;1471:6;1479;1487;1495;1548:3;1536:9;1527:7;1523:23;1519:33;1516:53;;;1565:1;1562;1555:12;1516:53;1604:9;1591:23;1623:31;1648:5;1623:31;:::i;:::-;1673:5;-1:-1:-1;1697:2:1;1736:18;;;1723:32;1764:33;1723:32;1764:33;:::i;:::-;1816:7;-1:-1:-1;1870:2:1;1855:18;;1842:32;;-1:-1:-1;1925:2:1;1910:18;;1897:32;-1:-1:-1;;;;;1978:14:1;;;1975:34;;;2005:1;2002;1995:12;1975:34;2043:6;2032:9;2028:22;2018:32;;2088:7;2081:4;2077:2;2073:13;2069:27;2059:55;;2110:1;2107;2100:12;2059:55;2146:2;2133:16;2168:2;2164;2161:10;2158:36;;;2174:18;;:::i;:::-;2216:53;2259:2;2240:13;;-1:-1:-1;;2236:27:1;2232:36;;2216:53;:::i;:::-;2203:66;;2292:2;2285:5;2278:17;2332:7;2327:2;2322;2318;2314:11;2310:20;2307:33;2304:53;;;2353:1;2350;2343:12;2304:53;2408:2;2403;2399;2395:11;2390:2;2383:5;2379:14;2366:45;2452:1;2447:2;2442;2435:5;2431:14;2427:23;2420:34;;2473:5;2463:15;;;;;1376:1108;;;;;;;:::o;2489:416::-;2554:6;2562;2615:2;2603:9;2594:7;2590:23;2586:32;2583:52;;;2631:1;2628;2621:12;2583:52;2670:9;2657:23;2689:31;2714:5;2689:31;:::i;:::-;2739:5;-1:-1:-1;2796:2:1;2781:18;;2768:32;2838:15;;2831:23;2819:36;;2809:64;;2869:1;2866;2859:12;2910:315;2978:6;2986;3039:2;3027:9;3018:7;3014:23;3010:32;3007:52;;;3055:1;3052;3045:12;3007:52;3094:9;3081:23;3113:31;3138:5;3113:31;:::i;:::-;3163:5;3215:2;3200:18;;;;3187:32;;-1:-1:-1;;;2910:315:1:o;3230:957::-;3314:6;3345:2;3388;3376:9;3367:7;3363:23;3359:32;3356:52;;;3404:1;3401;3394:12;3356:52;3431:23;;-1:-1:-1;;;;;3503:14:1;;;3500:34;;;3530:1;3527;3520:12;3500:34;3568:6;3557:9;3553:22;3543:32;;3613:7;3606:4;3602:2;3598:13;3594:27;3584:55;;3635:1;3632;3625:12;3584:55;3671:2;3658:16;3693:2;3689;3686:10;3683:36;;;3699:18;;:::i;:::-;3745:2;3742:1;3738:10;3728:20;;3768:28;3792:2;3788;3784:11;3768:28;:::i;:::-;3830:15;;;3861:12;;;;3893:11;;;3923;;;3919:20;;3916:33;-1:-1:-1;3913:53:1;;;3962:1;3959;3952:12;3913:53;3984:1;3975:10;;3994:163;4008:2;4005:1;4002:9;3994:163;;;4065:17;;4053:30;;4026:1;4019:9;;;;;4103:12;;;;4135;;3994:163;;;-1:-1:-1;4176:5:1;3230:957;-1:-1:-1;;;;;;;;3230:957:1:o;4192:245::-;4250:6;4303:2;4291:9;4282:7;4278:23;4274:32;4271:52;;;4319:1;4316;4309:12;4271:52;4358:9;4345:23;4377:30;4401:5;4377:30;:::i;4442:249::-;4511:6;4564:2;4552:9;4543:7;4539:23;4535:32;4532:52;;;4580:1;4577;4570:12;4532:52;4612:9;4606:16;4631:30;4655:5;4631:30;:::i;4696:180::-;4755:6;4808:2;4796:9;4787:7;4783:23;4779:32;4776:52;;;4824:1;4821;4814:12;4776:52;-1:-1:-1;4847:23:1;;4696:180;-1:-1:-1;4696:180:1:o;4881:257::-;4922:3;4960:5;4954:12;4987:6;4982:3;4975:19;5003:63;5059:6;5052:4;5047:3;5043:14;5036:4;5029:5;5025:16;5003:63;:::i;:::-;5120:2;5099:15;-1:-1:-1;;5095:29:1;5086:39;;;;5127:4;5082:50;;4881:257;-1:-1:-1;;4881:257:1:o;5434:470::-;5613:3;5651:6;5645:13;5667:53;5713:6;5708:3;5701:4;5693:6;5689:17;5667:53;:::i;:::-;5783:13;;5742:16;;;;5805:57;5783:13;5742:16;5839:4;5827:17;;5805:57;:::i;:::-;5878:20;;5434:470;-1:-1:-1;;;;5434:470:1:o;5909:1449::-;6328:3;6366:6;6360:13;6392:4;6405:51;6449:6;6444:3;6439:2;6431:6;6427:15;6405:51;:::i;:::-;6519:13;;6478:16;;;;6541:55;6519:13;6478:16;6563:15;;;6541:55;:::i;:::-;6663:13;;6618:20;;;6685:55;6663:13;6618:20;6707:15;;;6685:55;:::i;:::-;6807:13;;6762:20;;;6829:55;6807:13;6762:20;6851:15;;;6829:55;:::i;:::-;6951:13;;6906:20;;;6973:55;6951:13;6906:20;6995:15;;;6973:55;:::i;:::-;7095:13;;7050:20;;;7117:55;7095:13;7050:20;7139:15;;;7117:55;:::i;:::-;7239:13;;7194:20;;;7261:55;7239:13;7194:20;7283:15;;;7261:55;:::i;:::-;7332:20;;;;;5909:1449;-1:-1:-1;;;;;;;;;;5909:1449:1:o;7363:1641::-;7830:3;7868:6;7862:13;7894:4;7907:51;7951:6;7946:3;7941:2;7933:6;7929:15;7907:51;:::i;:::-;8021:13;;7980:16;;;;8043:55;8021:13;7980:16;8065:15;;;8043:55;:::i;:::-;8165:13;;8120:20;;;8187:55;8165:13;8120:20;8209:15;;;8187:55;:::i;:::-;8309:13;;8264:20;;;8331:55;8309:13;8264:20;8353:15;;;8331:55;:::i;:::-;8453:13;;8408:20;;;8475:55;8453:13;8408:20;8497:15;;;8475:55;:::i;:::-;8597:13;;8552:20;;;8619:55;8597:13;8552:20;8641:15;;;8619:55;:::i;:::-;8741:13;;8696:20;;;8763:55;8741:13;8696:20;8785:15;;;8763:55;:::i;:::-;8885:13;;8840:20;;;8907:55;8885:13;8840:20;8929:15;;;8907:55;:::i;:::-;8978:20;;;;;7363:1641;-1:-1:-1;;;;;;;;;;;7363:1641:1:o;9009:615::-;9289:3;9327:6;9321:13;9343:53;9389:6;9384:3;9377:4;9369:6;9365:17;9343:53;:::i;:::-;-1:-1:-1;;;9418:16:1;;;9443:19;;;9487:13;;9509:65;9487:13;9561:1;9550:13;;9543:4;9531:17;;9509:65;:::i;:::-;9594:20;9616:1;9590:28;;9009:615;-1:-1:-1;;;;9009:615:1:o;9629:971::-;10058:3;10096:6;10090:13;10112:53;10158:6;10153:3;10146:4;10138:6;10134:17;10112:53;:::i;:::-;-1:-1:-1;;;10187:16:1;;;10245:17;;;10287:13;;10187:16;;10222:14;10309:65;10287:13;10361:1;10350:13;;10343:4;10331:17;;10309:65;:::i;:::-;10437:1;10393:20;;10429:10;;;10422:22;10469:13;;10491:62;10469:13;10540:1;10532:10;;10525:4;10513:17;;10491:62;:::i;:::-;10573:17;10592:1;10569:25;;9629:971;-1:-1:-1;;;;;9629:971:1:o;10605:614::-;10885:3;10923:6;10917:13;10939:53;10985:6;10980:3;10973:4;10965:6;10961:17;10939:53;:::i;:::-;-1:-1:-1;;;11014:16:1;;;11039:18;;;11082:13;;11104:65;11082:13;11156:1;11145:13;;11138:4;11126:17;;11104:65;:::i;:::-;11189:20;11211:1;11185:28;;10605:614;-1:-1:-1;;;;10605:614:1:o;11224:888::-;11605:3;11643:6;11637:13;11659:53;11705:6;11700:3;11693:4;11685:6;11681:17;11659:53;:::i;:::-;11743:6;11738:3;11734:16;11721:29;;11773:66;11766:5;11759:81;-1:-1:-1;;;11867:4:1;11860:5;11856:16;11849:34;11914:6;11908:13;11930:66;11987:8;11982:2;11975:5;11971:14;11964:4;11956:6;11952:17;11930:66;:::i;:::-;-1:-1:-1;;;12059:2:1;12015:20;;;;12051:11;;;12044:35;12103:2;12095:11;;11224:888;-1:-1:-1;;;;11224:888:1:o;12117:795::-;12498:3;12536:6;12530:13;12552:53;12598:6;12593:3;12586:4;12578:6;12574:17;12552:53;:::i;:::-;-1:-1:-1;;;12627:16:1;;;12652:35;;;12712:13;;12734:66;12712:13;12786:2;12775:14;;12768:4;12756:17;;12734:66;:::i;:::-;-1:-1:-1;;;12863:2:1;12819:20;;;;12855:11;;;12848:31;12903:2;12895:11;;12117:795;-1:-1:-1;;;;12117:795:1:o;12917:989::-;-1:-1:-1;;;13316:43:1;;13382:13;;13298:3;;13404:61;13382:13;13454:1;13445:11;;13438:4;13426:17;;13404:61;:::i;:::-;13528:66;13524:1;13484:16;;;13516:10;;;13509:86;13624:34;13619:2;13611:11;;13604:55;-1:-1:-1;;;13683:2:1;13675:11;;13668:80;13773:13;;13795:63;13773:13;13844:2;13836:11;;13829:4;13817:17;;13795:63;:::i;:::-;13878:17;13897:2;13874:26;;12917:989;-1:-1:-1;;;;12917:989:1:o;13911:448::-;14173:31;14168:3;14161:44;14143:3;14234:6;14228:13;14250:62;14305:6;14300:2;14295:3;14291:12;14284:4;14276:6;14272:17;14250:62;:::i;:::-;14332:16;;;;14350:2;14328:25;;13911:448;-1:-1:-1;;13911:448:1:o;14574:772::-;-1:-1:-1;;;14980:3:1;14973:33;14955:3;15035:6;15029:13;15051:62;15106:6;15101:2;15096:3;15092:12;15085:4;15077:6;15073:17;15051:62;:::i;:::-;-1:-1:-1;;;15172:2:1;15132:16;;;15164:11;;;15157:31;15213:13;;15235:63;15213:13;15284:2;15276:11;;15269:4;15257:17;;15235:63;:::i;:::-;15318:17;15337:2;15314:26;;14574:772;-1:-1:-1;;;;14574:772:1:o;17980:488::-;-1:-1:-1;;;;;18249:15:1;;;18231:34;;18301:15;;18296:2;18281:18;;18274:43;18348:2;18333:18;;18326:34;;;18396:3;18391:2;18376:18;;18369:31;;;18174:4;;18417:45;;18442:19;;18434:6;18417:45;:::i;:::-;18409:53;17980:488;-1:-1:-1;;;;;;17980:488:1:o;18902:219::-;19051:2;19040:9;19033:21;19014:4;19071:44;19111:2;19100:9;19096:18;19088:6;19071:44;:::i;19483:414::-;19685:2;19667:21;;;19724:2;19704:18;;;19697:30;19763:34;19758:2;19743:18;;19736:62;-1:-1:-1;;;19829:2:1;19814:18;;19807:48;19887:3;19872:19;;19483:414::o;25507:356::-;25709:2;25691:21;;;25728:18;;;25721:30;25787:34;25782:2;25767:18;;25760:62;25854:2;25839:18;;25507:356::o;25868:340::-;26070:2;26052:21;;;26109:2;26089:18;;;26082:30;-1:-1:-1;;;26143:2:1;26128:18;;26121:46;26199:2;26184:18;;25868:340::o;26213:336::-;26415:2;26397:21;;;26454:2;26434:18;;;26427:30;-1:-1:-1;;;26488:2:1;26473:18;;26466:42;26540:2;26525:18;;26213:336::o;27369:473::-;27571:2;27553:21;;;27610:2;27590:18;;;27583:30;-1:-1:-1;;;;;;;;;;;27644:2:1;27629:18;;27622:62;27720:34;27715:2;27700:18;;27693:62;-1:-1:-1;;;27786:3:1;27771:19;;27764:36;27832:3;27817:19;;27369:473::o;28195:413::-;28397:2;28379:21;;;28436:2;28416:18;;;28409:30;28475:34;28470:2;28455:18;;28448:62;-1:-1:-1;;;28541:2:1;28526:18;;28519:47;28598:3;28583:19;;28195:413::o;29026:416::-;29228:2;29210:21;;;29267:2;29247:18;;;29240:30;29306:34;29301:2;29286:18;;29279:62;-1:-1:-1;;;29372:2:1;29357:18;;29350:50;29432:3;29417:19;;29026:416::o;30041:275::-;30112:2;30106:9;30177:2;30158:13;;-1:-1:-1;;30154:27:1;30142:40;;-1:-1:-1;;;;;30197:34:1;;30233:22;;;30194:62;30191:88;;;30259:18;;:::i;:::-;30295:2;30288:22;30041:275;;-1:-1:-1;30041:275:1:o;30321:128::-;30361:3;30392:1;30388:6;30385:1;30382:13;30379:39;;;30398:18;;:::i;:::-;-1:-1:-1;30434:9:1;;30321:128::o;30454:120::-;30494:1;30520;30510:35;;30525:18;;:::i;:::-;-1:-1:-1;30559:9:1;;30454:120::o;30579:168::-;30619:7;30685:1;30681;30677:6;30673:14;30670:1;30667:21;30662:1;30655:9;30648:17;30644:45;30641:71;;;30692:18;;:::i;:::-;-1:-1:-1;30732:9:1;;30579:168::o;30752:125::-;30792:4;30820:1;30817;30814:8;30811:34;;;30825:18;;:::i;:::-;-1:-1:-1;30862:9:1;;30752:125::o;30882:258::-;30954:1;30964:113;30978:6;30975:1;30972:13;30964:113;;;31054:11;;;31048:18;31035:11;;;31028:39;31000:2;30993:10;30964:113;;;31095:6;31092:1;31089:13;31086:48;;;-1:-1:-1;;31130:1:1;31112:16;;31105:27;30882:258::o;31145:380::-;31224:1;31220:12;;;;31267;;;31288:61;;31342:4;31334:6;31330:17;31320:27;;31288:61;31395:2;31387:6;31384:14;31364:18;31361:38;31358:161;;;31441:10;31436:3;31432:20;31429:1;31422:31;31476:4;31473:1;31466:15;31504:4;31501:1;31494:15;31358:161;;31145:380;;;:::o;31530:135::-;31569:3;-1:-1:-1;;31590:17:1;;31587:43;;;31610:18;;:::i;:::-;-1:-1:-1;31657:1:1;31646:13;;31530:135::o;31670:112::-;31702:1;31728;31718:35;;31733:18;;:::i;:::-;-1:-1:-1;31767:9:1;;31670:112::o;31787:127::-;31848:10;31843:3;31839:20;31836:1;31829:31;31879:4;31876:1;31869:15;31903:4;31900:1;31893:15;31919:127;31980:10;31975:3;31971:20;31968:1;31961:31;32011:4;32008:1;32001:15;32035:4;32032:1;32025:15;32051:127;32112:10;32107:3;32103:20;32100:1;32093:31;32143:4;32140:1;32133:15;32167:4;32164:1;32157:15;32183:127;32244:10;32239:3;32235:20;32232:1;32225:31;32275:4;32272:1;32265:15;32299:4;32296:1;32289:15;32315:131;-1:-1:-1;;;;;32390:31:1;;32380:42;;32370:70;;32436:1;32433;32426:12;32451:131;-1:-1:-1;;;;;;32525:32:1;;32515:43;;32505:71;;32572:1;32569;32562:12

Swarm Source

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