code: @Override
  	protected byte[] createTile(int z, long x, long y) {
  
  		byte[] bytes = null;
  
  		String zoomUrl = tileUrl;
  
  		// Replace x, y, and z
  		if (urlHasXYZ) {
  			long yRequest = y;
  
  			// If TMS, flip the y value
  			if (tileFormat == TileFormatType.TMS) {
  				yRequest = TileBoundingBoxUtils.getYAsOppositeTileFormat(z,
  						(int) y);
  			}
  
  			zoomUrl = replaceXYZ(zoomUrl, z, x, yRequest);
  		}
  
  		// Replace bounding box
  		if (urlHasBoundingBox) {
  			zoomUrl = replaceBoundingBox(zoomUrl, z, x, y);
  		}
  
  		URL url;
  		try {
  			url = new URL(zoomUrl);
  		} catch (MalformedURLException e) {
  			throw new GeoPackageException("Failed to download tile. URL: "
  					+ zoomUrl + ", z=" + z + ", x=" + x + ", y=" + y, e);
  		}
  
  		int attempt = 1;
  		while (true) {
  			try {
  				bytes = downloadTile(zoomUrl, url, z, x, y);
  				break;
  			} catch (Exception e) {
  				if (attempt < downloadAttempts) {
  					LOGGER.log(Level.WARNING,
  							"Failed to download tile after attempt " + attempt
  									+ " of " + downloadAttempts + ". URL: "
  									+ zoomUrl + ", z=" + z + ", x=" + x
  									+ ", y=" + y, e);
  					attempt++;
  				} else {
  					throw new GeoPackageException(
  							"Failed to download tile after " + downloadAttempts
  									+ " attempts. URL: " + zoomUrl + ", z=" + z
  									+ ", x=" + x + ", y=" + y, e);
  				}
  			}
  		}
  
  		return bytes;
  	}
docs: {@inheritDoc}