class HbrowseRipper extends AbstractHTMLRipper {

    public HbrowseRipper(URL url) throws IOException {
    super(url);
    }

        @Override
        public String getHost() {
            return "hbrowse";
        }

        @Override
        public String getDomain() {
            return "hbrowse.com";
        }

        @Override
        public String getGID(URL url) throws MalformedURLException {<FILL_FUNCTION_BODY>}

        @Override
        public Document getFirstPage() throws IOException {
            // "url" is an instance field of the superclass
            Document tempDoc = Http.url(url).get();
            return Http.url("https://www.hbrowse.com" + tempDoc.select("td[id=pageTopHome] > a[title=view thumbnails (top)]").attr("href")).get();
        }

        @Override
        public String getAlbumTitle(URL url) throws MalformedURLException {
            try {
                Document doc = getFirstPage();
                String title = doc.select("div[id=main] > table.listTable > tbody > tr > td.listLong").first().text();
                return getHost() + "_" + title + "_" + getGID(url);
            } catch (Exception e) {
                // Fall back to default album naming convention
                LOGGER.warn("Failed to get album title from " + url, e);
            }
            return super.getAlbumTitle(url);
        }

        @Override
        public List<String> getURLsFromPage(Document doc) {
            List<String> result = new ArrayList<String>();
            for (Element el : doc.select("table > tbody > tr > td > a > img")) {
                String imageURL = el.attr("src").replace("/zzz", "");
                result.add("https://www.hbrowse.com" + imageURL);
            }
                return result;
        }

        @Override
        public void downloadURL(URL url, int index) {
            addURLToDownload(url, getPrefix(index));
        }
    }

            Pattern p = Pattern.compile("https?://www.hbrowse.com/(\\d+)/[a-zA-Z0-9]*");
            Matcher m = p.matcher(url.toExternalForm());
            if (m.matches()) {
                return m.group(1);
            }
            throw new MalformedURLException("Expected hbrowse.com URL format: " +
                            "hbrowse.com/ID/COMICID - got " + url + " instead");
        
<methods>public boolean addURLToDownload(java.net.URL, java.io.File, java.lang.String, Map<java.lang.String,java.lang.String>, java.lang.Boolean) ,public boolean addURLToDownload(java.net.URL, java.io.File) ,public boolean canRip(java.net.URL) ,public void downloadCompleted(java.net.URL, java.io.File) ,public void downloadErrored(java.net.URL, java.lang.String) ,public void downloadExists(java.net.URL, java.io.File) ,public int getCompletionPercentage() ,public int getCount() ,public abstract java.lang.String getHost() ,public Document getNextPage(Document) throws java.io.IOException,public java.lang.String getStatusText() ,public void rip() throws java.io.IOException,public java.net.URL sanitizeURL(java.net.URL) throws java.net.MalformedURLException,public boolean saveText(java.net.URL, java.lang.String, java.lang.String, int) ,public void setWorkingDir(java.net.URL) throws java.io.IOException<variables>private Map<java.net.URL,java.io.File> itemsCompleted,private Map<java.net.URL,java.lang.String> itemsErrored,private Map<java.net.URL,java.io.File> itemsPending