ETH Price: $3,807.06 (+1.21%)
Gas: 16 Gwei

Token

Benji Bananas ()
 

Overview

Max Total Supply

5,000

Holders

2,963

Market

Volume (24H)

0.0076 ETH

Min Price (24H)

$28.93 @ 0.007600 ETH

Max Price (24H)

$28.93 @ 0.007600 ETH
0xea19fd8976141f85a66f77a224a32618c1f57cae
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Benji Bananas is a free-to-play mobile game from Animoca Brands available for download on the App Store and Google Play.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BenjiBananasMembershipPassNFT

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-14
*/

// Sources flattened with hardhat v2.6.4 https://hardhat.org

// File contracts/token/erc1155/BenjiBananasMembershipPassNFT.sol

/**
 *Submitted for verification at Etherscan.io on 2021-10-12
 */

// Sources flattened with hardhat v2.6.5 https://hardhat.org

// File @animoca/ethereum-contracts-core-1.1.2/contracts/metatx/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity >=0.7.6 <0.8.0;

/*
 * 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.
 */
abstract contract ManagedIdentity {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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

// File @animoca/ethereum-contracts-core-1.1.2/contracts/access/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC-173 Contract Ownership Standard
 * Note: the ERC-165 identifier for this interface is 0x7f5828d0
 */
interface IERC173 {
    /**
     * Event emited when ownership of a contract changes.
     * @param previousOwner the previous owner.
     * @param newOwner the new owner.
     */
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * Get the address of the owner
     * @return The address of the owner.
     */
    function owner() external view returns (address);

    /**
     * Set the address of the new owner of the contract
     * Set newOwner to address(0) to renounce any ownership.
     * @dev Emits an {OwnershipTransferred} event.
     * @param newOwner The address of the new owner of the contract. Using the zero address means renouncing ownership.
     */
    function transferOwnership(address newOwner) external;
}

// File @animoca/ethereum-contracts-core-1.1.2/contracts/access/[email protected]

pragma solidity >=0.7.6 <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 ManagedIdentity, IERC173 {
    address internal _owner;

    /**
     * Initializes the contract, setting the deployer as the initial owner.
     * @dev Emits an {IERC173-OwnershipTransferred(address,address)} event.
     */
    constructor(address owner_) {
        _owner = owner_;
        emit OwnershipTransferred(address(0), owner_);
    }

    /**
     * Gets the address of the current contract owner.
     */
    function owner() public view virtual override returns (address) {
        return _owner;
    }

    /**
     * See {IERC173-transferOwnership(address)}
     * @dev Reverts if the sender is not the current contract owner.
     * @param newOwner the address of the new owner. Use the zero address to renounce the ownership.
     */
    function transferOwnership(address newOwner) public virtual override {
        _requireOwnership(_msgSender());
        _owner = newOwner;
        emit OwnershipTransferred(_owner, newOwner);
    }

    /**
     * @dev Reverts if `account` is not the contract owner.
     * @param account the account to test.
     */
    function _requireOwnership(address account) internal virtual {
        require(account == this.owner(), "Ownable: not the owner");
    }
}

// File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/types/[email protected]

// Partially derived from OpenZeppelin:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/406c83649bd6169fc1b578e08506d78f0873b276/contracts/utils/Address.sol

pragma solidity >=0.7.6 <0.8.0;

/**
 * @dev Upgrades the address type to check if it is a contract.
 */
library AddressIsContract {
    /**
     * @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;
    }
}

// File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20Wrapper
 * Wraps ERC20 functions to support non-standard implementations which do not return a bool value.
 * Calls to the wrapped functions revert only if they throw or if they return false.
 */
library ERC20Wrapper {
    using AddressIsContract for address;

    function wrappedTransfer(
        IWrappedERC20 token,
        address to,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function wrappedTransferFrom(
        IWrappedERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function wrappedApprove(
        IWrappedERC20 token,
        address spender,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function _callWithOptionalReturnData(IWrappedERC20 token, bytes memory callData) internal {
        address target = address(token);
        require(target.isContract(), "ERC20Wrapper: non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = target.call(callData);
        if (success) {
            if (data.length != 0) {
                require(abi.decode(data, (bool)), "ERC20Wrapper: operation failed");
            }
        } else {
            // revert using a standard revert message
            if (data.length == 0) {
                revert("ERC20Wrapper: operation failed");
            }

            // revert using the revert message coming from the call
            assembly {
                let size := mload(data)
                revert(add(32, data), size)
            }
        }
    }
}

interface IWrappedERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);
}

// File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/[email protected]

pragma solidity >=0.7.6 <0.8.0;

abstract contract Recoverable is ManagedIdentity, Ownable {
    using ERC20Wrapper for IWrappedERC20;

    /**
     * Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.
     * Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens
     * so that the extraction is limited to only amounts sent accidentally.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `accounts`, `tokens` and `amounts` do not have the same length.
     * @dev Reverts if one of `tokens` is does not implement the ERC20 transfer function.
     * @dev Reverts if one of the ERC20 transfers fail for any reason.
     * @param accounts the list of accounts to transfer the tokens to.
     * @param tokens the list of ERC20 token addresses.
     * @param amounts the list of token amounts to transfer.
     */
    function recoverERC20s(
        address[] calldata accounts,
        address[] calldata tokens,
        uint256[] calldata amounts
    ) external virtual {
        _requireOwnership(_msgSender());
        uint256 length = accounts.length;
        require(length == tokens.length && length == amounts.length, "Recov: inconsistent arrays");
        for (uint256 i = 0; i != length; ++i) {
            IWrappedERC20(tokens[i]).wrappedTransfer(accounts[i], amounts[i]);
        }
    }

    /**
     * Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.
     * Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens
     * so that the extraction is limited to only tokens sent accidentally.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `accounts`, `contracts` and `amounts` do not have the same length.
     * @dev Reverts if one of `contracts` is does not implement the ERC721 transferFrom function.
     * @dev Reverts if one of the ERC721 transfers fail for any reason.
     * @param accounts the list of accounts to transfer the tokens to.
     * @param contracts the list of ERC721 contract addresses.
     * @param tokenIds the list of token ids to transfer.
     */
    function recoverERC721s(
        address[] calldata accounts,
        address[] calldata contracts,
        uint256[] calldata tokenIds
    ) external virtual {
        _requireOwnership(_msgSender());
        uint256 length = accounts.length;
        require(length == contracts.length && length == tokenIds.length, "Recov: inconsistent arrays");
        for (uint256 i = 0; i != length; ++i) {
            IRecoverableERC721(contracts[i]).transferFrom(address(this), accounts[i], tokenIds[i]);
        }
    }
}

interface IRecoverableERC721 {
    /// See {IERC721-transferFrom(address,address,uint256)}
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
}

// File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

abstract contract UsingAppendedCallData {
    function _lastAppendedDataAsSender() internal pure virtual returns (address payable sender) {
        // Copied from openzeppelin : https://github.com/OpenZeppelin/openzeppelin-contracts/blob/9d5f77db9da0604ce0b25148898a94ae2c20d70f/contracts/metatx/ERC2771Context.sol1
        // The assembly code is more direct than the Solidity version using `abi.decode`.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            sender := shr(96, calldataload(sub(calldatasize(), 20)))
        }
    }

    function _msgDataAssuming20BytesAppendedData() internal pure virtual returns (bytes calldata) {
        return msg.data[:msg.data.length - 20];
    }
}

// File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

interface IERC2771 {
    function isTrustedForwarder(address forwarder) external view returns (bool);
}

// File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

interface IForwarderRegistry {
    function isForwarderFor(address, address) external view returns (bool);
}

// File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

abstract contract UsingUniversalForwarding is UsingAppendedCallData, IERC2771 {
    IForwarderRegistry internal immutable _forwarderRegistry;
    address internal immutable _universalForwarder;

    constructor(IForwarderRegistry forwarderRegistry, address universalForwarder) {
        _universalForwarder = universalForwarder;
        _forwarderRegistry = forwarderRegistry;
    }

    function isTrustedForwarder(address forwarder) external view virtual override returns (bool) {
        return forwarder == _universalForwarder || forwarder == address(_forwarderRegistry);
    }

    function _msgSender() internal view virtual returns (address payable) {
        address payable msgSender = msg.sender;
        address payable sender = _lastAppendedDataAsSender();
        if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) {
            // if forwarder use appended data
            return sender;
        }

        // if msg.sender is neither the registry nor the universal forwarder,
        // we have to check the last 20bytes of the call data intepreted as an address
        // and check if the msg.sender was registered as forewarder for that address
        // we check tx.origin to save gas in case where msg.sender == tx.origin
        // solhint-disable-next-line avoid-tx-origin
        if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(sender, msgSender)) {
            return sender;
        }

        return msgSender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        address payable msgSender = msg.sender;
        if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) {
            // if forwarder use appended data
            return _msgDataAssuming20BytesAppendedData();
        }

        // we check tx.origin to save gas in case where msg.sender == tx.origin
        // solhint-disable-next-line avoid-tx-origin
        if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(_lastAppendedDataAsSender(), msgSender)) {
            return _msgDataAssuming20BytesAppendedData();
        }
        return msg.data;
    }
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Inventory. optional extension: Burnable.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.
 */
interface IERC1155InventoryBurnable {
    /**
     * Burns some token.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `id` does not represent a token.
     * @dev Reverts if `id` represents a Fungible Token and `value` is 0.
     * @dev Reverts if `id` represents a Fungible Token and `value` is higher than `from`'s balance.
     * @dev Reverts if `id` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if `id` represents a Non-Fungible Token which is not owned by `from`.
     * @dev Emits an {IERC1155-TransferSingle} event.
     * @param from Address of the current token owner.
     * @param id Identifier of the token to burn.
     * @param value Amount of token to burn.
     */
    function burnFrom(
        address from,
        uint256 id,
        uint256 value
    ) external;

    /**
     * Burns multiple tokens.
     * @dev Reverts if `ids` and `values` have different lengths.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if one of `ids` does not represent a token.
     * @dev Reverts if one of `ids` represents a Fungible Token and `value` is 0.
     * @dev Reverts if one of `ids` represents a Fungible Token and `value` is higher than `from`'s balance.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token which is not owned by `from`.
     * @dev Emits an {IERC1155-TransferBatch} event.
     * @param from Address of the current tokens owner.
     * @param ids Identifiers of the tokens to burn.
     * @param values Amounts of tokens to burn.
     */
    function batchBurnFrom(
        address from,
        uint256[] calldata ids,
        uint256[] calldata values
    ) external;
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155InventoryIdentifiersLib, a library to introspect inventory identifiers.
 * @dev With N=32, representing the Non-Fungible Collection mask length, identifiers are represented as follow:
 * (a) a Fungible Token:
 *     - most significant bit == 0
 * (b) a Non-Fungible Collection:
 *     - most significant bit == 1
 *     - (256-N) least significant bits == 0
 * (c) a Non-Fungible Token:
 *     - most significant bit == 1
 *     - (256-N) least significant bits != 0
 */
library ERC1155InventoryIdentifiersLib {
    // Non-Fungible bit. If an id has this bit set, it is a Non-Fungible (either Collection or Token)
    uint256 internal constant _NF_BIT = 1 << 255;

    // Mask for Non-Fungible Collection (including the nf bit)
    uint256 internal constant _NF_COLLECTION_MASK = uint256(type(uint32).max) << 224;
    uint256 internal constant _NF_TOKEN_MASK = ~_NF_COLLECTION_MASK;

    function isFungibleToken(uint256 id) internal pure returns (bool) {
        return id & _NF_BIT == 0;
    }

    function isNonFungibleToken(uint256 id) internal pure returns (bool) {
        return id & _NF_BIT != 0 && id & _NF_TOKEN_MASK != 0;
    }

    function getNonFungibleCollection(uint256 nftId) internal pure returns (uint256) {
        return nftId & _NF_COLLECTION_MASK;
    }
}

// File @animoca/ethereum-contracts-core-1.1.2/contracts/introspection/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165.
 */
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 @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Multi Token Standard, basic interface.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.
 */
interface IERC1155 {
    event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value);

    event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values);

    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    event URI(string _value, uint256 indexed _id);

    /**
     * Safely transfers some token.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `from` has an insufficient balance.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155received} fails or is refused.
     * @dev Emits a `TransferSingle` event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param id Identifier of the token to transfer.
     * @param value Amount of token to transfer.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external;

    /**
     * Safely transfers a batch of tokens.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `ids` and `values` have different lengths.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `from` has an insufficient balance for any of `ids`.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused.
     * @dev Emits a `TransferBatch` event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param ids Identifiers of the tokens to transfer.
     * @param values Amounts of tokens to transfer.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external;

    /**
     * Retrieves the balance of `id` owned by account `owner`.
     * @param owner The account to retrieve the balance of.
     * @param id The identifier to retrieve the balance of.
     * @return The balance of `id` owned by account `owner`.
     */
    function balanceOf(address owner, uint256 id) external view returns (uint256);

    /**
     * Retrieves the balances of `ids` owned by accounts `owners`. For each pair:
     * @dev Reverts if `owners` and `ids` have different lengths.
     * @param owners The addresses of the token holders
     * @param ids The identifiers to retrieve the balance of.
     * @return The balances of `ids` owned by accounts `owners`.
     */
    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory);

    /**
     * Enables or disables an operator's approval.
     * @dev Emits an `ApprovalForAll` event.
     * @param operator Address of the operator.
     * @param approved True to approve the operator, false to revoke an approval.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * Retrieves the approval status of an operator for a given owner.
     * @param owner Address of the authorisation giver.
     * @param operator Address of the operator.
     * @return True if the operator is approved, false if not.
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Multi Token Standard, optional extension: Inventory.
 * Interface for Fungible/Non-Fungible Tokens management on an ERC1155 contract.
 * @dev See https://eips.ethereum.org/EIPS/eip-xxxx
 * @dev Note: The ERC-165 identifier for this interface is 0x09ce5c46.
 */
interface IERC1155InventoryFunctions {
    function ownerOf(uint256 nftId) external view returns (address);

    function isFungible(uint256 id) external view returns (bool);

    function collectionOf(uint256 nftId) external view returns (uint256);
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Multi Token Standard, optional extension: Inventory.
 * Interface for Fungible/Non-Fungible Tokens management on an ERC1155 contract.
 *
 * This interface rationalizes the co-existence of Fungible and Non-Fungible Tokens
 * within the same contract. As several kinds of Fungible Tokens can be managed under
 * the Multi-Token standard, we consider that Non-Fungible Tokens can be classified
 * under their own specific type. We introduce the concept of Non-Fungible Collection
 * and consider the usage of 3 types of identifiers:
 * (a) Fungible Token identifiers, each representing a set of Fungible Tokens,
 * (b) Non-Fungible Collection identifiers, each representing a set of Non-Fungible Tokens (this is not a token),
 * (c) Non-Fungible Token identifiers.
 *
 * Identifiers nature
 * |       Type                | isFungible  | isCollection | isToken |
 * |  Fungible Token           |   true      |     true     |  true   |
 * |  Non-Fungible Collection  |   false     |     true     |  false  |
 * |  Non-Fungible Token       |   false     |     false    |  true   |
 *
 * Identifiers compatibilities
 * |       Type                |  transfer  |   balance    |   supply    |  owner  |
 * |  Fungible Token           |    OK      |     OK       |     OK      |   NOK   |
 * |  Non-Fungible Collection  |    NOK     |     OK       |     OK      |   NOK   |
 * |  Non-Fungible Token       |    OK      |   0 or 1     |   0 or 1    |   OK    |
 *
 * @dev See https://eips.ethereum.org/EIPS/eip-xxxx
 * @dev Note: The ERC-165 identifier for this interface is 0x09ce5c46.
 */
interface IERC1155Inventory is IERC1155, IERC1155InventoryFunctions {
    //================================================== ERC1155Inventory ===================================================//
    /**
     * Optional event emitted when a collection (Fungible Token or Non-Fungible Collection) is created.
     *  This event can be used by a client application to determine which identifiers are meaningful
     *  to track through the functions `balanceOf`, `balanceOfBatch` and `totalSupply`.
     * @dev This event MUST NOT be emitted twice for the same `collectionId`.
     */
    event CollectionCreated(uint256 indexed collectionId, bool indexed fungible);

    /**
     * Retrieves the owner of a Non-Fungible Token (ERC721-compatible).
     * @dev Reverts if `nftId` is owned by the zero address.
     * @param nftId Identifier of the token to query.
     * @return Address of the current owner of the token.
     */
    function ownerOf(uint256 nftId) external view override returns (address);

    /**
     * Introspects whether or not `id` represents a Fungible Token.
     *  This function MUST return true even for a Fungible Token which is not-yet created.
     * @param id The identifier to query.
     * @return bool True if `id` represents aFungible Token, false otherwise.
     */
    function isFungible(uint256 id) external view override returns (bool);

    /**
     * Introspects the Non-Fungible Collection to which `nftId` belongs.
     * @dev This function MUST return a value representing a Non-Fungible Collection.
     * @dev This function MUST return a value for a non-existing token, and SHOULD NOT be used to check the existence of a Non-Fungible Token.
     * @dev Reverts if `nftId` does not represent a Non-Fungible Token.
     * @param nftId The token identifier to query the collection of.
     * @return The Non-Fungible Collection identifier to which `nftId` belongs.
     */
    function collectionOf(uint256 nftId) external view override returns (uint256);

    //======================================================= ERC1155 =======================================================//

    /**
     * Retrieves the balance of `id` owned by account `owner`.
     * @param owner The account to retrieve the balance of.
     * @param id The identifier to retrieve the balance of.
     * @return
     *  If `id` represents a collection (Fungible Token or Non-Fungible Collection), the balance for this collection.
     *  If `id` represents a Non-Fungible Token, 1 if the token is owned by `owner`, else 0.
     */
    function balanceOf(address owner, uint256 id) external view override returns (uint256);

    /**
     * Retrieves the balances of `ids` owned by accounts `owners`.
     * @dev Reverts if `owners` and `ids` have different lengths.
     * @param owners The accounts to retrieve the balances of.
     * @param ids The identifiers to retrieve the balances of.
     * @return An array of elements such as for each pair `id`/`owner`:
     *  If `id` represents a collection (Fungible Token or Non-Fungible Collection), the balance for this collection.
     *  If `id` represents a Non-Fungible Token, 1 if the token is owned by `owner`, else 0.
     */
    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view override returns (uint256[] memory);

    /**
     * Safely transfers some token.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `id` does not represent a token.
     * @dev Reverts if `id` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if `id` represents a Non-Fungible Token and is not owned by `from`.
     * @dev Reverts if `id` represents a Fungible Token and `value` is 0.
     * @dev Reverts if `id` represents a Fungible Token and `from` has an insufficient balance.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155received} fails or is refused.
     * @dev Emits an {IERC1155-TransferSingle} event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param id Identifier of the token to transfer.
     * @param value Amount of token to transfer.
     * @param data Optional data to pass to the receiver contract.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external override;

    /**
     * @notice this documentation overrides its {IERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.
     * Safely transfers a batch of tokens.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if one of `ids` does not represent a token.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token and is not owned by `from`.
     * @dev Reverts if one of `ids` represents a Fungible Token and `value` is 0.
     * @dev Reverts if one of `ids` represents a Fungible Token and `from` has an insufficient balance.
     * @dev Reverts if one of `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused.
     * @dev Emits an {IERC1155-TransferBatch} event.
     * @param from Current tokens owner.
     * @param to Address of the new tokens owner.
     * @param ids Identifiers of the tokens to transfer.
     * @param values Amounts of tokens to transfer.
     * @param data Optional data to pass to the receiver contract.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external override;
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Multi Token Standard, optional extension: Metadata URI.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.
 */
interface IERC1155MetadataURI {
    /**
     * @notice A distinct Uniform Resource Identifier (URI) for a given token.
     * @dev URIs are defined in RFC 3986.
     * @dev The URI MUST point to a JSON file that conforms to the "ERC1155 Metadata URI JSON Schema".
     * @dev The uri function SHOULD be used to retrieve values if no event was emitted.
     * @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.
     * @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for
     *  an implementation to return a valid string even if the token does not exist.
     * @return URI string
     */
    function uri(uint256 id) external view returns (string memory);
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Inventory, optional extension: Total Supply.
 * @dev See https://eips.ethereum.org/EIPS/eip-xxxx
 * @dev Note: The ERC-165 identifier for this interface is 0xbd85b039.
 */
interface IERC1155InventoryTotalSupply {
    /**
     * Retrieves the total supply of `id`.
     * @param id The identifier for which to retrieve the supply of.
     * @return
     *  If `id` represents a collection (Fungible Token or Non-Fungible Collection), the total supply for this collection.
     *  If `id` represents a Non-Fungible Token, 1 if the token exists, else 0.
     */
    function totalSupply(uint256 id) external view returns (uint256);
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Multi Token Standard, Tokens Receiver.
 * Interface for any contract that wants to support transfers from ERC1155 asset contracts.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.
 */
interface IERC1155TokenReceiver {
    /**
     * @notice Handle the receipt of a single ERC1155 token type.
     * An ERC1155 contract MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.
     * This function MUST return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     *  (i.e. 0xf23a6e61) to accept the transfer.
     * Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
     * @param operator  The address which initiated the transfer (i.e. msg.sender)
     * @param from      The address which previously owned the token
     * @param id        The ID of the token being transferred
     * @param value     The amount of tokens being transferred
     * @param data      Additional data with no specified format
     * @return bytes4   `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @notice Handle the receipt of multiple ERC1155 token types.
     * An ERC1155 contract MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.
     * This function MUST return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     *  (i.e. 0xbc197c81) if to accept the transfer(s).
     * Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
     * @param operator  The address which initiated the batch transfer (i.e. msg.sender)
     * @param from      The address which previously owned the token
     * @param ids       An array containing ids of each token being transferred (order and length must match _values array)
     * @param values    An array containing amounts of each token being transferred (order and length must match _ids array)
     * @param data      Additional data with no specified format
     * @return          `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Inventory Base.
 * @dev The functions `safeTransferFrom(address,address,uint256,uint256,bytes)`
 *  and `safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)` need to be implemented by a child contract.
 * @dev The function `uri(uint256)` needs to be implemented by a child contract, for example with the help of `BaseMetadataURI`.
 */
abstract contract ERC1155InventoryBase is ManagedIdentity, IERC165, IERC1155Inventory, IERC1155MetadataURI, IERC1155InventoryTotalSupply {
    using ERC1155InventoryIdentifiersLib for uint256;

    // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))
    bytes4 internal constant _ERC1155_RECEIVED = 0xf23a6e61;

    // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
    bytes4 internal constant _ERC1155_BATCH_RECEIVED = 0xbc197c81;

    // Burnt Non-Fungible Token owner's magic value
    uint256 internal constant _BURNT_NFT_OWNER = 0xdead000000000000000000000000000000000000000000000000000000000000;

    /* owner => operator => approved */
    mapping(address => mapping(address => bool)) internal _operators;

    /* collection ID => owner => balance */
    mapping(uint256 => mapping(address => uint256)) internal _balances;

    /* collection ID => supply */
    mapping(uint256 => uint256) internal _supplies;

    /* NFT ID => owner */
    mapping(uint256 => uint256) internal _owners;

    /* collection ID => creator */
    mapping(uint256 => address) internal _creators;

    //======================================================= ERC165 ========================================================//

    /// @inheritdoc IERC165
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return
            interfaceId == type(IERC165).interfaceId ||
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            interfaceId == type(IERC1155InventoryFunctions).interfaceId ||
            interfaceId == type(IERC1155InventoryTotalSupply).interfaceId;
    }

    //======================================================= ERC1155 =======================================================//

    /// @inheritdoc IERC1155Inventory
    function balanceOf(address owner, uint256 id) public view virtual override returns (uint256) {
        require(owner != address(0), "Inventory: zero address");

        if (id.isNonFungibleToken()) {
            return address(uint160(_owners[id])) == owner ? 1 : 0;
        }

        return _balances[id][owner];
    }

    /// @inheritdoc IERC1155Inventory
    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual override returns (uint256[] memory) {
        require(owners.length == ids.length, "Inventory: inconsistent arrays");

        uint256[] memory balances = new uint256[](owners.length);

        for (uint256 i = 0; i != owners.length; ++i) {
            balances[i] = balanceOf(owners[i], ids[i]);
        }

        return balances;
    }

    /// @inheritdoc IERC1155
    function setApprovalForAll(address operator, bool approved) public virtual override {
        address sender = _msgSender();
        require(operator != sender, "Inventory: self-approval");
        _operators[sender][operator] = approved;
        emit ApprovalForAll(sender, operator, approved);
    }

    /// @inheritdoc IERC1155
    function isApprovedForAll(address tokenOwner, address operator) public view virtual override returns (bool) {
        return _operators[tokenOwner][operator];
    }

    //================================================== ERC1155Inventory ===================================================//

    /// @inheritdoc IERC1155Inventory
    function isFungible(uint256 id) external pure virtual override returns (bool) {
        return id.isFungibleToken();
    }

    /// @inheritdoc IERC1155Inventory
    function collectionOf(uint256 nftId) external pure virtual override returns (uint256) {
        require(nftId.isNonFungibleToken(), "Inventory: not an NFT");
        return nftId.getNonFungibleCollection();
    }

    /// @inheritdoc IERC1155Inventory
    function ownerOf(uint256 nftId) public view virtual override returns (address) {
        address owner = address(uint160(_owners[nftId]));
        require(owner != address(0), "Inventory: non-existing NFT");
        return owner;
    }

    //============================================= ERC1155InventoryTotalSupply =============================================//

    /// @inheritdoc IERC1155InventoryTotalSupply
    function totalSupply(uint256 id) external view virtual override returns (uint256) {
        if (id.isNonFungibleToken()) {
            return address(uint160(_owners[id])) == address(0) ? 0 : 1;
        } else {
            return _supplies[id];
        }
    }

    //============================================ High-level Internal Functions ============================================//

    /**
     * Creates a collection (optional).
     * @dev Reverts if `collectionId` does not represent a collection.
     * @dev Reverts if `collectionId` has already been created.
     * @dev Emits a {IERC1155Inventory-CollectionCreated} event.
     * @param collectionId Identifier of the collection.
     */
    function _createCollection(uint256 collectionId) internal virtual {
        require(!collectionId.isNonFungibleToken(), "Inventory: not a collection");
        require(_creators[collectionId] == address(0), "Inventory: existing collection");
        _creators[collectionId] = _msgSender();
        emit CollectionCreated(collectionId, collectionId.isFungibleToken());
    }

    function _creator(uint256 collectionId) internal view virtual returns (address) {
        require(!collectionId.isNonFungibleToken(), "Inventory: not a collection");
        return _creators[collectionId];
    }

    //============================================== Helper Internal Functions ==============================================//

    /**
     * Returns whether `sender` is authorised to make a transfer on behalf of `from`.
     * @param from The address to check operatibility upon.
     * @param sender The sender address.
     * @return True if sender is `from` or an operator for `from`, false otherwise.
     */
    function _isOperatable(address from, address sender) internal view virtual returns (bool) {
        return (from == sender) || _operators[from][sender];
    }

    /**
     * Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.
     * @dev Reverts if `to` is not a contract.
     * @dev Reverts if the call to the target fails or is refused.
     * @param from Previous token owner.
     * @param to New token owner.
     * @param id Identifier of the token transferred.
     * @param value Amount of token transferred.
     * @param data Optional data to send along with the receiver contract call.
     */
    function _callOnERC1155Received(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) internal {
        require(IERC1155TokenReceiver(to).onERC1155Received(_msgSender(), from, id, value, data) == _ERC1155_RECEIVED, "Inventory: transfer refused");
    }

    /**
     * Calls {IERC1155TokenReceiver-onERC1155batchReceived} on a target contract.
     * @dev Reverts if `to` is not a contract.
     * @dev Reverts if the call to the target fails or is refused.
     * @param from Previous tokens owner.
     * @param to New tokens owner.
     * @param ids Identifiers of the tokens to transfer.
     * @param values Amounts of tokens to transfer.
     * @param data Optional data to send along with the receiver contract call.
     */
    function _callOnERC1155BatchReceived(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) internal {
        require(
            IERC1155TokenReceiver(to).onERC1155BatchReceived(_msgSender(), from, ids, values, data) == _ERC1155_BATCH_RECEIVED,
            "Inventory: transfer refused"
        );
    }
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

// solhint-disable-next-line max-line-length

/**
 * @title ERC1155Inventory, a contract which manages up to multiple Collections of Fungible and Non-Fungible Tokens.
 * @dev The function `uri(uint256)` needs to be implemented by a child contract, for example with the help of `BaseMetadataURI`.
 */
abstract contract ERC1155Inventory is ERC1155InventoryBase {
    using AddressIsContract for address;
    using ERC1155InventoryIdentifiersLib for uint256;

    //======================================================= ERC1155 =======================================================//

    /// @inheritdoc IERC1155Inventory
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) public virtual override {
        address sender = _msgSender();
        require(to != address(0), "Inventory: transfer to zero");
        require(_isOperatable(from, sender), "Inventory: non-approved sender");

        if (id.isFungibleToken()) {
            _transferFungible(from, to, id, value);
        } else if (id.isNonFungibleToken()) {
            _transferNFT(from, to, id, value, false);
        } else {
            revert("Inventory: not a token id");
        }

        emit TransferSingle(sender, from, to, id, value);
        if (to.isContract()) {
            _callOnERC1155Received(from, to, id, value, data);
        }
    }

    /// @inheritdoc IERC1155Inventory
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) public virtual override {
        // internal function to avoid stack too deep error
        _safeBatchTransferFrom(from, to, ids, values, data);
    }

    //============================================ High-level Internal Functions ============================================//

    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) internal {
        require(to != address(0), "Inventory: transfer to zero");
        uint256 length = ids.length;
        require(length == values.length, "Inventory: inconsistent arrays");
        address sender = _msgSender();
        require(_isOperatable(from, sender), "Inventory: non-approved sender");

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 id = ids[i];
            uint256 value = values[i];
            if (id.isFungibleToken()) {
                _transferFungible(from, to, id, value);
            } else if (id.isNonFungibleToken()) {
                _transferNFT(from, to, id, value, true);
                uint256 nextCollectionId = id.getNonFungibleCollection();
                if (nfCollectionId == 0) {
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    if (nextCollectionId != nfCollectionId) {
                        _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount);
                        nfCollectionId = nextCollectionId;
                        nfCollectionCount = 1;
                    } else {
                        ++nfCollectionCount;
                    }
                }
            } else {
                revert("Inventory: not a token id");
            }
        }

        if (nfCollectionId != 0) {
            _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount);
        }

        emit TransferBatch(sender, from, to, ids, values);
        if (to.isContract()) {
            _callOnERC1155BatchReceived(from, to, ids, values, data);
        }
    }

    function _safeMint(
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) internal {
        require(to != address(0), "Inventory: mint to zero");

        if (id.isFungibleToken()) {
            _mintFungible(to, id, value);
        } else if (id.isNonFungibleToken()) {
            _mintNFT(to, id, value, false);
        } else {
            revert("Inventory: not a token id");
        }

        emit TransferSingle(_msgSender(), address(0), to, id, value);
        if (to.isContract()) {
            _callOnERC1155Received(address(0), to, id, value, data);
        }
    }

    function _safeBatchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "Inventory: mint to zero");
        uint256 length = ids.length;
        require(length == values.length, "Inventory: inconsistent arrays");

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 id = ids[i];
            uint256 value = values[i];
            if (id.isFungibleToken()) {
                _mintFungible(to, id, value);
            } else if (id.isNonFungibleToken()) {
                _mintNFT(to, id, value, true);
                uint256 nextCollectionId = id.getNonFungibleCollection();
                if (nfCollectionId == 0) {
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    if (nextCollectionId != nfCollectionId) {
                        _balances[nfCollectionId][to] += nfCollectionCount;
                        _supplies[nfCollectionId] += nfCollectionCount;
                        nfCollectionId = nextCollectionId;
                        nfCollectionCount = 1;
                    } else {
                        ++nfCollectionCount;
                    }
                }
            } else {
                revert("Inventory: not a token id");
            }
        }

        if (nfCollectionId != 0) {
            _balances[nfCollectionId][to] += nfCollectionCount;
            _supplies[nfCollectionId] += nfCollectionCount;
        }

        emit TransferBatch(_msgSender(), address(0), to, ids, values);
        if (to.isContract()) {
            _callOnERC1155BatchReceived(address(0), to, ids, values, data);
        }
    }

    //============================================== Helper Internal Functions ==============================================//

    function _mintFungible(
        address to,
        uint256 id,
        uint256 value
    ) internal {
        require(value != 0, "Inventory: zero value");
        uint256 supply = _supplies[id];
        uint256 newSupply = supply + value;
        require(newSupply > supply, "Inventory: supply overflow");
        _supplies[id] = newSupply;
        // cannot overflow as any balance is bounded up by the supply which cannot overflow
        _balances[id][to] += value;
    }

    function _mintNFT(
        address to,
        uint256 id,
        uint256 value,
        bool isBatch
    ) internal {
        require(value == 1, "Inventory: wrong NFT value");
        require(_owners[id] == 0, "Inventory: existing/burnt NFT");

        _owners[id] = uint256(uint160(to));

        if (!isBatch) {
            uint256 collectionId = id.getNonFungibleCollection();
            // it is virtually impossible that a Non-Fungible Collection supply
            // overflows due to the cost of minting individual tokens
            ++_supplies[collectionId];
            // cannot overflow as supply cannot overflow
            ++_balances[collectionId][to];
        }
    }

    function _transferFungible(
        address from,
        address to,
        uint256 id,
        uint256 value
    ) internal {
        require(value != 0, "Inventory: zero value");
        uint256 balance = _balances[id][from];
        require(balance >= value, "Inventory: not enough balance");
        if (from != to) {
            _balances[id][from] = balance - value;
            // cannot overflow as supply cannot overflow
            _balances[id][to] += value;
        }
    }

    function _transferNFT(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bool isBatch
    ) internal {
        require(value == 1, "Inventory: wrong NFT value");
        require(from == address(uint160(_owners[id])), "Inventory: non-owned NFT");
        _owners[id] = uint256(uint160(to));
        if (!isBatch) {
            uint256 collectionId = id.getNonFungibleCollection();
            // cannot underflow as balance is verified through ownership
            _balances[collectionId][from] -= 1;
            // cannot overflow as supply cannot overflow
            _balances[collectionId][to] += 1;
        }
    }

    function _transferNFTUpdateCollection(
        address from,
        address to,
        uint256 collectionId,
        uint256 amount
    ) internal virtual {
        if (from != to) {
            // cannot underflow as balance is verified through ownership
            _balances[collectionId][from] -= amount;
            // cannot overflow as supply cannot overflow
            _balances[collectionId][to] += amount;
        }
    }
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155Inventory, burnable version.
 * @dev The function `uri(uint256)` needs to be implemented by a child contract, for example with the help of `BaseMetadataURI`.
 */
abstract contract ERC1155InventoryBurnable is IERC1155InventoryBurnable, ERC1155Inventory {
    using ERC1155InventoryIdentifiersLib for uint256;

    //======================================================= ERC165 ========================================================//

    /// @inheritdoc IERC165
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC1155InventoryBurnable).interfaceId || super.supportsInterface(interfaceId);
    }

    //============================================== ERC1155InventoryBurnable ===============================================//

    /// @inheritdoc IERC1155InventoryBurnable
    function burnFrom(
        address from,
        uint256 id,
        uint256 value
    ) public virtual override {
        address sender = _msgSender();
        require(_isOperatable(from, sender), "Inventory: non-approved sender");

        if (id.isFungibleToken()) {
            _burnFungible(from, id, value);
        } else if (id.isNonFungibleToken()) {
            _burnNFT(from, id, value, false);
        } else {
            revert("Inventory: not a token id");
        }

        emit TransferSingle(sender, from, address(0), id, value);
    }

    /// @inheritdoc IERC1155InventoryBurnable
    function batchBurnFrom(
        address from,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual override {
        uint256 length = ids.length;
        require(length == values.length, "Inventory: inconsistent arrays");

        address sender = _msgSender();
        require(_isOperatable(from, sender), "Inventory: non-approved sender");

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 id = ids[i];
            uint256 value = values[i];
            if (id.isFungibleToken()) {
                _burnFungible(from, id, value);
            } else if (id.isNonFungibleToken()) {
                _burnNFT(from, id, value, true);
                uint256 nextCollectionId = id.getNonFungibleCollection();
                if (nfCollectionId == 0) {
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    if (nextCollectionId != nfCollectionId) {
                        _balances[nfCollectionId][from] -= nfCollectionCount;
                        _supplies[nfCollectionId] -= nfCollectionCount;
                        nfCollectionId = nextCollectionId;
                        nfCollectionCount = 1;
                    } else {
                        ++nfCollectionCount;
                    }
                }
            } else {
                revert("Inventory: not a token id");
            }
        }

        if (nfCollectionId != 0) {
            _balances[nfCollectionId][from] -= nfCollectionCount;
            _supplies[nfCollectionId] -= nfCollectionCount;
        }

        emit TransferBatch(sender, from, address(0), ids, values);
    }

    //============================================== Helper Internal Functions ==============================================//

    function _burnFungible(
        address from,
        uint256 id,
        uint256 value
    ) internal {
        require(value != 0, "Inventory: zero value");
        uint256 balance = _balances[id][from];
        require(balance >= value, "Inventory: not enough balance");
        _balances[id][from] = balance - value;
        // Cannot underflow
        _supplies[id] -= value;
    }

    function _burnNFT(
        address from,
        uint256 id,
        uint256 value,
        bool isBatch
    ) internal {
        require(value == 1, "Inventory: wrong NFT value");
        require(from == address(uint160(_owners[id])), "Inventory: non-owned NFT");
        _owners[id] = _BURNT_NFT_OWNER;

        if (!isBatch) {
            uint256 collectionId = id.getNonFungibleCollection();
            // cannot underflow as balance is confirmed through ownership
            --_balances[collectionId][from];
            // Cannot underflow
            --_supplies[collectionId];
        }
    }
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Inventory, optional extension: Mintable.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 */
interface IERC1155InventoryMintable {
    /**
     * Safely mints some token.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `id` is not a token.
     * @dev Reverts if `id` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if `id` represents a Non-Fungible Token which has already been minted.
     * @dev Reverts if `id` represents a Fungible Token and `value` is 0.
     * @dev Reverts if `id` represents a Fungible Token and there is an overflow of supply.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails or is refused.
     * @dev Emits an {IERC1155-TransferSingle} event.
     * @param to Address of the new token owner.
     * @param id Identifier of the token to mint.
     * @param value Amount of token to mint.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeMint(
        address to,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external;

    /**
     * Safely mints a batch of tokens.
     * @dev Reverts if `ids` and `values` have different lengths.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if one of `ids` is not a token.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token and its paired value is not 1.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token which has already been minted.
     * @dev Reverts if one of `ids` represents a Fungible Token and its paired value is 0.
     * @dev Reverts if one of `ids` represents a Fungible Token and there is an overflow of supply.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused.
     * @dev Emits an {IERC1155-TransferBatch} event.
     * @param to Address of the new tokens owner.
     * @param ids Identifiers of the tokens to mint.
     * @param values Amounts of tokens to mint.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeBatchMint(
        address to,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external;
}

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Inventory, optional extension: Creator.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0x510b5158.
 */
interface IERC1155InventoryCreator {
    /**
     * Returns the creator of a collection, or the zero address if the collection has not been created.
     * @dev Reverts if `collectionId` does not represent a collection.
     * @param collectionId Identifier of the collection.
     * @return The creator of a collection, or the zero address if the collection has not been created.
     */
    function creator(uint256 collectionId) external view returns (address);
}

// File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/types/[email protected]

// Partially derived from OpenZeppelin:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8b10cb38d8fedf34f2d89b0ed604f2dceb76d6a9/contracts/utils/Strings.sol

pragma solidity >=0.7.6 <0.8.0;

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

// File @animoca/ethereum-contracts-assets-2.0.0/contracts/metadata/[email protected]

pragma solidity >=0.7.6 <0.8.0;

abstract contract BaseMetadataURI is ManagedIdentity, Ownable {
    using UInt256ToDecimalString for uint256;

    event BaseMetadataURISet(string baseMetadataURI);

    string public baseMetadataURI;

    function setBaseMetadataURI(string calldata baseMetadataURI_) external {
        _requireOwnership(_msgSender());
        baseMetadataURI = baseMetadataURI_;
        emit BaseMetadataURISet(baseMetadataURI_);
    }

    function _uri(uint256 id) internal view virtual returns (string memory) {
        return string(abi.encodePacked(baseMetadataURI, id.toDecimalString()));
    }
}

// File @animoca/ethereum-contracts-core-1.1.2/contracts/access/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * Contract which allows derived contracts access control over token minting operations.
 */
contract MinterRole is Ownable {
    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);

    mapping(address => bool) public isMinter;

    /**
     * Constructor.
     */
    constructor(address owner_) Ownable(owner_) {
        _addMinter(owner_);
    }

    /**
     * Grants the minter role to a non-minter.
     * @dev reverts if the sender is not the contract owner.
     * @param account The account to grant the minter role to.
     */
    function addMinter(address account) public {
        _requireOwnership(_msgSender());
        _addMinter(account);
    }

    /**
     * Renounces the granted minter role.
     * @dev reverts if the sender is not a minter.
     */
    function renounceMinter() public {
        address account = _msgSender();
        _requireMinter(account);
        isMinter[account] = false;
        emit MinterRemoved(account);
    }

    function _requireMinter(address account) internal view {
        require(isMinter[account], "MinterRole: not a Minter");
    }

    function _addMinter(address account) internal {
        isMinter[account] = true;
        emit MinterAdded(account);
    }
}

// File contracts/token/ERC1155/BenjiBananasMembershipPassNFT.sol

pragma solidity >=0.7.6 <0.8.0;

// solhint-disable-next-line max-line-length

/**
 * @title BenjiBananasMembershipPassNFT
 */
contract BenjiBananasMembershipPassNFT is
    Recoverable,
    UsingUniversalForwarding,
    ERC1155InventoryBurnable,
    IERC1155InventoryMintable,
    IERC1155InventoryCreator,
    BaseMetadataURI,
    MinterRole
{
    constructor(IForwarderRegistry forwarderRegistry, address universalForwarder)
        UsingUniversalForwarding(forwarderRegistry, universalForwarder)
        MinterRole(msg.sender)
    {}

    //======================================================= ERC165 ========================================================//

    /// @inheritdoc IERC165
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC1155InventoryCreator).interfaceId || super.supportsInterface(interfaceId);
    }

    //================================================= ERC1155MetadataURI ==================================================//

    /// @inheritdoc IERC1155MetadataURI
    function uri(uint256 id) external view virtual override returns (string memory) {
        return _uri(id);
    }

    //=============================================== ERC1155InventoryCreator ===============================================//

    /// @inheritdoc IERC1155InventoryCreator
    function creator(uint256 collectionId) external view override returns (address) {
        return _creator(collectionId);
    }

    //=========================================== ERC1155InventoryCreator (admin) ===========================================//

    /**
     * Creates a collection.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `collectionId` does not represent a collection.
     * @dev Reverts if `collectionId` has already been created.
     * @dev Emits a {IERC1155Inventory-CollectionCreated} event.
     * @param collectionId Identifier of the collection.
     */
    function createCollection(uint256 collectionId) external {
        _requireOwnership(_msgSender());
        _createCollection(collectionId);
    }

    //============================================== ERC1155InventoryMintable ===============================================//

    /// @inheritdoc IERC1155InventoryMintable
    /// @dev Reverts if the sender is not a minter.
    function safeMint(
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) public virtual override {
        _requireMinter(_msgSender());
        _safeMint(to, id, value, data);
    }

    /// @inheritdoc IERC1155InventoryMintable
    /// @dev Reverts if the sender is not a minter.
    function safeBatchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) public virtual override {
        _requireMinter(_msgSender());
        _safeBatchMint(to, ids, values, data);
    }

    //======================================== Meta Transactions Internal Functions =========================================//

    function _msgSender() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (address payable) {
        return UsingUniversalForwarding._msgSender();
    }

    function _msgData() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (bytes memory ret) {
        return UsingUniversalForwarding._msgData();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"},{"internalType":"address","name":"universalForwarder","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"string","name":"baseMetadataURI","type":"string"}],"name":"BaseMetadataURISet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"collectionId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"fungible","type":"bool"}],"name":"CollectionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","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":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_value","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseMetadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"collectionOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"createCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","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":"baseMetadataURI_","type":"string"}],"name":"setBaseMetadataURI","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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b50604051620039b6380380620039b6833981810160405260408110156200003757600080fd5b508051602090910151600080546001600160a01b03191633908117825560405190918491849184918291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606091821b811660a05291901b16608052620000ad81620000b6565b50505062000102565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b60805160601c60a05160601c61387b6200013b600039806112255280612fc35250806112605280612f88528061301b525061387b6000f3fe608060405234801561001057600080fd5b50600436106101c35760003560e01c806380534934116100f9578063bd85b03911610097578063d0011d9d11610071578063d0011d9d14610d70578063e985e9c514610d8d578063f242432a14610dbb578063f2fde38b14610e84576101c3565b8063bd85b03914610c28578063c3666c3614610c45578063c7778baa14610d53576101c3565b806398650275116100d35780639865027514610baf578063a22cb46514610bb7578063aa271e1a14610be5578063adebf6f214610c0b576101c3565b80638053493414610a4e5780638da5cb5b14610b81578063983b2d5614610b89576101c3565b8063510b5158116101665780635cfa9297116101405780635cfa9297146107f55780636352211e146108b557806373c8a958146108d25780637e518ec8146109e0576101c3565b8063510b51581461078e578063572b6c05146107c75780635b2bd79e146107ed576101c3565b80630e89341c116101a25780630e89341c146103fb578063124d91e51461048d5780632eb2c2d6146104bf5780634e1273f414610680576101c3565b8062fdd58e146101c857806301ffc9a7146102065780630d6a5bbb14610241575b600080fd5b6101f4600480360360408110156101de57600080fd5b506001600160a01b038135169060200135610eaa565b60408051918252519081900360200190f35b61022d6004803603602081101561021c57600080fd5b50356001600160e01b031916610f75565b604080519115158252519081900360200190f35b6103f96004803603608081101561025757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561028157600080fd5b82018360208201111561029357600080fd5b803590602001918460208302840111600160201b831117156102b457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561030357600080fd5b82018360208201111561031557600080fd5b803590602001918460208302840111600160201b8311171561033657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561038557600080fd5b82018360208201111561039757600080fd5b803590602001918460018302840111600160201b831117156103b857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fa2945050505050565b005b6104186004803603602081101561041157600080fd5b5035610fc4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561045257818101518382015260200161043a565b50505050905090810190601f16801561047f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f9600480360360608110156104a357600080fd5b506001600160a01b038135169060208101359060400135610fcf565b6103f9600480360360a08110156104d557600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561050857600080fd5b82018360208201111561051a57600080fd5b803590602001918460208302840111600160201b8311171561053b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561058a57600080fd5b82018360208201111561059c57600080fd5b803590602001918460208302840111600160201b831117156105bd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060c57600080fd5b82018360208201111561061e57600080fd5b803590602001918460018302840111600160201b8311171561063f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061110e945050505050565b61073e6004803603604081101561069657600080fd5b810190602081018135600160201b8111156106b057600080fd5b8201836020820111156106c257600080fd5b803590602001918460208302840111600160201b831117156106e357600080fd5b919390929091602081019035600160201b81111561070057600080fd5b82018360208201111561071257600080fd5b803590602001918460208302840111600160201b8311171561073357600080fd5b509092509050611122565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561077a578181015183820152602001610762565b505050509050019250505060405180910390f35b6107ab600480360360208110156107a457600080fd5b5035611216565b604080516001600160a01b039092168252519081900360200190f35b61022d600480360360208110156107dd57600080fd5b50356001600160a01b0316611221565b61041861129a565b6103f96004803603608081101561080b57600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b81111561084157600080fd5b82018360208201111561085357600080fd5b803590602001918460018302840111600160201b8311171561087457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611328945050505050565b6107ab600480360360208110156108cb57600080fd5b503561133f565b6103f9600480360360608110156108e857600080fd5b810190602081018135600160201b81111561090257600080fd5b82018360208201111561091457600080fd5b803590602001918460208302840111600160201b8311171561093557600080fd5b919390929091602081019035600160201b81111561095257600080fd5b82018360208201111561096457600080fd5b803590602001918460208302840111600160201b8311171561098557600080fd5b919390929091602081019035600160201b8111156109a257600080fd5b8201836020820111156109b457600080fd5b803590602001918460208302840111600160201b831117156109d557600080fd5b5090925090506113a9565b6103f9600480360360208110156109f657600080fd5b810190602081018135600160201b811115610a1057600080fd5b820183602082011115610a2257600080fd5b803590602001918460018302840111600160201b83111715610a4357600080fd5b50909250905061149b565b6103f960048036036060811015610a6457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610a8e57600080fd5b820183602082011115610aa057600080fd5b803590602001918460208302840111600160201b83111715610ac157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b1057600080fd5b820183602082011115610b2257600080fd5b803590602001918460208302840111600160201b83111715610b4357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611517945050505050565b6107ab6117ca565b6103f960048036036020811015610b9f57600080fd5b50356001600160a01b03166117da565b6103f96117f1565b6103f960048036036040811015610bcd57600080fd5b506001600160a01b038135169060200135151561184f565b61022d60048036036020811015610bfb57600080fd5b50356001600160a01b0316611930565b61022d60048036036020811015610c2157600080fd5b5035611945565b6101f460048036036020811015610c3e57600080fd5b5035611950565b6103f960048036036060811015610c5b57600080fd5b810190602081018135600160201b811115610c7557600080fd5b820183602082011115610c8757600080fd5b803590602001918460208302840111600160201b83111715610ca857600080fd5b919390929091602081019035600160201b811115610cc557600080fd5b820183602082011115610cd757600080fd5b803590602001918460208302840111600160201b83111715610cf857600080fd5b919390929091602081019035600160201b811115610d1557600080fd5b820183602082011115610d2757600080fd5b803590602001918460208302840111600160201b83111715610d4857600080fd5b5090925090506119a6565b6101f460048036036020811015610d6957600080fd5b5035611aee565b6103f960048036036020811015610d8657600080fd5b5035611b4b565b61022d60048036036040811015610da357600080fd5b506001600160a01b0381358116916020013516611b5f565b6103f9600480360360a0811015610dd157600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610e1057600080fd5b820183602082011115610e2257600080fd5b803590602001918460018302840111600160201b83111715610e4357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b8d945050505050565b6103f960048036036020811015610e9a57600080fd5b50356001600160a01b0316611d01565b60006001600160a01b038316610f07576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b610f1082611d5a565b15610f4a576000828152600460205260409020546001600160a01b03848116911614610f3d576000610f40565b60015b60ff169050610f6f565b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216630a216a2b60e31b1480610f9a5750610f9a82611d7b565b90505b919050565b610fb2610fad611da0565b611daf565b610fbe84848484611e1c565b50505050565b6060610f9a826120ee565b6000610fd9611da0565b9050610fe584826121c1565b611024576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b61102d8361220f565b156110425761103d848484612219565b6110aa565b61104b83611d5a565b1561105d5761103d848484600061231a565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b60006001600160a01b0316846001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a450505050565b61111b8585858585612440565b5050505050565b6060838214611166576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60008467ffffffffffffffff8111801561117f57600080fd5b506040519080825280602002602001820160405280156111a9578160200160208202803683370190505b50905060005b80861461120c576111ed8787838181106111c557fe5b905060200201356001600160a01b03168686848181106111e157fe5b90506020020135610eaa565b8282815181106111f957fe5b60209081029190910101526001016111af565b5095945050505050565b6000610f9a82612718565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610f9a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316149050919050565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113205780601f106112f557610100808354040283529160200191611320565b820191906000526020600020905b81548152906001019060200180831161130357829003601f168201915b505050505081565b611333610fad611da0565b610fbe84848484612791565b6000818152600460205260408120546001600160a01b038116610f9a576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b6113b96113b4611da0565b6128a0565b8483811480156113c857508082145b611419576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b8181146114915761148988888381811061143257fe5b905060200201356001600160a01b031685858481811061144e57fe5b9050602002013588888581811061146157fe5b905060200201356001600160a01b03166001600160a01b031661295d9092919063ffffffff16565b60010161141c565b5050505050505050565b6114a66113b4611da0565b6114b260068383613764565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b81518151811461155c576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b6000611566611da0565b905061157285826121c1565b6115b1576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b60008060005b8481146116a55760008782815181106115cc57fe5b6020026020010151905060008783815181106115e457fe5b602002602001015190506115f78261220f565b1561160c576116078a8383612219565b61169b565b61161582611d5a565b1561105d576116278a8383600161231a565b6000611632836129b4565b9050856116455780955060019450611699565b8581146116925760008681526002602090815260408083206001600160a01b038f168452825280832080548990039055978252600390529590952080549490940390935560019284611699565b8460010194505b505b50506001016115b7565b5081156116e75760008281526002602090815260408083206001600160a01b038b16845282528083208054859003905584835260039091529020805482900390555b60006001600160a01b0316876001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561176d578181015183820152602001611755565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117ac578181015183820152602001611794565b5050505090500194505050505060405180910390a450505050505050565b6000546001600160a01b03165b90565b6117e56113b4611da0565b6117ee816129c1565b50565b60006117fb611da0565b905061180681611daf565b6001600160a01b038116600081815260076020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b6000611859611da0565b9050806001600160a01b0316836001600160a01b031614156118c2576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b03818116600081815260016020908152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b60076020526000908152604090205460ff1681565b6000610f9a8261220f565b600061195b82611d5a565b15611991576000828152600460205260409020546001600160a01b031615611984576001611987565b60005b60ff169050610f9d565b50600081815260036020526040902054610f9d565b6119b16113b4611da0565b8483811480156119c057508082145b611a11576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461149157858582818110611a2757fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a85818110611a5257fe5b905060200201356001600160a01b0316878786818110611a6e57fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611acb57600080fd5b505af1158015611adf573d6000803e3d6000fd5b50505050806001019050611a14565b6000611af982611d5a565b611b42576040805162461bcd60e51b8152602060048201526015602482015274125b9d995b9d1bdc9e4e881b9bdd08185b88139195605a1b604482015290519081900360640190fd5b610f9a826129b4565b611b566113b4611da0565b6117ee81612a0d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6000611b97611da0565b90506001600160a01b038516611bf4576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b611bfe86826121c1565b611c3d576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b611c468461220f565b15611c5c57611c5786868686612b41565b611c78565b611c6584611d5a565b1561105d57611c57868686866000612c57565b846001600160a01b0316866001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4611ce7856001600160a01b0316612d7d565b15611cf957611cf98686868686612d83565b505050505050565b611d0c6113b4611da0565b600080546001600160a01b0319166001600160a01b0383811691821780845560405192939116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000600160ff1b821615801590610f9a5750506001600160e01b0316151590565b60006001600160e01b0319821663921ed8d160e01b1480610f9a5750610f9a82612ef4565b6000611daa612f78565b905090565b6001600160a01b03811660009081526007602052604090205460ff166117ee576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b6001600160a01b038416611e71576040805162461bcd60e51b8152602060048201526017602482015276496e76656e746f72793a206d696e7420746f207a65726f60481b604482015290519081900360640190fd5b825182518114611eb6576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60008060005b838114611fa8576000878281518110611ed157fe5b602002602001015190506000878381518110611ee957fe5b60200260200101519050611efc8261220f565b15611f1157611f0c8a83836130d8565b611f9e565b611f1a82611d5a565b1561105d57611f2c8a838360016131c2565b6000611f37836129b4565b905085611f4a5780955060019450611f9c565b858114611f955760008681526002602090815260408083206001600160a01b038f16845282528083208054890190559782526003905295909520805490940190935560019284611f9c565b8460010194505b505b5050600101611ebc565b508115611fe85760008281526002602090815260408083206001600160a01b038b1684528252808320805485019055848352600390915290208054820190555b6001600160a01b0387166000611ffc611da0565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561206c578181015183820152602001612054565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156120ab578181015183820152602001612093565b5050505090500194505050505060405180910390a46120d2876001600160a01b0316612d7d565b156120e5576120e56000888888886132e1565b50505050505050565b606060066120fb83613446565b60405160200180838054600181600116156101000203166002900480156121595780601f10612137576101008083540402835291820191612159565b820191906000526020600020905b815481529060010190602001808311612145575b5050825160208401908083835b602083106121855780518252601f199092019160209182019101612166565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b6000816001600160a01b0316836001600160a01b0316148061220857506001600160a01b0380841660009081526001602090815260408083209386168352929052205460ff165b9392505050565b600160ff1b161590565b80612263576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b0387168452909152902054818110156122db576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008381526002602090815260408083206001600160a01b03909716835295815285822092849003909255928352600390529190208054919091039055565b8160011461236c576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b038581169116146123d5576040805162461bcd60e51b8152602060048201526018602482015277125b9d995b9d1bdc9e4e881b9bdb8b5bdddb99590813919560421b604482015290519081900360640190fd5b600083815260046020526040902061dead60f01b905580610fbe5760006123fb846129b4565b60008181526002602090815260408083206001600160a01b038a1684528252808320805460001990810190915593835260039091529020805490910190555050505050565b6001600160a01b03841661249b576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b8251825181146124e0576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60006124ea611da0565b90506124f687826121c1565b612535576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b60008060005b8481146125fd57600088828151811061255057fe5b60200260200101519050600088838151811061256857fe5b6020026020010151905061257b8261220f565b156125915761258c8c8c8484612b41565b6125f3565b61259a82611d5a565b1561105d576125ad8c8c84846001612c57565b60006125b8836129b4565b9050856125cb57809550600194506125f1565b8581146125ea576125de8d8d8888613521565b809550600194506125f1565b8460010194505b505b505060010161253b565b5081156126105761261089898484613521565b876001600160a01b0316896001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561269557818101518382015260200161267d565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156126d45781810151838201526020016126bc565b5050505090500194505050505060405180910390a46126fb886001600160a01b0316612d7d565b1561270d5761270d89898989896132e1565b505050505050505050565b600061272382611d5a565b15612775576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600560205260409020546001600160a01b031690565b6001600160a01b0384166127e6576040805162461bcd60e51b8152602060048201526017602482015276496e76656e746f72793a206d696e7420746f207a65726f60481b604482015290519081900360640190fd5b6127ef8361220f565b15612804576127ff8484846130d8565b61281f565b61280d83611d5a565b1561105d576127ff84848460006131c2565b6001600160a01b0384166000612833611da0565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a461288d846001600160a01b0316612d7d565b15610fbe57610fbe600085858585612d83565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128d957600080fd5b505afa1580156128ed573d6000803e3d6000fd5b505050506040513d602081101561290357600080fd5b50516001600160a01b038281169116146117ee576040805162461bcd60e51b815260206004820152601660248201527527bbb730b136329d103737ba103a34329037bbb732b960511b604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526129af908490613575565b505050565b6001600160e01b03191690565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b612a1681611d5a565b15612a68576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600560205260409020546001600160a01b031615612ad2576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b612ada611da0565b600082815260056020526040902080546001600160a01b0319166001600160a01b0392909216919091179055612b0f8161220f565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b80612b8b576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b038816845290915290205481811015612c03576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03161461111b5760009283526002602090815260408085206001600160a01b039788168652909152808420918390039091559290931681522080549091019055565b81600114612ca9576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b03868116911614612d12576040805162461bcd60e51b8152602060048201526018602482015277125b9d995b9d1bdc9e4e881b9bdb8b5bdddb99590813919560421b604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b03851690558061111b576000612d3c846129b4565b60009081526002602090815260408083206001600160a01b03998a168452909152808220805460001901905595909616865250505091208054600101905550565b3b151590565b63f23a6e6160e01b6001600160a01b03851663f23a6e61612da2611da0565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612e1c578181015183820152602001612e04565b50505050905090810190601f168015612e495780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015612e6c57600080fd5b505af1158015612e80573d6000803e3d6000fd5b505050506040513d6020811015612e9657600080fd5b50516001600160e01b0319161461111b576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60006001600160e01b031982166301ffc9a760e01b1480612f2557506001600160e01b03198216636cdb3d1360e11b145b80612f4057506001600160e01b031982166303a24d0760e21b145b80612f5b57506001600160e01b031982166304e72e2360e11b145b80610f9a5750506001600160e01b03191663bd85b03960e01b1490565b60003381612f84613758565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480612ff757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b156130055791506117d79050565b6001600160a01b03821632148015906130c457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561309757600080fd5b505afa1580156130ab573d6000803e3d6000fd5b505050506040513d60208110156130c157600080fd5b50515b156130d25791506117d79050565b50905090565b80613122576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b600082815260036020526040902054818101818111613188576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260036020908152604080862092909255600281528185206001600160a01b039096168552949094525091902080549091019055565b81600114613214576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b60008381526004602052604090205415613275576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b038516905580610fbe57600061329f846129b4565b600090815260036020908152604080832080546001908101909155600283528184206001600160a01b038a168552909252909120805490910190555050505050565b63bc197c8160e01b6001600160a01b03851663bc197c81613300611da0565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015613379578181015183820152602001613361565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156133b85781810151838201526020016133a0565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156133f45781810151838201526020016133dc565b50505050905090810190601f1680156134215780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015612e6c57600080fd5b60608161346b57506040805180820190915260018152600360fc1b6020820152610f9d565b8160005b811561348357600101600a8204915061346f565b60008167ffffffffffffffff8111801561349c57600080fd5b506040519080825280601f01601f1916602001820160405280156134c7576020820181803683370190505b50859350905060001982015b831561351857600a840660300160f81b828280600190039350815181106134f657fe5b60200101906001600160f81b031916908160001a905350600a840493506134d3565b50949350505050565b826001600160a01b0316846001600160a01b031614610fbe5760009182526002602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b816135886001600160a01b038216612d7d565b6135d9576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b602083106136165780518252601f1990920191602091820191016135f7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613678576040519150601f19603f3d011682016040523d82523d6000602084013e61367d565b606091505b509150915081156136fc578051156136f7578080602001905160208110156136a457600080fd5b50516136f7576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b61111b565b805161374f576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b60131936013560601c90565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261379a57600085556137e0565b82601f106137b35782800160ff198235161785556137e0565b828001600101855582156137e0579182015b828111156137e05782358255916020019190600101906137c5565b506137ec9291506137f0565b5090565b5b808211156137ec57600081556001016137f156fe496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000496e76656e746f72793a20696e636f6e73697374656e74206172726179730000a26469706673582212208f635348050ae875d7f3ba6d2ea489f83f6d79a22b048a98937551edf99e209064736f6c63430007060033000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f0000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c35760003560e01c806380534934116100f9578063bd85b03911610097578063d0011d9d11610071578063d0011d9d14610d70578063e985e9c514610d8d578063f242432a14610dbb578063f2fde38b14610e84576101c3565b8063bd85b03914610c28578063c3666c3614610c45578063c7778baa14610d53576101c3565b806398650275116100d35780639865027514610baf578063a22cb46514610bb7578063aa271e1a14610be5578063adebf6f214610c0b576101c3565b80638053493414610a4e5780638da5cb5b14610b81578063983b2d5614610b89576101c3565b8063510b5158116101665780635cfa9297116101405780635cfa9297146107f55780636352211e146108b557806373c8a958146108d25780637e518ec8146109e0576101c3565b8063510b51581461078e578063572b6c05146107c75780635b2bd79e146107ed576101c3565b80630e89341c116101a25780630e89341c146103fb578063124d91e51461048d5780632eb2c2d6146104bf5780634e1273f414610680576101c3565b8062fdd58e146101c857806301ffc9a7146102065780630d6a5bbb14610241575b600080fd5b6101f4600480360360408110156101de57600080fd5b506001600160a01b038135169060200135610eaa565b60408051918252519081900360200190f35b61022d6004803603602081101561021c57600080fd5b50356001600160e01b031916610f75565b604080519115158252519081900360200190f35b6103f96004803603608081101561025757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561028157600080fd5b82018360208201111561029357600080fd5b803590602001918460208302840111600160201b831117156102b457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561030357600080fd5b82018360208201111561031557600080fd5b803590602001918460208302840111600160201b8311171561033657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561038557600080fd5b82018360208201111561039757600080fd5b803590602001918460018302840111600160201b831117156103b857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fa2945050505050565b005b6104186004803603602081101561041157600080fd5b5035610fc4565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561045257818101518382015260200161043a565b50505050905090810190601f16801561047f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103f9600480360360608110156104a357600080fd5b506001600160a01b038135169060208101359060400135610fcf565b6103f9600480360360a08110156104d557600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561050857600080fd5b82018360208201111561051a57600080fd5b803590602001918460208302840111600160201b8311171561053b57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561058a57600080fd5b82018360208201111561059c57600080fd5b803590602001918460208302840111600160201b831117156105bd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561060c57600080fd5b82018360208201111561061e57600080fd5b803590602001918460018302840111600160201b8311171561063f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061110e945050505050565b61073e6004803603604081101561069657600080fd5b810190602081018135600160201b8111156106b057600080fd5b8201836020820111156106c257600080fd5b803590602001918460208302840111600160201b831117156106e357600080fd5b919390929091602081019035600160201b81111561070057600080fd5b82018360208201111561071257600080fd5b803590602001918460208302840111600160201b8311171561073357600080fd5b509092509050611122565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561077a578181015183820152602001610762565b505050509050019250505060405180910390f35b6107ab600480360360208110156107a457600080fd5b5035611216565b604080516001600160a01b039092168252519081900360200190f35b61022d600480360360208110156107dd57600080fd5b50356001600160a01b0316611221565b61041861129a565b6103f96004803603608081101561080b57600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b81111561084157600080fd5b82018360208201111561085357600080fd5b803590602001918460018302840111600160201b8311171561087457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611328945050505050565b6107ab600480360360208110156108cb57600080fd5b503561133f565b6103f9600480360360608110156108e857600080fd5b810190602081018135600160201b81111561090257600080fd5b82018360208201111561091457600080fd5b803590602001918460208302840111600160201b8311171561093557600080fd5b919390929091602081019035600160201b81111561095257600080fd5b82018360208201111561096457600080fd5b803590602001918460208302840111600160201b8311171561098557600080fd5b919390929091602081019035600160201b8111156109a257600080fd5b8201836020820111156109b457600080fd5b803590602001918460208302840111600160201b831117156109d557600080fd5b5090925090506113a9565b6103f9600480360360208110156109f657600080fd5b810190602081018135600160201b811115610a1057600080fd5b820183602082011115610a2257600080fd5b803590602001918460018302840111600160201b83111715610a4357600080fd5b50909250905061149b565b6103f960048036036060811015610a6457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b811115610a8e57600080fd5b820183602082011115610aa057600080fd5b803590602001918460208302840111600160201b83111715610ac157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610b1057600080fd5b820183602082011115610b2257600080fd5b803590602001918460208302840111600160201b83111715610b4357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611517945050505050565b6107ab6117ca565b6103f960048036036020811015610b9f57600080fd5b50356001600160a01b03166117da565b6103f96117f1565b6103f960048036036040811015610bcd57600080fd5b506001600160a01b038135169060200135151561184f565b61022d60048036036020811015610bfb57600080fd5b50356001600160a01b0316611930565b61022d60048036036020811015610c2157600080fd5b5035611945565b6101f460048036036020811015610c3e57600080fd5b5035611950565b6103f960048036036060811015610c5b57600080fd5b810190602081018135600160201b811115610c7557600080fd5b820183602082011115610c8757600080fd5b803590602001918460208302840111600160201b83111715610ca857600080fd5b919390929091602081019035600160201b811115610cc557600080fd5b820183602082011115610cd757600080fd5b803590602001918460208302840111600160201b83111715610cf857600080fd5b919390929091602081019035600160201b811115610d1557600080fd5b820183602082011115610d2757600080fd5b803590602001918460208302840111600160201b83111715610d4857600080fd5b5090925090506119a6565b6101f460048036036020811015610d6957600080fd5b5035611aee565b6103f960048036036020811015610d8657600080fd5b5035611b4b565b61022d60048036036040811015610da357600080fd5b506001600160a01b0381358116916020013516611b5f565b6103f9600480360360a0811015610dd157600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b811115610e1057600080fd5b820183602082011115610e2257600080fd5b803590602001918460018302840111600160201b83111715610e4357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611b8d945050505050565b6103f960048036036020811015610e9a57600080fd5b50356001600160a01b0316611d01565b60006001600160a01b038316610f07576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b610f1082611d5a565b15610f4a576000828152600460205260409020546001600160a01b03848116911614610f3d576000610f40565b60015b60ff169050610f6f565b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216630a216a2b60e31b1480610f9a5750610f9a82611d7b565b90505b919050565b610fb2610fad611da0565b611daf565b610fbe84848484611e1c565b50505050565b6060610f9a826120ee565b6000610fd9611da0565b9050610fe584826121c1565b611024576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b61102d8361220f565b156110425761103d848484612219565b6110aa565b61104b83611d5a565b1561105d5761103d848484600061231a565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b60006001600160a01b0316846001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a450505050565b61111b8585858585612440565b5050505050565b6060838214611166576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60008467ffffffffffffffff8111801561117f57600080fd5b506040519080825280602002602001820160405280156111a9578160200160208202803683370190505b50905060005b80861461120c576111ed8787838181106111c557fe5b905060200201356001600160a01b03168686848181106111e157fe5b90506020020135610eaa565b8282815181106111f957fe5b60209081029190910101526001016111af565b5095945050505050565b6000610f9a82612718565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610f9a57507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b0316826001600160a01b0316149050919050565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113205780601f106112f557610100808354040283529160200191611320565b820191906000526020600020905b81548152906001019060200180831161130357829003601f168201915b505050505081565b611333610fad611da0565b610fbe84848484612791565b6000818152600460205260408120546001600160a01b038116610f9a576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b6113b96113b4611da0565b6128a0565b8483811480156113c857508082145b611419576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b8181146114915761148988888381811061143257fe5b905060200201356001600160a01b031685858481811061144e57fe5b9050602002013588888581811061146157fe5b905060200201356001600160a01b03166001600160a01b031661295d9092919063ffffffff16565b60010161141c565b5050505050505050565b6114a66113b4611da0565b6114b260068383613764565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b81518151811461155c576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b6000611566611da0565b905061157285826121c1565b6115b1576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b60008060005b8481146116a55760008782815181106115cc57fe5b6020026020010151905060008783815181106115e457fe5b602002602001015190506115f78261220f565b1561160c576116078a8383612219565b61169b565b61161582611d5a565b1561105d576116278a8383600161231a565b6000611632836129b4565b9050856116455780955060019450611699565b8581146116925760008681526002602090815260408083206001600160a01b038f168452825280832080548990039055978252600390529590952080549490940390935560019284611699565b8460010194505b505b50506001016115b7565b5081156116e75760008281526002602090815260408083206001600160a01b038b16845282528083208054859003905584835260039091529020805482900390555b60006001600160a01b0316876001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561176d578181015183820152602001611755565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117ac578181015183820152602001611794565b5050505090500194505050505060405180910390a450505050505050565b6000546001600160a01b03165b90565b6117e56113b4611da0565b6117ee816129c1565b50565b60006117fb611da0565b905061180681611daf565b6001600160a01b038116600081815260076020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b6000611859611da0565b9050806001600160a01b0316836001600160a01b031614156118c2576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b03818116600081815260016020908152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b60076020526000908152604090205460ff1681565b6000610f9a8261220f565b600061195b82611d5a565b15611991576000828152600460205260409020546001600160a01b031615611984576001611987565b60005b60ff169050610f9d565b50600081815260036020526040902054610f9d565b6119b16113b4611da0565b8483811480156119c057508082145b611a11576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b81811461149157858582818110611a2757fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a85818110611a5257fe5b905060200201356001600160a01b0316878786818110611a6e57fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611acb57600080fd5b505af1158015611adf573d6000803e3d6000fd5b50505050806001019050611a14565b6000611af982611d5a565b611b42576040805162461bcd60e51b8152602060048201526015602482015274125b9d995b9d1bdc9e4e881b9bdd08185b88139195605a1b604482015290519081900360640190fd5b610f9a826129b4565b611b566113b4611da0565b6117ee81612a0d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6000611b97611da0565b90506001600160a01b038516611bf4576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b611bfe86826121c1565b611c3d576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b611c468461220f565b15611c5c57611c5786868686612b41565b611c78565b611c6584611d5a565b1561105d57611c57868686866000612c57565b846001600160a01b0316866001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4611ce7856001600160a01b0316612d7d565b15611cf957611cf98686868686612d83565b505050505050565b611d0c6113b4611da0565b600080546001600160a01b0319166001600160a01b0383811691821780845560405192939116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b6000600160ff1b821615801590610f9a5750506001600160e01b0316151590565b60006001600160e01b0319821663921ed8d160e01b1480610f9a5750610f9a82612ef4565b6000611daa612f78565b905090565b6001600160a01b03811660009081526007602052604090205460ff166117ee576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b6001600160a01b038416611e71576040805162461bcd60e51b8152602060048201526017602482015276496e76656e746f72793a206d696e7420746f207a65726f60481b604482015290519081900360640190fd5b825182518114611eb6576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60008060005b838114611fa8576000878281518110611ed157fe5b602002602001015190506000878381518110611ee957fe5b60200260200101519050611efc8261220f565b15611f1157611f0c8a83836130d8565b611f9e565b611f1a82611d5a565b1561105d57611f2c8a838360016131c2565b6000611f37836129b4565b905085611f4a5780955060019450611f9c565b858114611f955760008681526002602090815260408083206001600160a01b038f16845282528083208054890190559782526003905295909520805490940190935560019284611f9c565b8460010194505b505b5050600101611ebc565b508115611fe85760008281526002602090815260408083206001600160a01b038b1684528252808320805485019055848352600390915290208054820190555b6001600160a01b0387166000611ffc611da0565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561206c578181015183820152602001612054565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156120ab578181015183820152602001612093565b5050505090500194505050505060405180910390a46120d2876001600160a01b0316612d7d565b156120e5576120e56000888888886132e1565b50505050505050565b606060066120fb83613446565b60405160200180838054600181600116156101000203166002900480156121595780601f10612137576101008083540402835291820191612159565b820191906000526020600020905b815481529060010190602001808311612145575b5050825160208401908083835b602083106121855780518252601f199092019160209182019101612166565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b6000816001600160a01b0316836001600160a01b0316148061220857506001600160a01b0380841660009081526001602090815260408083209386168352929052205460ff165b9392505050565b600160ff1b161590565b80612263576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b0387168452909152902054818110156122db576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008381526002602090815260408083206001600160a01b03909716835295815285822092849003909255928352600390529190208054919091039055565b8160011461236c576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b038581169116146123d5576040805162461bcd60e51b8152602060048201526018602482015277125b9d995b9d1bdc9e4e881b9bdb8b5bdddb99590813919560421b604482015290519081900360640190fd5b600083815260046020526040902061dead60f01b905580610fbe5760006123fb846129b4565b60008181526002602090815260408083206001600160a01b038a1684528252808320805460001990810190915593835260039091529020805490910190555050505050565b6001600160a01b03841661249b576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b8251825181146124e0576040805162461bcd60e51b815260206004820152601e6024820152600080516020613826833981519152604482015290519081900360640190fd5b60006124ea611da0565b90506124f687826121c1565b612535576040805162461bcd60e51b815260206004820152601e6024820152600080516020613806833981519152604482015290519081900360640190fd5b60008060005b8481146125fd57600088828151811061255057fe5b60200260200101519050600088838151811061256857fe5b6020026020010151905061257b8261220f565b156125915761258c8c8c8484612b41565b6125f3565b61259a82611d5a565b1561105d576125ad8c8c84846001612c57565b60006125b8836129b4565b9050856125cb57809550600194506125f1565b8581146125ea576125de8d8d8888613521565b809550600194506125f1565b8460010194505b505b505060010161253b565b5081156126105761261089898484613521565b876001600160a01b0316896001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561269557818101518382015260200161267d565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156126d45781810151838201526020016126bc565b5050505090500194505050505060405180910390a46126fb886001600160a01b0316612d7d565b1561270d5761270d89898989896132e1565b505050505050505050565b600061272382611d5a565b15612775576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600560205260409020546001600160a01b031690565b6001600160a01b0384166127e6576040805162461bcd60e51b8152602060048201526017602482015276496e76656e746f72793a206d696e7420746f207a65726f60481b604482015290519081900360640190fd5b6127ef8361220f565b15612804576127ff8484846130d8565b61281f565b61280d83611d5a565b1561105d576127ff84848460006131c2565b6001600160a01b0384166000612833611da0565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a461288d846001600160a01b0316612d7d565b15610fbe57610fbe600085858585612d83565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156128d957600080fd5b505afa1580156128ed573d6000803e3d6000fd5b505050506040513d602081101561290357600080fd5b50516001600160a01b038281169116146117ee576040805162461bcd60e51b815260206004820152601660248201527527bbb730b136329d103737ba103a34329037bbb732b960511b604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526129af908490613575565b505050565b6001600160e01b03191690565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b612a1681611d5a565b15612a68576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600560205260409020546001600160a01b031615612ad2576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b612ada611da0565b600082815260056020526040902080546001600160a01b0319166001600160a01b0392909216919091179055612b0f8161220f565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b80612b8b576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b038816845290915290205481811015612c03576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03161461111b5760009283526002602090815260408085206001600160a01b039788168652909152808420918390039091559290931681522080549091019055565b81600114612ca9576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b03868116911614612d12576040805162461bcd60e51b8152602060048201526018602482015277125b9d995b9d1bdc9e4e881b9bdb8b5bdddb99590813919560421b604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b03851690558061111b576000612d3c846129b4565b60009081526002602090815260408083206001600160a01b03998a168452909152808220805460001901905595909616865250505091208054600101905550565b3b151590565b63f23a6e6160e01b6001600160a01b03851663f23a6e61612da2611da0565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612e1c578181015183820152602001612e04565b50505050905090810190601f168015612e495780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015612e6c57600080fd5b505af1158015612e80573d6000803e3d6000fd5b505050506040513d6020811015612e9657600080fd5b50516001600160e01b0319161461111b576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60006001600160e01b031982166301ffc9a760e01b1480612f2557506001600160e01b03198216636cdb3d1360e11b145b80612f4057506001600160e01b031982166303a24d0760e21b145b80612f5b57506001600160e01b031982166304e72e2360e11b145b80610f9a5750506001600160e01b03191663bd85b03960e01b1490565b60003381612f84613758565b90507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b0316826001600160a01b03161480612ff757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b156130055791506117d79050565b6001600160a01b03821632148015906130c457507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561309757600080fd5b505afa1580156130ab573d6000803e3d6000fd5b505050506040513d60208110156130c157600080fd5b50515b156130d25791506117d79050565b50905090565b80613122576040805162461bcd60e51b8152602060048201526015602482015274496e76656e746f72793a207a65726f2076616c756560581b604482015290519081900360640190fd5b600082815260036020526040902054818101818111613188576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260036020908152604080862092909255600281528185206001600160a01b039096168552949094525091902080549091019055565b81600114613214576040805162461bcd60e51b815260206004820152601a602482015279496e76656e746f72793a2077726f6e67204e46542076616c756560301b604482015290519081900360640190fd5b60008381526004602052604090205415613275576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b038516905580610fbe57600061329f846129b4565b600090815260036020908152604080832080546001908101909155600283528184206001600160a01b038a168552909252909120805490910190555050505050565b63bc197c8160e01b6001600160a01b03851663bc197c81613300611da0565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015613379578181015183820152602001613361565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156133b85781810151838201526020016133a0565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156133f45781810151838201526020016133dc565b50505050905090810190601f1680156134215780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015612e6c57600080fd5b60608161346b57506040805180820190915260018152600360fc1b6020820152610f9d565b8160005b811561348357600101600a8204915061346f565b60008167ffffffffffffffff8111801561349c57600080fd5b506040519080825280601f01601f1916602001820160405280156134c7576020820181803683370190505b50859350905060001982015b831561351857600a840660300160f81b828280600190039350815181106134f657fe5b60200101906001600160f81b031916908160001a905350600a840493506134d3565b50949350505050565b826001600160a01b0316846001600160a01b031614610fbe5760009182526002602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b816135886001600160a01b038216612d7d565b6135d9576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b602083106136165780518252601f1990920191602091820191016135f7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613678576040519150601f19603f3d011682016040523d82523d6000602084013e61367d565b606091505b509150915081156136fc578051156136f7578080602001905160208110156136a457600080fd5b50516136f7576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b61111b565b805161374f576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b60131936013560601c90565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261379a57600085556137e0565b82601f106137b35782800160ff198235161785556137e0565b828001600101855582156137e0579182015b828111156137e05782358255916020019190600101906137c5565b506137ec9291506137f0565b5090565b5b808211156137ec57600081556001016137f156fe496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000496e76656e746f72793a20696e636f6e73697374656e74206172726179730000a26469706673582212208f635348050ae875d7f3ba6d2ea489f83f6d79a22b048a98937551edf99e209064736f6c63430007060033

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

000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : forwarderRegistry (address): 0xB87EbEB1f4aA317bd3eEc04704D3fFD6e3BC4b8f
Arg [1] : universalForwarder (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

65689:3427:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38761:328;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38761:328:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;66278:214;;;;;;;;;;;;;;;;-1:-1:-1;66278:214:0;-1:-1:-1;;;;;;66278:214:0;;:::i;:::-;;;;;;;;;;;;;;;;;;68336:263;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68336:263:0;;;;;;;;;;;;;;;-1:-1:-1;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68336:263:0;;;;;;;;-1:-1:-1;68336:263:0;;-1:-1:-1;;;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68336:263:0;;;;;;;;-1:-1:-1;68336:263:0;;-1:-1:-1;;;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68336:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68336:263:0;;-1:-1:-1;68336:263:0;;-1:-1:-1;;;;;68336:263:0:i;:::-;;66672:114;;;;;;;;;;;;;;;;-1:-1:-1;66672:114:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55427:572;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;55427:572:0;;;;;;;;;;;;;:::i;46435:329::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46435:329:0;;;;;;;;-1:-1:-1;46435:329:0;;-1:-1:-1;;;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46435:329:0;;;;;;;;-1:-1:-1;46435:329:0;;-1:-1:-1;;;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46435:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46435:329:0;;-1:-1:-1;46435:329:0;;-1:-1:-1;;;;;46435:329:0:i;39136:445::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39136:445:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39136:445:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39136:445:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;39136:445:0;;;;;;;;;;-1:-1:-1;39136:445:0;;-1:-1:-1;39136:445:0;-1:-1:-1;39136:445:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66971:128;;;;;;;;;;;;;;;;-1:-1:-1;66971:128:0;;:::i;:::-;;;;-1:-1:-1;;;;;66971:128:0;;;;;;;;;;;;;;12643:195;;;;;;;;;;;;;;;;-1:-1:-1;12643:195:0;-1:-1:-1;;;;;12643:195:0;;:::i;63611:29::-;;;:::i;67997:231::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67997:231:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67997:231:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67997:231:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67997:231:0;;-1:-1:-1;67997:231:0;;-1:-1:-1;;;;;67997:231:0:i;40740:239::-;;;;;;;;;;;;;;;;-1:-1:-1;40740:239:0;;:::i;8738:492::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8738:492:0;;;;;;;;;;-1:-1:-1;8738:492:0;;-1:-1:-1;8738:492:0;-1:-1:-1;8738:492:0;:::i;63649:218::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63649:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;63649:218:0;;;;;;;;;;-1:-1:-1;63649:218:0;;-1:-1:-1;63649:218:0;-1:-1:-1;63649:218:0;:::i;56054:1804::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56054:1804:0;;;;;;;;;;;;;;;-1:-1:-1;;;56054:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56054:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56054:1804:0;;;;;;;;-1:-1:-1;56054:1804:0;;-1:-1:-1;;;;;56054:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56054:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56054:1804:0;;-1:-1:-1;56054:1804:0;;-1:-1:-1;;;;;56054:1804:0:i;3093:96::-;;;:::i;64776:123::-;;;;;;;;;;;;;;;;-1:-1:-1;64776:123:0;-1:-1:-1;;;;;64776:123:0;;:::i;65020:190::-;;;:::i;39619:306::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39619:306:0;;;;;;;;;;:::i;64407:40::-;;;;;;;;;;;;;;;;-1:-1:-1;64407:40:0;-1:-1:-1;;;;;64407:40:0;;:::i;40307:124::-;;;;;;;;;;;;;;;;-1:-1:-1;40307:124:0;;:::i;41168:267::-;;;;;;;;;;;;;;;;-1:-1:-1;41168:267:0;;:::i;10056:522::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10056:522:0;;;;;;;;;;-1:-1:-1;10056:522:0;;-1:-1:-1;10056:522:0;-1:-1:-1;10056:522:0;:::i;40478:215::-;;;;;;;;;;;;;;;;-1:-1:-1;40478:215:0;;:::i;67609:149::-;;;;;;;;;;;;;;;;-1:-1:-1;67609:149:0;;:::i;39963:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39963:166:0;;;;;;;;;;:::i;45577:811::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45577:811:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45577:811:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45577:811:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45577:811:0;;-1:-1:-1;45577:811:0;;-1:-1:-1;;;;;45577:811:0:i;3436:201::-;;;;;;;;;;;;;;;;-1:-1:-1;3436:201:0;-1:-1:-1;;;;;3436:201:0;;:::i;38761:328::-;38845:7;-1:-1:-1;;;;;38873:19:0;;38865:55;;;;;-1:-1:-1;;;38865:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38937:23;:2;:21;:23::i;:::-;38933:109;;;39000:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;38984:38:0;;;;;;:46;;39029:1;38984:46;;;39025:1;38984:46;38977:53;;;;;;38933:109;-1:-1:-1;39061:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;39061:20:0;;;;;;;;;;38761:328;;;;;:::o;66278:214::-;66363:4;-1:-1:-1;;;;;;66387:57:0;;-1:-1:-1;;;66387:57:0;;:97;;;66448:36;66472:11;66448:23;:36::i;:::-;66380:104;;66278:214;;;;:::o;68336:263::-;68515:28;68530:12;:10;:12::i;:::-;68515:14;:28::i;:::-;68554:37;68569:2;68573:3;68578:6;68586:4;68554:14;:37::i;:::-;68336:263;;;;:::o;66672:114::-;66737:13;66770:8;66775:2;66770:4;:8::i;55427:572::-;55555:14;55572:12;:10;:12::i;:::-;55555:29;;55603:27;55617:4;55623:6;55603:13;:27::i;:::-;55595:70;;;;;-1:-1:-1;;;55595:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;55595:70:0;;;;;;;;;;;;;;;55682:20;:2;:18;:20::i;:::-;55678:245;;;55719:30;55733:4;55739:2;55743:5;55719:13;:30::i;:::-;55678:245;;;55771:23;:2;:21;:23::i;:::-;55767:156;;;55811:32;55820:4;55826:2;55830:5;55837;55811:8;:32::i;55767:156::-;55876:35;;;-1:-1:-1;;;55876:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;55767:156;55977:1;-1:-1:-1;;;;;55940:51:0;55963:4;-1:-1:-1;;;;;55940:51:0;55955:6;-1:-1:-1;;;;;55940:51:0;;55981:2;55985:5;55940:51;;;;;;;;;;;;;;;;;;;;;;;;55427:572;;;;:::o;46435:329::-;46705:51;46728:4;46734:2;46738:3;46743:6;46751:4;46705:22;:51::i;:::-;46435:329;;;;;:::o;39136:445::-;39251:16;39288:27;;;39280:70;;;;;-1:-1:-1;;;39280:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39280:70:0;;;;;;;;;;;;;;;39363:25;39405:6;39391:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39391:28:0;;39363:56;;39437:9;39432:114;39452:18;;;39432:114;;39506:28;39516:6;;39523:1;39516:9;;;;;;;;;;;;;-1:-1:-1;;;;;39516:9:0;39527:3;;39531:1;39527:6;;;;;;;;;;;;;39506:9;:28::i;:::-;39492:8;39501:1;39492:11;;;;;;;;;;;;;;;;;:42;39472:3;;39432:114;;;-1:-1:-1;39565:8:0;39136:445;-1:-1:-1;;;;;39136:445:0:o;66971:128::-;67042:7;67069:22;67078:12;67069:8;:22::i;12643:195::-;12730:4;12767:19;-1:-1:-1;;;;;12754:32:0;:9;-1:-1:-1;;;;;12754:32:0;;:76;;;;12811:18;-1:-1:-1;;;;;12790:40:0;:9;-1:-1:-1;;;;;12790:40:0;;12747:83;;12643:195;;;:::o;63611:29::-;;;;;;;;;;;;;;;-1:-1:-1;;63611:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67997:231::-;68151:28;68166:12;:10;:12::i;68151:28::-;68190:30;68200:2;68204;68208:5;68215:4;68190:9;:30::i;40740:239::-;40810:7;40862:14;;;:7;:14;;;;;;-1:-1:-1;;;;;40897:19:0;;40889:59;;;;;-1:-1:-1;;;40889:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8738:492;8907:31;8925:12;:10;:12::i;:::-;8907:17;:31::i;:::-;8966:8;9000:23;;;:51;;;;-1:-1:-1;9027:24:0;;;9000:51;8992:90;;;;;-1:-1:-1;;;8992:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9098:9;9093:130;9118:6;9113:1;:11;9093:130;;9146:65;9187:8;;9196:1;9187:11;;;;;;;;;;;;;-1:-1:-1;;;;;9187:11:0;9200:7;;9208:1;9200:10;;;;;;;;;;;;;9160:6;;9167:1;9160:9;;;;;;;;;;;;;-1:-1:-1;;;;;9160:9:0;-1:-1:-1;;;;;9146:40:0;;;:65;;;;;:::i;:::-;9126:3;;9093:130;;;;8738:492;;;;;;;:::o;63649:218::-;63731:31;63749:12;:10;:12::i;63731:31::-;63773:34;:15;63791:16;;63773:34;:::i;:::-;;63823:36;63842:16;;63823:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63823:36:0;;;;;;;;-1:-1:-1;63823:36:0;;-1:-1:-1;;;;63823:36:0;63649:218;;:::o;56054:1804::-;56224:10;;56263:13;;56253:23;;56245:66;;;;;-1:-1:-1;;;56245:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;56245:66:0;;;;;;;;;;;;;;;56324:14;56341:12;:10;:12::i;:::-;56324:29;;56372:27;56386:4;56392:6;56372:13;:27::i;:::-;56364:70;;;;;-1:-1:-1;;;56364:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;56364:70:0;;;;;;;;;;;;;;;56447:22;56480:25;56521:9;56516:1088;56537:6;56532:1;:11;56516:1088;;56565:10;56578:3;56582:1;56578:6;;;;;;;;;;;;;;56565:19;;56599:13;56615:6;56622:1;56615:9;;;;;;;;;;;;;;56599:25;;56643:20;:2;:18;:20::i;:::-;56639:954;;;56684:30;56698:4;56704:2;56708:5;56684:13;:30::i;:::-;56639:954;;;56740:23;:2;:21;:23::i;:::-;56736:857;;;56784:31;56793:4;56799:2;56803:5;56810:4;56784:8;:31::i;:::-;56834:24;56861:29;:2;:27;:29::i;:::-;56834:56;-1:-1:-1;56913:19:0;56909:593;;56974:16;56957:33;;57033:1;57013:21;;56909:593;;;57107:14;57087:16;:34;57083:400;;57150:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;57150:31:0;;;;;;;;;:52;;;;;;;57229:25;;;:9;:25;;;;;;:46;;;;;;;;;-1:-1:-1;;57319:16:0;57083:400;;;57440:19;;;;;57083:400;56736:857;;-1:-1:-1;;56545:3:0;;56516:1088;;;-1:-1:-1;57620:19:0;;57616:165;;57656:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;57656:31:0;;;;;;;;;:52;;;;;;;57723:25;;;:9;:25;;;;;:46;;;;;;;57616:165;57834:1;-1:-1:-1;;;;;57798:52:0;57820:4;-1:-1:-1;;;;;57798:52:0;57812:6;-1:-1:-1;;;;;57798:52:0;;57838:3;57843:6;57798:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56054:1804;;;;;;;:::o;3093:96::-;3148:7;3175:6;-1:-1:-1;;;;;3175:6:0;3093:96;;:::o;64776:123::-;64830:31;64848:12;:10;:12::i;64830:31::-;64872:19;64883:7;64872:10;:19::i;:::-;64776:123;:::o;65020:190::-;65064:15;65082:12;:10;:12::i;:::-;65064:30;;65105:23;65120:7;65105:14;:23::i;:::-;-1:-1:-1;;;;;65139:17:0;;65159:5;65139:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;65139:25:0;;;65180:22;;;65159:5;65180:22;65020:190;:::o;39619:306::-;39714:14;39731:12;:10;:12::i;:::-;39714:29;;39774:6;-1:-1:-1;;;;;39762:18:0;:8;-1:-1:-1;;;;;39762:18:0;;;39754:55;;;;;-1:-1:-1;;;39754:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39820:18:0;;;;;;;:10;:18;;;;;;;;:28;;;;;;;;;;;;;:39;;-1:-1:-1;;39820:39:0;;;;;;;;;;39875:42;;;;;;;;;;;;;;;;;39619:306;;;:::o;64407:40::-;;;;;;;;;;;;;;;:::o;40307:124::-;40379:4;40403:20;:2;:18;:20::i;41168:267::-;41241:7;41265:23;:2;:21;:23::i;:::-;41261:167;;;41353:1;41328:11;;;:7;:11;;;;;;-1:-1:-1;;;;;41312:43:0;;:51;;41362:1;41312:51;;;41358:1;41312:51;41305:58;;;;;;41261:167;-1:-1:-1;41403:13:0;;;;:9;:13;;;;;;41396:20;;10056:522;10230:31;10248:12;:10;:12::i;10230:31::-;10289:8;10323:26;;;:55;;;;-1:-1:-1;10353:25:0;;;10323:55;10315:94;;;;;-1:-1:-1;;;10315:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10425:9;10420:151;10445:6;10440:1;:11;10420:151;;10492:9;;10502:1;10492:12;;;;;;;;;;;;;-1:-1:-1;;;;;10492:12:0;-1:-1:-1;;;;;10473:45:0;;10527:4;10534:8;;10543:1;10534:11;;;;;;;;;;;;;-1:-1:-1;;;;;10534:11:0;10547:8;;10556:1;10547:11;;;;;;;;;;;;;10473:86;;;;;;;;;;;;;-1:-1:-1;;;;;10473:86:0;;;;;;-1:-1:-1;;;;;10473:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10453:3;;;;;10420:151;;40478:215;40555:7;40583:26;:5;:24;:26::i;:::-;40575:60;;;;;-1:-1:-1;;;40575:60:0;;;;;;;;;;;;-1:-1:-1;;;40575:60:0;;;;;;;;;;;;;;;40653:32;:5;:30;:32::i;67609:149::-;67677:31;67695:12;:10;:12::i;67677:31::-;67719;67737:12;67719:17;:31::i;39963:166::-;-1:-1:-1;;;;;40089:22:0;;;40065:4;40089:22;;;:10;:22;;;;;;;;:32;;;;;;;;;;;;;;;39963:166::o;45577:811::-;45762:14;45779:12;:10;:12::i;:::-;45762:29;-1:-1:-1;;;;;;45810:16:0;;45802:56;;;;;-1:-1:-1;;;45802:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45877:27;45891:4;45897:6;45877:13;:27::i;:::-;45869:70;;;;;-1:-1:-1;;;45869:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;45869:70:0;;;;;;;;;;;;;;;45956:20;:2;:18;:20::i;:::-;45952:261;;;45993:38;46011:4;46017:2;46021;46025:5;45993:17;:38::i;:::-;45952:261;;;46053:23;:2;:21;:23::i;:::-;46049:164;;;46093:40;46106:4;46112:2;46116;46120:5;46127;46093:12;:40::i;46049:164::-;46259:2;-1:-1:-1;;;;;46230:43:0;46253:4;-1:-1:-1;;;;;46230:43:0;46245:6;-1:-1:-1;;;;;46230:43:0;;46263:2;46267:5;46230:43;;;;;;;;;;;;;;;;;;;;;;;;46288:15;:2;-1:-1:-1;;;;;46288:13:0;;:15::i;:::-;46284:97;;;46320:49;46343:4;46349:2;46353;46357:5;46364:4;46320:22;:49::i;:::-;45577:811;;;;;;:::o;3436:201::-;3516:31;3534:12;:10;:12::i;3516:31::-;3558:6;:17;;-1:-1:-1;;;;;;3558:17:0;-1:-1:-1;;;;;3558:17:0;;;;;;;;;3591:38;;3558:17;;3612:6;;;3591:38;;3558:6;3591:38;3436:201;:::o;17841:140::-;17904:4;-1:-1:-1;;;17928:12:0;;:17;;;;:45;;-1:-1:-1;;;;;;;17949:19:0;:24;;;17841:140::o;55026:215::-;55111:4;-1:-1:-1;;;;;;55135:58:0;;-1:-1:-1;;;55135:58:0;;:98;;;55197:36;55221:11;55197:23;:36::i;68738:185::-;68843:15;68878:37;:35;:37::i;:::-;68871:44;;68738:185;:::o;65218:128::-;-1:-1:-1;;;;;65292:17:0;;;;;;:8;:17;;;;;;;;65284:54;;;;;-1:-1:-1;;;65284:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;49500:1880;-1:-1:-1;;;;;49681:16:0;;49673:52;;;;;-1:-1:-1;;;49673:52:0;;;;;;;;;;;;-1:-1:-1;;;49673:52:0;;;;;;;;;;;;;;;49753:10;;49792:13;;49782:23;;49774:66;;;;;-1:-1:-1;;;49774:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;49774:66:0;;;;;;;;;;;;;;;49853:22;49886:25;49927:9;49922:1082;49943:6;49938:1;:11;49922:1082;;49971:10;49984:3;49988:1;49984:6;;;;;;;;;;;;;;49971:19;;50005:13;50021:6;50028:1;50021:9;;;;;;;;;;;;;;50005:25;;50049:20;:2;:18;:20::i;:::-;50045:948;;;50090:28;50104:2;50108;50112:5;50090:13;:28::i;:::-;50045:948;;;50144:23;:2;:21;:23::i;:::-;50140:853;;;50188:29;50197:2;50201;50205:5;50212:4;50188:8;:29::i;:::-;50236:24;50263:29;:2;:27;:29::i;:::-;50236:56;-1:-1:-1;50315:19:0;50311:591;;50376:16;50359:33;;50435:1;50415:21;;50311:591;;;50509:14;50489:16;:34;50485:398;;50552:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;50552:29:0;;;;;;;;;:50;;;;;;50629:25;;;:9;:25;;;;;;:46;;;;;;;;-1:-1:-1;;50719:16:0;50485:398;;;50840:19;;;;;50485:398;50140:853;;-1:-1:-1;;49951:3:0;;49922:1082;;;-1:-1:-1;51020:19:0;;51016:163;;51056:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;51056:29:0;;;;;;;;;:50;;;;;;51121:25;;;:9;:25;;;;;:46;;;;;;51016:163;-1:-1:-1;;;;;51196:56:0;;51232:1;51210:12;:10;:12::i;:::-;-1:-1:-1;;;;;51196:56:0;;51240:3;51245:6;51196:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51267:15;:2;-1:-1:-1;;;;;51267:13:0;;:15::i;:::-;51263:110;;;51299:62;51335:1;51339:2;51343:3;51348:6;51356:4;51299:27;:62::i;:::-;49500:1880;;;;;;;:::o;63875:161::-;63932:13;63989:15;64006:20;:2;:18;:20::i;:::-;63972:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63972:55:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63972:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63958:70;;63875:161;;;:::o;42926:160::-;43010:4;43043:6;-1:-1:-1;;;;;43035:14:0;:4;-1:-1:-1;;;;;43035:14:0;;43034:44;;;-1:-1:-1;;;;;;43054:16:0;;;;;;;:10;:16;;;;;;;;:24;;;;;;;;;;;;43034:44;43027:51;42926:160;-1:-1:-1;;;42926:160:0:o;17724:109::-;-1:-1:-1;;;17808:12:0;:17;;17724:109::o;57997:397::-;58123:10;58115:44;;;;;-1:-1:-1;;;58115:44:0;;;;;;;;;;;;-1:-1:-1;;;58115:44:0;;;;;;;;;;;;;;;58170:15;58188:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;58188:19:0;;;;;;;;;;58226:16;;;;58218:58;;;;;-1:-1:-1;;;58218:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58287:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;58287:19:0;;;;;;;;;;;58309:15;;;;58287:37;;;58364:13;;;:9;:13;;;;;:22;;;;;;;;57997:397::o;58402:618::-;58546:5;58555:1;58546:10;58538:49;;;;;-1:-1:-1;;;58538:49:0;;;;;;;;;;;;-1:-1:-1;;;58538:49:0;;;;;;;;;;;;;;;58630:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;58606:37:0;;;;;;58598:74;;;;;-1:-1:-1;;;58598:74:0;;;;;;;;;;;;-1:-1:-1;;;58598:74:0;;;;;;;;;;;;;;;58683:11;;;;:7;:11;;;;;-1:-1:-1;;;58683:30:0;;58731:7;58726:287;;58755:20;58778:29;:2;:27;:29::i;:::-;58899:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;58899:29:0;;;;;;;;;58897:31;;-1:-1:-1;;58897:31:0;;;;;;58978:23;;;:9;:23;;;;;58976:25;;;;;;;-1:-1:-1;58402:618:0;;;;:::o;46903:1942::-;-1:-1:-1;;;;;47107:16:0;;47099:56;;;;;-1:-1:-1;;;47099:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47183:10;;47222:13;;47212:23;;47204:66;;;;;-1:-1:-1;;;47204:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47204:66:0;;;;;;;;;;;;;;;47281:14;47298:12;:10;:12::i;:::-;47281:29;;47329:27;47343:4;47349:6;47329:13;:27::i;:::-;47321:70;;;;;-1:-1:-1;;;47321:70:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47321:70:0;;;;;;;;;;;;;;;47404:22;47437:25;47478:9;47473:1052;47494:6;47489:1;:11;47473:1052;;47522:10;47535:3;47539:1;47535:6;;;;;;;;;;;;;;47522:19;;47556:13;47572:6;47579:1;47572:9;;;;;;;;;;;;;;47556:25;;47600:20;:2;:18;:20::i;:::-;47596:918;;;47641:38;47659:4;47665:2;47669;47673:5;47641:17;:38::i;:::-;47596:918;;;47705:23;:2;:21;:23::i;:::-;47701:813;;;47749:39;47762:4;47768:2;47772;47776:5;47783:4;47749:12;:39::i;:::-;47807:24;47834:29;:2;:27;:29::i;:::-;47807:56;-1:-1:-1;47886:19:0;47882:541;;47947:16;47930:33;;48006:1;47986:21;;47882:541;;;48080:14;48060:16;:34;48056:348;;48123:73;48152:4;48158:2;48162:14;48178:17;48123:28;:73::i;:::-;48240:16;48223:33;;48303:1;48283:21;;48056:348;;;48361:19;;;;;48056:348;47701:813;;-1:-1:-1;;47502:3:0;;47473:1052;;;-1:-1:-1;48541:19:0;;48537:125;;48577:73;48606:4;48612:2;48616:14;48632:17;48577:28;:73::i;:::-;48707:2;-1:-1:-1;;;;;48679:44:0;48701:4;-1:-1:-1;;;;;48679:44:0;48693:6;-1:-1:-1;;;;;48679:44:0;;48711:3;48716:6;48679:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48738:15;:2;-1:-1:-1;;;;;48738:13:0;;:15::i;:::-;48734:104;;;48770:56;48798:4;48804:2;48808:3;48813:6;48821:4;48770:27;:56::i;:::-;46903:1942;;;;;;;;;:::o;42280:214::-;42351:7;42380:33;:12;:31;:33::i;:::-;42379:34;42371:74;;;;;-1:-1:-1;;;42371:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42463:23:0;;;;:9;:23;;;;;;-1:-1:-1;;;;;42463:23:0;;42280:214::o;48853:639::-;-1:-1:-1;;;;;49001:16:0;;48993:52;;;;;-1:-1:-1;;;48993:52:0;;;;;;;;;;;;-1:-1:-1;;;48993:52:0;;;;;;;;;;;;;;;49062:20;:2;:18;:20::i;:::-;49058:241;;;49099:28;49113:2;49117;49121:5;49099:13;:28::i;:::-;49058:241;;;49149:23;:2;:21;:23::i;:::-;49145:154;;;49189:30;49198:2;49202;49206:5;49213;49189:8;:30::i;49145:154::-;-1:-1:-1;;;;;49316:55:0;;49353:1;49331:12;:10;:12::i;:::-;-1:-1:-1;;;;;49316:55:0;;49361:2;49365:5;49316:55;;;;;;;;;;;;;;;;;;;;;;;;49386:15;:2;-1:-1:-1;;;;;49386:13:0;;:15::i;:::-;49382:103;;;49418:55;49449:1;49453:2;49457;49461:5;49468:4;49418:22;:55::i;3768:138::-;3859:4;-1:-1:-1;;;;;3859:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3859:12:0;-1:-1:-1;;;;;3848:23:0;;;;;;3840:58;;;;;-1:-1:-1;;;3840:58:0;;;;;;;;;;;;-1:-1:-1;;;3840:58:0;;;;;;;;;;;;;;5731:229;5893:58;;;-1:-1:-1;;;;;5893:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5893:58:0;-1:-1:-1;;;5893:58:0;;;5858:94;;5886:5;;5858:27;:94::i;:::-;5731:229;;;:::o;17989:134::-;-1:-1:-1;;;;;;18088:27:0;;17989:134::o;65354:125::-;-1:-1:-1;;;;;65411:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;65411:24:0;65431:4;65411:24;;;65451:20;;;65411:17;65451:20;65354:125;:::o;41894:378::-;41980:33;:12;:31;:33::i;:::-;41979:34;41971:74;;;;;-1:-1:-1;;;41971:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42099:1;42064:23;;;:9;:23;;;;;;-1:-1:-1;;;;;42064:23:0;:37;42056:80;;;;;-1:-1:-1;;;42056:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42173:12;:10;:12::i;:::-;42147:23;;;;:9;:23;;;;;:38;;-1:-1:-1;;;;;;42147:38:0;-1:-1:-1;;;;;42147:38:0;;;;;;;;;;42233:30;42147:23;42233:28;:30::i;:::-;42201:63;;42219:12;42201:63;;;;;;;;;;41894:378;:::o;52729:501::-;52880:10;52872:44;;;;;-1:-1:-1;;;52872:44:0;;;;;;;;;;;;-1:-1:-1;;;52872:44:0;;;;;;;;;;;;;;;52927:15;52945:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;52945:19:0;;;;;;;;;;52983:16;;;;52975:58;;;;;-1:-1:-1;;;52975:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53056:2;-1:-1:-1;;;;;53048:10:0;:4;-1:-1:-1;;;;;53048:10:0;;53044:179;;53075:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;53075:19:0;;;;;;;;;;;53097:15;;;;53075:37;;;53185:17;;;;;;;:26;;;;;;;52729:501::o;53238:679::-;53407:5;53416:1;53407:10;53399:49;;;;;-1:-1:-1;;;53399:49:0;;;;;;;;;;;;-1:-1:-1;;;53399:49:0;;;;;;;;;;;;;;;53491:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;53467:37:0;;;;;;53459:74;;;;;-1:-1:-1;;;53459:74:0;;;;;;;;;;;;-1:-1:-1;;;53459:74:0;;;;;;;;;;;;;;;53544:11;;;;:7;:11;;;;;-1:-1:-1;;;;;53558:20:0;;53544:34;;53594:7;53589:321;;53618:20;53641:29;:2;:27;:29::i;:::-;53759:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;53759:29:0;;;;;;;;;;;:34;;-1:-1:-1;;53759:34:0;;;53866:27;;;;;;-1:-1:-1;;;53866:27:0;;:32;;-1:-1:-1;53866:32:0;;;-1:-1:-1;53238:679:0:o;4920:387::-;5243:20;5291:8;;;4920:387::o;43569:325::-;-1:-1:-1;;;;;;;;43753:43:0;;37120:10;43797:12;:10;:12::i;:::-;43811:4;43817:2;43821:5;43828:4;43753:80;;;;;;;;;;;;;-1:-1:-1;;;;;43753:80:0;;;;;;-1:-1:-1;;;;;43753:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43753:80:0;-1:-1:-1;;;;;;43753:101:0;;43745:141;;;;;-1:-1:-1;;;43745:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;38132:451;38217:4;-1:-1:-1;;;;;;38254:40:0;;-1:-1:-1;;;38254:40:0;;:98;;-1:-1:-1;;;;;;;38311:41:0;;-1:-1:-1;;;38311:41:0;38254:98;:167;;;-1:-1:-1;;;;;;;38369:52:0;;-1:-1:-1;;;38369:52:0;38254:167;:243;;;-1:-1:-1;;;;;;;38438:59:0;;-1:-1:-1;;;38438:59:0;38254:243;:321;;;-1:-1:-1;;;;;;;;38514:61:0;-1:-1:-1;;;38514:61:0;;38132:451::o;12846:922::-;12899:15;12955:10;12899:15;13001:27;:25;:27::i;:::-;12976:52;;13064:18;-1:-1:-1;;;;;13043:40:0;:9;-1:-1:-1;;;;;13043:40:0;;:76;;;;13100:19;-1:-1:-1;;;;;13087:32:0;:9;-1:-1:-1;;;;;13087:32:0;;13043:76;13039:169;;;13190:6;-1:-1:-1;13183:13:0;;-1:-1:-1;13183:13:0;13039:169;-1:-1:-1;;;;;13612:22:0;;13625:9;13612:22;;;;:78;;;13638:18;-1:-1:-1;;;;;13638:33:0;;13672:6;13680:9;13638:52;;;;;;;;;;;;;-1:-1:-1;;;;;13638:52:0;;;;;;-1:-1:-1;;;;;13638:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13638:52:0;13612:78;13608:124;;;13714:6;-1:-1:-1;13707:13:0;;-1:-1:-1;13707:13:0;13608:124;-1:-1:-1;13751:9:0;-1:-1:-1;12846:922:0;:::o;51519:488::-;51643:10;51635:44;;;;;-1:-1:-1;;;51635:44:0;;;;;;;;;;;;-1:-1:-1;;;51635:44:0;;;;;;;;;;;;;;;51690:14;51707:13;;;:9;:13;;;;;;51751:14;;;51784:18;;;51776:57;;;;;-1:-1:-1;;;51776:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51844:13;;;;:9;:13;;;;;;;;:25;;;;51973:9;:13;;;;;-1:-1:-1;;;;;51973:17:0;;;;;;;;;-1:-1:-1;51973:17:0;;;:26;;;;;;;51519:488::o;52015:706::-;52157:5;52166:1;52157:10;52149:49;;;;;-1:-1:-1;;;52149:49:0;;;;;;;;;;;;-1:-1:-1;;;52149:49:0;;;;;;;;;;;;;;;52217:11;;;;:7;:11;;;;;;:16;52209:58;;;;;-1:-1:-1;;;52209:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52280:11;;;;:7;:11;;;;;-1:-1:-1;;;;;52294:20:0;;52280:34;;52332:7;52327:387;;52356:20;52379:29;:2;:27;:29::i;:::-;52577:23;;;;:9;:23;;;;;;;;52575:25;;;;;;;;;52675:9;:23;;;;;-1:-1:-1;;;;;52675:27:0;;;;;;;;;;52673:29;;;;;;;-1:-1:-1;52015:706:0;;;;:::o;44390:400::-;-1:-1:-1;;;;;;;;44613:48:0;;37285:10;44662:12;:10;:12::i;:::-;44676:4;44682:3;44687:6;44695:4;44613:87;;;;;;;;;;;;;-1:-1:-1;;;;;44613:87:0;;;;;;-1:-1:-1;;;;;44613:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62732:564;62795:13;62825:10;62821:53;;-1:-1:-1;62852:10:0;;;;;;;;;;;;-1:-1:-1;;;62852:10:0;;;;;;62821:53;62899:5;62884:12;62940:78;62947:9;;62940:78;;62973:8;;63004:2;62996:10;;;;62940:78;;;63028:19;63060:6;63050:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63050:17:0;-1:-1:-1;63122:5:0;;-1:-1:-1;63028:39:0;-1:-1:-1;;;63094:10:0;;63138:119;63145:9;;63138:119;;63215:2;63208:4;:9;63202:2;:16;63189:31;;63171:6;63178:7;;;;;;;63171:15;;;;;;;;;;;:49;-1:-1:-1;;;;;63171:49:0;;;;;;;;-1:-1:-1;63243:2:0;63235:10;;;;63138:119;;;-1:-1:-1;63281:6:0;62732:564;-1:-1:-1;;;;62732:564:0:o;53925:446::-;54110:2;-1:-1:-1;;;;;54102:10:0;:4;-1:-1:-1;;;;;54102:10:0;;54098:266;;54203:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;54203:29:0;;;;;;;;;;;:39;;;;;;;54315:27;;;;;;;:37;;;;;;;53925:446::o;6487:892::-;6613:5;6638:19;-1:-1:-1;;;;;6638:17:0;;;:19::i;:::-;6630:58;;;;;-1:-1:-1;;;6630:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6762:12;6776:17;6797:6;-1:-1:-1;;;;;6797:11:0;6809:8;6797:21;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6797:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6761:57;;;;6833:7;6829:543;;;6861:11;;:16;6857:124;;6917:4;6906:24;;;;;;;;;;;;;;;-1:-1:-1;6906:24:0;6898:67;;;;;-1:-1:-1;;;6898:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6829:543;;;7072:11;;7068:97;;7109:40;;;-1:-1:-1;;;7109:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7068:97;7296:4;7290:11;7341:4;7334;7330:2;7326:13;7319:27;10969:526;-1:-1:-1;;11456:14:0;11452:23;11439:37;11435:2;11431:46;;11406:82::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

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