
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xml:lang="en" lang="en">
    <!-- this is a JXR report set (jdk8) -->
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <title>Apache NetBeans Maven Utilities - NB Repository Plugin 1.4-SNAPSHOT Reference</title>
        <script type="text/javascript">
            tmpTargetPage = "" + window.location.search;
            if (tmpTargetPage != "" && tmpTargetPage != "undefined")
                tmpTargetPage = tmpTargetPage.substring(1);
            if (tmpTargetPage.indexOf(":") != -1 || (tmpTargetPage != "" && !validURL(tmpTargetPage)))
                tmpTargetPage = "undefined";
            targetPage = tmpTargetPage;
            function validURL(url) {
                try {
                    url = decodeURIComponent(url);
                }
                catch (error) {
                    return false;
                }
                var pos = url.indexOf(".html");
                if (pos == -1 || pos != url.length - 5)
                    return false;
                var allowNumber = false;
                var allowSep = false;
                var seenDot = false;
                for (var i = 0; i < url.length - 5; i++) {
                    var ch = url.charAt(i);
                    if ('a' <= ch && ch <= 'z' ||
                            'A' <= ch && ch <= 'Z' ||
                            ch == '$' ||
                            ch == '_' ||
                            ch.charCodeAt(0) > 127) {
                        allowNumber = true;
                        allowSep = true;
                    } else if ('0' <= ch && ch <= '9'
                            || ch == '-') {
                        if (!allowNumber)
                            return false;
                    } else if (ch == '/' || ch == '.') {
                        if (!allowSep)
                            return false;
                        allowNumber = false;
                        allowSep = false;
                        if (ch == '.')
                            seenDot = true;
                        if (ch == '/' && seenDot)
                            return false;
                    } else {
                        return false;
                    }
                }
                return true;
            }
            function loadFrames() {
                if (targetPage != "" && targetPage != "undefined")
                    top.classFrame.location = top.targetPage;
            }
        </script>
    </head>
    <frameset cols="20%,80%" title="Documentation frame" onload="top.loadFrames()">
        <frameset rows="30%,70%" title="Left frames" onload="top.loadFrames()">
            <frame src="overview-frame.html" name="packageListFrame" title="All Packages"/>
            <frame src="allclasses-frame.html" name="packageFrame" title="All classes and interfaces (except non-static nested types)"/>
        </frameset>
        <frame src="overview-summary.html" name="classFrame" title="Package, class and interface descriptions" scrolling="yes"/>
        <noframes>
            <h1>Frame Alert</h1>
            <p>
                You don't have frames. Go <a href="overview-summary.html">here</a>
            </p>
        </noframes>
    </frameset>
</html>
