Contract 0x51ac4a13054d5d7e1fa795439821484177e7e828 4

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x54ec3fb80d7a878458a57a1dce8d7af6118a583eec79c9e82de3c03f3cd31e23Safe Transfer Fr...285106572022-05-19 14:06:1839 mins ago0xe5f382166e34e60b8579e4fb94bd0607f4e24c74 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.018013746022 192.530658726
0x914db4ab37e1c2b4c7c59a1053455884e7c830502f41ca7b4fbbbb542d2182deSafe Transfer Fr...285103602022-05-19 13:56:0449 mins ago0xe5f382166e34e60b8579e4fb94bd0607f4e24c74 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.007442730958 79.547801568
0xef2d4f7f9a3d6211df10f9e83319572bf3c717c736c84c06777af79cb7a3385dSafe Transfer Fr...285103262022-05-19 13:54:5250 mins ago0xe5f382166e34e60b8579e4fb94bd0607f4e24c74 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.00672877741 71.91707631
0x167a79d8e7f2485046e93b2fa8f710f18a49de369ea2af8df9be58e58038856cSafe Transfer Fr...285080562022-05-19 12:36:522 hrs 8 mins ago0x1ac1ca3665b5cd5fdd8bc76f924b76c2a2889d39 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.003517849671.2
0x010fc000329a961c5177da8bf746065a8dda29c6e811de556ab5c979f535a68bSafe Transfer Fr...285073852022-05-19 12:11:382 hrs 33 mins ago0x5e7cd53f5b8a2a576cf9d88abe0b4940d53b3042 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.002705307379 54.376944772
0xafca393bf2cc37afc065a1bae3b19244340d12e3e6d76ecd5c783598df17b828Safe Transfer Fr...285073702022-05-19 12:11:082 hrs 34 mins ago0x5e7cd53f5b8a2a576cf9d88abe0b4940d53b3042 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.002315344455 39.003157784
0x60116a26332659416395fd4aa32c8716bd829c1d681ba9cb9378a4eaed2c81b0Safe Transfer Fr...285073572022-05-19 12:10:422 hrs 34 mins ago0x13b97022ca852f9f2c9bb7c11584a8f37aa21c8f IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.002181833179 43.844486454
0xa611c400d8bcd4c2e1bd1cc061e70217572a8daf6a10fc2c4ff3d90a0850d701Safe Transfer Fr...285073432022-05-19 12:10:142 hrs 35 mins ago0x26b99947060016408e97cc5d96825078e35a1728 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.002775690897 55.805120688
0x8dbb167030d1a5288b369c8670664c9422248075b7eaad95b168556259e2115bSafe Transfer Fr...285072872022-05-19 12:08:172 hrs 37 mins ago0x10c67e41d22fa07014d66fb638cd7cf53aaaeaac IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.002107141673 42.353755162
0x87c3a1d46483b0d06951ebbfa49d0c26838171db4b9fee93f086b3b4e350bff3Safe Transfer Fr...285071782022-05-19 12:04:312 hrs 40 mins ago0xfcc1d715ed22d69f4f4149d7b0371fdd7d35a2d4 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.003322986192 55.977396567
0x48711ab667e98710e4391d6072f6d6faa8dffe591d6401fa862ff7054cb267acSafe Transfer Fr...285071682022-05-19 12:04:112 hrs 41 mins ago0x4dc9429be3f0b8de7415d335171c21eb727b6010 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.00336091186 56.616273789
0x7cd466c090c18d2cb6660c1b0b323ec523ee5c7d9b687872444c60cdb36b4ca0Safe Transfer Fr...285071592022-05-19 12:03:532 hrs 41 mins ago0x1cd122eb1ed84aa6e28802ee91d6f23c9fa32d3e IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.004148782196 69.888351271
0x5f13c2fb9561b6b2aa97979a7980abb962140cd552d8e1c980feffee46b65d1bSafe Transfer Fr...285071312022-05-19 12:02:532 hrs 42 mins ago0xfcc1d715ed22d69f4f4149d7b0371fdd7d35a2d4 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.003835436378 64.609881208
0x3a0ace5ce97cf8ff4e61cdd099e8019a8d9026e1dfa7acd1930d4d48952ba3b9Safe Transfer Fr...285071122022-05-19 12:02:152 hrs 43 mins ago0x4dc9429be3f0b8de7415d335171c21eb727b6010 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.003562971206 60.020066474
0x024d5b2ae19a45cbac7c1d003845769623e6197e7b4e5ae83921a69144644cfdSafe Transfer Fr...285070982022-05-19 12:01:472 hrs 43 mins ago0x1cd122eb1ed84aa6e28802ee91d6f23c9fa32d3e IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.004687590293 78.964848361
0x18797c8b116a699585a23237d139f7c19c8961a6b9e26a731df67bf9cca85e42Safe Transfer Fr...285070862022-05-19 12:01:232 hrs 44 mins ago0x4861ab914b2e0af8691de0194b0a8f002717fb4d IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.004105674708 69.176167351
0x7b0fab14f2b702487ed95370b668c8c0a739daf713c62a00e617520f9eaa622aSafe Transfer Fr...285070622022-05-19 12:00:312 hrs 44 mins ago0x9e0b5b9aa1164b125407845ea45719c2bf7eed08 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.003637245172 61.27124931
0x1b7e619db717acf3ee312cbeaf2541debe70718f620c05dd791c1af47cc1deb6Safe Transfer Fr...285070502022-05-19 12:00:072 hrs 45 mins ago0x3e91080203e4411a48b140e5b86d11053cdf60b3 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.003727647645 62.794125061
0x50db4d25ea5ed152de2bfece7ec76ae9fd6b726a5e2f9b9702bd47dd9904c9b5Safe Transfer Fr...285070382022-05-19 11:59:432 hrs 45 mins ago0x20cc4e0e457dd7c2bb112fdcfc80d74811715c21 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.004221914047 71.12029458
0x1606adbec2d2db0692ef00c33fa028327a07d2415b364d03876ec7476d1528a8Safe Transfer Fr...285070262022-05-19 11:59:192 hrs 46 mins ago0x769308f348eb21465730cf799781474eefd4ae0e IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.004888383078 82.347305195
0x89663025c22f8a8c908ed990c701a20b0ee911c27aa317d80d79dfdb4d086c33Safe Transfer Fr...285070142022-05-19 11:58:552 hrs 46 mins ago0x8186d37d70ba0510ccaba11280dd1ce17f3d4dd1 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.004922347531 82.919453717
0x3340304a08b9ea7faf02ac032119fa57cdc9e89dc83d0d43edefeb1ad630d030Safe Transfer Fr...285070052022-05-19 11:58:332 hrs 46 mins ago0x769308f348eb21465730cf799781474eefd4ae0e IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.004711348275 79.365063682
0xcc3338fe03cd4aded5391cc0547809fc22399a21f7a5c39e9d80a2de5e085e20Safe Transfer Fr...285069812022-05-19 11:57:452 hrs 47 mins ago0xeb582f75ce9402169c08748aa0f1b0ff67861966 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.005939431359 100.052749355
0xe6af7b8f3187bc3cedb53e0c5734ee958296f12bd6ec07eb735846631b016a70Set Approval For...285069792022-05-19 11:57:412 hrs 47 mins ago0x0e28cc7e4c4688a7364c5f2ff3189c381763d954 IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.004518674784 97.425126333
0xa72a3b2cc061443cb36415f9664e3e78c02c768694689bafb3079f88d797c72eSafe Transfer Fr...285069712022-05-19 11:57:252 hrs 47 mins ago0xc33b0121afcf7c8581089eefb8fad925573bbcfc IN  0x51ac4a13054d5d7e1fa795439821484177e7e8280 MATIC0.006022129344 101.445839074
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
REVVMotorsportInventory

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-06-29
*/

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

// File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155721/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title IERC1155721InventoryBurnable interface.
 * The function {IERC721Burnable-burnFrom(address,uint256)} is not provided as
 *  {IERC1155Burnable-burnFrom(address,uint256,uint256)} can be used instead.
 */
interface IERC1155721InventoryBurnable {
    /**
     * Burns some token (ERC1155-compatible).
     * @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 {IERC721-Transfer} event to the zero address if `id` represents a non-fungible token.
     * @dev Emits an {IERC1155-TransferSingle} event to the zero address.
     * @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 (ERC1155-compatible).
     * @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 {IERC721-Transfer} event to the zero address for each burnt non-fungible token.
     * @dev Emits an {IERC1155-TransferBatch} event to the zero address.
     * @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;

    /**
     * Burns a batch of Non-Fungible Tokens (ERC721-compatible).
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if one of `nftIds` does not represent a non-fungible token.
     * @dev Reverts if one of `nftIds` is not owned by `from`.
     * @dev Emits an {IERC721-Transfer} event to the zero address for each of `nftIds`.
     * @dev Emits an {IERC1155-TransferBatch} event to the zero address.
     * @param from Current token owner.
     * @param nftIds Identifiers of the tokens to transfer.
     */
    function batchBurnFrom(address from, uint256[] calldata nftIds) external;
}


// File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC721/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC721 Non-Fungible Token Standard, basic interface
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 * Note: The ERC-165 identifier for this interface is 0x80ac58cd.
 */
interface IERC721 {
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

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

    /**
     * Gets the balance of the specified address
     * @param owner address to query the balance of
     * @return balance uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * Gets the owner of the specified ID
     * @param tokenId uint256 ID to query the owner of
     * @return owner address currently marked as the owner of the given ID
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * Approves another address to transfer the given token ID
     * @dev The zero address indicates there is no approved address.
     * @dev There can only be one approved address per token at a given time.
     * @dev Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * Gets the approved address for a token ID, or zero if no address set
     * @dev Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return operator address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * Sets or unsets the approval of a given operator
     * @dev An operator is allowed to transfer all tokens of the sender on their behalf
     * @param operator operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * Tells whether an operator is approved by a given owner
     * @param owner owner address which you want to query the approval of
     * @param operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * Transfers the ownership of a given token ID to another address
     * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
     * @dev Requires the msg sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * Safely transfers the ownership of a given token ID to another address
     *
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     *
     * @dev Requires the msg sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * Safely transfers the ownership of a given token ID to another address
     *
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     *
     * @dev Requires the msg sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}


// File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC721/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 * Note: The ERC-165 identifier for this interface is 0x5b5e139f.
 */
interface IERC721Metadata {
    /**
     * @dev Gets the token name
     * @return string representing the token name
     */
    function name() external view returns (string memory);

    /**
     * @dev Gets the token symbol
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns an URI for a given token ID
     * Throws if the token ID does not exist. May return an empty string.
     * @param tokenId uint256 ID of the token to query
     * @return string URI of given token ID
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


// File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC721/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC721 Non-Fungible Token Standard, optional unsafe batchTransfer interface
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 * Note: The ERC-165 identifier for this interface is.
 */
interface IERC721BatchTransfer {
    /**
     * Unsafely transfers a batch of tokens.
     * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if one of `tokenIds` is not owned by `from`.
     * @dev Resets the token approval for each of `tokenIds`.
     * @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.
     * @param from Current tokens owner.
     * @param to Address of the new token owner.
     * @param tokenIds Identifiers of the tokens to transfer.
     */
    function batchTransferFrom(
        address from,
        address to,
        uint256[] calldata tokenIds
    ) external;
}


// File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC721/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
    @title ERC721 Non-Fungible Token Standard, token receiver
    @dev See https://eips.ethereum.org/EIPS/eip-721
    Interface for any contract that wants to support safeTransfers from ERC721 asset contracts.
    Note: The ERC-165 identifier for this interface is 0x150b7a02.
 */
interface IERC721Receiver {
    /**
        @notice Handle the receipt of an NFT
        @dev The ERC721 smart contract calls this function on the recipient
        after a {IERC721-safeTransferFrom}. This function MUST return the function selector,
        otherwise the caller will revert the transaction. The selector to be
        returned can be obtained as `this.onERC721Received.selector`. This
        function MAY throw to revert and reject the transfer.
        Note: the ERC721 contract address is always the message sender.
        @param operator The address which called `safeTransferFrom` function
        @param from The address which previously owned the token
        @param tokenId The NFT identifier which is being transferred
        @param data Additional data with no specified format
        @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


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

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC-1155 Multi Token Standard, optional Inventory extension
 * @dev See https://eips.ethereum.org/EIPS/eip-xxxx
 * Interface for fungible/non-fungible tokens management on a 1155-compliant 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    |
 *
 * Note: The ERC-165 identifier for this interface is 0x469bd23f.
 */
interface IERC1155Inventory {
    /**
     * 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 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 pure 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 pure returns (uint256);

    /**
     * @notice this documentation overrides {IERC1155-balanceOf(address,uint256)}.
     * 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 returns (uint256);

    /**
     * @notice this documentation overrides {IERC1155-balanceOfBatch(address[],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 returns (uint256[] memory);

    /**
     * @notice this documentation overrides its {IERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.
     * 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;

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


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

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC-1155 Multi Token Standard, basic interface
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * 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-1.0.2/contracts/token/ERC1155721/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155721
 */
interface IERC1155721 is IERC1155 {
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /**
     * Gets the balance of the specified address
     * @param owner address to query the balance of
     * @return balance uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * Gets the owner of the specified ID
     * @param tokenId uint256 ID to query the owner of
     * @return owner address currently marked as the owner of the given ID
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * Approves another address to transfer the given token ID
     * @dev The zero address indicates there is no approved address.
     * @dev There can only be one approved address per token at a given time.
     * @dev Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * Gets the approved address for a token ID, or zero if no address set
     * @dev Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return operator address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * Transfers the ownership of a given token ID to another address
     * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
     * @dev Requires the msg sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * Safely transfers the ownership of a given token ID to another address
     *
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     *
     * @dev Requires the msg sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * Safely transfers the ownership of a given token ID to another address
     *
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     *
     * @dev Requires the msg sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}


// File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155721/[email protected]

pragma solidity >=0.7.6 <0.8.0;


/**
 * @title IERC1155721Inventory interface.
 */
interface IERC1155721Inventory is IERC1155721, IERC1155Inventory {
    /// @dev See {IERC721-ownerOf(uint256)} and {IERC1155Inventory-ownerOf(uint256)}.
    function ownerOf(uint256 nftId) external view override(IERC1155721, IERC1155Inventory) returns (address);

    /**
     * @notice this documentation overrides {IERC1155Inventory-safeTransferFrom(address,address,uint256,uint256,bytes)}.
     * 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 Resets the ERC721 single token approval if `id` represents a non-fungible token.
     * @dev Emits an {IERC721-Transfer} event if `id` represents a non-fungible token.
     * @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;
    /**
     * @notice this documentation overrides {IERC1155Inventory-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 Resets the ERC721 single token approval for each transferred non-fungible token.
     * @dev Emits an {IERC721-Transfer} event for each transferred non-fungible token.
     * @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;
    /**
     * @notice this documentation overrides its IERC721 counterpart.
     * Unsafely transfers a Non-Fungible Token.
     * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `nftId` is not owned by `from`.
     * @dev Reverts if `to` is an IERC1155TokenReceiver contract which refuses the receiver call.
     * @dev Resets the ERC721 single token approval.
     * @dev Emits an {IERC721-Transfer} event.
     * @dev Emits an {IERC1155-TransferSingle} event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param nftId Identifier of the token to transfer.
     */
    // function transferFrom(
    //     address from,
    //     address to,
    //     uint256 nftId
    // ) external;
    /**
     * @notice this documentation overrides its IERC721 counterpart.
     * Safely transfers a Non-Fungible Token.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `nftId` is not owned by `from`.
     * @dev Reverts if `to` is a contract which does not implement IERC1155TokenReceiver or IERC721Receiver.
     * @dev Reverts if `to` is an IERC1155TokenReceiver or IERC721Receiver contract which refuses the transfer.
     * @dev Resets the ERC721 single token approval.
     * @dev Emits an {IERC721-Transfer} event.
     * @dev Emits an {IERC1155-TransferSingle} event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param nftId Identifier of the token to transfer.
     */
    // function safeTransferFrom(
    //     address from,
    //     address to,
    //     uint256 nftId
    // ) external;
    /**
     * @notice this documentation overrides its IERC721 counterpart.
     * Safely transfers a Non-Fungible Token.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `nftId` is not owned by `from`.
     * @dev Reverts if `to` is a contract which does not implement IERC1155TokenReceiver or IERC721Receiver.
     * @dev Reverts if `to` is an IERC1155TokenReceiver or IERC721Receiver contract which refuses the transfer.
     * @dev Resets the ERC721 single token approval.
     * @dev Emits an {IERC721-Transfer} event.
     * @dev Emits an {IERC1155-TransferSingle} event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param nftId Identifier of the token to transfer.
     * @param data Optional data to pass to the receiver contract.
     */
    // function safeTransferFrom(
    //     address from,
    //     address to,
    //     uint256 nftId,
    //     bytes calldata data
    // ) external;
}


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

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC-1155 Multi Token Standard, optional metadata URI extension
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * 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 "ERC-1155 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-1.0.2/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC-1155 Multi Token Standard, optional InventoryTotalSupply extension
 * @dev See https://eips.ethereum.org/EIPS/eip-xxxx
 * Note: The ERC-165 identifier for this interface is 0xTODO.
 */
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-1.0.2/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC-1155 Multi Token Standard, token receiver
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * Interface for any contract that wants to support transfers from ERC1155 asset contracts.
 * 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-core-1.0.1/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-core-1.0.1/contracts/metatx/[email protected]

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File @animoca/ethereum-contracts-assets-1.0.2/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;
    }
}

abstract contract ERC1155InventoryBase is IERC165, IERC1155, IERC1155MetadataURI, IERC1155Inventory, IERC1155InventoryTotalSupply, ManagedIdentity {
    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;

    /// @dev See {IERC165-supportsInterface}.
    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(IERC1155Inventory).interfaceId ||
            interfaceId == type(IERC1155InventoryTotalSupply).interfaceId;
    }

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

    /// @dev See {IERC1155-balanceOf(address,uint256)}.
    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];
    }

    /// @dev See {IERC1155-balanceOfBatch(address[],uint256[])}.
    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;
    }

    /// @dev See {IERC1155-setApprovalForAll(address,bool)}.
    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);
    }

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

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

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

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

    /// @dev See {IERC1155Inventory-ownerOf(uint256)}.
    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;
    }

    /// @dev See {IERC1155Inventory-totalSupply(uint256)}.
    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];
        }
    }

    //================================== ABI-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());
    }

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

    //================================== Internal Helper 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-core-1.0.1/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;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}


// File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155721/[email protected]

pragma solidity >=0.7.6 <0.8.0;







/**
 * @title ERC1155721Inventory, an ERC1155Inventory with additional support for ERC721.
 */
abstract contract ERC1155721Inventory is IERC1155721Inventory, IERC721Metadata, IERC721BatchTransfer, ERC1155InventoryBase {
    using ERC1155InventoryIdentifiersLib for uint256;
    using AddressIsContract for address;

    uint256 internal constant _APPROVAL_BIT_TOKEN_OWNER_ = 1 << 160;

    string internal _name;
    string internal _symbol;

    /* owner => NFT balance */
    mapping(address => uint256) internal _nftBalances;

    /* NFT ID => operator */
    mapping(uint256 => address) internal _nftApprovals;

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

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

    //===================================== ERC721 ==========================================/

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

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

    /// @dev See {IERC721-balanceOf(address)}.
    function balanceOf(address tokenOwner) external view virtual override returns (uint256) {
        require(tokenOwner != address(0), "Inventory: zero address");
        return _nftBalances[tokenOwner];
    }

    /// @dev See {IERC721-ownerOf(uint256)} and {IERC1155Inventory-ownerOf(uint256)}.
    function ownerOf(uint256 nftId) public view virtual override(IERC1155721Inventory, ERC1155InventoryBase) returns (address) {
        return super.ownerOf(nftId);
    }

    /// @dev See {IERC721-approve(address,uint256)}.
    function approve(address to, uint256 nftId) external virtual override {
        address tokenOwner = ownerOf(nftId);
        require(to != tokenOwner, "Inventory: self-approval");
        require(_isOperatable(tokenOwner, _msgSender()), "Inventory: non-approved sender");
        _owners[nftId] = uint256(uint160(tokenOwner)) | _APPROVAL_BIT_TOKEN_OWNER_;
        _nftApprovals[nftId] = to;
        emit Approval(tokenOwner, to, nftId);
    }

    /// @dev See {IERC721-getApproved(uint256)}.
    function getApproved(uint256 nftId) external view virtual override returns (address) {
        uint256 tokenOwner = _owners[nftId];
        require(address(uint160(tokenOwner)) != address(0), "Inventory: non-existing NFT");
        if (tokenOwner & _APPROVAL_BIT_TOKEN_OWNER_ != 0) {
            return _nftApprovals[nftId];
        } else {
            return address(0);
        }
    }

    /**
     * Unsafely transfers a Non-Fungible Token (ERC721-compatible).
     * @dev See {IERC1155721Inventory-transferFrom(address,address,uint256)}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 nftId
    ) public virtual override {
        _transferFrom(
            from,
            to,
            nftId,
            "",
            /* safe */
            false
        );
    }

    /**
     * Safely transfers a Non-Fungible Token (ERC721-compatible).
     * @dev See {IERC1155721Inventory-safeTransferFrom(address,address,uint256)}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 nftId
    ) public virtual override {
        _transferFrom(
            from,
            to,
            nftId,
            "",
            /* safe */
            true
        );
    }

    /**
     * Safely transfers a Non-Fungible Token (ERC721-compatible).
     * @dev See {IERC1155721Inventory-safeTransferFrom(address,address,uint256,bytes)}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 nftId,
        bytes memory data
    ) public virtual override {
        _transferFrom(
            from,
            to,
            nftId,
            data,
            /* safe */
            true
        );
    }

    /**
     * Unsafely transfers a batch of Non-Fungible Tokens (ERC721-compatible).
     * @dev See {IERC1155721BatchTransfer-batchTransferFrom(address,address,uint256[])}.
     */
    function batchTransferFrom(
        address from,
        address to,
        uint256[] memory nftIds
    ) public virtual override {
        require(to != address(0), "Inventory: transfer to zero");
        address sender = _msgSender();
        bool operatable = _isOperatable(from, sender);

        uint256 length = nftIds.length;
        uint256[] memory values = new uint256[](length);

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 nftId = nftIds[i];
            values[i] = 1;
            _transferNFT(from, to, nftId, 1, operatable, true);
            emit Transfer(from, to, nftId);
            uint256 nextCollectionId = nftId.getNonFungibleCollection();
            if (nfCollectionId == 0) {
                nfCollectionId = nextCollectionId;
                nfCollectionCount = 1;
            } else {
                if (nextCollectionId != nfCollectionId) {
                    _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount);
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    ++nfCollectionCount;
                }
            }
        }

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

        emit TransferBatch(_msgSender(), from, to, nftIds, values);
        if (to.isContract() && _isERC1155TokenReceiver(to)) {
            _callOnERC1155BatchReceived(from, to, nftIds, values, "");
        }
    }

    /// @dev See {IERC721Metadata-tokenURI(uint256)}.
    function tokenURI(uint256 nftId) external view virtual override returns (string memory) {
        require(address(uint160(_owners[nftId])) != address(0), "Inventory: non-existing NFT");
        return uri(nftId);
    }

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

    /**
     * Safely transfers some token (ERC1155-compatible).
     * @dev See {IERC1155721Inventory-safeTransferFrom(address,address,uint256,uint256,bytes)}.
     */
    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");
        bool operatable = _isOperatable(from, sender);

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

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

    /**
     * Safely transfers a batch of tokens (ERC1155-compatible).
     * @dev See {IERC1155721Inventory-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.
     */
    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);
    }

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

    /// @dev See {IERC1155MetadataURI-uri(uint256)}.
    function uri(uint256) public view virtual override returns (string memory);

    //================================== ABI-level Internal Functions =======================================/

    /**
     * Safely or unsafely transfers some token (ERC721-compatible).
     * @dev For `safe` transfer, see {IERC1155721Inventory-transferFrom(address,address,uint256)}.
     * @dev For un`safe` transfer, see {IERC1155721Inventory-safeTransferFrom(address,address,uint256,bytes)}.
     */
    function _transferFrom(
        address from,
        address to,
        uint256 nftId,
        bytes memory data,
        bool safe
    ) internal {
        require(to != address(0), "Inventory: transfer to zero");
        address sender = _msgSender();
        bool operatable = _isOperatable(from, sender);

        _transferNFT(from, to, nftId, 1, operatable, false);

        emit Transfer(from, to, nftId);
        emit TransferSingle(sender, from, to, nftId, 1);
        if (to.isContract()) {
            if (_isERC1155TokenReceiver(to)) {
                _callOnERC1155Received(from, to, nftId, 1, data);
            } else if (safe) {
                _callOnERC721Received(from, to, nftId, data);
            }
        }
    }

    /**
     * Safely transfers a batch of tokens (ERC1155-compatible).
     * @dev See {IERC1155721Inventory-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.
     */
    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();
        bool operatable = _isOperatable(from, sender);

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

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

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

    /**
     * Safely or unsafely mints some token (ERC721-compatible).
     * @dev For `safe` mint, see {IERC1155721InventoryMintable-mint(address,uint256)}.
     * @dev For un`safe` mint, see {IERC1155721InventoryMintable-safeMint(address,uint256,bytes)}.
     */
    function _mint(
        address to,
        uint256 nftId,
        bytes memory data,
        bool safe
    ) internal {
        require(to != address(0), "Inventory: mint to zero");
        require(nftId.isNonFungibleToken(), "Inventory: not an NFT");

        _mintNFT(to, nftId, 1, false);

        emit Transfer(address(0), to, nftId);
        emit TransferSingle(_msgSender(), address(0), to, nftId, 1);
        if (to.isContract()) {
            if (_isERC1155TokenReceiver(to)) {
                _callOnERC1155Received(address(0), to, nftId, 1, data);
            } else if (safe) {
                _callOnERC721Received(address(0), to, nftId, data);
            }
        }
    }

    /**
     * Unsafely mints a batch of Non-Fungible Tokens (ERC721-compatible).
     * @dev See {IERC1155721InventoryMintable-batchMint(address,uint256[])}.
     */
    function _batchMint(address to, uint256[] memory nftIds) internal {
        require(to != address(0), "Inventory: mint to zero");

        uint256 length = nftIds.length;
        uint256[] memory values = new uint256[](length);

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 nftId = nftIds[i];
            require(nftId.isNonFungibleToken(), "Inventory: not an NFT");
            values[i] = 1;
            _mintNFT(to, nftId, 1, true);
            emit Transfer(address(0), to, nftId);
            uint256 nextCollectionId = nftId.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;
                }
            }
        }

        _balances[nfCollectionId][to] += nfCollectionCount;
        _supplies[nfCollectionId] += nfCollectionCount;
        _nftBalances[to] += length;

        emit TransferBatch(_msgSender(), address(0), to, nftIds, values);
        if (to.isContract() && _isERC1155TokenReceiver(to)) {
            _callOnERC1155BatchReceived(address(0), to, nftIds, values, "");
        }
    }

    /**
     * Safely mints some token (ERC1155-compatible).
     * @dev See {IERC1155721InventoryMintable-safeMint(address,uint256,uint256,bytes)}.
     */
    function _safeMint(
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "Inventory: mint to zero");
        address sender = _msgSender();
        if (id.isFungibleToken()) {
            _mintFungible(to, id, value);
        } else if (id.isNonFungibleToken()) {
            _mintNFT(to, id, value, false);
            emit Transfer(address(0), to, id);
        } else {
            revert("Inventory: not a token id");
        }

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

    /**
     * Safely mints a batch of tokens (ERC1155-compatible).
     * @dev See {IERC1155721InventoryMintable-safeBatchMint(address,uint256[],uint256[],bytes)}.
     */
    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;
        uint256 nftsCount;
        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);
                emit Transfer(address(0), to, id);
                uint256 nextCollectionId = id.getNonFungibleCollection();
                if (nfCollectionId == 0) {
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    if (nextCollectionId != nfCollectionId) {
                        _balances[nfCollectionId][to] += nfCollectionCount;
                        _supplies[nfCollectionId] += nfCollectionCount;
                        nfCollectionId = nextCollectionId;
                        nftsCount += nfCollectionCount;
                        nfCollectionCount = 1;
                    } else {
                        ++nfCollectionCount;
                    }
                }
            } else {
                revert("Inventory: not a token id");
            }
        }

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

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

    /**
     * Safely mints some tokens to a list of recipients.
     * @dev Reverts if `recipients`, `ids` and `values` have different lengths.
     * @dev Reverts if one of `recipients` 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 `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 `value` is 0.
     * @dev Reverts if one of `ids` represents a fungible token and there is an overflow of supply.
     * @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received}
     *  or {IERC721Receiver-onERC721Received} fails or is refused.
     * @dev Emits an {IERC721-Transfer} event from the zero address for each `id` representing a non-fungible token.
     * @dev Emits an {IERC1155-TransferSingle} event from the zero address.
     * @param recipients Addresses of the new token owners.
     * @param ids Identifiers of the tokens to mint.
     * @param values Amounts of tokens to mint.
     * @param data Optional data to send along to the receiver contract(s), if any. All receivers receive the same data.
     */
    function _safeDeliver(
        address[] calldata recipients,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) internal {
        uint256 length = recipients.length;
        require(length == ids.length && length == values.length, "Inventory: inconsistent arrays");

        address sender = _msgSender();
        for (uint256 i; i != length; ++i) {
            address to = recipients[i];
            require(to != address(0), "Inventory: mint to zero");
            uint256 id = ids[i];
            uint256 value = values[i];
            if (id.isFungibleToken()) {
                _mintFungible(to, id, value);
                emit TransferSingle(sender, address(0), to, id, value);
                if (to.isContract()) {
                    _callOnERC1155Received(address(0), to, id, value, data);
                }
            } else if (id.isNonFungibleToken()) {
                _mintNFT(to, id, value, false);
                emit Transfer(address(0), to, id);
                emit TransferSingle(sender, address(0), to, id, 1);
                if (to.isContract()) {
                    if (_isERC1155TokenReceiver(to)) {
                        _callOnERC1155Received(address(0), to, id, 1, data);
                    } else {
                        _callOnERC721Received(address(0), to, id, data);
                    }
                }
            } else {
                revert("Inventory: not a token id");
            }
        }
    }

    //============================== Internal Helper 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 supply 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];
            ++_balances[collectionId][to];
            ++_nftBalances[to];
        }
    }

    function _transferFungible(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bool operatable
    ) internal {
        require(operatable, "Inventory: non-approved sender");
        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 operatable,
        bool isBatch
    ) internal virtual {
        require(value == 1, "Inventory: wrong NFT value");
        uint256 owner = _owners[id];
        require(from == address(uint160(owner)), "Inventory: non-owned NFT");
        if (!operatable) {
            require((owner & _APPROVAL_BIT_TOKEN_OWNER_ != 0) && _msgSender() == _nftApprovals[id], "Inventory: non-approved sender");
        }
        _owners[id] = uint256(uint160(to));
        if (!isBatch) {
            _transferNFTUpdateBalances(from, to, 1);
            _transferNFTUpdateCollection(from, to, id.getNonFungibleCollection(), 1);
        }
    }

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

    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;
        }
    }

    ///////////////////////////////////// Receiver Calls Internal /////////////////////////////////////

    /**
     * Queries whether a contract implements ERC1155TokenReceiver.
     * @param _contract address of the contract.
     * @return wheter the given contract implements ERC1155TokenReceiver.
     */
    function _isERC1155TokenReceiver(address _contract) internal view returns (bool) {
        bool success;
        bool result;
        bytes memory staticCallData = abi.encodeWithSelector(type(IERC165).interfaceId, type(IERC1155TokenReceiver).interfaceId);
        assembly {
            let call_ptr := add(0x20, staticCallData)
            let call_size := mload(staticCallData)
            let output := mload(0x40) // Find empty storage location using "free memory pointer"
            mstore(output, 0x0)
            success := staticcall(10000, _contract, call_ptr, call_size, output, 0x20) // 32 bytes
            result := mload(output)
        }
        // (10000 / 63) "not enough for supportsInterface(...)" // consume all gas, so caller can potentially know that there was not enough gas
        assert(gasleft() > 158);
        return success && result;
    }

    /**
     * Calls {IERC721Receiver-onERC721Received} 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 nftId Identifier of the token transferred.
     * @param data Optional data to send along with the receiver contract call.
     */
    function _callOnERC721Received(
        address from,
        address to,
        uint256 nftId,
        bytes memory data
    ) internal {
        require(
            IERC721Receiver(to).onERC721Received(_msgSender(), from, nftId, data) == type(IERC721Receiver).interfaceId,
            "Inventory: transfer refused"
        );
    }
}


// File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155721/[email protected]

pragma solidity >=0.7.6 <0.8.0;


/**
 * @title ERC1155721InventoryBurnable, a burnable ERC1155721Inventory.
 */
abstract contract ERC1155721InventoryBurnable is IERC1155721InventoryBurnable, ERC1155721Inventory {
    using ERC1155InventoryIdentifiersLib for uint256;

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

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

    //============================== ERC1155721InventoryBurnable =======================================/

    /**
     * Burns some token (ERC1155-compatible).
     * @dev See {IERC1155721InventoryBurnable-burnFrom(address,uint256,uint256)}.
     */
    function burnFrom(
        address from,
        uint256 id,
        uint256 value
    ) public virtual override {
        address sender = _msgSender();
        bool operatable = _isOperatable(from, sender);

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

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

    /**
     * Burns a batch of token (ERC1155-compatible).
     * @dev See {IERC1155721InventoryBurnable-batchBurnFrom(address,uint256[],uint256[])}.
     */
    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();
        bool operatable = _isOperatable(from, sender);

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

        if (nfCollectionId != 0) {
            _burnNFTUpdateCollection(from, nfCollectionId, nfCollectionCount);
            nftsCount += nfCollectionCount;
            // cannot underflow as balance is verified through ownership
            _nftBalances[from] -= nftsCount;
        }

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

    /**
     * Burns a batch of token (ERC721-compatible).
     * @dev See {IERC1155721InventoryBurnable-batchBurnFrom(address,uint256[])}.
     */
    function batchBurnFrom(address from, uint256[] memory nftIds) public virtual override {
        address sender = _msgSender();
        bool operatable = _isOperatable(from, sender);

        uint256 length = nftIds.length;
        uint256[] memory values = new uint256[](length);

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 nftId = nftIds[i];
            values[i] = 1;
            _burnNFT(from, nftId, values[i], operatable, true);
            emit Transfer(from, address(0), nftId);
            uint256 nextCollectionId = nftId.getNonFungibleCollection();
            if (nfCollectionId == 0) {
                nfCollectionId = nextCollectionId;
                nfCollectionCount = 1;
            } else {
                if (nextCollectionId != nfCollectionId) {
                    _burnNFTUpdateCollection(from, nfCollectionId, nfCollectionCount);
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    ++nfCollectionCount;
                }
            }
        }

        if (nfCollectionId != 0) {
            _burnNFTUpdateCollection(from, nfCollectionId, nfCollectionCount);
            _nftBalances[from] -= length;
        }

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

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

    function _burnFungible(
        address from,
        uint256 id,
        uint256 value,
        bool operatable
    ) internal {
        require(value != 0, "Inventory: zero value");
        require(operatable, "Inventory: non-approved sender");
        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 operatable,
        bool isBatch
    ) internal virtual {
        require(value == 1, "Inventory: wrong NFT value");
        uint256 owner = _owners[id];
        require(from == address(uint160(owner)), "Inventory: non-owned NFT");
        if (!operatable) {
            require((owner & _APPROVAL_BIT_TOKEN_OWNER_ != 0) && _msgSender() == _nftApprovals[id], "Inventory: non-approved sender");
        }
        _owners[id] = _BURNT_NFT_OWNER;

        if (!isBatch) {
            _burnNFTUpdateCollection(from, id.getNonFungibleCollection(), 1);

            // cannot underflow as balance is verified through NFT ownership
            --_nftBalances[from];
        }
    }

    function _burnNFTUpdateCollection(
        address from,
        uint256 collectionId,
        uint256 amount
    ) internal virtual {
        // cannot underflow as balance is verified through NFT ownership
        _balances[collectionId][from] -= amount;
        _supplies[collectionId] -= amount;
    }
}


// File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155721/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title IERC1155721InventoryMintable interface.
 * The function {IERC721Mintable-safeMint(address,uint256,bytes)} is not provided as
 *  {IERC1155Mintable-safeMint(address,uint256,uint256,bytes)} can be used instead.
 */
interface IERC1155721InventoryMintable {
    /**
     * Safely mints some token (ERC1155-compatible).
     * @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 {IERC721-Transfer} event from the zero address if `id` represents a non-fungible token.
     * @dev Emits an {IERC1155-TransferSingle} event from the zero address.
     * @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 (ERC1155-compatible).
     * @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 {IERC721-Transfer} event from the zero address for each non-fungible token minted.
     * @dev Emits an {IERC1155-TransferBatch} event from the zero address.
     * @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;

    /**
     * Unsafely mints a Non-Fungible Token (ERC721-compatible).
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `nftId` does not represent a non-fungible token.
     * @dev Reverts if `nftId` has already been minted.
     * @dev Emits an {IERC721-Transfer} event from the zero address.
     * @dev Emits an {IERC1155-TransferSingle} event from the zero address.
     * @dev If `to` is a contract and supports ERC1155TokenReceiver, calls {IERC1155TokenReceiver-onERC1155Received} with empty data.
     * @param to Address of the new token owner.
     * @param nftId Identifier of the token to mint.
     */
    function mint(address to, uint256 nftId) external;

    /**
     * Unsafely mints a batch of Non-Fungible Tokens (ERC721-compatible).
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if one of `nftIds` does not represent a non-fungible token.
     * @dev Reverts if one of `nftIds` has already been minted.
     * @dev Emits an {IERC721-Transfer} event from the zero address for each of `nftIds`.
     * @dev Emits an {IERC1155-TransferBatch} event from the zero address.
     * @dev If `to` is a contract and supports ERC1155TokenReceiver, calls {IERC1155TokenReceiver-onERC1155BatchReceived} with empty data.
     * @param to Address of the new token owner.
     * @param nftIds Identifiers of the tokens to mint.
     */
    function batchMint(address to, uint256[] calldata nftIds) external;

    /**
     * Safely mints a token (ERC721-compatible).
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `tokenId` has already ben minted.
     * @dev Reverts if `to` is a contract which does not implement IERC721Receiver or IERC1155TokenReceiver.
     * @dev Reverts if `to` is an IERC1155TokenReceiver or IERC721TokenReceiver contract which refuses the transfer.
     * @dev Emits an {IERC721-Transfer} event from the zero address.
     * @dev Emits an {IERC1155-TransferSingle} event from the zero address.
     * @param to Address of the new token owner.
     * @param nftId Identifier of the token to mint.
     * @param data Optional data to pass along to the receiver call.
     */
    function safeMint(
        address to,
        uint256 nftId,
        bytes calldata data
    ) external;
}


// File @animoca/ethereum-contracts-assets-1.0.2/contracts/token/ERC1155721/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title IERC1155721InventoryDeliverable interface.
 */
interface IERC1155721InventoryDeliverable {
    /**
     * Safely mints some tokens to a list of recipients.
     * @dev Reverts if `recipients`, `ids` and `values` have different lengths.
     * @dev Reverts if one of `recipients` 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 `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 `value` is 0.
     * @dev Reverts if one of `ids` represents a fungible token and there is an overflow of supply.
     * @dev Reverts if one of `recipients` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails or is refused.
     * @dev Emits an {IERC721-Transfer} event from the zero address for each `id` representing a non-fungible token.
     * @dev Emits an {IERC1155-TransferSingle} event from the zero address.
     * @param recipients Addresses of the new token owners.
     * @param ids Identifiers of the tokens to mint.
     * @param values Amounts of tokens to mint.
     * @param data Optional data to send along to the receiver contract(s), if any. All receivers receive the same data.
     */
    function safeDeliver(
        address[] calldata recipients,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external;
}


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

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC-1155 Inventory, additional creator interface
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 */
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.0.1/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.0.1/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.
     */
    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.0.1/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-1.0.2/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.0.1/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 @animoca/ethereum-contracts-core-1.0.1/contracts/utils/[email protected]

pragma solidity >=0.7.6 <0.8.0;


abstract contract Recoverable is ManagedIdentity, Ownable {
    /**
     * 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) {
            require(RecoverableERC20(tokens[i]).transfer(accounts[i], amounts[i]), "Recov: transfer failed");
        }
    }

    /**
     * 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) {
            RecoverableERC721(contracts[i]).transferFrom(address(this), accounts[i], tokenIds[i]);
        }
    }
}

interface RecoverableERC20 {
    /// See {IERC20-transfer(address,uint256)}
    function transfer(address recipient, uint256 amount) external returns (bool);
}

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


// File @animoca/ethereum-contracts-core-1.0.1/contracts/lifecycle/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @dev Contract which allows children to implement pausability.
 */
abstract contract Pausable is ManagedIdentity {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool public paused;

    constructor(bool paused_) {
        paused = paused_;
    }

    function _requireNotPaused() internal view {
        require(!paused, "Pausable: paused");
    }

    function _requirePaused() internal view {
        require(paused, "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual {
        _requireNotPaused();
        paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual {
        _requirePaused();
        paused = false;
        emit Unpaused(_msgSender());
    }
}


// File ethereum-universal-forwarder/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/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/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/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 contracts/token/ERC155721/REVVMotorsportInventory.sol

pragma solidity >=0.7.6 <0.8.0;

// solhint-disable max-line-length









// solhint-enable max-line-length

contract REVVMotorsportInventory is
    ERC1155721InventoryBurnable,
    IERC1155721InventoryMintable,
    IERC1155721InventoryDeliverable,
    IERC1155InventoryCreator,
    BaseMetadataURI,
    MinterRole,
    Pausable,
    Recoverable,
    UsingUniversalForwarding
{
    constructor(IForwarderRegistry forwarderRegistry, address universalForwarder)
        ERC1155721Inventory("REVV Motorsport Inventory", "REVVM")
        MinterRole(msg.sender)
        Pausable(false)
        UsingUniversalForwarding(forwarderRegistry, universalForwarder)
    {}

    // ===================================================================================================
    //                                 User Public Functions
    // ===================================================================================================

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

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

    /// @dev See {IERC1155MetadataURI-uri(uint256)}.
    function uri(uint256 id) public view virtual override returns (string memory) {
        return _uri(id);
    }

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

    /// @dev See {IERC1155InventoryCreator-creator(uint256)}.
    function creator(uint256 collectionId) external view override returns (address) {
        return _creator(collectionId);
    }

    // ===================================================================================================
    //                               Admin Public Functions
    // ===================================================================================================

    // Destroys the contract
    function deprecate() external {
        _requirePaused();
        address payable sender = _msgSender();
        _requireOwnership(sender);
        selfdestruct(sender);
    }

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

    //================================== Pausable =======================================/

    function pause() external virtual {
        _requireOwnership(_msgSender());
        _pause();
    }

    function unpause() external virtual {
        _requireOwnership(_msgSender());
        _unpause();
    }

    //================================== ERC721 =======================================/

    function transferFrom(
        address from,
        address to,
        uint256 nftId
    ) public virtual override {
        _requireNotPaused();
        super.transferFrom(from, to, nftId);
    }

    function batchTransferFrom(
        address from,
        address to,
        uint256[] memory nftIds
    ) public virtual override {
        _requireNotPaused();
        super.batchTransferFrom(from, to, nftIds);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 nftId
    ) public virtual override {
        _requireNotPaused();
        super.safeTransferFrom(from, to, nftId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 nftId,
        bytes memory data
    ) public virtual override {
        _requireNotPaused();
        super.safeTransferFrom(from, to, nftId, data);
    }

    function batchBurnFrom(address from, uint256[] memory nftIds) public virtual override {
        _requireNotPaused();
        super.batchBurnFrom(from, nftIds);
    }

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) public virtual override {
        _requireNotPaused();
        super.safeTransferFrom(from, to, id, value, data);
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) public virtual override {
        _requireNotPaused();
        super.safeBatchTransferFrom(from, to, ids, values, data);
    }

    function burnFrom(
        address from,
        uint256 id,
        uint256 value
    ) public virtual override {
        _requireNotPaused();
        super.burnFrom(from, id, value);
    }

    function batchBurnFrom(
        address from,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual override {
        _requireNotPaused();
        super.batchBurnFrom(from, ids, values);
    }

    //================================== ERC1155721InventoryMintable =======================================/

    /**
     * Unsafely mints a Non-Fungible Token (ERC721-compatible).
     * @dev See {IERC1155721InventoryMintable-batchMint(address,uint256)}.
     */
    function mint(address to, uint256 nftId) public virtual override {
        _requireMinter(_msgSender());
        _mint(to, nftId, "", false);
    }

    /**
     * Unsafely mints a batch of Non-Fungible Tokens (ERC721-compatible).
     * @dev See {IERC1155721InventoryMintable-batchMint(address,uint256[])}.
     */
    function batchMint(address to, uint256[] memory nftIds) public virtual override {
        _requireMinter(_msgSender());
        _batchMint(to, nftIds);
    }

    /**
     * Safely mints a Non-Fungible Token (ERC721-compatible).
     * @dev See {IERC1155721InventoryMintable-safeMint(address,uint256,bytes)}.
     */
    function safeMint(
        address to,
        uint256 nftId,
        bytes memory data
    ) public virtual override {
        _requireMinter(_msgSender());
        _mint(to, nftId, data, true);
    }

    /**
     * Safely mints some token (ERC1155-compatible).
     * @dev See {IERC1155721InventoryMintable-safeMint(address,uint256,uint256,bytes)}.
     */
    function safeMint(
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) public virtual override {
        _requireMinter(_msgSender());
        _safeMint(to, id, value, data);
    }

    /**
     * Safely mints a batch of tokens (ERC1155-compatible).
     * @dev See {IERC1155721InventoryMintable-safeBatchMint(address,uint256[],uint256[],bytes)}.
     */
    function safeBatchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) public virtual override {
        _requireMinter(_msgSender());
        _safeBatchMint(to, ids, values, data);
    }

    /**
     * Safely mints tokens to recipients.
     * @dev See {IERC1155721InventoryDeliverable-safeDeliver(address[],uint256[],uint256[],bytes)}.
     */
    function safeDeliver(
        address[] calldata recipients,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external virtual override {
        _requireMinter(_msgSender());
        _safeDeliver(recipients, ids, values, data);
    }

    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":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"approve","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":"tokenOwner","type":"address"}],"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":"nftIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"batchTransferFrom","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":[],"name":"deprecate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"getApproved","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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeDeliver","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":"to","type":"address"},{"internalType":"uint256","name":"nftId","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":"nftId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b5060405162005f1e38038062005f1e833981810160405260408110156200003757600080fd5b508051602091820151604080518082018252601981527f52455656204d6f746f7273706f727420496e76656e746f7279000000000000008186019081528251808401909352600580845264524556564d60d81b9684019690965281519495939486948694600094339485949193620000b292909190620001a4565b508051620000c8906006906020840190620001a4565b5050600980546001600160a01b0319166001600160a01b0384169081179091556040519091506000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620001228162000158565b50600c805460ff1916911515919091179055606090811b6001600160601b031990811660a05291901b1660805250620002509050565b6001600160a01b0381166000818152600b6020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001dc576000855562000227565b82601f10620001f757805160ff191683800117855562000227565b8280016001018555821562000227579182015b82811115620002275782518255916020019190600101906200020a565b506200023592915062000239565b5090565b5b808211156200023557600081556001016200023a565b60805160601c60a05160601c615c956200028960003980611c365280614576525080611c71528061453b52806145ce5250615c956000f3fe608060405234801561001057600080fd5b50600436106103145760003560e01c806373c8a958116101a7578063b88d4fde116100ee578063e8ab9ccc11610097578063f247296511610071578063f2472965146114e9578063f2fde38b1461159c578063f3993d11146115c257610314565b8063e8ab9ccc1461128a578063e985e9c5146113f0578063f242432a1461141e57610314565b8063c7778baa116100c8578063c7778baa14611233578063c87b56dd14611250578063d0011d9d1461126d57610314565b8063b88d4fde1461103c578063bd85b03914611102578063c3666c361461111f57610314565b806395d89b4111610150578063a22cb4651161012a578063a22cb46514610fcb578063aa271e1a14610ff9578063adebf6f21461101f57610314565b806395d89b4114610f95578063983b2d5614610f9d5780639865027514610fc357610314565b80638456cb59116101815780638456cb5914610eca5780638832e6e314610ed25780638da5cb5b14610f8d57610314565b806373c8a95814610c0f5780637e518ec814610d235780638053493414610d9357610314565b80633f4ba83a1161026b578063572b6c05116102145780635cfa9297116101ee5780635cfa929714610b0a5780636352211e14610bcc57806370a0823114610be957610314565b8063572b6c0514610ad45780635b2bd79e14610afa5780635c975abb14610b0257610314565b80634684d7e9116102455780634684d7e9146108f25780634e1273f4146109a5578063510b515814610ab757610314565b80633f4ba83a1461088857806340c10f191461089057806342842e0e146108bc57610314565b80630d6a5bbb116102cd578063124d91e5116102a7578063124d91e51461065957806323b872dd1461068b5780632eb2c2d6146106c157610314565b80630d6a5bbb146104765780630e89341c146106345780630fcc0c281461065157610314565b806306fdde03116102fe57806306fdde0314610392578063081812fc1461040f578063095ea7b31461044857610314565b8062fdd58e1461031957806301ffc9a714610357575b600080fd5b6103456004803603604081101561032f57600080fd5b506001600160a01b03813516906020013561167e565b60408051918252519081900360200190f35b61037e6004803603602081101561036d57600080fd5b50356001600160e01b031916611749565b604080519115158252519081900360200190f35b61039a61178f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103d45781810151838201526020016103bc565b50505050905090810190601f1680156104015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61042c6004803603602081101561042557600080fd5b5035611826565b604080516001600160a01b039092168252519081900360200190f35b6104746004803603604081101561045e57600080fd5b506001600160a01b0381351690602001356118c5565b005b6104746004803603608081101561048c57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156104b757600080fd5b8201836020820111156104c957600080fd5b803590602001918460208302840111640100000000831117156104eb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561053b57600080fd5b82018360208201111561054d57600080fd5b8035906020019184602083028401116401000000008311171561056f57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156105bf57600080fd5b8201836020820111156105d157600080fd5b803590602001918460018302840111640100000000831117156105f357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a17945050505050565b61039a6004803603602081101561064a57600080fd5b5035611a39565b610474611a44565b6104746004803603606081101561066f57600080fd5b506001600160a01b038135169060208101359060400135611a6d565b610474600480360360608110156106a157600080fd5b506001600160a01b03813581169160208101359091169060400135611a85565b610474600480360360a08110156106d757600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561070b57600080fd5b82018360208201111561071d57600080fd5b8035906020019184602083028401116401000000008311171561073f57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561078f57600080fd5b8201836020820111156107a157600080fd5b803590602001918460208302840111640100000000831117156107c357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561081357600080fd5b82018360208201111561082557600080fd5b8035906020019184600183028401116401000000008311171561084757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611a98945050505050565b610474611ab4565b610474600480360360408110156108a657600080fd5b506001600160a01b038135169060200135611ace565b610474600480360360608110156108d257600080fd5b506001600160a01b03813581169160208101359091169060400135611af9565b6104746004803603604081101561090857600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561093357600080fd5b82018360208201111561094557600080fd5b8035906020019184602083028401116401000000008311171561096757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611b0c945050505050565b610a67600480360360408110156109bb57600080fd5b8101906020810181356401000000008111156109d657600080fd5b8201836020820111156109e857600080fd5b80359060200191846020830284011164010000000083111715610a0a57600080fd5b919390929091602081019035640100000000811115610a2857600080fd5b820183602082011115610a3a57600080fd5b80359060200191846020830284011164010000000083111715610a5c57600080fd5b509092509050611b21565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610aa3578181015183820152602001610a8b565b505050509050019250505060405180910390f35b61042c60048036036020811015610acd57600080fd5b5035611c27565b61037e60048036036020811015610aea57600080fd5b50356001600160a01b0316611c32565b61039a611cab565b61037e611d39565b61047460048036036080811015610b2057600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135640100000000811115610b5757600080fd5b820183602082011115610b6957600080fd5b80359060200191846001830284011164010000000083111715610b8b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611d42945050505050565b61042c60048036036020811015610be257600080fd5b5035611d59565b61034560048036036020811015610bff57600080fd5b50356001600160a01b0316611d64565b61047460048036036060811015610c2557600080fd5b810190602081018135640100000000811115610c4057600080fd5b820183602082011115610c5257600080fd5b80359060200191846020830284011164010000000083111715610c7457600080fd5b919390929091602081019035640100000000811115610c9257600080fd5b820183602082011115610ca457600080fd5b80359060200191846020830284011164010000000083111715610cc657600080fd5b919390929091602081019035640100000000811115610ce457600080fd5b820183602082011115610cf657600080fd5b80359060200191846020830284011164010000000083111715610d1857600080fd5b509092509050611ddd565b61047460048036036020811015610d3957600080fd5b810190602081018135640100000000811115610d5457600080fd5b820183602082011115610d6657600080fd5b80359060200191846001830284011164010000000083111715610d8857600080fd5b509092509050611f80565b61047460048036036060811015610da957600080fd5b6001600160a01b038235169190810190604081016020820135640100000000811115610dd457600080fd5b820183602082011115610de657600080fd5b80359060200191846020830284011164010000000083111715610e0857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610e5857600080fd5b820183602082011115610e6a57600080fd5b80359060200191846020830284011164010000000083111715610e8c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611ffc945050505050565b61047461200f565b61047460048036036060811015610ee857600080fd5b6001600160a01b0382351691602081013591810190606081016040820135640100000000811115610f1857600080fd5b820183602082011115610f2a57600080fd5b80359060200191846001830284011164010000000083111715610f4c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612022945050505050565b61042c61203a565b61039a612049565b61047460048036036020811015610fb357600080fd5b50356001600160a01b03166120aa565b6104746120c1565b61047460048036036040811015610fe157600080fd5b506001600160a01b038135169060200135151561211f565b61037e6004803603602081101561100f57600080fd5b50356001600160a01b03166121fe565b61037e6004803603602081101561103557600080fd5b5035612213565b6104746004803603608081101561105257600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561108d57600080fd5b82018360208201111561109f57600080fd5b803590602001918460018302840111640100000000831117156110c157600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061221e945050505050565b6103456004803603602081101561111857600080fd5b5035612232565b6104746004803603606081101561113557600080fd5b81019060208101813564010000000081111561115057600080fd5b82018360208201111561116257600080fd5b8035906020019184602083028401116401000000008311171561118457600080fd5b9193909290916020810190356401000000008111156111a257600080fd5b8201836020820111156111b457600080fd5b803590602001918460208302840111640100000000831117156111d657600080fd5b9193909290916020810190356401000000008111156111f457600080fd5b82018360208201111561120657600080fd5b8035906020019184602083028401116401000000008311171561122857600080fd5b509092509050612288565b6103456004803603602081101561124957600080fd5b50356123d0565b61039a6004803603602081101561126657600080fd5b5035612435565b6104746004803603602081101561128357600080fd5b50356124aa565b610474600480360360808110156112a057600080fd5b8101906020810181356401000000008111156112bb57600080fd5b8201836020820111156112cd57600080fd5b803590602001918460208302840111640100000000831117156112ef57600080fd5b91939092909160208101903564010000000081111561130d57600080fd5b82018360208201111561131f57600080fd5b8035906020019184602083028401116401000000008311171561134157600080fd5b91939092909160208101903564010000000081111561135f57600080fd5b82018360208201111561137157600080fd5b8035906020019184602083028401116401000000008311171561139357600080fd5b9193909290916020810190356401000000008111156113b157600080fd5b8201836020820111156113c357600080fd5b803590602001918460018302840111640100000000831117156113e557600080fd5b5090925090506124be565b61037e6004803603604081101561140657600080fd5b506001600160a01b03813581169160200135166124d9565b610474600480360360a081101561143457600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561147457600080fd5b82018360208201111561148657600080fd5b803590602001918460018302840111640100000000831117156114a857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612505945050505050565b610474600480360360408110156114ff57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561152a57600080fd5b82018360208201111561153c57600080fd5b8035906020019184602083028401116401000000008311171561155e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061251a945050505050565b610474600480360360208110156115b257600080fd5b50356001600160a01b031661252c565b610474600480360360608110156115d857600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561160c57600080fd5b82018360208201111561161e57600080fd5b8035906020019184602083028401116401000000008311171561164057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612594945050505050565b60006001600160a01b0383166116db576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b6116e4826125a7565b1561171e576000828152600360205260409020546001600160a01b03848116911614611711576000611714565b60015b60ff169050611743565b5060008181526001602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b031982167f510b51580000000000000000000000000000000000000000000000000000000014806117875750611787826125f9565b90505b919050565b60058054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561181b5780601f106117f05761010080835404028352916020019161181b565b820191906000526020600020905b8154815290600101906020018083116117fe57829003601f168201915b505050505090505b90565b6000818152600360205260408120546001600160a01b038116611890576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b600160a01b8116156118bb5750506000818152600860205260409020546001600160a01b031661178a565b600091505061178a565b60006118d082611d59565b9050806001600160a01b0316836001600160a01b03161415611939576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b61194a81611945612637565b612646565b61199b576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008281526003602090815260408083206001600160a01b03808616600160a01b81179092556008909352818420805493881673ffffffffffffffffffffffffffffffffffffffff1990941684179055905185937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611a27611a22612637565b612692565b611a33848484846126ff565b50505050565b606061178782612ab1565b611a4c612b84565b6000611a56612637565b9050611a6181612bdb565b806001600160a01b0316ff5b611a75612c9f565b611a80838383612cf7565b505050565b611a8d612c9f565b611a80838383612dea565b611aa0612c9f565b611aad8585858585612e07565b5050505050565b611ac4611abf612637565b612bdb565b611acc612e14565b565b611ad9611a22612637565b611af58282604051806020016040528060008152506000612e6c565b5050565b611b01612c9f565b611a80838383613010565b611b17611a22612637565b611af5828261302d565b6060838214611b77576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60008467ffffffffffffffff81118015611b9057600080fd5b50604051908082528060200260200182016040528015611bba578160200160208202803683370190505b50905060005b808614611c1d57611bfe878783818110611bd657fe5b905060200201356001600160a01b0316868684818110611bf257fe5b9050602002013561167e565b828281518110611c0a57fe5b6020908102919091010152600101611bc0565b5095945050505050565b60006117878261338b565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148061178757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316149050919050565b600a805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611d315780601f10611d0657610100808354040283529160200191611d31565b820191906000526020600020905b815481529060010190602001808311611d1457829003601f168201915b505050505081565b600c5460ff1681565b611d4d611a22612637565b611a3384848484613404565b60006117878261354f565b60006001600160a01b038216611dc1576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b506001600160a01b031660009081526007602052604090205490565b611de8611abf612637565b848381148015611df757508082145b611e48576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b818114611f7657858582818110611e5e57fe5b905060200201356001600160a01b03166001600160a01b031663a9059cbb898984818110611e8857fe5b905060200201356001600160a01b0316868685818110611ea457fe5b905060200201356040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611ef157600080fd5b505af1158015611f05573d6000803e3d6000fd5b505050506040513d6020811015611f1b57600080fd5b5051611f6e576040805162461bcd60e51b815260206004820152601660248201527f5265636f763a207472616e73666572206661696c656400000000000000000000604482015290519081900360640190fd5b600101611e4b565b5050505050505050565b611f8b611abf612637565b611f97600a8383615bbe565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b612004612c9f565b611a808383836135b9565b61201a611abf612637565b611acc613856565b61202d611a22612637565b611a808383836001612e6c565b6009546001600160a01b031690565b60068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561181b5780601f106117f05761010080835404028352916020019161181b565b6120b5611abf612637565b6120be81613894565b50565b60006120cb612637565b90506120d681612692565b6001600160a01b0381166000818152600b6020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b6000612129612637565b9050806001600160a01b0316836001600160a01b03161415612192576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b0381811660008181526020818152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b600b6020526000908152604090205460ff1681565b6000611787826138e0565b612226612c9f565b611a3384848484613906565b600061223d826125a7565b15612273576000828152600360205260409020546001600160a01b031615612266576001612269565b60005b60ff16905061178a565b5060008181526002602052604090205461178a565b612293611abf612637565b8483811480156122a257508082145b6122f3576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b818114611f765785858281811061230957fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a8581811061233457fe5b905060200201356001600160a01b031687878681811061235057fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156123ad57600080fd5b505af11580156123c1573d6000803e3d6000fd5b505050508060010190506122f6565b60006123db826125a7565b61242c576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b61178782613914565b6000818152600360205260409020546060906001600160a01b03166124a1576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b61178782611a39565b6124b5611abf612637565b6120be81613921565b6124c9611a22612637565b611f768888888888888888613a62565b6001600160a01b0391821660009081526020818152604080832093909416825291909152205460ff1690565b61250d612c9f565b611aad8585858585613dc1565b612522612c9f565b611af58282613f3f565b612537611abf612637565b6009805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821792839055604051919216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b61259c612c9f565b611a8083838361419d565b60007f80000000000000000000000000000000000000000000000000000000000000008216158015906117875750507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16151590565b60006001600160e01b031982167f6059f1b4000000000000000000000000000000000000000000000000000000001480611787575061178782614485565b600061264161452b565b905090565b6000816001600160a01b0316836001600160a01b0316148061268b57506001600160a01b038084166000908152602081815260408083209386168352929052205460ff165b9392505050565b6001600160a01b0381166000908152600b602052604090205460ff166120be576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b6001600160a01b03841661275a576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b8251825181146127b1576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b6000806000805b84811461295f5760008882815181106127cd57fe5b6020026020010151905060008883815181106127e557fe5b602002602001015190506127f8826138e0565b1561280d576128088b838361468b565b612955565b612816826125a7565b15612908576128288b8383600161477d565b60405182906001600160a01b038d16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600061286b83613914565b90508661287e5780965060019550612902565b8681146128fb57856001600089815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008282540192505081905550856002600089815260200190815260200160002060008282540192505081905550809650858501945060019550612902565b8560010195505b50612955565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b50506001016127b8565b5082156129b45760008381526001602090815260408083206001600160a01b038c1680855290835281842080548701905586845260028352818420805487019055835260079091529020805491830191820190555b6001600160a01b03881660006129c8612637565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612a38578181015183820152602001612a20565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612a77578181015183820152602001612a5f565b5050505090500194505050505060405180910390a4612a9e886001600160a01b03166148ab565b15611f7657611f766000898989896148b1565b6060600a612abe83614ab7565b6040516020018083805460018160011615610100020316600290048015612b1c5780601f10612afa576101008083540402835291820191612b1c565b820191906000526020600020905b815481529060010190602001808311612b08575b5050825160208401908083835b60208310612b485780518252601f199092019160209182019101612b29565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b600c5460ff16611acc576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c1457600080fd5b505afa158015612c28573d6000803e3d6000fd5b505050506040513d6020811015612c3e57600080fd5b50516001600160a01b038281169116146120be576040805162461bcd60e51b815260206004820152601660248201527f4f776e61626c653a206e6f7420746865206f776e657200000000000000000000604482015290519081900360640190fd5b600c5460ff1615611acc576040805162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b6000612d01612637565b90506000612d0f8583612646565b9050612d1a846138e0565b15612d3057612d2b85858584614bc6565b612d85565b612d39846125a7565b1561290857612d4c858585846000614d22565b60405184906000906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45b60006001600160a01b0316856001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a45050505050565b611a80838383604051806020016040528060008152506000614ee9565b611aad8585858585615057565b612e1c612b84565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612e4f612637565b604080516001600160a01b039092168252519081900360200190a1565b6001600160a01b038416612ec7576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b612ed0836125a7565b612f21576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b612f2f84846001600061477d565b60405183906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001600160a01b0384166000612f7b612637565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62866001604051808381526020018281526020019250505060405180910390a4612fd6846001600160a01b03166148ab565b15611a3357612fe484615364565b15612ffd57612ff86000858560018661542c565b611a33565b8015611a3357611a33600085858561552e565b611a80838383604051806020016040528060008152506001614ee9565b6001600160a01b038216613088576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b805160008167ffffffffffffffff811180156130a357600080fd5b506040519080825280602002602001820160405280156130cd578160200160208202803683370190505b50905060008060005b8481146132275760008682815181106130eb57fe5b602002602001015190506130fe816125a7565b61314f576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b600185838151811061315d57fe5b602002602001018181525050613176888260018061477d565b60405181906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460006131b982613914565b9050846131cc578094506001935061321d565b8481146132165760008581526001602081815260408084206001600160a01b038e16855282528084208054890190559783526002905295902080549094019093559192918361321d565b8360010193505b50506001016130d6565b5060008281526001602090815260408083206001600160a01b038a1680855290835281842080548601905585845260028352818420805486019055808452600790925282208054870190559061327b612637565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8887604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156132eb5781810151838201526020016132d3565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561332a578181015183820152602001613312565b5050505090500194505050505060405180910390a4613351866001600160a01b03166148ab565b8015613361575061336186615364565b15613383576133836000878786604051806020016040528060008152506148b1565b505050505050565b6000613396826125a7565b156133e8576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600460205260409020546001600160a01b031690565b6001600160a01b03841661345f576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b6000613469612637565b9050613474846138e0565b156134895761348485858561468b565b6134dd565b613492846125a7565b15612908576134a4858585600061477d565b60405184906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45b604080518581526020810185905281516001600160a01b0380891693600093918616927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629281900390910190a461353c856001600160a01b03166148ab565b15611aad57611aad60008686868661542c565b6000818152600360205260408120546001600160a01b038116611787576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b815181518114613610576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b600061361a612637565b905060006136288683612646565b90506000806000805b86811461373b57600089828151811061364657fe5b60200260200101519050613659816138e0565b156136825761367d8b828b858151811061366f57fe5b602002602001015189614bc6565b613732565b61368b816125a7565b15612908576136b18b828b85815181106136a157fe5b6020026020010151896001614d22565b60405181906000906001600160a01b038e16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a460006136f482613914565b9050856137075780955060019450613730565b858114613729576137198c87876156b0565b9450600193929092019184613730565b8460010194505b505b50600101613631565b5082156137715761374d8984846156b0565b6001600160a01b038916600090815260076020526040902080549183019182900390555b60006001600160a01b0316896001600160a01b0316866001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156137f75781810151838201526020016137df565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561383657818101518382015260200161381e565b5050505090500194505050505060405180910390a4505050505050505050565b61385e612c9f565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612e4f612637565b6001600160a01b0381166000818152600b6020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b7f8000000000000000000000000000000000000000000000000000000000000000161590565b611a33848484846001614ee9565b6001600160e01b03191690565b61392a816125a7565b1561397c576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600460205260409020546001600160a01b0316156139e6576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b6139ee612637565b6000828152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055613a30816138e0565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b868581148015613a7157508084145b613ac2576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b6000613acc612637565b905060005b828114613db45760008b8b83818110613ae657fe5b905060200201356001600160a01b0316905060006001600160a01b0316816001600160a01b03161415613b60576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b60008a8a84818110613b6e57fe5b9050602002013590506000898985818110613b8557fe5b905060200201359050613b97826138e0565b15613c5457613ba783838361468b565b604080518381526020810183905281516001600160a01b0380871693600093918a16927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629281900390910190a4613c06836001600160a01b03166148ab565b15613c4f57613c4f60008484848c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061542c92505050565b613da6565b613c5d826125a7565b1561290857613c6f838383600061477d565b60405182906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4604080518381526001602082015281516001600160a01b0380871693600093918a16927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629281900390910190a4613d06836001600160a01b03166148ab565b15613c4f57613d1483615364565b15613d6357613d5e6000848460018c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061542c92505050565b613c4f565b613c4f600084848b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061552e92505050565b505050806001019050613ad1565b5050505050505050505050565b6000613dcb612637565b90506001600160a01b038516613e28576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6000613e348783612646565b9050613e3f856138e0565b15613e5657613e5187878787856156f0565b613eb5565b613e5f856125a7565b1561290857613e7387878787856000615863565b84866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051808381526020018281526020019250505060405180910390a4613f24866001600160a01b03166148ab565b15613f3657613f36878787878761542c565b50505050505050565b6000613f49612637565b90506000613f578483612646565b835190915060008167ffffffffffffffff81118015613f7557600080fd5b50604051908082528060200260200182016040528015613f9f578160200160208202803683370190505b50905060008060005b848114614087576000888281518110613fbd57fe5b602002602001015190506001858381518110613fd557fe5b6020026020010181815250506140028a82878581518110613ff257fe5b60200260200101518a6001614d22565b60405181906000906001600160a01b038d16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4600061404582613914565b905084614058578094506001935061407d565b8481146140765761406a8b86866156b0565b8094506001935061407d565b8360010193505b5050600101613fa8565b5081156140b9576140998883836156b0565b6001600160a01b0388166000908152600760205260409020805485900390555b60006001600160a01b0316886001600160a01b0316876001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a87604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561413f578181015183820152602001614127565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561417e578181015183820152602001614166565b5050505090500194505050505060405180910390a45050505050505050565b6001600160a01b0382166141f8576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6000614202612637565b905060006142108583612646565b835190915060008167ffffffffffffffff8111801561422e57600080fd5b50604051908082528060200260200182016040528015614258578160200160208202803683370190505b50905060008060005b84811461433957600088828151811061427657fe5b60200260200101519050600185838151811061428e57fe5b6020026020010181815250506142aa8b8b8360018b6001615863565b808a6001600160a01b03168c6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a460006142f682613914565b905084614309578094506001935061432f565b8481146143285761431c8c8c87876159f4565b8094506001935061432f565b8360010193505b5050600101614261565b5081156143575761434c898984846159f4565b614357898986615a48565b876001600160a01b0316896001600160a01b0316614373612637565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a87604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156143e35781810151838201526020016143cb565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561442257818101518382015260200161440a565b5050505090500194505050505060405180910390a4614449886001600160a01b03166148ab565b8015614459575061445988615364565b1561447a5761447a89898986604051806020016040528060008152506148b1565b505050505050505050565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806144e857506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061451c57506001600160e01b031982167ff3993d1100000000000000000000000000000000000000000000000000000000145b80611787575061178782615a93565b60003381614537615b94565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614806145aa57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b156145b85791506118239050565b6001600160a01b038216321480159061467757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561464a57600080fd5b505afa15801561465e573d6000803e3d6000fd5b505050506040513d602081101561467457600080fd5b50515b156146855791506118239050565b50905090565b806146dd576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b600082815260026020526040902054818101818111614743576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260026020908152604080862092909255600181528185206001600160a01b039096168552949094525091902080549091019055565b816001146147d2576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b60008381526003602052604090205415614833576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526003602052604090206001600160a01b038516905580611a3357600061485d84613914565b6000908152600260209081526040808320805460019081019091558083528184206001600160a01b038a16855283528184208054820190556007909252909120805490910190555050505050565b3b151590565b7fbc197c81000000000000000000000000000000000000000000000000000000006001600160a01b03851663bc197c816148e9612637565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561496257818101518382015260200161494a565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156149a1578181015183820152602001614989565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156149dd5781810151838201526020016149c5565b50505050905090810190601f168015614a0a5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015614a2f57600080fd5b505af1158015614a43573d6000803e3d6000fd5b505050506040513d6020811015614a5957600080fd5b50516001600160e01b03191614611aad576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b606081614af8575060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015261178a565b8160005b8115614b1057600101600a82049150614afc565b60008167ffffffffffffffff81118015614b2957600080fd5b506040519080825280601f01601f191660200182016040528015614b54576020820181803683370190505b50859350905060001982015b8315614bbd57600a840660300160f81b82828060019003935081518110614b8357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350614b60565b50949350505050565b81614c18576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b80614c6a576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008381526001602090815260408083206001600160a01b038816845290915290205482811015614ce2576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008481526001602090815260408083206001600160a01b0390981683529681528682209285900390925593845260029052509190208054919091039055565b82600114614d77576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000848152600360205260409020546001600160a01b0386811690821614614de6576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b82614e7757600160a01b811615801590614e2657506000858152600860205260409020546001600160a01b0316614e1b612637565b6001600160a01b0316145b614e77576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008581526003602052604090207fdead00000000000000000000000000000000000000000000000000000000000090558161338357614ec186614eba87613914565b60016156b0565b6001600160a01b03861660009081526007602052604090208054600019019055505050505050565b6001600160a01b038416614f44576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6000614f4e612637565b90506000614f5c8783612646565b9050614f6e8787876001856000615863565b84866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051808381526020018281526020019250505060405180910390a461501f866001600160a01b03166148ab565b15613f365761502d86615364565b156150455761504087878760018861542c565b613f36565b8215613f3657613f368787878761552e565b6001600160a01b0384166150b2576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b825182518114615109576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b6000615113612637565b905060006151218883612646565b90506000806000805b8681146152405760008a828151811061513f57fe5b60200260200101519050615152816138e0565b1561517c576151778d8d838d868151811061516957fe5b60200260200101518a6156f0565b615237565b615185816125a7565b15612908576151ac8d8d838d868151811061519c57fe5b60200260200101518a6001615863565b808c6001600160a01b03168e6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a460006151f882613914565b90508561520b5780955060019450615235565b85811461522e5761521e8e8e88886159f4565b9450600193929092019184615235565b8460010194505b505b5060010161512a565b508215615260576152538b8b85856159f4565b81016152608b8b83615a48565b896001600160a01b03168b6001600160a01b031661527c612637565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8c8c604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156152ec5781810151838201526020016152d4565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561532b578181015183820152602001615313565b5050505090500194505050505060405180910390a46153528a6001600160a01b03166148ab565b15613db457613db48b8b8b8b8b6148b1565b604080517f4e2312e0000000000000000000000000000000000000000000000000000000006024808301919091528251808303909101815260449091018252602081810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001781528251935160008082529485948594909392908183858b612710fa955080519450505050609e5a1161541957fe5b8280156154235750815b95945050505050565b7ff23a6e61000000000000000000000000000000000000000000000000000000006001600160a01b03851663f23a6e61615464612637565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156154de5781810151838201526020016154c6565b50505050905090810190601f16801561550b5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015614a2f57600080fd5b7f150b7a02000000000000000000000000000000000000000000000000000000006001600160a01b03841663150b7a02615566612637565b8786866040518563ffffffff1660e01b815260040180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156155d95781810151838201526020016155c1565b50505050905090810190601f1680156156065780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561562857600080fd5b505af115801561563c573d6000803e3d6000fd5b505050506040513d602081101561565257600080fd5b50516001600160e01b03191614611a33576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60008281526001602090815260408083206001600160a01b0390961683529481528482208054849003905592815260029092529190208054919091039055565b80615742576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b81615794576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008381526001602090815260408083206001600160a01b03891684529091529020548281101561580c576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b846001600160a01b0316866001600160a01b0316146133835760009384526001602090815260408086206001600160a01b039889168752909152808520918490039091559390941682529190208054909101905550565b826001146158b8576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000848152600360205260409020546001600160a01b0387811690821614615927576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b826159b857600160a01b81161580159061596757506000858152600860205260409020546001600160a01b031661595c612637565b6001600160a01b0316145b6159b8576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008581526003602052604090206001600160a01b038716905581613f36576159e387876001615a48565b613f3687876159f188613914565b60015b826001600160a01b0316846001600160a01b031614611a335760009182526001602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b816001600160a01b0316836001600160a01b031614611a80576001600160a01b0380841660009081526007602052604080822080548590039055918416815220805482019055505050565b60006001600160e01b031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480615af657506001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000145b80615b2a57506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b80615b5e57506001600160e01b031982167f09ce5c4600000000000000000000000000000000000000000000000000000000145b806117875750506001600160e01b0319167fbd85b039000000000000000000000000000000000000000000000000000000001490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282615bf45760008555615c3a565b82601f10615c0d5782800160ff19823516178555615c3a565b82800160010185558215615c3a579182015b82811115615c3a578235825591602001919060010190615c1f565b50615c46929150615c4a565b5090565b5b80821115615c465760008155600101615c4b56fea2646970667358221220f15bb571a09ca2cc4fc24fb025c14fbc428a46d23fa58f2d9c182efa34bd4bd064736f6c6343000706003300000000000000000000000071bee13e92e64701b78f059801a70857e4683acd00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2

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

00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2

-----Decoded View---------------
Arg [0] : forwarderRegistry (address): 0x71bee13e92e64701b78f059801a70857e4683acd
Arg [1] : universalForwarder (address): 0x56133a31f4cd01ede8c6ee780071c021bd324ad2

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000071bee13e92e64701b78f059801a70857e4683acd
Arg [1] : 00000000000000000000000056133a31f4cd01ede8c6ee780071c021bd324ad2


Deployed ByteCode Sourcemap

107613:8209:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44062:328;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44062:328:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;108514:214;;;;;;;;;;;;;;;;-1:-1:-1;108514:214:0;-1:-1:-1;;;;;;108514:214:0;;:::i;:::-;;;;;;;;;;;;;;;;;;53194:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54565:396;;;;;;;;;;;;;;;;-1:-1:-1;54565:396:0;;:::i;:::-;;;;-1:-1:-1;;;;;54565:396:0;;;;;;;;;;;;;;54058:449;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54058:449:0;;;;;;;;:::i;:::-;;114709:263;;;;;;;;;;;;;;;;-1:-1:-1;;;;;114709:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;114709:263:0;;;;;;;;-1:-1:-1;114709:263:0;;-1:-1:-1;;114709:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;114709:263:0;;;;;;;;-1:-1:-1;114709:263:0;;-1:-1:-1;;114709:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;114709:263:0;;-1:-1:-1;114709:263:0;;-1:-1:-1;;;;;114709:263:0:i;108894:112::-;;;;;;;;;;;;;;;;-1:-1:-1;108894:112:0;;:::i;109631:180::-;;;:::i;112543:197::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;112543:197:0;;;;;;;;;;;;;:::i;110759:205::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;110759:205:0;;;;;;;;;;;;;;;;;:::i;112231:304::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;112231:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112231:304:0;;;;;;;;-1:-1:-1;112231:304:0;;-1:-1:-1;;112231:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112231:304:0;;;;;;;;-1:-1:-1;112231:304:0;;-1:-1:-1;;112231:304:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112231:304:0;;-1:-1:-1;112231:304:0;;-1:-1:-1;;;;;112231:304:0:i;110552:107::-;;;:::i;113257:150::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;113257:150:0;;;;;;;;:::i;111206:213::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;111206:213:0;;;;;;;;;;;;;;;;;:::i;113586:160::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;113586:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;113586:160:0;;-1:-1:-1;113586:160:0;;-1:-1:-1;;;;;113586:160:0:i;44464:445::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44464:445:0;;-1:-1:-1;44464:445:0;-1:-1:-1;44464:445:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109186:128;;;;;;;;;;;;;;;;-1:-1:-1;109186:128:0;;:::i;105597:195::-;;;;;;;;;;;;;;;;-1:-1:-1;105597:195:0;-1:-1:-1;;;;;105597:195:0;;:::i;97285:29::-;;;:::i;102903:18::-;;;:::i;114293:231::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;114293:231:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;114293:231:0;;-1:-1:-1;114293:231:0;;-1:-1:-1;;;;;114293:231:0:i;53827:169::-;;;;;;;;;;;;;;;;-1:-1:-1;53827:169:0;;:::i;53523:209::-;;;;;;;;;;;;;;;;-1:-1:-1;53523:209:0;-1:-1:-1;;;;;53523:209:0;;:::i;100156:523::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;100156:523:0;;-1:-1:-1;100156:523:0;-1:-1:-1;100156:523:0;:::i;97323:218::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;97323:218:0;;-1:-1:-1;97323:218:0;-1:-1:-1;97323:218:0;:::i;112748:229::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;112748:229:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112748:229:0;;;;;;;;-1:-1:-1;112748:229:0;;-1:-1:-1;;112748:229:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;112748:229:0;;-1:-1:-1;112748:229:0;;-1:-1:-1;;;;;112748:229:0:i;110441:103::-;;;:::i;113916:208::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;113916:208:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;113916:208:0;;-1:-1:-1;113916:208:0;;-1:-1:-1;;;;;113916:208:0:i;95327:96::-;;;:::i;53363:104::-;;;:::i;98452:123::-;;;;;;;;;;;;;;;;-1:-1:-1;98452:123:0;-1:-1:-1;;;;;98452:123:0;;:::i;98696:190::-;;;:::i;44979:306::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44979:306:0;;;;;;;;;;:::i;98083:40::-;;;;;;;;;;;;;;;;-1:-1:-1;98083:40:0;-1:-1:-1;;;;;98083:40:0;;:::i;45692:124::-;;;;;;;;;;;;;;;;-1:-1:-1;45692:124:0;;:::i;111427:247::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;111427:247:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;111427:247:0;;-1:-1:-1;111427:247:0;;-1:-1:-1;;;;;111427:247:0:i;46471:267::-;;;;;;;;;;;;;;;;-1:-1:-1;46471:267:0;;:::i;101505:521::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;101505:521:0;;-1:-1:-1;101505:521:0;-1:-1:-1;101505:521:0;:::i;45885:215::-;;;;;;;;;;;;;;;;-1:-1:-1;45885:215:0;;:::i;58341:221::-;;;;;;;;;;;;;;;;-1:-1:-1;58341:221:0;;:::i;110190:149::-;;;;;;;;;;;;;;;;-1:-1:-1;110190:149:0;;:::i;115142:294::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;115142:294:0;;-1:-1:-1;115142:294:0;-1:-1:-1;115142:294:0;:::i;45357:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45357:166:0;;;;;;;;;;:::i;111951:272::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;111951:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;111951:272:0;;-1:-1:-1;111951:272:0;;-1:-1:-1;;;;;111951:272:0:i;111682:168::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;111682:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;111682:168:0;;-1:-1:-1;111682:168:0;;-1:-1:-1;;;;;111682:168:0:i;95568:201::-;;;;;;;;;;;;;;;;-1:-1:-1;95568:201:0;-1:-1:-1;;;;;95568:201:0;;:::i;110972:226::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;110972:226:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;110972:226:0;;-1:-1:-1;110972:226:0;;-1:-1:-1;;;;;110972:226:0:i;44062:328::-;44146:7;-1:-1:-1;;;;;44174:19:0;;44166:55;;;;;-1:-1:-1;;;44166:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44238:23;:2;:21;:23::i;:::-;44234:109;;;44301:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;44285:38:0;;;;;;:46;;44330:1;44285:46;;;44326:1;44285:46;44278:53;;;;;;44234:109;-1:-1:-1;44362:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;44362:20:0;;;;;;;;;;44062:328;;;;;:::o;108514:214::-;108599:4;-1:-1:-1;;;;;;108623:57:0;;108638:42;108623:57;;:97;;;108684:36;108708:11;108684:23;:36::i;:::-;108616:104;;108514:214;;;;:::o;53194:100::-;53281:5;53274:12;;;;;;;;-1:-1:-1;;53274:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53248:13;;53274:12;;53281:5;;53274:12;;53281:5;53274:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53194:100;;:::o;54565:396::-;54641:7;54682:14;;;:7;:14;;;;;;-1:-1:-1;;;;;54715:42:0;;54707:82;;;;;-1:-1:-1;;;54707:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;54804:39:0;;:44;54800:154;;-1:-1:-1;;54872:20:0;;;;:13;:20;;;;;;-1:-1:-1;;;;;54872:20:0;54865:27;;54800:154;54940:1;54925:17;;;;;54058:449;54139:18;54160:14;54168:5;54160:7;:14::i;:::-;54139:35;;54199:10;-1:-1:-1;;;;;54193:16:0;:2;-1:-1:-1;;;;;54193:16:0;;;54185:53;;;;;-1:-1:-1;;;54185:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54257:39;54271:10;54283:12;:10;:12::i;:::-;54257:13;:39::i;:::-;54249:82;;;;;-1:-1:-1;;;54249:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54342:14;;;;:7;:14;;;;;;;;-1:-1:-1;;;;;54359:28:0;;;-1:-1:-1;;;54359:57:0;;54342:74;;;54427:13;:20;;;;;;:25;;;;;-1:-1:-1;;54427:25:0;;;;;;;54468:31;;54350:5;;54468:31;;;54058:449;;;:::o;114709:263::-;114888:28;114903:12;:10;:12::i;:::-;114888:14;:28::i;:::-;114927:37;114942:2;114946:3;114951:6;114959:4;114927:14;:37::i;:::-;114709:263;;;;:::o;108894:112::-;108957:13;108990:8;108995:2;108990:4;:8::i;109631:180::-;109672:16;:14;:16::i;:::-;109699:22;109724:12;:10;:12::i;:::-;109699:37;;109747:25;109765:6;109747:17;:25::i;:::-;109796:6;-1:-1:-1;;;;;109783:20:0;;112543:197;112671:19;:17;:19::i;:::-;112701:31;112716:4;112722:2;112726:5;112701:14;:31::i;:::-;112543:197;;;:::o;110759:205::-;110891:19;:17;:19::i;:::-;110921:35;110940:4;110946:2;110950:5;110921:18;:35::i;112231:304::-;112441:19;:17;:19::i;:::-;112471:56;112499:4;112505:2;112509:3;112514:6;112522:4;112471:27;:56::i;:::-;112231:304;;;;;:::o;110552:107::-;110599:31;110617:12;:10;:12::i;:::-;110599:17;:31::i;:::-;110641:10;:8;:10::i;:::-;110552:107::o;113257:150::-;113333:28;113348:12;:10;:12::i;113333:28::-;113372:27;113378:2;113382:5;113372:27;;;;;;;;;;;;113393:5;113372;:27::i;:::-;113257:150;;:::o;111206:213::-;111342:19;:17;:19::i;:::-;111372:39;111395:4;111401:2;111405:5;111372:22;:39::i;113586:160::-;113677:28;113692:12;:10;:12::i;113677:28::-;113716:22;113727:2;113731:6;113716:10;:22::i;44464:445::-;44579:16;44616:27;;;44608:70;;;;;-1:-1:-1;;;44608:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44691:25;44733:6;44719:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44719:28:0;;44691:56;;44765:9;44760:114;44780:18;;;44760:114;;44834:28;44844:6;;44851:1;44844:9;;;;;;;;;;;;;-1:-1:-1;;;;;44844:9:0;44855:3;;44859:1;44855:6;;;;;;;;;;;;;44834:9;:28::i;:::-;44820:8;44829:1;44820:11;;;;;;;;;;;;;;;;;:42;44800:3;;44760:114;;;-1:-1:-1;44893:8:0;44464:445;-1:-1:-1;;;;;44464:445:0:o;109186:128::-;109257:7;109284:22;109293:12;109284:8;:22::i;105597:195::-;105684:4;105721:19;-1:-1:-1;;;;;105708:32:0;:9;-1:-1:-1;;;;;105708:32:0;;:76;;;;105765:18;-1:-1:-1;;;;;105744:40:0;:9;-1:-1:-1;;;;;105744:40:0;;105701:83;;105597:195;;;:::o;97285:29::-;;;;;;;;;;;;;;;-1:-1:-1;;97285:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;102903:18::-;;;;;;:::o;114293:231::-;114447:28;114462:12;:10;:12::i;114447:28::-;114486:30;114496:2;114500;114504:5;114511:4;114486:9;:30::i;53827:169::-;53941:7;53968:20;53982:5;53968:13;:20::i;53523:209::-;53602:7;-1:-1:-1;;;;;53630:24:0;;53622:60;;;;;-1:-1:-1;;;53622:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53700:24:0;;;;;:12;:24;;;;;;;53523:209::o;100156:523::-;100325:31;100343:12;:10;:12::i;100325:31::-;100384:8;100418:23;;;:51;;;;-1:-1:-1;100445:24:0;;;100418:51;100410:90;;;;;-1:-1:-1;;;100410:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;100516:9;100511:161;100536:6;100531:1;:11;100511:161;;100589:6;;100596:1;100589:9;;;;;;;;;;;;;-1:-1:-1;;;;;100589:9:0;-1:-1:-1;;;;;100572:36:0;;100609:8;;100618:1;100609:11;;;;;;;;;;;;;-1:-1:-1;;;;;100609:11:0;100622:7;;100630:1;100622:10;;;;;;;;;;;;;100572:61;;;;;;;;;;;;;-1:-1:-1;;;;;100572:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;100572:61:0;100564:96;;;;;-1:-1:-1;;;100564:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;100544:3;;100511:161;;;;100156:523;;;;;;;:::o;97323:218::-;97405:31;97423:12;:10;:12::i;97405:31::-;97447:34;:15;97465:16;;97447:34;:::i;:::-;;97497:36;97516:16;;97497:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;97497:36:0;;;;;;;;-1:-1:-1;97497:36:0;;-1:-1:-1;;;;97497:36:0;97323:218;;:::o;112748:229::-;112901:19;:17;:19::i;:::-;112931:38;112951:4;112957:3;112962:6;112931:19;:38::i;110441:103::-;110486:31;110504:12;:10;:12::i;110486:31::-;110528:8;:6;:8::i;113916:208::-;114049:28;114064:12;:10;:12::i;114049:28::-;114088;114094:2;114098:5;114105:4;114111;114088:5;:28::i;95327:96::-;95409:6;;-1:-1:-1;;;;;95409:6:0;95327:96;:::o;53363:104::-;53452:7;53445:14;;;;;;;;-1:-1:-1;;53445:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53419:13;;53445:14;;53452:7;;53445:14;;53452:7;53445:14;;;;;;;;;;;;;;;;;;;;;;;;98452:123;98506:31;98524:12;:10;:12::i;98506:31::-;98548:19;98559:7;98548:10;:19::i;:::-;98452:123;:::o;98696:190::-;98740:15;98758:12;:10;:12::i;:::-;98740:30;;98781:23;98796:7;98781:14;:23::i;:::-;-1:-1:-1;;;;;98815:17:0;;98835:5;98815:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;98815:25:0;;;98856:22;;;98835:5;98856:22;98696:190;:::o;44979:306::-;45074:14;45091:12;:10;:12::i;:::-;45074:29;;45134:6;-1:-1:-1;;;;;45122:18:0;:8;-1:-1:-1;;;;;45122:18:0;;;45114:55;;;;;-1:-1:-1;;;45114:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45180:18:0;;;:10;:18;;;;;;;;;;;:28;;;;;;;;;;;;;:39;;-1:-1:-1;;45180:39:0;;;;;;;;;;45235:42;;;;;;;;;;;;;;;;;44979:306;;;:::o;98083:40::-;;;;;;;;;;;;;;;:::o;45692:124::-;45764:4;45788:20;:2;:18;:20::i;111427:247::-;111591:19;:17;:19::i;:::-;111621:45;111644:4;111650:2;111654:5;111661:4;111621:22;:45::i;46471:267::-;46544:7;46568:23;:2;:21;:23::i;:::-;46564:167;;;46656:1;46631:11;;;:7;:11;;;;;;-1:-1:-1;;;;;46615:43:0;;:51;;46665:1;46615:51;;;46661:1;46615:51;46608:58;;;;;;46564:167;-1:-1:-1;46706:13:0;;;;:9;:13;;;;;;46699:20;;101505:521;101679:31;101697:12;:10;:12::i;101679:31::-;101738:8;101772:26;;;:55;;;;-1:-1:-1;101802:25:0;;;101772:55;101764:94;;;;;-1:-1:-1;;;101764:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;101874:9;101869:150;101894:6;101889:1;:11;101869:150;;101940:9;;101950:1;101940:12;;;;;;;;;;;;;-1:-1:-1;;;;;101940:12:0;-1:-1:-1;;;;;101922:44:0;;101975:4;101982:8;;101991:1;101982:11;;;;;;;;;;;;;-1:-1:-1;;;;;101982:11:0;101995:8;;102004:1;101995:11;;;;;;;;;;;;;101922:85;;;;;;;;;;;;;-1:-1:-1;;;;;101922:85:0;;;;;;-1:-1:-1;;;;;101922:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101902:3;;;;;101869:150;;45885:215;45962:7;45990:26;:5;:24;:26::i;:::-;45982:60;;;;;-1:-1:-1;;;45982:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;46060:32;:5;:30;:32::i;58341:221::-;58492:1;58464:14;;;:7;:14;;;;;;58414:13;;-1:-1:-1;;;;;58448:46:0;58440:86;;;;;-1:-1:-1;;;58440:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58544:10;58548:5;58544:3;:10::i;110190:149::-;110258:31;110276:12;:10;:12::i;110258:31::-;110300;110318:12;110300:17;:31::i;115142:294::-;115346:28;115361:12;:10;:12::i;115346:28::-;115385:43;115398:10;;115410:3;;115415:6;;115423:4;;115385:12;:43::i;45357:166::-;-1:-1:-1;;;;;45483:22:0;;;45459:4;45483:22;;;;;;;;;;;:32;;;;;;;;;;;;;;;45357:166::o;111951:272::-;112136:19;:17;:19::i;:::-;112166:49;112189:4;112195:2;112199;112203:5;112210:4;112166:22;:49::i;111682:168::-;111779:19;:17;:19::i;:::-;111809:33;111829:4;111835:6;111809:19;:33::i;95568:201::-;95648:31;95666:12;:10;:12::i;95648:31::-;95690:6;:17;;-1:-1:-1;;95690:17:0;-1:-1:-1;;;;;95690:17:0;;;;;;;;;;95723:38;;95690:17;;95744:6;;95723:38;;-1:-1:-1;;95723:38:0;95568:201;:::o;110972:226::-;111119:19;:17;:19::i;:::-;111149:41;111173:4;111179:2;111183:6;111149:23;:41::i;41932:140::-;41995:4;41575:8;42019:12;;:17;;;;:45;;-1:-1:-1;;41786:20:0;42040:19;:24;;;41932:140::o;78859:218::-;78944:4;-1:-1:-1;;;;;;78968:61:0;;78983:46;78968:61;;:101;;;79033:36;79057:11;79033:23;:36::i;115444:185::-;115549:15;115584:37;:35;:37::i;:::-;115577:44;;115444:185;:::o;48255:160::-;48339:4;48372:6;-1:-1:-1;;;;;48364:14:0;:4;-1:-1:-1;;;;;48364:14:0;;48363:44;;;-1:-1:-1;;;;;;48383:16:0;;;:10;:16;;;;;;;;;;;:24;;;;;;;;;;;;48363:44;48356:51;48255:160;-1:-1:-1;;;48255:160:0:o;98894:128::-;-1:-1:-1;;;;;98968:17:0;;;;;;:8;:17;;;;;;;;98960:54;;;;;-1:-1:-1;;;98960:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;67850:2106;-1:-1:-1;;;;;68031:16:0;;68023:52;;;;;-1:-1:-1;;;68023:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;68103:10;;68142:13;;68132:23;;68124:66;;;;;-1:-1:-1;;;68124:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;68203:22;68236:25;68272:17;68305:9;68300:1191;68321:6;68316:1;:11;68300:1191;;68349:10;68362:3;68366:1;68362:6;;;;;;;;;;;;;;68349:19;;68383:13;68399:6;68406:1;68399:9;;;;;;;;;;;;;;68383:25;;68427:20;:2;:18;:20::i;:::-;68423:1057;;;68468:28;68482:2;68486;68490:5;68468:13;:28::i;:::-;68423:1057;;;68522:23;:2;:21;:23::i;:::-;68518:962;;;68566:29;68575:2;68579;68583:5;68590:4;68566:8;:29::i;:::-;68619:28;;68644:2;;-1:-1:-1;;;;;68619:28:0;;;68636:1;;68619:28;;68636:1;;68619:28;68666:24;68693:29;:2;:27;:29::i;:::-;68666:56;-1:-1:-1;68745:19:0;68741:648;;68806:16;68789:33;;68865:1;68845:21;;68741:648;;;68939:14;68919:16;:34;68915:455;;69015:17;68982:9;:25;68992:14;68982:25;;;;;;;;;;;:29;69008:2;-1:-1:-1;;;;;68982:29:0;-1:-1:-1;;;;;68982:29:0;;;;;;;;;;;;;:50;;;;;;;;;;;69088:17;69059:9;:25;69069:14;69059:25;;;;;;;;;;;;:46;;;;;;;;;;;69149:16;69132:33;;69205:17;69192:30;;;;69269:1;69249:21;;68915:455;;;69327:19;;;;;68915:455;68518:962;;;;69429:35;;;-1:-1:-1;;;69429:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;68518:962;-1:-1:-1;;68329:3:0;;68300:1191;;;-1:-1:-1;69507:19:0;;69503:252;;69543:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;69543:29:0;;;;;;;;;;;:50;;;;;;69608:25;;;:9;:25;;;;;:46;;;;;;69714:16;;:12;:16;;;;;:29;;69669:30;;;69714:29;;;;;69503:252;-1:-1:-1;;;;;69772:56:0;;69808:1;69786:12;:10;:12::i;:::-;-1:-1:-1;;;;;69772:56:0;;69816:3;69821:6;69772:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69843:15;:2;-1:-1:-1;;;;;69843:13:0;;:15::i;:::-;69839:110;;;69875:62;69911:1;69915:2;69919:3;69924:6;69932:4;69875:27;:62::i;97549:161::-;97606:13;97663:15;97680:20;:2;:18;:20::i;:::-;97646:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;97646:55:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;97646:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97632:70;;97549:161;;;:::o;103105:98::-;103164:6;;;;103156:39;;;;;-1:-1:-1;;;103156:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;95900:138;95991:4;-1:-1:-1;;;;;95991:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;95991:12:0;-1:-1:-1;;;;;95980:23:0;;;;;;95972:58;;;;;-1:-1:-1;;;95972:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;102999:98;103062:6;;;;103061:7;103053:36;;;;;-1:-1:-1;;;103053:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;79342:621;79470:14;79487:12;:10;:12::i;:::-;79470:29;;79510:15;79528:27;79542:4;79548:6;79528:13;:27::i;:::-;79510:45;;79572:20;:2;:18;:20::i;:::-;79568:319;;;79609:42;79623:4;79629:2;79633:5;79640:10;79609:13;:42::i;:::-;79568:319;;;79673:23;:2;:21;:23::i;:::-;79669:218;;;79713:44;79722:4;79728:2;79732:5;79739:10;79751:5;79713:8;:44::i;:::-;79777:30;;79804:2;;79800:1;;-1:-1:-1;;;;;79777:30:0;;;;;79800:1;;79777:30;79669:218;79941:1;-1:-1:-1;;;;;79904:51:0;79927:4;-1:-1:-1;;;;;79904:51:0;79919:6;-1:-1:-1;;;;;79904:51:0;;79945:2;79949:5;79904:51;;;;;;;;;;;;;;;;;;;;;;;;79342:621;;;;;:::o;55135:281::-;55267:141;55295:4;55314:2;55331:5;55267:141;;;;;;;;;;;;55392:5;55267:13;:141::i;59885:329::-;60155:51;60178:4;60184:2;60188:3;60193:6;60201:4;60155:22;:51::i;103621:135::-;103669:16;:14;:16::i;:::-;103696:6;:14;;-1:-1:-1;;103696:14:0;;;103726:22;103735:12;:10;:12::i;:::-;103726:22;;;-1:-1:-1;;;;;103726:22:0;;;;;;;;;;;;;;103621:135::o;64264:707::-;-1:-1:-1;;;;;64407:16:0;;64399:52;;;;;-1:-1:-1;;;64399:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;64470:26;:5;:24;:26::i;:::-;64462:60;;;;;-1:-1:-1;;;64462:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;64535:29;64544:2;64548:5;64555:1;64558:5;64535:8;:29::i;:::-;64582:31;;64607:5;;-1:-1:-1;;;;;64582:31:0;;;64599:1;;64582:31;;64599:1;;64582:31;-1:-1:-1;;;;;64629:54:0;;64666:1;64644:12;:10;:12::i;:::-;-1:-1:-1;;;;;64629:54:0;;64674:5;64681:1;64629:54;;;;;;;;;;;;;;;;;;;;;;;;64698:15;:2;-1:-1:-1;;;;;64698:13:0;;:15::i;:::-;64694:270;;;64734:27;64758:2;64734:23;:27::i;:::-;64730:223;;;64782:54;64813:1;64817:2;64821:5;64828:1;64831:4;64782:22;:54::i;:::-;64730:223;;;64862:4;64858:95;;;64887:50;64917:1;64921:2;64925:5;64932:4;64887:21;:50::i;55592:284::-;55728:140;55756:4;55775:2;55792:5;55728:140;;;;;;;;;;;;55853:4;55728:13;:140::i;65150:1619::-;-1:-1:-1;;;;;65235:16:0;;65227:52;;;;;-1:-1:-1;;;65227:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;65309:13;;65292:14;65309:13;65359:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65359:21:0;;65333:47;;65393:22;65426:25;65467:9;65462:914;65483:6;65478:1;:11;65462:914;;65511:13;65527:6;65534:1;65527:9;;;;;;;;;;;;;;65511:25;;65559:26;:5;:24;:26::i;:::-;65551:60;;;;;-1:-1:-1;;;65551:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;65638:1;65626:6;65633:1;65626:9;;;;;;;;;;;;;:13;;;;;65654:28;65663:2;65667:5;65674:1;65677:4;65654:8;:28::i;:::-;65702:31;;65727:5;;-1:-1:-1;;;;;65702:31:0;;;65719:1;;65702:31;;65719:1;;65702:31;65748:24;65775:32;:5;:30;:32::i;:::-;65748:59;-1:-1:-1;65826:19:0;65822:543;;65883:16;65866:33;;65938:1;65918:21;;65822:543;;;66004:14;65984:16;:34;65980:370;;66043:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;66043:29:0;;;;;;;;;:50;;;;;;66116:25;;;:9;:25;;;;;:46;;;;;;;;66202:16;;66043:9;66202:16;65980:370;;;66311:19;;;;;65980:370;-1:-1:-1;;65491:3:0;;65462:914;;;-1:-1:-1;66388:25:0;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;66388:29:0;;;;;;;;;;;:50;;;;;;66449:25;;;:9;:25;;;;;:46;;;;;;66506:16;;;:12;:16;;;;;:26;;;;;;66388:29;66564:12;:10;:12::i;:::-;-1:-1:-1;;;;;66550:59:0;;66594:6;66602;66550:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66624:15;:2;-1:-1:-1;;;;;66624:13:0;;:15::i;:::-;:46;;;;;66643:27;66667:2;66643:23;:27::i;:::-;66620:142;;;66687:63;66723:1;66727:2;66731:6;66739;66687:63;;;;;;;;;;;;:27;:63::i;:::-;65150:1619;;;;;;:::o;47629:214::-;47700:7;47729:33;:12;:31;:33::i;:::-;47728:34;47720:74;;;;;-1:-1:-1;;;47720:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47812:23:0;;;;:9;:23;;;;;;-1:-1:-1;;;;;47812:23:0;;47629:214::o;66938:727::-;-1:-1:-1;;;;;67094:16:0;;67086:52;;;;;-1:-1:-1;;;67086:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;67149:14;67166:12;:10;:12::i;:::-;67149:29;;67193:20;:2;:18;:20::i;:::-;67189:289;;;67230:28;67244:2;67248;67252:5;67230:13;:28::i;:::-;67189:289;;;67280:23;:2;:21;:23::i;:::-;67276:202;;;67320:30;67329:2;67333;67337:5;67344;67320:8;:30::i;:::-;67370:28;;67395:2;;-1:-1:-1;;;;;67370:28:0;;;67387:1;;67370:28;;67387:1;;67370:28;67276:202;67495:49;;;;;;;;;;;;;;-1:-1:-1;;;;;67495:49:0;;;;67526:1;;67495:49;;;;;;;;;;;;;;67559:15;:2;-1:-1:-1;;;;;67559:13:0;;:15::i;:::-;67555:103;;;67591:55;67622:1;67626:2;67630;67634:5;67641:4;67591:22;:55::i;46164:239::-;46234:7;46286:14;;;:7;:14;;;;;;-1:-1:-1;;;;;46321:19:0;;46313:59;;;;;-1:-1:-1;;;46313:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;80134:1967;80304:10;;80343:13;;80333:23;;80325:66;;;;;-1:-1:-1;;;80325:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;80404:14;80421:12;:10;:12::i;:::-;80404:29;;80444:15;80462:27;80476:4;80482:6;80462:13;:27::i;:::-;80444:45;;80502:22;80535:25;80571:17;80604:9;80599:1131;80620:6;80615:1;:11;80599:1131;;80648:10;80661:3;80665:1;80661:6;;;;;;;;;;;;;;80648:19;;80686:20;:2;:18;:20::i;:::-;80682:1037;;;80727:46;80741:4;80747:2;80751:6;80758:1;80751:9;;;;;;;;;;;;;;80762:10;80727:13;:46::i;:::-;80682:1037;;;80799:23;:2;:21;:23::i;:::-;80795:924;;;80843:47;80852:4;80858:2;80862:6;80869:1;80862:9;;;;;;;;;;;;;;80873:10;80885:4;80843:8;:47::i;:::-;80914:30;;80941:2;;80937:1;;-1:-1:-1;;;;;80914:30:0;;;;;80937:1;;80914:30;80963:24;80990:29;:2;:27;:29::i;:::-;80963:56;-1:-1:-1;81042:19:0;81038:590;;81103:16;81086:33;;81162:1;81142:21;;81038:590;;;81236:14;81216:16;:34;81212:397;;81279:65;81304:4;81310:14;81326:17;81279:24;:65::i;:::-;81388:16;-1:-1:-1;81508:1:0;;81431:30;;;;;81388:16;81212:397;;;81566:19;;;;;81212:397;80795:924;;-1:-1:-1;80628:3:0;;80599:1131;;;-1:-1:-1;81746:19:0;;81742:282;;81782:65;81807:4;81813:14;81829:17;81782:24;:65::i;:::-;-1:-1:-1;;;;;81981:18:0;;;;;;:12;:18;;;;;:31;;81862:30;;;81981:31;;;;;;81742:282;82077:1;-1:-1:-1;;;;;82041:52:0;82063:4;-1:-1:-1;;;;;82041:52:0;82055:6;-1:-1:-1;;;;;82041:52:0;;82081:3;82086:6;82041:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80134:1967;;;;;;;;;:::o;103347:133::-;103393:19;:17;:19::i;:::-;103423:6;:13;;-1:-1:-1;;103423:13:0;103432:4;103423:13;;;103452:20;103459:12;:10;:12::i;99030:125::-;-1:-1:-1;;;;;99087:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;99087:24:0;99107:4;99087:24;;;99127:20;;;99087:17;99127:20;99030:125;:::o;41815:109::-;41575:8;41899:12;:17;;41815:109::o;56058:314::-;56222:142;56250:4;56269:2;56286:5;56306:4;56349;56222:13;:142::i;42080:134::-;-1:-1:-1;;;;;;42179:27:0;;42080:134::o;47180:378::-;47266:33;:12;:31;:33::i;:::-;47265:34;47257:74;;;;;-1:-1:-1;;;47257:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47385:1;47350:23;;;:9;:23;;;;;;-1:-1:-1;;;;;47350:23:0;:37;47342:80;;;;;-1:-1:-1;;;47342:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47459:12;:10;:12::i;:::-;47433:23;;;;:9;:23;;;;;:38;;-1:-1:-1;;47433:38:0;-1:-1:-1;;;;;47433:38:0;;;;;;;;;;47519:30;47433:23;47519:28;:30::i;:::-;47487:63;;47505:12;47487:63;;;;;;;;;;47180:378;:::o;71287:1541::-;71492:10;71528:20;;;:47;;;;-1:-1:-1;71552:23:0;;;71528:47;71520:90;;;;;-1:-1:-1;;;71520:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;71623:14;71640:12;:10;:12::i;:::-;71623:29;;71668:9;71663:1158;71684:6;71679:1;:11;71663:1158;;71712:10;71725;;71736:1;71725:13;;;;;;;;;;;;;-1:-1:-1;;;;;71725:13:0;71712:26;;71775:1;-1:-1:-1;;;;;71761:16:0;:2;-1:-1:-1;;;;;71761:16:0;;;71753:52;;;;;-1:-1:-1;;;71753:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;71820:10;71833:3;;71837:1;71833:6;;;;;;;;;;;;;71820:19;;71854:13;71870:6;;71877:1;71870:9;;;;;;;;;;;;;71854:25;;71898:20;:2;:18;:20::i;:::-;71894:916;;;71939:28;71953:2;71957;71961:5;71939:13;:28::i;:::-;71991:49;;;;;;;;;;;;;;-1:-1:-1;;;;;71991:49:0;;;;72022:1;;71991:49;;;;;;;;;;;;;;72063:15;:2;-1:-1:-1;;;;;72063:13:0;;:15::i;:::-;72059:119;;;72103:55;72134:1;72138:2;72142;72146:5;72153:4;;72103:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72103:22:0;;-1:-1:-1;;;72103:55:0:i;:::-;71894:916;;;72203:23;:2;:21;:23::i;:::-;72199:611;;;72247:30;72256:2;72260;72264:5;72271;72247:8;:30::i;:::-;72301:28;;72326:2;;-1:-1:-1;;;;;72301:28:0;;;72318:1;;72301:28;;72318:1;;72301:28;72353:45;;;;;;72396:1;72353:45;;;;;;-1:-1:-1;;;;;72353:45:0;;;;72384:1;;72353:45;;;;;;;;;;;;;;72421:15;:2;-1:-1:-1;;;;;72421:13:0;;:15::i;:::-;72417:302;;;72465:27;72489:2;72465:23;:27::i;:::-;72461:239;;;72521:51;72552:1;72556:2;72560;72564:1;72567:4;;72521:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72521:22:0;;-1:-1:-1;;;72521:51:0:i;:::-;72461:239;;;72629:47;72659:1;72663:2;72667;72671:4;;72629:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72629:21:0;;-1:-1:-1;;;72629:47:0:i;72199:611::-;71663:1158;;;71692:3;;;;;71663:1158;;;;71287:1541;;;;;;;;;;:::o;58836:852::-;59021:14;59038:12;:10;:12::i;:::-;59021:29;-1:-1:-1;;;;;;59069:16:0;;59061:56;;;;;-1:-1:-1;;;59061:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59128:15;59146:27;59160:4;59166:6;59146:13;:27::i;:::-;59128:45;;59190:20;:2;:18;:20::i;:::-;59186:327;;;59227:50;59245:4;59251:2;59255;59259:5;59266:10;59227:17;:50::i;:::-;59186:327;;;59299:23;:2;:21;:23::i;:::-;59295:218;;;59339:52;59352:4;59358:2;59362;59366:5;59373:10;59385:5;59339:12;:52::i;:::-;59430:2;59426;-1:-1:-1;;;;;59411:22:0;59420:4;-1:-1:-1;;;;;59411:22:0;;;;;;;;;;;59295:218;59559:2;-1:-1:-1;;;;;59530:43:0;59553:4;-1:-1:-1;;;;;59530:43:0;59545:6;-1:-1:-1;;;;;59530:43:0;;59563:2;59567:5;59530:43;;;;;;;;;;;;;;;;;;;;;;;;59588:15;:2;-1:-1:-1;;;;;59588:13:0;;:15::i;:::-;59584:97;;;59620:49;59643:4;59649:2;59653;59657:5;59664:4;59620:22;:49::i;:::-;58836:852;;;;;;;:::o;82261:1426::-;82358:14;82375:12;:10;:12::i;:::-;82358:29;;82398:15;82416:27;82430:4;82436:6;82416:13;:27::i;:::-;82473:13;;82398:45;;-1:-1:-1;82456:14:0;82473:13;82523:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;82523:21:0;;82497:47;;82557:22;82590:25;82631:9;82626:809;82647:6;82642:1;:11;82626:809;;82675:13;82691:6;82698:1;82691:9;;;;;;;;;;;;;;82675:25;;82727:1;82715:6;82722:1;82715:9;;;;;;;;;;;;;:13;;;;;82743:50;82752:4;82758:5;82765:6;82772:1;82765:9;;;;;;;;;;;;;;82776:10;82788:4;82743:8;:50::i;:::-;82813:33;;82840:5;;82836:1;;-1:-1:-1;;;;;82813:33:0;;;;;82836:1;;82813:33;82861:24;82888:32;:5;:30;:32::i;:::-;82861:59;-1:-1:-1;82939:19:0;82935:489;;82996:16;82979:33;;83051:1;83031:21;;82935:489;;;83117:14;83097:16;:34;83093:316;;83156:65;83181:4;83187:14;83203:17;83156:24;:65::i;:::-;83261:16;83244:33;;83320:1;83300:21;;83093:316;;;83370:19;;;;;83093:316;-1:-1:-1;;82655:3:0;;82626:809;;;-1:-1:-1;83451:19:0;;83447:160;;83487:65;83512:4;83518:14;83534:17;83487:24;:65::i;:::-;-1:-1:-1;;;;;83567:18:0;;;;;;:12;:18;;;;;:28;;;;;;;83447:160;83660:1;-1:-1:-1;;;;;83624:55:0;83646:4;-1:-1:-1;;;;;83624:55:0;83638:6;-1:-1:-1;;;;;83624:55:0;;83664:6;83672;83624:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82261:1426;;;;;;;;:::o;56567:1711::-;-1:-1:-1;;;;;56722:16:0;;56714:56;;;;;-1:-1:-1;;;56714:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56781:14;56798:12;:10;:12::i;:::-;56781:29;;56821:15;56839:27;56853:4;56859:6;56839:13;:27::i;:::-;56896:13;;56821:45;;-1:-1:-1;56879:14:0;56896:13;56946:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56946:21:0;;56920:47;;56980:22;57013:25;57054:9;57049:809;57070:6;57065:1;:11;57049:809;;57098:13;57114:6;57121:1;57114:9;;;;;;;;;;;;;;57098:25;;57150:1;57138:6;57145:1;57138:9;;;;;;;;;;;;;:13;;;;;57166:50;57179:4;57185:2;57189:5;57196:1;57199:10;57211:4;57166:12;:50::i;:::-;57255:5;57251:2;-1:-1:-1;;;;;57236:25:0;57245:4;-1:-1:-1;;;;;57236:25:0;;;;;;;;;;;57276:24;57303:32;:5;:30;:32::i;:::-;57276:59;-1:-1:-1;57354:19:0;57350:497;;57411:16;57394:33;;57466:1;57446:21;;57350:497;;;57532:14;57512:16;:34;57508:324;;57571:73;57600:4;57606:2;57610:14;57626:17;57571:28;:73::i;:::-;57684:16;57667:33;;57743:1;57723:21;;57508:324;;;57793:19;;;;;57508:324;-1:-1:-1;;57078:3:0;;57049:809;;;-1:-1:-1;57874:19:0;;57870:184;;57910:73;57939:4;57945:2;57949:14;57965:17;57910:28;:73::i;:::-;57998:44;58025:4;58031:2;58035:6;57998:26;:44::i;:::-;58105:2;-1:-1:-1;;;;;58071:53:0;58099:4;-1:-1:-1;;;;;58071:53:0;58085:12;:10;:12::i;:::-;-1:-1:-1;;;;;58071:53:0;;58109:6;58117;58071:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58139:15;:2;-1:-1:-1;;;;;58139:13:0;;:15::i;:::-;:46;;;;;58158:27;58182:2;58158:23;:27::i;:::-;58135:136;;;58202:57;58230:4;58236:2;58240:6;58248;58202:57;;;;;;;;;;;;:27;:57::i;:::-;56567:1711;;;;;;;;;:::o;52562:467::-;52647:4;-1:-1:-1;;;;;;52684:40:0;;52699:25;52684:40;;:105;;-1:-1:-1;;;;;;;52741:48:0;;52756:33;52741:48;52684:105;:175;;;-1:-1:-1;;;;;;;52806:53:0;;52821:38;52806:53;52684:175;:228;;;;52876:36;52900:11;52876:23;:36::i;105800:922::-;105853:15;105909:10;105853:15;105955:27;:25;:27::i;:::-;105930:52;;106018:18;-1:-1:-1;;;;;105997:40:0;:9;-1:-1:-1;;;;;105997:40:0;;:76;;;;106054:19;-1:-1:-1;;;;;106041:32:0;:9;-1:-1:-1;;;;;106041:32:0;;105997:76;105993:169;;;106144:6;-1:-1:-1;106137:13:0;;-1:-1:-1;106137:13:0;105993:169;-1:-1:-1;;;;;106566:22:0;;106579:9;106566:22;;;;:78;;;106592:18;-1:-1:-1;;;;;106592:33:0;;106626:6;106634:9;106592:52;;;;;;;;;;;;;-1:-1:-1;;;;;106592:52:0;;;;;;-1:-1:-1;;;;;106592:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;106592:52:0;106566:78;106562:124;;;106668:6;-1:-1:-1;106661:13:0;;-1:-1:-1;106661:13:0;106562:124;-1:-1:-1;106705:9:0;-1:-1:-1;105800:922:0;:::o;72943:449::-;73067:10;73059:44;;;;;-1:-1:-1;;;73059:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;73114:14;73131:13;;;:9;:13;;;;;;73175:14;;;73208:18;;;73200:57;;;;;-1:-1:-1;;;73200:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;73268:13;;;;:9;:13;;;;;;;;:25;;;;73358:9;:13;;;;;-1:-1:-1;;;;;73358:17:0;;;;;;;;;-1:-1:-1;73358:17:0;;;:26;;;;;;;72943:449::o;73400:681::-;73542:5;73551:1;73542:10;73534:49;;;;;-1:-1:-1;;;73534:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;73602:11;;;;:7;:11;;;;;;:16;73594:58;;;;;-1:-1:-1;;;73594:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;73665:11;;;;:7;:11;;;;;-1:-1:-1;;;;;73679:20:0;;73665:34;;73717:7;73712:362;;73741:20;73764:29;:2;:27;:29::i;:::-;73962:23;;;;:9;:23;;;;;;;;73960:25;;;;;;;;;74002:23;;;;;;-1:-1:-1;;;;;74002:27:0;;;;;;;;;74000:29;;;;;;74046:12;:16;;;;;;74044:18;;;;;;;-1:-1:-1;73400:681:0;;;;:::o;51135:444::-;51515:20;51563:8;;;51135:444::o;49719:400::-;50033:23;-1:-1:-1;;;;;49942:48:0;;42728:10;49991:12;:10;:12::i;:::-;50005:4;50011:3;50016:6;50024:4;49942:87;;;;;;;;;;;;;-1:-1:-1;;;;;49942:87:0;;;;;;-1:-1:-1;;;;;49942:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49942:87:0;-1:-1:-1;;;;;;49942:114:0;;49920:191;;;;;-1:-1:-1;;;49920:191:0;;;;;;;;;;;;;;;;;;;;;;;;;;;96402:564;96465:13;96495:10;96491:53;;-1:-1:-1;96522:10:0;;;;;;;;;;;;;;;;;;;96491:53;96569:5;96554:12;96610:78;96617:9;;96610:78;;96643:8;;96674:2;96666:10;;;;96610:78;;;96698:19;96730:6;96720:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;96720:17:0;-1:-1:-1;96792:5:0;;-1:-1:-1;96698:39:0;-1:-1:-1;;;96764:10:0;;96808:119;96815:9;;96808:119;;96885:2;96878:4;:9;96872:2;:16;96859:31;;96841:6;96848:7;;;;;;;96841:15;;;;;;;;;;;:49;;;;;;;;;;-1:-1:-1;96913:2:0;96905:10;;;;96808:119;;;-1:-1:-1;96951:6:0;96402:564;-1:-1:-1;;;;96402:564:0:o;83802:487::-;83954:10;83946:44;;;;;-1:-1:-1;;;83946:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;84009:10;84001:53;;;;;-1:-1:-1;;;84001:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;84065:15;84083:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;84083:19:0;;;;;;;;;;84121:16;;;;84113:58;;;;;-1:-1:-1;;;84113:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;84182:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;84182:19:0;;;;;;;;;;;84204:15;;;;84182:37;;;84259:13;;;:9;:13;;-1:-1:-1;84259:13:0;;;:22;;;;;;;;83802:487::o;84297:792::-;84475:5;84484:1;84475:10;84467:49;;;;;-1:-1:-1;;;84467:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;84527:13;84543:11;;;:7;:11;;;;;;-1:-1:-1;;;;;84573:31:0;;;;;;;84565:68;;;;;-1:-1:-1;;;84565:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;84649:10;84644:165;;-1:-1:-1;;;84685:34:0;;:39;;;;84684:78;;-1:-1:-1;84745:17:0;;;;:13;:17;;;;;;-1:-1:-1;;;;;84745:17:0;84729:12;:10;:12::i;:::-;-1:-1:-1;;;;;84729:33:0;;84684:78;84676:121;;;;;-1:-1:-1;;;84676:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;84819:11;;;;:7;:11;;;;;42845:66;84819:30;;84867:7;84862:220;;84891:64;84916:4;84922:29;:2;:27;:29::i;:::-;84953:1;84891:24;:64::i;:::-;-1:-1:-1;;;;;85052:18:0;;;;;;:12;:18;;;;;85050:20;;-1:-1:-1;;85050:20:0;;;84297:792;;;;;;:::o;60876:759::-;-1:-1:-1;;;;;61050:16:0;;61042:56;;;;;-1:-1:-1;;;61042:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;61109:14;61126:12;:10;:12::i;:::-;61109:29;;61149:15;61167:27;61181:4;61187:6;61167:13;:27::i;:::-;61149:45;;61207:51;61220:4;61226:2;61230:5;61237:1;61240:10;61252:5;61207:12;:51::i;:::-;61295:5;61291:2;-1:-1:-1;;;;;61276:25:0;61285:4;-1:-1:-1;;;;;61276:25:0;;;;;;;;;;;61346:2;-1:-1:-1;;;;;61317:42:0;61340:4;-1:-1:-1;;;;;61317:42:0;61332:6;-1:-1:-1;;;;;61317:42:0;;61350:5;61357:1;61317:42;;;;;;;;;;;;;;;;;;;;;;;;61374:15;:2;-1:-1:-1;;;;;61374:13:0;;:15::i;:::-;61370:258;;;61410:27;61434:2;61410:23;:27::i;:::-;61406:211;;;61458:48;61481:4;61487:2;61491:5;61498:1;61501:4;61458:22;:48::i;:::-;61406:211;;;61532:4;61528:89;;;61557:44;61579:4;61585:2;61589:5;61596:4;61557:21;:44::i;61832:2153::-;-1:-1:-1;;;;;62036:16:0;;62028:56;;;;;-1:-1:-1;;;62028:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;62112:10;;62151:13;;62141:23;;62133:66;;;;;-1:-1:-1;;;62133:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;62210:14;62227:12;:10;:12::i;:::-;62210:29;;62250:15;62268:27;62282:4;62288:6;62268:13;:27::i;:::-;62250:45;;62308:22;62341:25;62377:17;62410:9;62405:1147;62426:6;62421:1;:11;62405:1147;;62454:10;62467:3;62471:1;62467:6;;;;;;;;;;;;;;62454:19;;62492:20;:2;:18;:20::i;:::-;62488:1053;;;62533:54;62551:4;62557:2;62561;62565:6;62572:1;62565:9;;;;;;;;;;;;;;62576:10;62533:17;:54::i;:::-;62488:1053;;;62613:23;:2;:21;:23::i;:::-;62609:932;;;62657:55;62670:4;62676:2;62680;62684:6;62691:1;62684:9;;;;;;;;;;;;;;62695:10;62707:4;62657:12;:55::i;:::-;62755:2;62751;-1:-1:-1;;;;;62736:22:0;62745:4;-1:-1:-1;;;;;62736:22:0;;;;;;;;;;;62777:24;62804:29;:2;:27;:29::i;:::-;62777:56;-1:-1:-1;62856:19:0;62852:598;;62917:16;62900:33;;62976:1;62956:21;;62852:598;;;63050:14;63030:16;:34;63026:405;;63093:73;63122:4;63128:2;63132:14;63148:17;63093:28;:73::i;:::-;63210:16;-1:-1:-1;63330:1:0;;63253:30;;;;;63210:16;63026:405;;;63388:19;;;;;63026:405;62609:932;;-1:-1:-1;62434:3:0;;62405:1147;;;-1:-1:-1;63568:19:0;;63564:232;;63604:73;63633:4;63639:2;63643:14;63659:17;63604:28;:73::i;:::-;63692:30;;63737:47;63764:4;63770:2;63692:30;63737:26;:47::i;:::-;63847:2;-1:-1:-1;;;;;63813:50:0;63841:4;-1:-1:-1;;;;;63813:50:0;63827:12;:10;:12::i;:::-;-1:-1:-1;;;;;63813:50:0;;63851:3;63856:6;63813:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63878:15;:2;-1:-1:-1;;;;;63878:13:0;;:15::i;:::-;63874:104;;;63910:56;63938:4;63944:2;63948:3;63953:6;63961:4;63910:27;:56::i;76634:886::-;76801:90;;;76851:39;76801:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76824:25;76801:90;;;76998:21;;77047:11;;76709:4;77131:19;;;76709:4;;;;;76801:90;;;77047:11;;76998:21;76801:90;77193:9;77186:5;77175:63;77164:74;;77280:6;77274:13;77264:23;;;;;77473:3;77461:9;:15;77454:23;;;;77495:7;:17;;;;;77506:6;77495:17;77488:24;76634:886;-1:-1:-1;;;;;76634:886:0:o;48898:325::-;49166:17;-1:-1:-1;;;;;49082:43:0;;42563:10;49126:12;:10;:12::i;:::-;49140:4;49146:2;49150:5;49157:4;49082:80;;;;;;;;;;;;;-1:-1:-1;;;;;49082:80:0;;;;;;-1:-1:-1;;;;;49082:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77949:345;78198:33;-1:-1:-1;;;;;78125:36:0;;;78162:12;:10;:12::i;:::-;78176:4;78182:5;78189:4;78125:69;;;;;;;;;;;;;-1:-1:-1;;;;;78125:69:0;;;;;;-1:-1:-1;;;;;78125:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;78125:69:0;-1:-1:-1;;;;;;78125:106:0;;78103:183;;;;;-1:-1:-1;;;78103:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;85097:313;85319:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;85319:29:0;;;;;;;;;;;:39;;;;;;;85369:23;;;:9;:23;;;;;;:33;;;;;;;;85097:313::o;74089:591::-;74266:10;74258:53;;;;;-1:-1:-1;;;74258:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;74330:10;74322:44;;;;;-1:-1:-1;;;74322:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;74377:15;74395:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;74395:19:0;;;;;;;;;;74433:16;;;;74425:58;;;;;-1:-1:-1;;;74425:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;74506:2;-1:-1:-1;;;;;74498:10:0;:4;-1:-1:-1;;;;;74498:10:0;;74494:179;;74525:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;74525:19:0;;;;;;;;;;;74547:15;;;;74525:37;;;74635:17;;;;;;;;;:26;;;;;;;-1:-1:-1;74089:591:0:o;74688:766::-;74891:5;74900:1;74891:10;74883:49;;;;;-1:-1:-1;;;74883:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;74943:13;74959:11;;;:7;:11;;;;;;-1:-1:-1;;;;;74989:31:0;;;;;;;74981:68;;;;;-1:-1:-1;;;74981:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;75065:10;75060:165;;-1:-1:-1;;;75101:34:0;;:39;;;;75100:78;;-1:-1:-1;75161:17:0;;;;:13;:17;;;;;;-1:-1:-1;;;;;75161:17:0;75145:12;:10;:12::i;:::-;-1:-1:-1;;;;;75145:33:0;;75100:78;75092:121;;;;;-1:-1:-1;;;75092:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;75235:11;;;;:7;:11;;;;;-1:-1:-1;;;;;75249:20:0;;75235:34;;75285:7;75280:167;;75309:39;75336:4;75342:2;75346:1;75309:26;:39::i;:::-;75363:72;75392:4;75398:2;75402:29;:2;:27;:29::i;:::-;75433:1;75862:446;76047:2;-1:-1:-1;;;;;76039:10:0;:4;-1:-1:-1;;;;;76039:10:0;;76035:266;;76140:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;76140:29:0;;;;;;;;;;;:39;;;;;;;76252:27;;;;;;;:37;;;;;;;75862:446::o;75462:392::-;75614:2;-1:-1:-1;;;;;75606:10:0;:4;-1:-1:-1;;;;;75606:10:0;;75602:245;;-1:-1:-1;;;;;75707:18:0;;;;;;;:12;:18;;;;;;:28;;;;;;;75809:16;;;;;;:26;;;;;;75462:392;;;:::o;43462:442::-;43547:4;-1:-1:-1;;;;;;43584:40:0;;43599:25;43584:40;;:98;;-1:-1:-1;;;;;;;43641:41:0;;43656:26;43641:41;43584:98;:167;;;-1:-1:-1;;;;;;;43699:52:0;;43714:37;43699:52;43584:167;:234;;;-1:-1:-1;;;;;;;43768:50:0;;43783:35;43768:50;43584:234;:312;;;-1:-1:-1;;;;;;;;43835:61:0;43850:46;43835:61;;43462:442::o;103931:526::-;104414:23;104418:14;104414:23;104401:37;104397:2;104393:46;;104368:82::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

ipfs://f15bb571a09ca2cc4fc24fb025c14fbc428a46d23fa58f2d9c182efa34bd4bd0
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.