contract ERC721ContractWrapper is Proxy {
    address internal constant _IMPLEMENTATION_ADDRESS = 0x0AaD9cf1D64301D6a37B1368f073E99DED6BECa5;
    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _totalSupply
    ) {
        assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
        StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = _IMPLEMENTATION_ADDRESS;
        Address.functionDelegateCall(
            _IMPLEMENTATION_ADDRESS,
            abi.encodeWithSignature("initialize(string,string,uint256)", _name, _symbol, _totalSupply)
        );
    }
    
    /**
     * @dev Returns the current implementation address.
     */
     function implementation() public view returns (address) {
        return _implementation();
    }

    function _implementation() internal override view returns (address) {
        return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
    }    
}
function implementation() public view returns (address) {
        return _implementation();
    }
/**
 * @dev Returns the current implementation address.
 */