ETH Price: $3,337.23 (-4.09%)

Token

BillionaireSkullClub (BSC)
 

Overview

Max Total Supply

0 BSC

Holders

1,754

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 BSC
0x29c9e0c4ca8ecc4b5a74f1261eb76d934ae6c460
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:
BillionaireSkullClub

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-13
*/

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                           @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                           @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@@@@@@        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@        @@@@@@@@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@@@@@@        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@        @@@@@@@@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@     XXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXX     @@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@     XXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXX     @@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@     XXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXX     @@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@     XXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXX     @@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@     XXXXX@@@@@                 @@@@@@@@@@@@@@@@@@@@@@@@@@@                 @@@@@XXXXX     @@@@@@@@@@@\\
//@@@@@@@@@@@     XXXXX@@@@@                 @@@@@@@@@@@@@@@@@@@@@@@@@@@                 @@@@@XXXXX     @@@@@@@@@@@\\
//@@@@@@@@@@@     XXXXX                           XXXXX@@@@@@@XXXXX                           XXXXX     @@@@@@@@@@@\\
//@@@@@@     XXXXX@@@@@         $$$$$$$$$         XXXXX@@@@@@@XXXXX         $$$$$$$$$         @@@@@XXXXX     @@@@@@\\
//@@@@@@     XXXXX@@@@@         $$$$$$$$$         XXXXX@@@@@@@XXXXX         $$$$$$$$$         @@@@@XXXXX     @@@@@@\\
//@@@@@@     XXXXX@@@@@         $$$$$$$$$         XXXXX@@@@@@@XXXXX         $$$$$$$$$         @@@@@XXXXX     @@@@@@\\
//@@@@@@     XXXXX@@@@@         $$$$$$$$$         XXXXX@@@@@@@XXXXX         $$$$$$$$$         @@@@@XXXXX     @@@@@@\\
//@@@@@@     XXXXX@@@@@                           XXXXX@@@@@@@XXXXX                           @@@@@XXXXX     @@@@@@\\
//@@@@@@     XXXXX@@@@@@@@@@                 XXXXX@@@@@@@@@@@@@@@@@XXXXX                 @@@@@@@@@@XXXXX     @@@@@@\\
//@@@@@@     XXXXX@@@@@@@@@@                 XXXXX@@@@@@@@@@@@@@@@@XXXXX                 @@@@@@@@@@XXXXX     @@@@@@\\
//@@@@@@@@@@@     @@@@@@@@@@XXXXXXXXXXXXXXXXX@@@@@@@@@@       @@@@@@@@@@XXXXXXXXXXXXXXXXX@@@@@@@@@@     @@@@@@@@@@@\\
//@@@@@@@@@@@     @@@@@@@@@@XXXXXXXXXXXXXXXXX@@@@@@@@@@       @@@@@@@@@@XXXXXXXXXXXXXXXXX@@@@@@@@@@     @@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@@@@@@                 @@@@@@@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@@@@@@@@@@@@                 @@@@@@@@@@@@@@@@@@@@@@@@@@@     @@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@     XXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXX     @@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@     XXXXX@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@XXXXX     @@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@     XXXXX@@@@@@@@@@@      @@@@@@@@@@@@@@@@@@      @@@@@@@@@@XXXXX     @@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@     XXXXX@@@@@@@@@@@      @@@@@@@@@@@@@@@@@@      @@@@@@@@@@XXXXX     @@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@     XXXXX@@@@@@@@@@@      @@@@@@@@@@@@@@@@@@      @@@@@@@@@@XXXXX     @@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@     XXXXX@@@@@@@@@@@      @@@@@@@@@@@@@@@@@@      @@@@@@@@@@XXXXX     @@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@     XXXXX@@@@@@@@@@@      @@@@@@@@@@@@@@@@@@      @@@@@@@@@@XXXXX     @@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@@@@@@     @@@@@@     @@@@@@     @@@@@@@@     @@@@@@     @@@@@     @@@@@@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@@@@@@     @@@@@@     @@@@@@     @@@@@@@@     @@@@@@     @@@@@     @@@@@@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                                   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@ *-------------------------------------------------------------------------------------* @@@@@@@@@@@@\\
//@@@@@@@@@@@@ |  $$$$$$   $$$$  $$    $$    $$$$    $$$    $$$   $$    $$$    $$$$  $$$$$    $$$$$  | @@@@@@@@@@@@\\
//@@@@@@@@@@@@ |  $$    $$  $$   $$    $$     $$   $$   $$  $$$$  $$  $$   $$   $$   $$   $$  $$     | @@@@@@@@@@@@\\
//@@@@@@@@@@@@ |  $$$$$$    $$   $$    $$     $$   $$   $$  $$  $$$$  $$   $$   $$   $$   $$  $$$$   | @@@@@@@@@@@@\\
//@@@@@@@@@@@@ |  $$    $$  $$   $$    $$     $$   $$   $$  $$   $$$  $$$$$$$   $$   $$$$$    $$     | @@@@@@@@@@@@\\
//@@@@@@@@@@@@ |  $$$$$$$  $$$$  $$$$$ $$$$$ $$$$    $$$    $$    $$  $$   $$  $$$$  $$   $$  $$$$$  | @@@@@@@@@@@@\\
//@@@@@@@@@@@@ |                                                                                     | @@@@@@@@@@@@\\
//@@@@@@@@@@@@ |       $$$$$  $$   $$  $$   $$  $$    $$          $$$$  $$    $$   $$  $$$$$$        | @@@@@@@@@@@@\\
//@@@@@@@@@@@@ |      $$      $$ $$    $$   $$  $$    $$        $$      $$    $$   $$  $$    $$      | @@@@@@@@@@@@\\
//@@@@@@@@@@@@ |        $$    $$$      $$   $$  $$    $$        $$      $$    $$   $$  $$$$$$        | @@@@@@@@@@@@\\
//@@@@@@@@@@@@ |          $$  $$ $$    $$   $$  $$    $$        $$      $$    $$   $$  $$    $$      | @@@@@@@@@@@@\\
//@@@@@@@@@@@@ |      $$$$$   $$   $$    $$$    $$$$$ $$$$$       $$$$  $$$$$   $$$    $$$$$$$       | @@@@@@@@@@@@\\
//@@@@@@@@@@@@ *-------------------------------------------------------------------------------------* @@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\\
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\\

// SPDX-License-Identifier: BUSL-1.1
// File: contracts/interfaces/ILayerZeroUserApplicationConfig.sol
pragma solidity >=0.5.0;

interface ILayerZeroUserApplicationConfig {
    // @notice set the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(
        uint16 _version,
        uint16 _chainId,
        uint256 _configType,
        bytes calldata _config
    ) external;

    // @notice set the send() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress)
        external;
}

// File: contracts/interfaces/ILayerZeroEndpoint.sol

pragma solidity >=0.5.0;

interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
    // @param _dstChainId - the destination chain identifier
    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
    // @param _payload - a custom bytes payload to send to the destination contract
    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
    function send(
        uint16 _dstChainId,
        bytes calldata _destination,
        bytes calldata _payload,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes calldata _adapterParams
    ) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source contract (as bytes) at the source chain
    // @param _dstAddress - the address on destination chain
    // @param _nonce - the unbound message ordering nonce
    // @param _gasLimit - the gas limit for external contract execution
    // @param _payload - verified payload to send to the destination contract
    function receivePayload(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        address _dstAddress,
        uint64 _nonce,
        uint256 _gasLimit,
        bytes calldata _payload
    ) external;

    // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress)
        external
        view
        returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param _srcAddress - the source chain contract address
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress)
        external
        view
        returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param _dstChainId - the destination chain identifier
    // @param _userApplication - the user app address on this EVM chain
    // @param _payload - the custom message to send over LayerZero
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(
        uint16 _dstChainId,
        address _userApplication,
        bytes calldata _payload,
        bool _payInZRO,
        bytes calldata _adapterParam
    ) external view returns (uint256 nativeFee, uint256 zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    // @param _payload - the payload to be retried
    function retryPayload(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        bytes calldata _payload
    ) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress)
        external
        view
        returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getSendLibraryAddress(address _userApplication)
        external
        view
        returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getReceiveLibraryAddress(address _userApplication)
        external
        view
        returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _userApplication - the contract address of the user application
    // @param _configType - type of configuration. every messaging library has its own convention.
    function getConfig(
        uint16 _version,
        uint16 _chainId,
        address _userApplication,
        uint256 _configType
    ) external view returns (bytes memory);

    // @notice get the send() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getSendVersion(address _userApplication)
        external
        view
        returns (uint16);

    // @notice get the lzReceive() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getReceiveVersion(address _userApplication)
        external
        view
        returns (uint16);
}

// File: contracts/interfaces/ILayerZeroReceiver.sol

pragma solidity >=0.5.0;

interface ILayerZeroReceiver {
    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(
        uint16 _srcChainId,
        bytes calldata _srcAddress,
        uint64 _nonce,
        bytes calldata _payload
    ) external;
}
// File: @openzeppelin/contracts/utils/Strings.sol

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(_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");

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

// File: contracts/NonblockingReceiver.sol

pragma solidity ^0.8.6;

abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver {
    ILayerZeroEndpoint internal endpoint;

    struct FailedMessages {
        uint256 payloadLength;
        bytes32 payloadHash;
    }

    mapping(uint16 => mapping(bytes => mapping(uint256 => FailedMessages)))
        public failedMessages;
    mapping(uint16 => bytes) public trustedRemoteLookup;

    event MessageFailed(
        uint16 _srcChainId,
        bytes _srcAddress,
        uint64 _nonce,
        bytes _payload
    );

    function lzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) external override {
        require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security
        require(
            _srcAddress.length == trustedRemoteLookup[_srcChainId].length &&
                keccak256(_srcAddress) ==
                keccak256(trustedRemoteLookup[_srcChainId]),
            "NonblockingReceiver: invalid source sending contract"
        );

        // try-catch all errors/exceptions
        // having failed messages does not block messages passing
        try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) {
            // do nothing
        } catch {
            // error / exception
            failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages(
                _payload.length,
                keccak256(_payload)
            );
            emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload);
        }
    }

    function onLzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) public {
        // only internal transaction
        require(
            msg.sender == address(this),
            "NonblockingReceiver: caller must be Bridge."
        );

        // handle incoming message
        _LzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    // abstract function
    function _LzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal virtual;

    function _lzSend(
        uint16 _dstChainId,
        bytes memory _payload,
        address payable _refundAddress,
        address _zroPaymentAddress,
        bytes memory _txParam
    ) internal {
        endpoint.send{value: msg.value}(
            _dstChainId,
            trustedRemoteLookup[_dstChainId],
            _payload,
            _refundAddress,
            _zroPaymentAddress,
            _txParam
        );
    }

    function retryMessage(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes calldata _payload
    ) external payable {
        // assert there is message to retry
        FailedMessages storage failedMsg = failedMessages[_srcChainId][
            _srcAddress
        ][_nonce];
        require(
            failedMsg.payloadHash != bytes32(0),
            "NonblockingReceiver: no stored message"
        );
        require(
            _payload.length == failedMsg.payloadLength &&
                keccak256(_payload) == failedMsg.payloadHash,
            "LayerZero: invalid payload"
        );
        // clear the stored message
        failedMsg.payloadLength = 0;
        failedMsg.payloadHash = bytes32(0);
        // execute the message. revert if it fails again
        this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    function setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote)
        external
        onlyOwner
    {
        trustedRemoteLookup[_chainId] = _trustedRemote;
    }
}

// File: contracts/BillionaireSkullClub.sol

pragma solidity ^0.8.7;

contract BillionaireSkullClub is Ownable, ERC721, NonblockingReceiver {
    address public _owner;
    string private baseURI;
    uint256 nextTokenId = 5556;
    uint256 MAX_MINT_Amount = 9999;
    uint256 gasForDestinationLzReceive = 350000;
    bool public paused = true;

    constructor(string memory baseURI_, address _layerZeroEndpoint)
        ERC721("BillionaireSkullClub", "BSC")
    {
        _owner = msg.sender;
        endpoint = ILayerZeroEndpoint(_layerZeroEndpoint);
        baseURI = baseURI_;
    }

    // mint function
    // you can choose to mint 1 or 2
    // mint is free, but payments are accepted
    function mint(uint8 numTokens) external payable {
        require(!paused, "Sale hasn't not started yet");
        require(balanceOf(msg.sender) < 2, "Each address may only own 2 NFTs");
        require(numTokens < 3, "Billionaire Skull Club: Max 2 NFTs per transaction");
        require(
            nextTokenId + numTokens <= MAX_MINT_Amount,
            "Billionaire Skull Club: Mint exceeds supply"
        );
        _safeMint(msg.sender, ++nextTokenId);
        if (numTokens == 2) {
            _safeMint(msg.sender, ++nextTokenId);
        }
    }

    // This function transfers the nft from your address on the
    // source chain to the same address on the destination chain
    function traverseChains(uint16 _chainId, uint256 tokenId) public payable {
        require(
            msg.sender == ownerOf(tokenId),
            "You must own the token to traverse"
        );
        require(
            trustedRemoteLookup[_chainId].length > 0,
            "This chain is currently unavailable for travel"
        );

        // burn NFT, eliminating it from circulation on src chain
        _burn(tokenId);

        // abi.encode() the payload with the values to send
        bytes memory payload = abi.encode(msg.sender, tokenId);

        // encode adapterParams to specify more gas for the destination
        uint16 version = 1;
        bytes memory adapterParams = abi.encodePacked(
            version,
            gasForDestinationLzReceive
        );

        // get the fees we need to pay to LayerZero + Relayer to cover message delivery
        // you will be refunded for extra gas paid
        (uint256 messageFee, ) = endpoint.estimateFees(
            _chainId,
            address(this),
            payload,
            false,
            adapterParams
        );

        require(
            msg.value >= messageFee,
            "Billionaire Skull Club: msg.value not enough to cover messageFee. Send gas for message fees"
        );

        endpoint.send{value: msg.value}(
            _chainId, // destination chainId
            trustedRemoteLookup[_chainId], // destination address of nft contract
            payload, // abi.encoded()'ed bytes
            payable(msg.sender), // refund address
            address(0x0), // 'zroPaymentAddress' unused for this
            adapterParams // txParameters
        );
    }

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

    function donate() external payable {
        // thank you
    }

    // This allows the devs to receive kind donations
    function withdraw(uint256 amt) external onlyOwner {
        (bool sent, ) = payable(_owner).call{value: amt}("");
        require(sent, "Billionaire Skull Club: Failed to withdraw");
    }

    // just in case this fixed variable limits us from future integrations
    function setGasForDestinationLzReceive(uint256 newVal) external onlyOwner {
        gasForDestinationLzReceive = newVal;
    }

    // ------------------
    // Internal Functions
    // ------------------

    function _LzReceive(
        uint16 _srcChainId,
        bytes memory _srcAddress,
        uint64 _nonce,
        bytes memory _payload
    ) internal override {
        // decode
        (address toAddr, uint256 tokenId) = abi.decode(
            _payload,
            (address, uint256)
        );

        // mint the tokens back into existence on destination chain
        _safeMint(toAddr, tokenId);
    }

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

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"address","name":"_layerZeroEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","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":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numTokens","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"onLzReceive","outputs":[],"stateMutability":"nonpayable","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":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"setGasForDestinationLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"traverseChains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526115b4600c5561270f600d5562055730600e55600f805460ff191660011790553480156200003157600080fd5b5060405162002f2d38038062002f2d83398101604081905262000054916200024c565b6040518060400160405280601481526020017f42696c6c696f6e61697265536b756c6c436c75620000000000000000000000008152506040518060400160405280600381526020016242534360e81b815250620000c0620000ba6200013560201b60201c565b62000139565b8151620000d590600190602085019062000189565b508051620000eb90600290602084019062000189565b5050600a8054336001600160a01b031991821617909155600780549091166001600160a01b0384161790555081516200012c90600b90602085019062000189565b50505062000390565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000197906200033d565b90600052602060002090601f016020900481019282620001bb576000855562000206565b82601f10620001d657805160ff191683800117855562000206565b8280016001018555821562000206579182015b8281111562000206578251825591602001919060010190620001e9565b506200021492915062000218565b5090565b5b8082111562000214576000815560010162000219565b80516001600160a01b03811681146200024757600080fd5b919050565b600080604083850312156200026057600080fd5b82516001600160401b03808211156200027857600080fd5b818501915085601f8301126200028d57600080fd5b815181811115620002a257620002a26200037a565b604051601f8201601f19908116603f01168101908382118183101715620002cd57620002cd6200037a565b81604052828152602093508884848701011115620002ea57600080fd5b600091505b828210156200030e5784820184015181830185015290830190620002ef565b82821115620003205760008484830101525b9550620003329150508582016200022f565b925050509250929050565b600181811c908216806200035257607f821691505b602082108114156200037457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b612b8d80620003a06000396000f3fe6080604052600436106101d75760003560e01c8063715018a611610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c514610581578063eb8d72b7146105ca578063ed88c68e146101fc578063f2fde38b146105ea57600080fd5b8063b88d4fde1461051b578063c87b56dd1461053b578063cf89fa031461055b578063d1deba1f1461056e57600080fd5b8063943fb872116100d1578063943fb872146104a657806395d89b41146104c6578063a22cb465146104db578063b2bdfa7b146104fb57600080fd5b8063715018a6146103e85780637533d788146103fd5780638da5cb5b1461041d5780638ee749121461043b57600080fd5b806323b872dd1161017a5780635c975abb116101495780635c975abb1461036d5780636352211e146103875780636ecd2306146103a757806370a08231146103ba57600080fd5b806323b872dd146102ed5780632e1a7d4d1461030d57806342842e0e1461032d57806355f804b31461034d57600080fd5b806306fdde03116101b657806306fdde0314610253578063081812fc14610275578063095ea7b3146102ad5780631c37a822146102cd57600080fd5b80621d3567146101dc57806301ffc9a7146101fe57806302329a2914610233575b600080fd5b3480156101e857600080fd5b506101fc6101f7366004612508565b61060a565b005b34801561020a57600080fd5b5061021e610219366004612338565b610804565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b506101fc61024e36600461231d565b610856565b34801561025f57600080fd5b50610268610893565b60405161022a9190612732565b34801561028157600080fd5b5061029561029036600461259c565b610925565b6040516001600160a01b03909116815260200161022a565b3480156102b957600080fd5b506101fc6102c83660046122f1565b6109ba565b3480156102d957600080fd5b506101fc6102e8366004612508565b610ad0565b3480156102f957600080fd5b506101fc610308366004612210565b610b3f565b34801561031957600080fd5b506101fc61032836600461259c565b610b70565b34801561033957600080fd5b506101fc610348366004612210565b610c54565b34801561035957600080fd5b506101fc610368366004612372565b610c6f565b34801561037957600080fd5b50600f5461021e9060ff1681565b34801561039357600080fd5b506102956103a236600461259c565b610cac565b6101fc6103b53660046125d9565b610d23565b3480156103c657600080fd5b506103da6103d536600461218c565b610ef1565b60405190815260200161022a565b3480156103f457600080fd5b506101fc610f78565b34801561040957600080fd5b506102686104183660046123ba565b610fae565b34801561042957600080fd5b506000546001600160a01b0316610295565b34801561044757600080fd5b50610491610456366004612427565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b6040805192835260208301919091520161022a565b3480156104b257600080fd5b506101fc6104c136600461259c565b611048565b3480156104d257600080fd5b50610268611077565b3480156104e757600080fd5b506101fc6104f63660046122bc565b611086565b34801561050757600080fd5b50600a54610295906001600160a01b031681565b34801561052757600080fd5b506101fc610536366004612251565b611091565b34801561054757600080fd5b5061026861055636600461259c565b6110c3565b6101fc610569366004612580565b61119e565b6101fc61057c36600461247d565b611495565b34801561058d57600080fd5b5061021e61059c3660046121d7565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156105d657600080fd5b506101fc6105e53660046123d5565b611622565b3480156105f657600080fd5b506101fc61060536600461218c565b61166a565b6007546001600160a01b0316331461062157600080fd5b61ffff84166000908152600960205260409020805461063f90612a6a565b9050835114801561067e575061ffff841660009081526009602052604090819020905161066c9190612654565b60405180910390208380519060200120145b6106ec5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906107159087908790879087906004016128d2565b600060405180830381600087803b15801561072f57600080fd5b505af1925050508015610740575060015b6107fe576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff1681526020019081526020016000208460405161078a9190612638565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906107f59086908690869086906128d2565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b148061083557506001600160e01b03198216635b5e139f60e01b145b8061085057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146108805760405162461bcd60e51b81526004016106e390612797565b600f805460ff1916911515919091179055565b6060600180546108a290612a6a565b80601f01602080910402602001604051908101604052809291908181526020018280546108ce90612a6a565b801561091b5780601f106108f05761010080835404028352916020019161091b565b820191906000526020600020905b8154815290600101906020018083116108fe57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661099e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106e3565b506000908152600560205260409020546001600160a01b031690565b60006109c582610cac565b9050806001600160a01b0316836001600160a01b03161415610a335760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106e3565b336001600160a01b0382161480610a4f5750610a4f813361059c565b610ac15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106e3565b610acb8383611702565b505050565b333014610b335760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b60648201526084016106e3565b6107fe84848484611770565b610b49338261179d565b610b655760405162461bcd60e51b81526004016106e3906127cc565b610acb838383611894565b6000546001600160a01b03163314610b9a5760405162461bcd60e51b81526004016106e390612797565b600a546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610be7576040519150601f19603f3d011682016040523d82523d6000602084013e610bec565b606091505b5050905080610c505760405162461bcd60e51b815260206004820152602a60248201527f42696c6c696f6e6169726520536b756c6c20436c75623a204661696c656420746044820152696f20776974686472617760b01b60648201526084016106e3565b5050565b610acb83838360405180602001604052806000815250611091565b6000546001600160a01b03163314610c995760405162461bcd60e51b81526004016106e390612797565b8051610c5090600b906020840190611f64565b6000818152600360205260408120546001600160a01b0316806108505760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106e3565b600f5460ff1615610d765760405162461bcd60e51b815260206004820152601b60248201527f53616c65206861736e2774206e6f74207374617274656420796574000000000060448201526064016106e3565b6002610d8133610ef1565b10610dce5760405162461bcd60e51b815260206004820181905260248201527f456163682061646472657373206d6179206f6e6c79206f776e2032204e46547360448201526064016106e3565b60038160ff1610610e3c5760405162461bcd60e51b815260206004820152603260248201527f42696c6c696f6e6169726520536b756c6c20436c75623a204d61782032204e466044820152712a39903832b9103a3930b739b0b1ba34b7b760711b60648201526084016106e3565b600d548160ff16600c54610e5091906129fb565b1115610eb25760405162461bcd60e51b815260206004820152602b60248201527f42696c6c696f6e6169726520536b756c6c20436c75623a204d696e742065786360448201526a6565647320737570706c7960a81b60648201526084016106e3565b610ecf33600c60008154610ec590612aa5565b9182905550611a34565b8060ff1660021415610eee57610eee33600c60008154610ec590612aa5565b50565b60006001600160a01b038216610f5c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106e3565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610fa25760405162461bcd60e51b81526004016106e390612797565b610fac6000611a4e565b565b60096020526000908152604090208054610fc790612a6a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff390612a6a565b80156110405780601f1061101557610100808354040283529160200191611040565b820191906000526020600020905b81548152906001019060200180831161102357829003601f168201915b505050505081565b6000546001600160a01b031633146110725760405162461bcd60e51b81526004016106e390612797565b600e55565b6060600280546108a290612a6a565b610c50338383611a9e565b61109b338361179d565b6110b75760405162461bcd60e51b81526004016106e3906127cc565b6107fe84848484611b6d565b6000818152600360205260409020546060906001600160a01b03166111425760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106e3565b600061114c611ba0565b9050600081511161116c5760405180602001604052806000815250611197565b8061117684611baf565b6040516020016111879291906126c6565b6040516020818303038152906040525b9392505050565b6111a781610cac565b6001600160a01b0316336001600160a01b0316146112125760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b60648201526084016106e3565b61ffff82166000908152600960205260408120805461123090612a6a565b9050116112965760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b60648201526084016106e3565b61129f81611cac565b60408051336020820152808201839052815180820383018152606082018352600e54600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb1090611322908990309089908790899060a60161281d565b604080518083038186803b15801561133957600080fd5b505afa15801561134d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137191906125b5565b509050803410156114105760405162461bcd60e51b815260206004820152605b60248201527f42696c6c696f6e6169726520536b756c6c20436c75623a206d73672e76616c7560448201527f65206e6f7420656e6f75676820746f20636f766572206d65737361676546656560648201527f2e2053656e642067617320666f72206d65737361676520666565730000000000608482015260a4016106e3565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c580310092349261145b928c928b913391908b9060040161291b565b6000604051808303818588803b15801561147457600080fd5b505af1158015611488573d6000803e3d6000fd5b5050505050505050505050565b61ffff851660009081526008602052604080822090516114b6908790612638565b90815260408051602092819003830190206001600160401b038716600090815292529020600181015490915061153d5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b60648201526084016106e3565b80548214801561156757508060010154838360405161155d929190612628565b6040518091039020145b6115b35760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f616400000000000060448201526064016106e3565b60008082556001820155604051630e1bd41160e11b81523090631c37a822906115e89089908990899089908990600401612871565b600060405180830381600087803b15801561160257600080fd5b505af1158015611616573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b0316331461164c5760405162461bcd60e51b81526004016106e390612797565b61ffff831660009081526009602052604090206107fe908383611fe8565b6000546001600160a01b031633146116945760405162461bcd60e51b81526004016106e390612797565b6001600160a01b0381166116f95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106e3565b610eee81611a4e565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061173782610cac565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000808280602001905181019061178791906121a9565b915091506117958282611a34565b505050505050565b6000818152600360205260408120546001600160a01b03166118165760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106e3565b600061182183610cac565b9050806001600160a01b0316846001600160a01b0316148061185c5750836001600160a01b031661185184610925565b6001600160a01b0316145b8061188c57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166118a782610cac565b6001600160a01b03161461190f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106e3565b6001600160a01b0382166119715760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106e3565b61197c600082611702565b6001600160a01b03831660009081526004602052604081208054600192906119a5908490612a27565b90915550506001600160a01b03821660009081526004602052604081208054600192906119d39084906129fb565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610c50828260405180602001604052806000815250611d47565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611b005760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106e3565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611b78848484611894565b611b8484848484611d7a565b6107fe5760405162461bcd60e51b81526004016106e390612745565b6060600b80546108a290612a6a565b606081611bd35750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611bfd5780611be781612aa5565b9150611bf69050600a83612a13565b9150611bd7565b6000816001600160401b03811115611c1757611c17612b16565b6040519080825280601f01601f191660200182016040528015611c41576020820181803683370190505b5090505b841561188c57611c56600183612a27565b9150611c63600a86612ac0565b611c6e9060306129fb565b60f81b818381518110611c8357611c83612b00565b60200101906001600160f81b031916908160001a905350611ca5600a86612a13565b9450611c45565b6000611cb782610cac565b9050611cc4600083611702565b6001600160a01b0381166000908152600460205260408120805460019290611ced908490612a27565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611d518383611e87565b611d5e6000848484611d7a565b610acb5760405162461bcd60e51b81526004016106e390612745565b60006001600160a01b0384163b15611e7c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611dbe9033908990889088906004016126f5565b602060405180830381600087803b158015611dd857600080fd5b505af1925050508015611e08575060408051601f3d908101601f19168201909252611e0591810190612355565b60015b611e62573d808015611e36576040519150601f19603f3d011682016040523d82523d6000602084013e611e3b565b606091505b508051611e5a5760405162461bcd60e51b81526004016106e390612745565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061188c565b506001949350505050565b6001600160a01b038216611edd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106e3565b6001600160a01b0382166000908152600460205260408120805460019290611f069084906129fb565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611f7090612a6a565b90600052602060002090601f016020900481019282611f925760008555611fd8565b82601f10611fab57805160ff1916838001178555611fd8565b82800160010185558215611fd8579182015b82811115611fd8578251825591602001919060010190611fbd565b50611fe492915061205c565b5090565b828054611ff490612a6a565b90600052602060002090601f0160209004810192826120165760008555611fd8565b82601f1061202f5782800160ff19823516178555611fd8565b82800160010185558215611fd8579182015b82811115611fd8578235825591602001919060010190612041565b5b80821115611fe4576000815560010161205d565b60006001600160401b038084111561208b5761208b612b16565b604051601f8501601f19908116603f011681019082821181831017156120b3576120b3612b16565b816040528093508581528686860111156120cc57600080fd5b858560208301376000602087830101525050509392505050565b803580151581146120f657600080fd5b919050565b60008083601f84011261210d57600080fd5b5081356001600160401b0381111561212457600080fd5b60208301915083602082850101111561213c57600080fd5b9250929050565b600082601f83011261215457600080fd5b61119783833560208501612071565b803561ffff811681146120f657600080fd5b80356001600160401b03811681146120f657600080fd5b60006020828403121561219e57600080fd5b813561119781612b2c565b600080604083850312156121bc57600080fd5b82516121c781612b2c565b6020939093015192949293505050565b600080604083850312156121ea57600080fd5b82356121f581612b2c565b9150602083013561220581612b2c565b809150509250929050565b60008060006060848603121561222557600080fd5b833561223081612b2c565b9250602084013561224081612b2c565b929592945050506040919091013590565b6000806000806080858703121561226757600080fd5b843561227281612b2c565b9350602085013561228281612b2c565b92506040850135915060608501356001600160401b038111156122a457600080fd5b6122b087828801612143565b91505092959194509250565b600080604083850312156122cf57600080fd5b82356122da81612b2c565b91506122e8602084016120e6565b90509250929050565b6000806040838503121561230457600080fd5b823561230f81612b2c565b946020939093013593505050565b60006020828403121561232f57600080fd5b611197826120e6565b60006020828403121561234a57600080fd5b813561119781612b41565b60006020828403121561236757600080fd5b815161119781612b41565b60006020828403121561238457600080fd5b81356001600160401b0381111561239a57600080fd5b8201601f810184136123ab57600080fd5b61188c84823560208401612071565b6000602082840312156123cc57600080fd5b61119782612163565b6000806000604084860312156123ea57600080fd5b6123f384612163565b925060208401356001600160401b0381111561240e57600080fd5b61241a868287016120fb565b9497909650939450505050565b60008060006060848603121561243c57600080fd5b61244584612163565b925060208401356001600160401b0381111561246057600080fd5b61246c86828701612143565b925050604084013590509250925092565b60008060008060006080868803121561249557600080fd5b61249e86612163565b945060208601356001600160401b03808211156124ba57600080fd5b6124c689838a01612143565b95506124d460408901612175565b945060608801359150808211156124ea57600080fd5b506124f7888289016120fb565b969995985093965092949392505050565b6000806000806080858703121561251e57600080fd5b61252785612163565b935060208501356001600160401b038082111561254357600080fd5b61254f88838901612143565b945061255d60408801612175565b9350606087013591508082111561257357600080fd5b506122b087828801612143565b6000806040838503121561259357600080fd5b61230f83612163565b6000602082840312156125ae57600080fd5b5035919050565b600080604083850312156125c857600080fd5b505080516020909101519092909150565b6000602082840312156125eb57600080fd5b813560ff8116811461119757600080fd5b60008151808452612614816020860160208601612a3e565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b6000825161264a818460208701612a3e565b9190910192915050565b600080835461266281612a6a565b6001828116801561267a576001811461268b576126ba565b60ff198416875282870194506126ba565b8760005260208060002060005b858110156126b15781548a820152908401908201612698565b50505082870194505b50929695505050505050565b600083516126d8818460208801612a3e565b8351908301906126ec818360208801612a3e565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612728908301846125fc565b9695505050505050565b60208152600061119760208301846125fc565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061284b908301866125fc565b8415156060840152828103608084015261286581856125fc565b98975050505050505050565b61ffff8616815260806020820152600061288e60808301876125fc565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff851681526080602082015260006128ef60808301866125fc565b6001600160401b0385166040840152828103606084015261291081856125fc565b979650505050505050565b61ffff871681526000602060c0818401526000885461293981612a6a565b8060c087015260e060018084166000811461295b57600181146129705761299e565b60ff198516898401526101008901955061299e565b8d6000528660002060005b858110156129965781548b820186015290830190880161297b565b8a0184019650505b505050505083810360408501526129b581896125fc565b9150506129cd60608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a08401526129ee81856125fc565b9998505050505050505050565b60008219821115612a0e57612a0e612ad4565b500190565b600082612a2257612a22612aea565b500490565b600082821015612a3957612a39612ad4565b500390565b60005b83811015612a59578181015183820152602001612a41565b838111156107fe5750506000910152565b600181811c90821680612a7e57607f821691505b60208210811415612a9f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ab957612ab9612ad4565b5060010190565b600082612acf57612acf612aea565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610eee57600080fd5b6001600160e01b031981168114610eee57600080fdfea2646970667358221220c319a37b2f828bc86086818bf72dd3f9bd5f19946dd604116dfee50527d71f5c64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000000000000000000000000000000000000000001e68747470733a2f2f62696c6c696f6e61697265736b756c6c2e636c75622f0000

Deployed Bytecode

0x6080604052600436106101d75760003560e01c8063715018a611610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c514610581578063eb8d72b7146105ca578063ed88c68e146101fc578063f2fde38b146105ea57600080fd5b8063b88d4fde1461051b578063c87b56dd1461053b578063cf89fa031461055b578063d1deba1f1461056e57600080fd5b8063943fb872116100d1578063943fb872146104a657806395d89b41146104c6578063a22cb465146104db578063b2bdfa7b146104fb57600080fd5b8063715018a6146103e85780637533d788146103fd5780638da5cb5b1461041d5780638ee749121461043b57600080fd5b806323b872dd1161017a5780635c975abb116101495780635c975abb1461036d5780636352211e146103875780636ecd2306146103a757806370a08231146103ba57600080fd5b806323b872dd146102ed5780632e1a7d4d1461030d57806342842e0e1461032d57806355f804b31461034d57600080fd5b806306fdde03116101b657806306fdde0314610253578063081812fc14610275578063095ea7b3146102ad5780631c37a822146102cd57600080fd5b80621d3567146101dc57806301ffc9a7146101fe57806302329a2914610233575b600080fd5b3480156101e857600080fd5b506101fc6101f7366004612508565b61060a565b005b34801561020a57600080fd5b5061021e610219366004612338565b610804565b60405190151581526020015b60405180910390f35b34801561023f57600080fd5b506101fc61024e36600461231d565b610856565b34801561025f57600080fd5b50610268610893565b60405161022a9190612732565b34801561028157600080fd5b5061029561029036600461259c565b610925565b6040516001600160a01b03909116815260200161022a565b3480156102b957600080fd5b506101fc6102c83660046122f1565b6109ba565b3480156102d957600080fd5b506101fc6102e8366004612508565b610ad0565b3480156102f957600080fd5b506101fc610308366004612210565b610b3f565b34801561031957600080fd5b506101fc61032836600461259c565b610b70565b34801561033957600080fd5b506101fc610348366004612210565b610c54565b34801561035957600080fd5b506101fc610368366004612372565b610c6f565b34801561037957600080fd5b50600f5461021e9060ff1681565b34801561039357600080fd5b506102956103a236600461259c565b610cac565b6101fc6103b53660046125d9565b610d23565b3480156103c657600080fd5b506103da6103d536600461218c565b610ef1565b60405190815260200161022a565b3480156103f457600080fd5b506101fc610f78565b34801561040957600080fd5b506102686104183660046123ba565b610fae565b34801561042957600080fd5b506000546001600160a01b0316610295565b34801561044757600080fd5b50610491610456366004612427565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b6040805192835260208301919091520161022a565b3480156104b257600080fd5b506101fc6104c136600461259c565b611048565b3480156104d257600080fd5b50610268611077565b3480156104e757600080fd5b506101fc6104f63660046122bc565b611086565b34801561050757600080fd5b50600a54610295906001600160a01b031681565b34801561052757600080fd5b506101fc610536366004612251565b611091565b34801561054757600080fd5b5061026861055636600461259c565b6110c3565b6101fc610569366004612580565b61119e565b6101fc61057c36600461247d565b611495565b34801561058d57600080fd5b5061021e61059c3660046121d7565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156105d657600080fd5b506101fc6105e53660046123d5565b611622565b3480156105f657600080fd5b506101fc61060536600461218c565b61166a565b6007546001600160a01b0316331461062157600080fd5b61ffff84166000908152600960205260409020805461063f90612a6a565b9050835114801561067e575061ffff841660009081526009602052604090819020905161066c9190612654565b60405180910390208380519060200120145b6106ec5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906107159087908790879087906004016128d2565b600060405180830381600087803b15801561072f57600080fd5b505af1925050508015610740575060015b6107fe576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff1681526020019081526020016000208460405161078a9190612638565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906107f59086908690869086906128d2565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b148061083557506001600160e01b03198216635b5e139f60e01b145b8061085057506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000546001600160a01b031633146108805760405162461bcd60e51b81526004016106e390612797565b600f805460ff1916911515919091179055565b6060600180546108a290612a6a565b80601f01602080910402602001604051908101604052809291908181526020018280546108ce90612a6a565b801561091b5780601f106108f05761010080835404028352916020019161091b565b820191906000526020600020905b8154815290600101906020018083116108fe57829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b031661099e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106e3565b506000908152600560205260409020546001600160a01b031690565b60006109c582610cac565b9050806001600160a01b0316836001600160a01b03161415610a335760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016106e3565b336001600160a01b0382161480610a4f5750610a4f813361059c565b610ac15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016106e3565b610acb8383611702565b505050565b333014610b335760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b60648201526084016106e3565b6107fe84848484611770565b610b49338261179d565b610b655760405162461bcd60e51b81526004016106e3906127cc565b610acb838383611894565b6000546001600160a01b03163314610b9a5760405162461bcd60e51b81526004016106e390612797565b600a546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610be7576040519150601f19603f3d011682016040523d82523d6000602084013e610bec565b606091505b5050905080610c505760405162461bcd60e51b815260206004820152602a60248201527f42696c6c696f6e6169726520536b756c6c20436c75623a204661696c656420746044820152696f20776974686472617760b01b60648201526084016106e3565b5050565b610acb83838360405180602001604052806000815250611091565b6000546001600160a01b03163314610c995760405162461bcd60e51b81526004016106e390612797565b8051610c5090600b906020840190611f64565b6000818152600360205260408120546001600160a01b0316806108505760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016106e3565b600f5460ff1615610d765760405162461bcd60e51b815260206004820152601b60248201527f53616c65206861736e2774206e6f74207374617274656420796574000000000060448201526064016106e3565b6002610d8133610ef1565b10610dce5760405162461bcd60e51b815260206004820181905260248201527f456163682061646472657373206d6179206f6e6c79206f776e2032204e46547360448201526064016106e3565b60038160ff1610610e3c5760405162461bcd60e51b815260206004820152603260248201527f42696c6c696f6e6169726520536b756c6c20436c75623a204d61782032204e466044820152712a39903832b9103a3930b739b0b1ba34b7b760711b60648201526084016106e3565b600d548160ff16600c54610e5091906129fb565b1115610eb25760405162461bcd60e51b815260206004820152602b60248201527f42696c6c696f6e6169726520536b756c6c20436c75623a204d696e742065786360448201526a6565647320737570706c7960a81b60648201526084016106e3565b610ecf33600c60008154610ec590612aa5565b9182905550611a34565b8060ff1660021415610eee57610eee33600c60008154610ec590612aa5565b50565b60006001600160a01b038216610f5c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016106e3565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610fa25760405162461bcd60e51b81526004016106e390612797565b610fac6000611a4e565b565b60096020526000908152604090208054610fc790612a6a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff390612a6a565b80156110405780601f1061101557610100808354040283529160200191611040565b820191906000526020600020905b81548152906001019060200180831161102357829003601f168201915b505050505081565b6000546001600160a01b031633146110725760405162461bcd60e51b81526004016106e390612797565b600e55565b6060600280546108a290612a6a565b610c50338383611a9e565b61109b338361179d565b6110b75760405162461bcd60e51b81526004016106e3906127cc565b6107fe84848484611b6d565b6000818152600360205260409020546060906001600160a01b03166111425760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016106e3565b600061114c611ba0565b9050600081511161116c5760405180602001604052806000815250611197565b8061117684611baf565b6040516020016111879291906126c6565b6040516020818303038152906040525b9392505050565b6111a781610cac565b6001600160a01b0316336001600160a01b0316146112125760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b60648201526084016106e3565b61ffff82166000908152600960205260408120805461123090612a6a565b9050116112965760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b60648201526084016106e3565b61129f81611cac565b60408051336020820152808201839052815180820383018152606082018352600e54600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb1090611322908990309089908790899060a60161281d565b604080518083038186803b15801561133957600080fd5b505afa15801561134d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137191906125b5565b509050803410156114105760405162461bcd60e51b815260206004820152605b60248201527f42696c6c696f6e6169726520536b756c6c20436c75623a206d73672e76616c7560448201527f65206e6f7420656e6f75676820746f20636f766572206d65737361676546656560648201527f2e2053656e642067617320666f72206d65737361676520666565730000000000608482015260a4016106e3565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c580310092349261145b928c928b913391908b9060040161291b565b6000604051808303818588803b15801561147457600080fd5b505af1158015611488573d6000803e3d6000fd5b5050505050505050505050565b61ffff851660009081526008602052604080822090516114b6908790612638565b90815260408051602092819003830190206001600160401b038716600090815292529020600181015490915061153d5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b60648201526084016106e3565b80548214801561156757508060010154838360405161155d929190612628565b6040518091039020145b6115b35760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f616400000000000060448201526064016106e3565b60008082556001820155604051630e1bd41160e11b81523090631c37a822906115e89089908990899089908990600401612871565b600060405180830381600087803b15801561160257600080fd5b505af1158015611616573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b0316331461164c5760405162461bcd60e51b81526004016106e390612797565b61ffff831660009081526009602052604090206107fe908383611fe8565b6000546001600160a01b031633146116945760405162461bcd60e51b81526004016106e390612797565b6001600160a01b0381166116f95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106e3565b610eee81611a4e565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061173782610cac565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000808280602001905181019061178791906121a9565b915091506117958282611a34565b505050505050565b6000818152600360205260408120546001600160a01b03166118165760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016106e3565b600061182183610cac565b9050806001600160a01b0316846001600160a01b0316148061185c5750836001600160a01b031661185184610925565b6001600160a01b0316145b8061188c57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166118a782610cac565b6001600160a01b03161461190f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016106e3565b6001600160a01b0382166119715760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016106e3565b61197c600082611702565b6001600160a01b03831660009081526004602052604081208054600192906119a5908490612a27565b90915550506001600160a01b03821660009081526004602052604081208054600192906119d39084906129fb565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610c50828260405180602001604052806000815250611d47565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b03161415611b005760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016106e3565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611b78848484611894565b611b8484848484611d7a565b6107fe5760405162461bcd60e51b81526004016106e390612745565b6060600b80546108a290612a6a565b606081611bd35750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611bfd5780611be781612aa5565b9150611bf69050600a83612a13565b9150611bd7565b6000816001600160401b03811115611c1757611c17612b16565b6040519080825280601f01601f191660200182016040528015611c41576020820181803683370190505b5090505b841561188c57611c56600183612a27565b9150611c63600a86612ac0565b611c6e9060306129fb565b60f81b818381518110611c8357611c83612b00565b60200101906001600160f81b031916908160001a905350611ca5600a86612a13565b9450611c45565b6000611cb782610cac565b9050611cc4600083611702565b6001600160a01b0381166000908152600460205260408120805460019290611ced908490612a27565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611d518383611e87565b611d5e6000848484611d7a565b610acb5760405162461bcd60e51b81526004016106e390612745565b60006001600160a01b0384163b15611e7c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611dbe9033908990889088906004016126f5565b602060405180830381600087803b158015611dd857600080fd5b505af1925050508015611e08575060408051601f3d908101601f19168201909252611e0591810190612355565b60015b611e62573d808015611e36576040519150601f19603f3d011682016040523d82523d6000602084013e611e3b565b606091505b508051611e5a5760405162461bcd60e51b81526004016106e390612745565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061188c565b506001949350505050565b6001600160a01b038216611edd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016106e3565b6001600160a01b0382166000908152600460205260408120805460019290611f069084906129fb565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611f7090612a6a565b90600052602060002090601f016020900481019282611f925760008555611fd8565b82601f10611fab57805160ff1916838001178555611fd8565b82800160010185558215611fd8579182015b82811115611fd8578251825591602001919060010190611fbd565b50611fe492915061205c565b5090565b828054611ff490612a6a565b90600052602060002090601f0160209004810192826120165760008555611fd8565b82601f1061202f5782800160ff19823516178555611fd8565b82800160010185558215611fd8579182015b82811115611fd8578235825591602001919060010190612041565b5b80821115611fe4576000815560010161205d565b60006001600160401b038084111561208b5761208b612b16565b604051601f8501601f19908116603f011681019082821181831017156120b3576120b3612b16565b816040528093508581528686860111156120cc57600080fd5b858560208301376000602087830101525050509392505050565b803580151581146120f657600080fd5b919050565b60008083601f84011261210d57600080fd5b5081356001600160401b0381111561212457600080fd5b60208301915083602082850101111561213c57600080fd5b9250929050565b600082601f83011261215457600080fd5b61119783833560208501612071565b803561ffff811681146120f657600080fd5b80356001600160401b03811681146120f657600080fd5b60006020828403121561219e57600080fd5b813561119781612b2c565b600080604083850312156121bc57600080fd5b82516121c781612b2c565b6020939093015192949293505050565b600080604083850312156121ea57600080fd5b82356121f581612b2c565b9150602083013561220581612b2c565b809150509250929050565b60008060006060848603121561222557600080fd5b833561223081612b2c565b9250602084013561224081612b2c565b929592945050506040919091013590565b6000806000806080858703121561226757600080fd5b843561227281612b2c565b9350602085013561228281612b2c565b92506040850135915060608501356001600160401b038111156122a457600080fd5b6122b087828801612143565b91505092959194509250565b600080604083850312156122cf57600080fd5b82356122da81612b2c565b91506122e8602084016120e6565b90509250929050565b6000806040838503121561230457600080fd5b823561230f81612b2c565b946020939093013593505050565b60006020828403121561232f57600080fd5b611197826120e6565b60006020828403121561234a57600080fd5b813561119781612b41565b60006020828403121561236757600080fd5b815161119781612b41565b60006020828403121561238457600080fd5b81356001600160401b0381111561239a57600080fd5b8201601f810184136123ab57600080fd5b61188c84823560208401612071565b6000602082840312156123cc57600080fd5b61119782612163565b6000806000604084860312156123ea57600080fd5b6123f384612163565b925060208401356001600160401b0381111561240e57600080fd5b61241a868287016120fb565b9497909650939450505050565b60008060006060848603121561243c57600080fd5b61244584612163565b925060208401356001600160401b0381111561246057600080fd5b61246c86828701612143565b925050604084013590509250925092565b60008060008060006080868803121561249557600080fd5b61249e86612163565b945060208601356001600160401b03808211156124ba57600080fd5b6124c689838a01612143565b95506124d460408901612175565b945060608801359150808211156124ea57600080fd5b506124f7888289016120fb565b969995985093965092949392505050565b6000806000806080858703121561251e57600080fd5b61252785612163565b935060208501356001600160401b038082111561254357600080fd5b61254f88838901612143565b945061255d60408801612175565b9350606087013591508082111561257357600080fd5b506122b087828801612143565b6000806040838503121561259357600080fd5b61230f83612163565b6000602082840312156125ae57600080fd5b5035919050565b600080604083850312156125c857600080fd5b505080516020909101519092909150565b6000602082840312156125eb57600080fd5b813560ff8116811461119757600080fd5b60008151808452612614816020860160208601612a3e565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b6000825161264a818460208701612a3e565b9190910192915050565b600080835461266281612a6a565b6001828116801561267a576001811461268b576126ba565b60ff198416875282870194506126ba565b8760005260208060002060005b858110156126b15781548a820152908401908201612698565b50505082870194505b50929695505050505050565b600083516126d8818460208801612a3e565b8351908301906126ec818360208801612a3e565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612728908301846125fc565b9695505050505050565b60208152600061119760208301846125fc565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061284b908301866125fc565b8415156060840152828103608084015261286581856125fc565b98975050505050505050565b61ffff8616815260806020820152600061288e60808301876125fc565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff851681526080602082015260006128ef60808301866125fc565b6001600160401b0385166040840152828103606084015261291081856125fc565b979650505050505050565b61ffff871681526000602060c0818401526000885461293981612a6a565b8060c087015260e060018084166000811461295b57600181146129705761299e565b60ff198516898401526101008901955061299e565b8d6000528660002060005b858110156129965781548b820186015290830190880161297b565b8a0184019650505b505050505083810360408501526129b581896125fc565b9150506129cd60608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a08401526129ee81856125fc565b9998505050505050505050565b60008219821115612a0e57612a0e612ad4565b500190565b600082612a2257612a22612aea565b500490565b600082821015612a3957612a39612ad4565b500390565b60005b83811015612a59578181015183820152602001612a41565b838111156107fe5750506000910152565b600181811c90821680612a7e57607f821691505b60208210811415612a9f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612ab957612ab9612ad4565b5060010190565b600082612acf57612acf612aea565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610eee57600080fd5b6001600160e01b031981168114610eee57600080fdfea2646970667358221220c319a37b2f828bc86086818bf72dd3f9bd5f19946dd604116dfee50527d71f5c64736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000000000000000000000000000000000000000001e68747470733a2f2f62696c6c696f6e61697265736b756c6c2e636c75622f0000

-----Decoded View---------------
Arg [0] : baseURI_ (string): https://billionaireskull.club/
Arg [1] : _layerZeroEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [2] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [3] : 68747470733a2f2f62696c6c696f6e61697265736b756c6c2e636c75622f0000


Deployed Bytecode Sourcemap

56840:4416:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53453:1098;;;;;;;;;;-1:-1:-1;53453:1098:0;;;;;:::i;:::-;;:::i;:::-;;39518:355;;;;;;;;;;-1:-1:-1;39518:355:0;;;;;:::i;:::-;;:::i;:::-;;;13051:14:1;;13044:22;13026:41;;13014:2;12999:18;39518:355:0;;;;;;;;61174:79;;;;;;;;;;-1:-1:-1;61174:79:0;;;;;:::i;:::-;;:::i;40687:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42380:308::-;;;;;;;;;;-1:-1:-1;42380:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12070:32:1;;;12052:51;;12040:2;12025:18;42380:308:0;11906:203:1;41903:411:0;;;;;;;;;;-1:-1:-1;41903:411:0;;;;;:::i;:::-;;:::i;54559:435::-;;;;;;;;;;-1:-1:-1;54559:435:0;;;;;:::i;:::-;;:::i;43299:376::-;;;;;;;;;;-1:-1:-1;43299:376:0;;;;;:::i;:::-;;:::i;60140:191::-;;;;;;;;;;-1:-1:-1;60140:191:0;;;;;:::i;:::-;;:::i;43746:185::-;;;;;;;;;;-1:-1:-1;43746:185:0;;;;;:::i;:::-;;:::i;59914:90::-;;;;;;;;;;-1:-1:-1;59914:90:0;;;;;:::i;:::-;;:::i;57094:25::-;;;;;;;;;;-1:-1:-1;57094:25:0;;;;;;;;40294:326;;;;;;;;;;-1:-1:-1;40294:326:0;;;;;:::i;:::-;;:::i;57487:568::-;;;;;;:::i;:::-;;:::i;39937:295::-;;;;;;;;;;-1:-1:-1;39937:295:0;;;;;:::i;:::-;;:::i;:::-;;;27997:25:1;;;27985:2;27970:18;39937:295:0;27851:177:1;19830:103:0;;;;;;;;;;;;;:::i;53252:51::-;;;;;;;;;;-1:-1:-1;53252:51:0;;;;;:::i;:::-;;:::i;19179:87::-;;;;;;;;;;-1:-1:-1;19225:7:0;19252:6;-1:-1:-1;;;;;19252:6:0;19179:87;;53143:102;;;;;;;;;;-1:-1:-1;53143:102:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28207:25:1;;;28263:2;28248:18;;28241:34;;;;28180:18;53143:102:0;28033:248:1;60415:128:0;;;;;;;;;;-1:-1:-1;60415:128:0;;;;;:::i;:::-;;:::i;40856:104::-;;;;;;;;;;;;;:::i;42760:187::-;;;;;;;;;;-1:-1:-1;42760:187:0;;;;;:::i;:::-;;:::i;56917:21::-;;;;;;;;;;-1:-1:-1;56917:21:0;;;;-1:-1:-1;;;;;56917:21:0;;;44002:365;;;;;;;;;;-1:-1:-1;44002:365:0;;;;;:::i;:::-;;:::i;41031:468::-;;;;;;;;;;-1:-1:-1;41031:468:0;;;;;:::i;:::-;;:::i;58194:1712::-;;;;;;:::i;:::-;;:::i;55654:916::-;;;;;;:::i;:::-;;:::i;43018:214::-;;;;;;;;;;-1:-1:-1;43018:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;43189:25:0;;;43160:4;43189:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;43018:214;56578:181;;;;;;;;;;-1:-1:-1;56578:181:0;;;;;:::i;:::-;;:::i;20088:238::-;;;;;;;;;;-1:-1:-1;20088:238:0;;;;;:::i;:::-;;:::i;53453:1098::-;53658:8;;-1:-1:-1;;;;;53658:8:0;53636:10;:31;53628:40;;;;;;53793:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;53771:11;:18;:61;:168;;;;-1:-1:-1;53906:32:0;;;;;;;:19;:32;;;;;;;53896:43;;;;53906:32;53896:43;:::i;:::-;;;;;;;;53863:11;53853:22;;;;;;:86;53771:168;53749:270;;;;-1:-1:-1;;;53749:270:0;;21021:2:1;53749:270:0;;;21003:21:1;21060:2;21040:18;;;21033:30;21099:34;21079:18;;;21072:62;-1:-1:-1;;;21150:18:1;;;21143:50;21210:19;;53749:270:0;;;;;;;;;54147:60;;-1:-1:-1;;;54147:60:0;;:4;;:16;;:60;;54164:11;;54177;;54190:6;;54198:8;;54147:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54143:401;;54354:101;;;;;;;;54387:8;:15;54354:101;;;;54431:8;54421:19;;;;;;54354:101;;;54303:14;:27;54318:11;54303:27;;;;;;;;;;;;;;;54331:11;54303:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54303:48:0;;;;;;;;;;;;;:152;;;;;;;;;;;;;;;54475:57;;;;54489:11;;54502;;54344:6;;54523:8;;54475:57;:::i;:::-;;;;;;;;54143:401;53453:1098;;;;:::o;39518:355::-;39665:4;-1:-1:-1;;;;;;39707:40:0;;-1:-1:-1;;;39707:40:0;;:105;;-1:-1:-1;;;;;;;39764:48:0;;-1:-1:-1;;;39764:48:0;39707:105;:158;;;-1:-1:-1;;;;;;;;;;32264:40:0;;;39829:36;39687:178;39518:355;-1:-1:-1;;39518:355:0:o;61174:79::-;19225:7;19252:6;-1:-1:-1;;;;;19252:6:0;17962:10;19399:23;19391:68;;;;-1:-1:-1;;;19391:68:0;;;;;;;:::i;:::-;61230:6:::1;:15:::0;;-1:-1:-1;;61230:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61174:79::o;40687:100::-;40741:13;40774:5;40767:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40687:100;:::o;42380:308::-;42501:7;46003:16;;;:7;:16;;;;;;-1:-1:-1;;;;;46003:16:0;42526:110;;;;-1:-1:-1;;;42526:110:0;;19747:2:1;42526:110:0;;;19729:21:1;19786:2;19766:18;;;19759:30;19825:34;19805:18;;;19798:62;-1:-1:-1;;;19876:18:1;;;19869:42;19928:19;;42526:110:0;19545:408:1;42526:110:0;-1:-1:-1;42656:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42656:24:0;;42380:308::o;41903:411::-;41984:13;42000:23;42015:7;42000:14;:23::i;:::-;41984:39;;42048:5;-1:-1:-1;;;;;42042:11:0;:2;-1:-1:-1;;;;;42042:11:0;;;42034:57;;;;-1:-1:-1;;;42034:57:0;;22679:2:1;42034:57:0;;;22661:21:1;22718:2;22698:18;;;22691:30;22757:34;22737:18;;;22730:62;-1:-1:-1;;;22808:18:1;;;22801:31;22849:19;;42034:57:0;22477:397:1;42034:57:0;17962:10;-1:-1:-1;;;;;42126:21:0;;;;:62;;-1:-1:-1;42151:37:0;42168:5;17962:10;43018:214;:::i;42151:37::-;42104:168;;;;-1:-1:-1;;;42104:168:0;;17728:2:1;42104:168:0;;;17710:21:1;17767:2;17747:18;;;17740:30;17806:34;17786:18;;;17779:62;17877:26;17857:18;;;17850:54;17921:19;;42104:168:0;17526:420:1;42104:168:0;42285:21;42294:2;42298:7;42285:8;:21::i;:::-;41973:341;41903:411;;:::o;54559:435::-;54785:10;54807:4;54785:27;54763:120;;;;-1:-1:-1;;;54763:120:0;;18974:2:1;54763:120:0;;;18956:21:1;19013:2;18993:18;;;18986:30;19052:34;19032:18;;;19025:62;-1:-1:-1;;;19103:18:1;;;19096:41;19154:19;;54763:120:0;18772:407:1;54763:120:0;54932:54;54943:11;54956;54969:6;54977:8;54932:10;:54::i;43299:376::-;43508:41;17962:10;43541:7;43508:18;:41::i;:::-;43486:140;;;;-1:-1:-1;;;43486:140:0;;;;;;;:::i;:::-;43639:28;43649:4;43655:2;43659:7;43639:9;:28::i;60140:191::-;19225:7;19252:6;-1:-1:-1;;;;;19252:6:0;17962:10;19399:23;19391:68;;;;-1:-1:-1;;;19391:68:0;;;;;;;:::i;:::-;60225:6:::1;::::0;60217:36:::1;::::0;60202:9:::1;::::0;-1:-1:-1;;;;;60225:6:0::1;::::0;60245:3;;60202:9;60217:36;60202:9;60217:36;60245:3;60225:6;60217:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60201:52;;;60272:4;60264:59;;;::::0;-1:-1:-1;;;60264:59:0;;22268:2:1;60264:59:0::1;::::0;::::1;22250:21:1::0;22307:2;22287:18;;;22280:30;22346:34;22326:18;;;22319:62;-1:-1:-1;;;22397:18:1;;;22390:40;22447:19;;60264:59:0::1;22066:406:1::0;60264:59:0::1;60190:141;60140:191:::0;:::o;43746:185::-;43884:39;43901:4;43907:2;43911:7;43884:39;;;;;;;;;;;;:16;:39::i;59914:90::-;19225:7;19252:6;-1:-1:-1;;;;;19252:6:0;17962:10;19399:23;19391:68;;;;-1:-1:-1;;;19391:68:0;;;;;;;:::i;:::-;59983:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;40294:326::-:0;40411:7;40452:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40452:16:0;40501:19;40479:110;;;;-1:-1:-1;;;40479:110:0;;18564:2:1;40479:110:0;;;18546:21:1;18603:2;18583:18;;;18576:30;18642:34;18622:18;;;18615:62;-1:-1:-1;;;18693:18:1;;;18686:39;18742:19;;40479:110:0;18362:405:1;57487:568:0;57555:6;;;;57554:7;57546:47;;;;-1:-1:-1;;;57546:47:0;;23499:2:1;57546:47:0;;;23481:21:1;23538:2;23518:18;;;23511:30;23577:29;23557:18;;;23550:57;23624:18;;57546:47:0;23297:351:1;57546:47:0;57636:1;57612:21;57622:10;57612:9;:21::i;:::-;:25;57604:70;;;;-1:-1:-1;;;57604:70:0;;24262:2:1;57604:70:0;;;24244:21:1;;;24281:18;;;24274:30;24340:34;24320:18;;;24313:62;24392:18;;57604:70:0;24060:356:1;57604:70:0;57705:1;57693:9;:13;;;57685:76;;;;-1:-1:-1;;;57685:76:0;;14964:2:1;57685:76:0;;;14946:21:1;15003:2;14983:18;;;14976:30;15042:34;15022:18;;;15015:62;-1:-1:-1;;;15093:18:1;;;15086:48;15151:19;;57685:76:0;14762:414:1;57685:76:0;57821:15;;57808:9;57794:23;;:11;;:23;;;;:::i;:::-;:42;;57772:135;;;;-1:-1:-1;;;57772:135:0;;13726:2:1;57772:135:0;;;13708:21:1;13765:2;13745:18;;;13738:30;13804:34;13784:18;;;13777:62;-1:-1:-1;;;13855:18:1;;;13848:41;13906:19;;57772:135:0;13524:407:1;57772:135:0;57918:36;57928:10;57942:11;;57940:13;;;;;:::i;:::-;;;;;-1:-1:-1;57918:9:0;:36::i;:::-;57969:9;:14;;57982:1;57969:14;57965:83;;;58000:36;58010:10;58024:11;;58022:13;;;;;:::i;58000:36::-;57487:568;:::o;39937:295::-;40054:7;-1:-1:-1;;;;;40101:19:0;;40079:111;;;;-1:-1:-1;;;40079:111:0;;18153:2:1;40079:111:0;;;18135:21:1;18192:2;18172:18;;;18165:30;18231:34;18211:18;;;18204:62;-1:-1:-1;;;18282:18:1;;;18275:40;18332:19;;40079:111:0;17951:406:1;40079:111:0;-1:-1:-1;;;;;;40208:16:0;;;;;:9;:16;;;;;;;39937:295::o;19830:103::-;19225:7;19252:6;-1:-1:-1;;;;;19252:6:0;17962:10;19399:23;19391:68;;;;-1:-1:-1;;;19391:68:0;;;;;;;:::i;:::-;19895:30:::1;19922:1;19895:18;:30::i;:::-;19830:103::o:0;53252:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;60415:128::-;19225:7;19252:6;-1:-1:-1;;;;;19252:6:0;17962:10;19399:23;19391:68;;;;-1:-1:-1;;;19391:68:0;;;;;;;:::i;:::-;60500:26:::1;:35:::0;60415:128::o;40856:104::-;40912:13;40945:7;40938:14;;;;;:::i;42760:187::-;42887:52;17962:10;42920:8;42930;42887:18;:52::i;44002:365::-;44191:41;17962:10;44224:7;44191:18;:41::i;:::-;44169:140;;;;-1:-1:-1;;;44169:140:0;;;;;;;:::i;:::-;44320:39;44334:4;44340:2;44344:7;44353:5;44320:13;:39::i;41031:468::-;45979:4;46003:16;;;:7;:16;;;;;;41149:13;;-1:-1:-1;;;;;46003:16:0;41180:113;;;;-1:-1:-1;;;41180:113:0;;21852:2:1;41180:113:0;;;21834:21:1;21891:2;21871:18;;;21864:30;21930:34;21910:18;;;21903:62;-1:-1:-1;;;21981:18:1;;;21974:45;22036:19;;41180:113:0;21650:411:1;41180:113:0;41306:21;41330:10;:8;:10::i;:::-;41306:34;;41395:1;41377:7;41371:21;:25;:120;;;;;;;;;;;;;;;;;41440:7;41449:18;:7;:16;:18::i;:::-;41423:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41371:120;41351:140;41031:468;-1:-1:-1;;;41031:468:0:o;58194:1712::-;58314:16;58322:7;58314;:16::i;:::-;-1:-1:-1;;;;;58300:30:0;:10;-1:-1:-1;;;;;58300:30:0;;58278:114;;;;-1:-1:-1;;;58278:114:0;;16912:2:1;58278:114:0;;;16894:21:1;16951:2;16931:18;;;16924:30;16990:34;16970:18;;;16963:62;-1:-1:-1;;;17041:18:1;;;17034:32;17083:19;;58278:114:0;16710:398:1;58278:114:0;58425:29;;;58464:1;58425:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;58403:136;;;;-1:-1:-1;;;58403:136:0;;16142:2:1;58403:136:0;;;16124:21:1;16181:2;16161:18;;;16154:30;16220:34;16200:18;;;16193:62;-1:-1:-1;;;16271:18:1;;;16264:44;16325:19;;58403:136:0;15940:410:1;58403:136:0;58619:14;58625:7;58619:5;:14::i;:::-;58730:31;;;58741:10;58730:31;;;12781:51:1;12848:18;;;12841:34;;;58730:31:0;;;;;;;;;12754:18:1;;;58730:31:0;;58958:26;;-1:-1:-1;;;58905:90:0;;;11780:51:1;11847:11;;;;11840:27;;;;58905:90:0;;;;;;;;;;11883:12:1;;;58905:90:0;;;;59174:8;;-1:-1:-1;;;59174:153:0;;;58730:31;;58864:1;;-1:-1:-1;;;;;;;59174:8:0;;:21;;:153;;59210:8;;59241:4;;58730:31;;-1:-1:-1;;58905:90:0;;59174:153;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59149:178;;;59375:10;59362:9;:23;;59340:164;;;;-1:-1:-1;;;59340:164:0;;20521:2:1;59340:164:0;;;20503:21:1;20560:2;20540:18;;;20533:30;20599:34;20579:18;;;20572:62;20670:34;20650:18;;;20643:62;20742:29;20721:19;;;20714:58;20789:19;;59340:164:0;20319:495:1;59340:164:0;59517:8;;59609:29;;;59517:8;59609:29;;;:19;:29;;;;;;59517:381;;-1:-1:-1;;;59517:381:0;;-1:-1:-1;;;;;59517:8:0;;;;:13;;59538:9;;59517:381;;59563:8;;59692:7;;59748:10;;59517:8;59858:13;;59517:381;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58267:1639;;;;58194:1712;;:::o;55654:916::-;55913:27;;;55878:32;55913:27;;;:14;:27;;;;;;:64;;;;55955:11;;55913:64;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55913:72:0;;;;;;;;;;56018:21;;;;55913:72;;-1:-1:-1;55996:123:0;;;;-1:-1:-1;;;55996:123:0;;23855:2:1;55996:123:0;;;23837:21:1;23894:2;23874:18;;;23867:30;23933:34;23913:18;;;23906:62;-1:-1:-1;;;23984:18:1;;;23977:36;24030:19;;55996:123:0;23653:402:1;55996:123:0;56171:23;;56152:42;;:107;;;;;56238:9;:21;;;56225:8;;56215:19;;;;;;;:::i;:::-;;;;;;;;:44;56152:107;56130:183;;;;-1:-1:-1;;;56130:183:0;;16557:2:1;56130:183:0;;;16539:21:1;16596:2;16576:18;;;16569:30;16635:28;16615:18;;;16608:56;16681:18;;56130:183:0;16355:350:1;56130:183:0;56387:1;56361:27;;;56399:21;;;:34;56502:60;;-1:-1:-1;;;56502:60:0;;:4;;:16;;:60;;56519:11;;56532;;56545:6;;56553:8;;;;56502:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55822:748;55654:916;;;;;:::o;56578:181::-;19225:7;19252:6;-1:-1:-1;;;;;19252:6:0;17962:10;19399:23;19391:68;;;;-1:-1:-1;;;19391:68:0;;;;;;;:::i;:::-;56705:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;56737:14;;56705:46:::1;:::i;20088:238::-:0;19225:7;19252:6;-1:-1:-1;;;;;19252:6:0;17962:10;19399:23;19391:68;;;;-1:-1:-1;;;19391:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20191:22:0;::::1;20169:110;;;::::0;-1:-1:-1;;;20169:110:0;;14557:2:1;20169:110:0::1;::::0;::::1;14539:21:1::0;14596:2;14576:18;;;14569:30;14635:34;14615:18;;;14608:62;-1:-1:-1;;;14686:18:1;;;14679:36;14732:19;;20169:110:0::1;14355:402:1::0;20169:110:0::1;20290:28;20309:8;20290:18;:28::i;49968:174::-:0;50043:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;50043:29:0;-1:-1:-1;;;;;50043:29:0;;;;;;;;:24;;50097:23;50043:24;50097:14;:23::i;:::-;-1:-1:-1;;;;;50088:46:0;;;;;;;;;;;49968:174;;:::o;60634:424::-;60830:14;60846:15;60890:8;60865:77;;;;;;;;;;;;:::i;:::-;60829:113;;;;61024:26;61034:6;61042:7;61024:9;:26::i;:::-;60799:259;;60634:424;;;;:::o;46208:452::-;46337:4;46003:16;;;:7;:16;;;;;;-1:-1:-1;;;;;46003:16:0;46359:110;;;;-1:-1:-1;;;46359:110:0;;17315:2:1;46359:110:0;;;17297:21:1;17354:2;17334:18;;;17327:30;17393:34;17373:18;;;17366:62;-1:-1:-1;;;17444:18:1;;;17437:42;17496:19;;46359:110:0;17113:408:1;46359:110:0;46480:13;46496:23;46511:7;46496:14;:23::i;:::-;46480:39;;46549:5;-1:-1:-1;;;;;46538:16:0;:7;-1:-1:-1;;;;;46538:16:0;;:64;;;;46595:7;-1:-1:-1;;;;;46571:31:0;:20;46583:7;46571:11;:20::i;:::-;-1:-1:-1;;;;;46571:31:0;;46538:64;:113;;;-1:-1:-1;;;;;;43189:25:0;;;43160:4;43189:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;46619:32;46530:122;46208:452;-1:-1:-1;;;;46208:452:0:o;49235:615::-;49408:4;-1:-1:-1;;;;;49381:31:0;:23;49396:7;49381:14;:23::i;:::-;-1:-1:-1;;;;;49381:31:0;;49359:122;;;;-1:-1:-1;;;49359:122:0;;21442:2:1;49359:122:0;;;21424:21:1;21481:2;21461:18;;;21454:30;21520:34;21500:18;;;21493:62;-1:-1:-1;;;21571:18:1;;;21564:39;21620:19;;49359:122:0;21240:405:1;49359:122:0;-1:-1:-1;;;;;49500:16:0;;49492:65;;;;-1:-1:-1;;;49492:65:0;;15383:2:1;49492:65:0;;;15365:21:1;15422:2;15402:18;;;15395:30;15461:34;15441:18;;;15434:62;-1:-1:-1;;;15512:18:1;;;15505:34;15556:19;;49492:65:0;15181:400:1;49492:65:0;49674:29;49691:1;49695:7;49674:8;:29::i;:::-;-1:-1:-1;;;;;49716:15:0;;;;;;:9;:15;;;;;:20;;49735:1;;49716:15;:20;;49735:1;;49716:20;:::i;:::-;;;;-1:-1:-1;;;;;;;49747:13:0;;;;;;:9;:13;;;;;:18;;49764:1;;49747:13;:18;;49764:1;;49747:18;:::i;:::-;;;;-1:-1:-1;;49776:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;49776:21:0;-1:-1:-1;;;;;49776:21:0;;;;;;;;;49815:27;;49776:16;;49815:27;;;;;;;49235:615;;;:::o;47002:110::-;47078:26;47088:2;47092:7;47078:26;;;;;;;;;;;;:9;:26::i;20486:191::-;20560:16;20579:6;;-1:-1:-1;;;;;20596:17:0;;;-1:-1:-1;;;;;;20596:17:0;;;;;;20629:40;;20579:6;;;;;;;20629:40;;20560:16;20629:40;20549:128;20486:191;:::o;50284:315::-;50439:8;-1:-1:-1;;;;;50430:17:0;:5;-1:-1:-1;;;;;50430:17:0;;;50422:55;;;;-1:-1:-1;;;50422:55:0;;15788:2:1;50422:55:0;;;15770:21:1;15827:2;15807:18;;;15800:30;15866:27;15846:18;;;15839:55;15911:18;;50422:55:0;15586:349:1;50422:55:0;-1:-1:-1;;;;;50488:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;50488:46:0;;;;;;;;;;50550:41;;13026::1;;;50550::0;;12999:18:1;50550:41:0;;;;;;;50284:315;;;:::o;45249:352::-;45406:28;45416:4;45422:2;45426:7;45406:9;:28::i;:::-;45467:48;45490:4;45496:2;45500:7;45509:5;45467:22;:48::i;:::-;45445:148;;;;-1:-1:-1;;;45445:148:0;;;;;;;:::i;61066:100::-;61118:13;61151:7;61144:14;;;;;:::i;15414:723::-;15470:13;15691:10;15687:53;;-1:-1:-1;;15718:10:0;;;;;;;;;;;;-1:-1:-1;;;15718:10:0;;;;;15414:723::o;15687:53::-;15765:5;15750:12;15806:78;15813:9;;15806:78;;15839:8;;;;:::i;:::-;;-1:-1:-1;15862:10:0;;-1:-1:-1;15870:2:0;15862:10;;:::i;:::-;;;15806:78;;;15894:19;15926:6;-1:-1:-1;;;;;15916:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15916:17:0;;15894:39;;15944:154;15951:10;;15944:154;;15978:11;15988:1;15978:11;;:::i;:::-;;-1:-1:-1;16047:10:0;16055:2;16047:5;:10;:::i;:::-;16034:24;;:2;:24;:::i;:::-;16021:39;;16004:6;16011;16004:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;16004:56:0;;;;;;;;-1:-1:-1;16075:11:0;16084:2;16075:11;;:::i;:::-;;;15944:154;;48538:360;48598:13;48614:23;48629:7;48614:14;:23::i;:::-;48598:39;;48739:29;48756:1;48760:7;48739:8;:29::i;:::-;-1:-1:-1;;;;;48781:16:0;;;;;;:9;:16;;;;;:21;;48801:1;;48781:16;:21;;48801:1;;48781:21;:::i;:::-;;;;-1:-1:-1;;48820:16:0;;;;:7;:16;;;;;;48813:23;;-1:-1:-1;;;;;;48813:23:0;;;48854:36;48828:7;;48820:16;-1:-1:-1;;;;;48854:36:0;;;;;48820:16;;48854:36;48587:311;48538:360;:::o;47339:321::-;47469:18;47475:2;47479:7;47469:5;:18::i;:::-;47520:54;47551:1;47555:2;47559:7;47568:5;47520:22;:54::i;:::-;47498:154;;;;-1:-1:-1;;;47498:154:0;;;;;;;:::i;51164:980::-;51319:4;-1:-1:-1;;;;;51340:13:0;;21825:20;21873:8;51336:801;;51393:175;;-1:-1:-1;;;51393:175:0;;-1:-1:-1;;;;;51393:36:0;;;;;:175;;17962:10;;51487:4;;51514:7;;51544:5;;51393:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51393:175:0;;;;;;;;-1:-1:-1;;51393:175:0;;;;;;;;;;;;:::i;:::-;;;51372:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51751:13:0;;51747:320;;51794:108;;-1:-1:-1;;;51794:108:0;;;;;;;:::i;51747:320::-;52017:6;52011:13;52002:6;51998:2;51994:15;51987:38;51372:710;-1:-1:-1;;;;;;51632:51:0;-1:-1:-1;;;51632:51:0;;-1:-1:-1;51625:58:0;;51336:801;-1:-1:-1;52121:4:0;51164:980;;;;;;:::o;47996:313::-;-1:-1:-1;;;;;48076:16:0;;48068:61;;;;-1:-1:-1;;;48068:61:0;;19386:2:1;48068:61:0;;;19368:21:1;;;19405:18;;;19398:30;19464:34;19444:18;;;19437:62;19516:18;;48068:61:0;19184:356:1;48068:61:0;-1:-1:-1;;;;;48200:13:0;;;;;;:9;:13;;;;;:18;;48217:1;;48200:13;:18;;48217:1;;48200:18;:::i;:::-;;;;-1:-1:-1;;48229:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;48229:21:0;-1:-1:-1;;;;;48229:21:0;;;;;;;;48268:33;;48229:16;;;48268:33;;48229:16;;48268:33;47996:313;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:160::-;715:20;;771:13;;764:21;754:32;;744:60;;800:1;797;790:12;744:60;650:160;;;:::o;815:347::-;866:8;876:6;930:3;923:4;915:6;911:17;907:27;897:55;;948:1;945;938:12;897:55;-1:-1:-1;971:20:1;;-1:-1:-1;;;;;1003:30:1;;1000:50;;;1046:1;1043;1036:12;1000:50;1083:4;1075:6;1071:17;1059:29;;1135:3;1128:4;1119:6;1111;1107:19;1103:30;1100:39;1097:59;;;1152:1;1149;1142:12;1097:59;815:347;;;;;:::o;1167:220::-;1209:5;1262:3;1255:4;1247:6;1243:17;1239:27;1229:55;;1280:1;1277;1270:12;1229:55;1302:79;1377:3;1368:6;1355:20;1348:4;1340:6;1336:17;1302:79;:::i;1392:159::-;1459:20;;1519:6;1508:18;;1498:29;;1488:57;;1541:1;1538;1531:12;1556:171;1623:20;;-1:-1:-1;;;;;1672:30:1;;1662:41;;1652:69;;1717:1;1714;1707:12;1732:247;1791:6;1844:2;1832:9;1823:7;1819:23;1815:32;1812:52;;;1860:1;1857;1850:12;1812:52;1899:9;1886:23;1918:31;1943:5;1918:31;:::i;1984:320::-;2071:6;2079;2132:2;2120:9;2111:7;2107:23;2103:32;2100:52;;;2148:1;2145;2138:12;2100:52;2180:9;2174:16;2199:31;2224:5;2199:31;:::i;:::-;2294:2;2279:18;;;;2273:25;2249:5;;2273:25;;-1:-1:-1;;;1984:320:1:o;2309:388::-;2377:6;2385;2438:2;2426:9;2417:7;2413:23;2409:32;2406:52;;;2454:1;2451;2444:12;2406:52;2493:9;2480:23;2512:31;2537:5;2512:31;:::i;:::-;2562:5;-1:-1:-1;2619:2:1;2604:18;;2591:32;2632:33;2591:32;2632:33;:::i;:::-;2684:7;2674:17;;;2309:388;;;;;:::o;2702:456::-;2779:6;2787;2795;2848:2;2836:9;2827:7;2823:23;2819:32;2816:52;;;2864:1;2861;2854:12;2816:52;2903:9;2890:23;2922:31;2947:5;2922:31;:::i;:::-;2972:5;-1:-1:-1;3029:2:1;3014:18;;3001:32;3042:33;3001:32;3042:33;:::i;:::-;2702:456;;3094:7;;-1:-1:-1;;;3148:2:1;3133:18;;;;3120:32;;2702:456::o;3163:665::-;3258:6;3266;3274;3282;3335:3;3323:9;3314:7;3310:23;3306:33;3303:53;;;3352:1;3349;3342:12;3303:53;3391:9;3378:23;3410:31;3435:5;3410:31;:::i;:::-;3460:5;-1:-1:-1;3517:2:1;3502:18;;3489:32;3530:33;3489:32;3530:33;:::i;:::-;3582:7;-1:-1:-1;3636:2:1;3621:18;;3608:32;;-1:-1:-1;3691:2:1;3676:18;;3663:32;-1:-1:-1;;;;;3707:30:1;;3704:50;;;3750:1;3747;3740:12;3704:50;3773:49;3814:7;3805:6;3794:9;3790:22;3773:49;:::i;:::-;3763:59;;;3163:665;;;;;;;:::o;3833:315::-;3898:6;3906;3959:2;3947:9;3938:7;3934:23;3930:32;3927:52;;;3975:1;3972;3965:12;3927:52;4014:9;4001:23;4033:31;4058:5;4033:31;:::i;:::-;4083:5;-1:-1:-1;4107:35:1;4138:2;4123:18;;4107:35;:::i;:::-;4097:45;;3833:315;;;;;:::o;4153:::-;4221:6;4229;4282:2;4270:9;4261:7;4257:23;4253:32;4250:52;;;4298:1;4295;4288:12;4250:52;4337:9;4324:23;4356:31;4381:5;4356:31;:::i;:::-;4406:5;4458:2;4443:18;;;;4430:32;;-1:-1:-1;;;4153:315:1:o;4473:180::-;4529:6;4582:2;4570:9;4561:7;4557:23;4553:32;4550:52;;;4598:1;4595;4588:12;4550:52;4621:26;4637:9;4621:26;:::i;4658:245::-;4716:6;4769:2;4757:9;4748:7;4744:23;4740:32;4737:52;;;4785:1;4782;4775:12;4737:52;4824:9;4811:23;4843:30;4867:5;4843:30;:::i;4908:249::-;4977:6;5030:2;5018:9;5009:7;5005:23;5001:32;4998:52;;;5046:1;5043;5036:12;4998:52;5078:9;5072:16;5097:30;5121:5;5097:30;:::i;5162:450::-;5231:6;5284:2;5272:9;5263:7;5259:23;5255:32;5252:52;;;5300:1;5297;5290:12;5252:52;5340:9;5327:23;-1:-1:-1;;;;;5365:6:1;5362:30;5359:50;;;5405:1;5402;5395:12;5359:50;5428:22;;5481:4;5473:13;;5469:27;-1:-1:-1;5459:55:1;;5510:1;5507;5500:12;5459:55;5533:73;5598:7;5593:2;5580:16;5575:2;5571;5567:11;5533:73;:::i;5617:184::-;5675:6;5728:2;5716:9;5707:7;5703:23;5699:32;5696:52;;;5744:1;5741;5734:12;5696:52;5767:28;5785:9;5767:28;:::i;5806:481::-;5884:6;5892;5900;5953:2;5941:9;5932:7;5928:23;5924:32;5921:52;;;5969:1;5966;5959:12;5921:52;5992:28;6010:9;5992:28;:::i;:::-;5982:38;;6071:2;6060:9;6056:18;6043:32;-1:-1:-1;;;;;6090:6:1;6087:30;6084:50;;;6130:1;6127;6120:12;6084:50;6169:58;6219:7;6210:6;6199:9;6195:22;6169:58;:::i;:::-;5806:481;;6246:8;;-1:-1:-1;6143:84:1;;-1:-1:-1;;;;5806:481:1:o;6292:460::-;6377:6;6385;6393;6446:2;6434:9;6425:7;6421:23;6417:32;6414:52;;;6462:1;6459;6452:12;6414:52;6485:28;6503:9;6485:28;:::i;:::-;6475:38;;6564:2;6553:9;6549:18;6536:32;-1:-1:-1;;;;;6583:6:1;6580:30;6577:50;;;6623:1;6620;6613:12;6577:50;6646:49;6687:7;6678:6;6667:9;6663:22;6646:49;:::i;:::-;6636:59;;;6742:2;6731:9;6727:18;6714:32;6704:42;;6292:460;;;;;:::o;6757:773::-;6861:6;6869;6877;6885;6893;6946:3;6934:9;6925:7;6921:23;6917:33;6914:53;;;6963:1;6960;6953:12;6914:53;6986:28;7004:9;6986:28;:::i;:::-;6976:38;;7065:2;7054:9;7050:18;7037:32;-1:-1:-1;;;;;7129:2:1;7121:6;7118:14;7115:34;;;7145:1;7142;7135:12;7115:34;7168:49;7209:7;7200:6;7189:9;7185:22;7168:49;:::i;:::-;7158:59;;7236:37;7269:2;7258:9;7254:18;7236:37;:::i;:::-;7226:47;;7326:2;7315:9;7311:18;7298:32;7282:48;;7355:2;7345:8;7342:16;7339:36;;;7371:1;7368;7361:12;7339:36;;7410:60;7462:7;7451:8;7440:9;7436:24;7410:60;:::i;:::-;6757:773;;;;-1:-1:-1;6757:773:1;;-1:-1:-1;7489:8:1;;7384:86;6757:773;-1:-1:-1;;;6757:773:1:o;7535:684::-;7637:6;7645;7653;7661;7714:3;7702:9;7693:7;7689:23;7685:33;7682:53;;;7731:1;7728;7721:12;7682:53;7754:28;7772:9;7754:28;:::i;:::-;7744:38;;7833:2;7822:9;7818:18;7805:32;-1:-1:-1;;;;;7897:2:1;7889:6;7886:14;7883:34;;;7913:1;7910;7903:12;7883:34;7936:49;7977:7;7968:6;7957:9;7953:22;7936:49;:::i;:::-;7926:59;;8004:37;8037:2;8026:9;8022:18;8004:37;:::i;:::-;7994:47;;8094:2;8083:9;8079:18;8066:32;8050:48;;8123:2;8113:8;8110:16;8107:36;;;8139:1;8136;8129:12;8107:36;;8162:51;8205:7;8194:8;8183:9;8179:24;8162:51;:::i;8224:252::-;8291:6;8299;8352:2;8340:9;8331:7;8327:23;8323:32;8320:52;;;8368:1;8365;8358:12;8320:52;8391:28;8409:9;8391:28;:::i;8481:180::-;8540:6;8593:2;8581:9;8572:7;8568:23;8564:32;8561:52;;;8609:1;8606;8599:12;8561:52;-1:-1:-1;8632:23:1;;8481:180;-1:-1:-1;8481:180:1:o;8666:245::-;8745:6;8753;8806:2;8794:9;8785:7;8781:23;8777:32;8774:52;;;8822:1;8819;8812:12;8774:52;-1:-1:-1;;8845:16:1;;8901:2;8886:18;;;8880:25;8845:16;;8880:25;;-1:-1:-1;8666:245:1:o;8916:269::-;8973:6;9026:2;9014:9;9005:7;9001:23;8997:32;8994:52;;;9042:1;9039;9032:12;8994:52;9081:9;9068:23;9131:4;9124:5;9120:16;9113:5;9110:27;9100:55;;9151:1;9148;9141:12;9307:257;9348:3;9386:5;9380:12;9413:6;9408:3;9401:19;9429:63;9485:6;9478:4;9473:3;9469:14;9462:4;9455:5;9451:16;9429:63;:::i;:::-;9546:2;9525:15;-1:-1:-1;;9521:29:1;9512:39;;;;9553:4;9508:50;;9307:257;-1:-1:-1;;9307:257:1:o;9569:271::-;9752:6;9744;9739:3;9726:33;9708:3;9778:16;;9803:13;;;9778:16;9569:271;-1:-1:-1;9569:271:1:o;9845:274::-;9974:3;10012:6;10006:13;10028:53;10074:6;10069:3;10062:4;10054:6;10050:17;10028:53;:::i;:::-;10097:16;;;;;9845:274;-1:-1:-1;;9845:274:1:o;10124:811::-;10250:3;10279:1;10312:6;10306:13;10342:36;10368:9;10342:36;:::i;:::-;10397:1;10414:18;;;10441:104;;;;10559:1;10554:356;;;;10407:503;;10441:104;-1:-1:-1;;10474:24:1;;10462:37;;10519:16;;;;-1:-1:-1;10441:104:1;;10554:356;10585:6;10582:1;10575:17;10615:4;10660:2;10657:1;10647:16;10685:1;10699:165;10713:6;10710:1;10707:13;10699:165;;;10791:14;;10778:11;;;10771:35;10834:16;;;;10728:10;;10699:165;;;10703:3;;;10893:6;10888:3;10884:16;10877:23;;10407:503;-1:-1:-1;10926:3:1;;10124:811;-1:-1:-1;;;;;;10124:811:1:o;10940:470::-;11119:3;11157:6;11151:13;11173:53;11219:6;11214:3;11207:4;11199:6;11195:17;11173:53;:::i;:::-;11289:13;;11248:16;;;;11311:57;11289:13;11248:16;11345:4;11333:17;;11311:57;:::i;:::-;11384:20;;10940:470;-1:-1:-1;;;;10940:470:1:o;12114:488::-;-1:-1:-1;;;;;12383:15:1;;;12365:34;;12435:15;;12430:2;12415:18;;12408:43;12482:2;12467:18;;12460:34;;;12530:3;12525:2;12510:18;;12503:31;;;12308:4;;12551:45;;12576:19;;12568:6;12551:45;:::i;:::-;12543:53;12114:488;-1:-1:-1;;;;;;12114:488:1:o;13078:217::-;13225:2;13214:9;13207:21;13188:4;13245:44;13285:2;13274:9;13270:18;13262:6;13245:44;:::i;13936:414::-;14138:2;14120:21;;;14177:2;14157:18;;;14150:30;14216:34;14211:2;14196:18;;14189:62;-1:-1:-1;;;14282:2:1;14267:18;;14260:48;14340:3;14325:19;;13936:414::o;19958:356::-;20160:2;20142:21;;;20179:18;;;20172:30;20238:34;20233:2;20218:18;;20211:62;20305:2;20290:18;;19958:356::o;22879:413::-;23081:2;23063:21;;;23120:2;23100:18;;;23093:30;23159:34;23154:2;23139:18;;23132:62;-1:-1:-1;;;23225:2:1;23210:18;;23203:47;23282:3;23267:19;;22879:413::o;24421:640::-;24702:6;24690:19;;24672:38;;-1:-1:-1;;;;;24746:32:1;;24741:2;24726:18;;24719:60;24766:3;24810:2;24795:18;;24788:31;;;-1:-1:-1;;24842:45:1;;24867:19;;24859:6;24842:45;:::i;:::-;24937:6;24930:14;24923:22;24918:2;24907:9;24903:18;24896:50;24995:9;24987:6;24983:22;24977:3;24966:9;24962:19;24955:51;25023:32;25048:6;25040;25023:32;:::i;:::-;25015:40;24421:640;-1:-1:-1;;;;;;;;24421:640:1:o;25066:717::-;25333:6;25325;25321:19;25310:9;25303:38;25377:3;25372:2;25361:9;25357:18;25350:31;25284:4;25404:45;25444:3;25433:9;25429:19;25421:6;25404:45;:::i;:::-;-1:-1:-1;;;;;25489:6:1;25485:31;25480:2;25469:9;25465:18;25458:59;25565:9;25557:6;25553:22;25548:2;25537:9;25533:18;25526:50;25600:6;25592;25585:22;25654:6;25646;25641:2;25633:6;25629:15;25616:45;25707:1;25702:2;25693:6;25685;25681:19;25677:28;25670:39;25774:2;25767;25763:7;25758:2;25750:6;25746:15;25742:29;25734:6;25730:42;25726:51;25718:59;;;25066:717;;;;;;;;:::o;25788:555::-;26045:6;26037;26033:19;26022:9;26015:38;26089:3;26084:2;26073:9;26069:18;26062:31;25996:4;26116:45;26156:3;26145:9;26141:19;26133:6;26116:45;:::i;:::-;-1:-1:-1;;;;;26201:6:1;26197:31;26192:2;26181:9;26177:18;26170:59;26277:9;26269:6;26265:22;26260:2;26249:9;26245:18;26238:50;26305:32;26330:6;26322;26305:32;:::i;:::-;26297:40;25788:555;-1:-1:-1;;;;;;;25788:555:1:o;26348:1498::-;26694:6;26686;26682:19;26671:9;26664:38;26645:4;26721:2;26759:3;26754:2;26743:9;26739:18;26732:31;26783:1;26816:6;26810:13;26846:36;26872:9;26846:36;:::i;:::-;26919:6;26913:3;26902:9;26898:19;26891:35;26945:3;26967:1;26999:2;26988:9;26984:18;27016:1;27011:122;;;;27147:1;27142:354;;;;26977:519;;27011:122;-1:-1:-1;;27059:24:1;;27039:18;;;27032:52;27119:3;27104:19;;;-1:-1:-1;27011:122:1;;27142:354;27173:6;27170:1;27163:17;27221:2;27218:1;27208:16;27246:1;27260:180;27274:6;27271:1;27268:13;27260:180;;;27367:14;;27343:17;;;27339:26;;27332:50;27410:16;;;;27289:10;;27260:180;;;27464:17;;27460:26;;;-1:-1:-1;;26977:519:1;;;;;;27541:9;27536:3;27532:19;27527:2;27516:9;27512:18;27505:47;27575:29;27600:3;27592:6;27575:29;:::i;:::-;27561:43;;;27613:54;27663:2;27652:9;27648:18;27640:6;-1:-1:-1;;;;;9264:31:1;9252:44;;9190:112;27613:54;-1:-1:-1;;;;;9264:31:1;;27726:3;27711:19;;9252:44;27780:9;27772:6;27768:22;27762:3;27751:9;27747:19;27740:51;27808:32;27833:6;27825;27808:32;:::i;:::-;27800:40;26348:1498;-1:-1:-1;;;;;;;;;26348:1498:1:o;28286:128::-;28326:3;28357:1;28353:6;28350:1;28347:13;28344:39;;;28363:18;;:::i;:::-;-1:-1:-1;28399:9:1;;28286:128::o;28419:120::-;28459:1;28485;28475:35;;28490:18;;:::i;:::-;-1:-1:-1;28524:9:1;;28419:120::o;28544:125::-;28584:4;28612:1;28609;28606:8;28603:34;;;28617:18;;:::i;:::-;-1:-1:-1;28654:9:1;;28544:125::o;28674:258::-;28746:1;28756:113;28770:6;28767:1;28764:13;28756:113;;;28846:11;;;28840:18;28827:11;;;28820:39;28792:2;28785:10;28756:113;;;28887:6;28884:1;28881:13;28878:48;;;-1:-1:-1;;28922:1:1;28904:16;;28897:27;28674:258::o;28937:380::-;29016:1;29012:12;;;;29059;;;29080:61;;29134:4;29126:6;29122:17;29112:27;;29080:61;29187:2;29179:6;29176:14;29156:18;29153:38;29150:161;;;29233:10;29228:3;29224:20;29221:1;29214:31;29268:4;29265:1;29258:15;29296:4;29293:1;29286:15;29150:161;;28937:380;;;:::o;29322:135::-;29361:3;-1:-1:-1;;29382:17:1;;29379:43;;;29402:18;;:::i;:::-;-1:-1:-1;29449:1:1;29438:13;;29322:135::o;29462:112::-;29494:1;29520;29510:35;;29525:18;;:::i;:::-;-1:-1:-1;29559:9:1;;29462:112::o;29579:127::-;29640:10;29635:3;29631:20;29628:1;29621:31;29671:4;29668:1;29661:15;29695:4;29692:1;29685:15;29711:127;29772:10;29767:3;29763:20;29760:1;29753:31;29803:4;29800:1;29793:15;29827:4;29824:1;29817:15;29843:127;29904:10;29899:3;29895:20;29892:1;29885:31;29935:4;29932:1;29925:15;29959:4;29956:1;29949:15;29975:127;30036:10;30031:3;30027:20;30024:1;30017:31;30067:4;30064:1;30057:15;30091:4;30088:1;30081:15;30107:131;-1:-1:-1;;;;;30182:31:1;;30172:42;;30162:70;;30228:1;30225;30218:12;30243:131;-1:-1:-1;;;;;;30317:32:1;;30307:43;;30297:71;;30364:1;30361;30354:12

Swarm Source

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