{"ast":null,"code":"// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar punycode = require('punycode');\nvar util = require('./util');\nexports.parse = urlParse;\nexports.resolve = urlResolve;\nexports.resolveObject = urlResolveObject;\nexports.format = urlFormat;\nexports.Url = Url;\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.host = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.query = null;\n this.pathname = null;\n this.path = null;\n this.href = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n // Special case for a simple path URL\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n // RFC 2396: characters reserved for delimiting URLs.\n // We actually just auto-escape these.\n delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t'],\n // RFC 2396: characters not allowed for various reasons.\n unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims),\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\n autoEscape = ['\\''].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n // Note that any invalid chars are also handled, but these\n // are the ones that are *expected* to be seen, so we fast-path\n // them.\n nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),\n hostEndingChars = ['/', '?', '#'],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\n unsafeProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that never have a hostname.\n hostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that always contain a // bit.\n slashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n },\n querystring = require('querystring');\nfunction urlParse(url, parseQueryString, slashesDenoteHost) {\n if (url && util.isObject(url) && url instanceof Url) return url;\n var u = new Url();\n u.parse(url, parseQueryString, slashesDenoteHost);\n return u;\n}\nUrl.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {\n if (!util.isString(url)) {\n throw new TypeError(\"Parameter 'url' must be a string, not \" + typeof url);\n }\n\n // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n var queryIndex = url.indexOf('?'),\n splitter = queryIndex !== -1 && queryIndex < url.indexOf('#') ? '?' : '#',\n uSplit = url.split(splitter),\n slashRegex = /\\\\/g;\n uSplit[0] = uSplit[0].replace(slashRegex, '/');\n url = uSplit.join(splitter);\n var rest = url;\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim();\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n if (simplePath) {\n this.path = rest;\n this.href = rest;\n this.pathname = simplePath[1];\n if (simplePath[2]) {\n this.search = simplePath[2];\n if (parseQueryString) {\n this.query = querystring.parse(this.search.substr(1));\n } else {\n this.query = this.search.substr(1);\n }\n } else if (parseQueryString) {\n this.search = '';\n this.query = {};\n }\n return this;\n }\n }\n var proto = protocolPattern.exec(rest);\n if (proto) {\n proto = proto[0];\n var lowerProto = proto.toLowerCase();\n this.protocol = lowerProto;\n rest = rest.substr(proto.length);\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n var slashes = rest.substr(0, 2) === '//';\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n if (!hostlessProtocol[proto] && (slashes || proto && !slashedProtocol[proto])) {\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n for (var i = 0; i < hostEndingChars.length; i++) {\n var hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec;\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n var auth, atSign;\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = decodeURIComponent(auth);\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1;\n for (var i = 0; i < nonHostChars.length; i++) {\n var hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) hostEnd = hec;\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1) hostEnd = rest.length;\n this.host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n\n // pull out port.\n this.parseHost();\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || '';\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n var ipv6Hostname = this.hostname[0] === '[' && this.hostname[this.hostname.length - 1] === ']';\n\n // validate a little.\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n for (var i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) continue;\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n if (notHost.length) {\n rest = '/' + notHost.join('.') + rest;\n }\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n } else {\n // hostnames are always lower case.\n this.hostname = this.hostname.toLowerCase();\n }\n if (!ipv6Hostname) {\n // IDNA Support: Returns a punycoded representation of \"domain\".\n // It only converts parts of the domain name that\n // have non-ASCII characters, i.e. it doesn't matter if\n // you call it with a domain that already is ASCII-only.\n this.hostname = punycode.toASCII(this.hostname);\n }\n var p = this.port ? ':' + this.port : '';\n var h = this.hostname || '';\n this.host = h + p;\n this.href += this.host;\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n if (rest[0] !== '/') {\n rest = '/' + rest;\n }\n }\n }\n\n // now rest is set to the post-host stuff.\n // chop off any delim chars.\n if (!unsafeProtocol[lowerProto]) {\n // First, make 100% sure that any \"autoEscape\" chars get\n // escaped, even if encodeURIComponent doesn't think they\n // need to be.\n for (var i = 0, l = autoEscape.length; i < l; i++) {\n var ae = autoEscape[i];\n if (rest.indexOf(ae) === -1) continue;\n var esc = encodeURIComponent(ae);\n if (esc === ae) {\n esc = escape(ae);\n }\n rest = rest.split(ae).join(esc);\n }\n }\n\n // chop off from the tail first.\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var qm = rest.indexOf('?');\n if (qm !== -1) {\n this.search = rest.substr(qm);\n this.query = rest.substr(qm + 1);\n if (parseQueryString) {\n this.query = querystring.parse(this.query);\n }\n rest = rest.slice(0, qm);\n } else if (parseQueryString) {\n // no query string, but parseQueryString still requested\n this.search = '';\n this.query = {};\n }\n if (rest) this.pathname = rest;\n if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) {\n this.pathname = '/';\n }\n\n //to support http.request\n if (this.pathname || this.search) {\n var p = this.pathname || '';\n var s = this.search || '';\n this.path = p + s;\n }\n\n // finally, reconstruct the href based on what has been validated.\n this.href = this.format();\n return this;\n};\n\n// format a parsed object into a url string\nfunction urlFormat(obj) {\n // ensure it's an object, and not a string url.\n // If it's an obj, this is a no-op.\n // this way, you can call url_format() on strings\n // to clean up potentially wonky urls.\n if (util.isString(obj)) obj = urlParse(obj);\n if (!(obj instanceof Url)) return Url.prototype.format.call(obj);\n return obj.format();\n}\nUrl.prototype.format = function () {\n var auth = this.auth || '';\n if (auth) {\n auth = encodeURIComponent(auth);\n auth = auth.replace(/%3A/i, ':');\n auth += '@';\n }\n var protocol = this.protocol || '',\n pathname = this.pathname || '',\n hash = this.hash || '',\n host = false,\n query = '';\n if (this.host) {\n host = auth + this.host;\n } else if (this.hostname) {\n host = auth + (this.hostname.indexOf(':') === -1 ? this.hostname : '[' + this.hostname + ']');\n if (this.port) {\n host += ':' + this.port;\n }\n }\n if (this.query && util.isObject(this.query) && Object.keys(this.query).length) {\n query = querystring.stringify(this.query);\n }\n var search = this.search || query && '?' + query || '';\n if (protocol && protocol.substr(-1) !== ':') protocol += ':';\n\n // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.\n // unless they had them to begin with.\n if (this.slashes || (!protocol || slashedProtocol[protocol]) && host !== false) {\n host = '//' + (host || '');\n if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;\n } else if (!host) {\n host = '';\n }\n if (hash && hash.charAt(0) !== '#') hash = '#' + hash;\n if (search && search.charAt(0) !== '?') search = '?' + search;\n pathname = pathname.replace(/[?#]/g, function (match) {\n return encodeURIComponent(match);\n });\n search = search.replace('#', '%23');\n return protocol + host + pathname + search + hash;\n};\nfunction urlResolve(source, relative) {\n return urlParse(source, false, true).resolve(relative);\n}\nUrl.prototype.resolve = function (relative) {\n return this.resolveObject(urlParse(relative, false, true)).format();\n};\nfunction urlResolveObject(source, relative) {\n if (!source) return relative;\n return urlParse(source, false, true).resolveObject(relative);\n}\nUrl.prototype.resolveObject = function (relative) {\n if (util.isString(relative)) {\n var rel = new Url();\n rel.parse(relative, false, true);\n relative = rel;\n }\n var result = new Url();\n var tkeys = Object.keys(this);\n for (var tk = 0; tk < tkeys.length; tk++) {\n var tkey = tkeys[tk];\n result[tkey] = this[tkey];\n }\n\n // hash is always overridden, no matter what.\n // even href=\"\" will remove it.\n result.hash = relative.hash;\n\n // if the relative url is empty, then there's nothing left to do here.\n if (relative.href === '') {\n result.href = result.format();\n return result;\n }\n\n // hrefs like //foo/bar always cut to the protocol.\n if (relative.slashes && !relative.protocol) {\n // take everything except the protocol from relative\n var rkeys = Object.keys(relative);\n for (var rk = 0; rk < rkeys.length; rk++) {\n var rkey = rkeys[rk];\n if (rkey !== 'protocol') result[rkey] = relative[rkey];\n }\n\n //urlParse appends trailing / to urls like http://www.example.com\n if (slashedProtocol[result.protocol] && result.hostname && !result.pathname) {\n result.path = result.pathname = '/';\n }\n result.href = result.format();\n return result;\n }\n if (relative.protocol && relative.protocol !== result.protocol) {\n // if it's a known url protocol, then changing\n // the protocol does weird things\n // first, if it's not file:, then we MUST have a host,\n // and if there was a path\n // to begin with, then we MUST have a path.\n // if it is file:, then the host is dropped,\n // because that's known to be hostless.\n // anything else is assumed to be absolute.\n if (!slashedProtocol[relative.protocol]) {\n var keys = Object.keys(relative);\n for (var v = 0; v < keys.length; v++) {\n var k = keys[v];\n result[k] = relative[k];\n }\n result.href = result.format();\n return result;\n }\n result.protocol = relative.protocol;\n if (!relative.host && !hostlessProtocol[relative.protocol]) {\n var relPath = (relative.pathname || '').split('/');\n while (relPath.length && !(relative.host = relPath.shift()));\n if (!relative.host) relative.host = '';\n if (!relative.hostname) relative.hostname = '';\n if (relPath[0] !== '') relPath.unshift('');\n if (relPath.length < 2) relPath.unshift('');\n result.pathname = relPath.join('/');\n } else {\n result.pathname = relative.pathname;\n }\n result.search = relative.search;\n result.query = relative.query;\n result.host = relative.host || '';\n result.auth = relative.auth;\n result.hostname = relative.hostname || relative.host;\n result.port = relative.port;\n // to support http.request\n if (result.pathname || result.search) {\n var p = result.pathname || '';\n var s = result.search || '';\n result.path = p + s;\n }\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n }\n var isSourceAbs = result.pathname && result.pathname.charAt(0) === '/',\n isRelAbs = relative.host || relative.pathname && relative.pathname.charAt(0) === '/',\n mustEndAbs = isRelAbs || isSourceAbs || result.host && relative.pathname,\n removeAllDots = mustEndAbs,\n srcPath = result.pathname && result.pathname.split('/') || [],\n relPath = relative.pathname && relative.pathname.split('/') || [],\n psychotic = result.protocol && !slashedProtocol[result.protocol];\n\n // if the url is a non-slashed url, then relative\n // links like ../.. should be able\n // to crawl up to the hostname, as well. This is strange.\n // result.protocol has already been set by now.\n // Later on, put the first path part into the host field.\n if (psychotic) {\n result.hostname = '';\n result.port = null;\n if (result.host) {\n if (srcPath[0] === '') srcPath[0] = result.host;else srcPath.unshift(result.host);\n }\n result.host = '';\n if (relative.protocol) {\n relative.hostname = null;\n relative.port = null;\n if (relative.host) {\n if (relPath[0] === '') relPath[0] = relative.host;else relPath.unshift(relative.host);\n }\n relative.host = null;\n }\n mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');\n }\n if (isRelAbs) {\n // it's absolute.\n result.host = relative.host || relative.host === '' ? relative.host : result.host;\n result.hostname = relative.hostname || relative.hostname === '' ? relative.hostname : result.hostname;\n result.search = relative.search;\n result.query = relative.query;\n srcPath = relPath;\n // fall through to the dot-handling below.\n } else if (relPath.length) {\n // it's relative\n // throw away the existing file, and take the new path instead.\n if (!srcPath) srcPath = [];\n srcPath.pop();\n srcPath = srcPath.concat(relPath);\n result.search = relative.search;\n result.query = relative.query;\n } else if (!util.isNullOrUndefined(relative.search)) {\n // just pull out the search.\n // like href='?foo'.\n // Put this after the other two cases because it simplifies the booleans\n if (psychotic) {\n result.hostname = result.host = srcPath.shift();\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n result.search = relative.search;\n result.query = relative.query;\n //to support http.request\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');\n }\n result.href = result.format();\n return result;\n }\n if (!srcPath.length) {\n // no path at all. easy.\n // we've already handled the other stuff above.\n result.pathname = null;\n //to support http.request\n if (result.search) {\n result.path = '/' + result.search;\n } else {\n result.path = null;\n }\n result.href = result.format();\n return result;\n }\n\n // if a url ENDs in . or .., then it must get a trailing slash.\n // however, if it ends in anything else non-slashy,\n // then it must NOT get a trailing slash.\n var last = srcPath.slice(-1)[0];\n var hasTrailingSlash = (result.host || relative.host || srcPath.length > 1) && (last === '.' || last === '..') || last === '';\n\n // strip single dots, resolve double dots to parent dir\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = srcPath.length; i >= 0; i--) {\n last = srcPath[i];\n if (last === '.') {\n srcPath.splice(i, 1);\n } else if (last === '..') {\n srcPath.splice(i, 1);\n up++;\n } else if (up) {\n srcPath.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (!mustEndAbs && !removeAllDots) {\n for (; up--; up) {\n srcPath.unshift('..');\n }\n }\n if (mustEndAbs && srcPath[0] !== '' && (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {\n srcPath.unshift('');\n }\n if (hasTrailingSlash && srcPath.join('/').substr(-1) !== '/') {\n srcPath.push('');\n }\n var isAbsolute = srcPath[0] === '' || srcPath[0] && srcPath[0].charAt(0) === '/';\n\n // put the host back\n if (psychotic) {\n result.hostname = result.host = isAbsolute ? '' : srcPath.length ? srcPath.shift() : '';\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n mustEndAbs = mustEndAbs || result.host && srcPath.length;\n if (mustEndAbs && !isAbsolute) {\n srcPath.unshift('');\n }\n if (!srcPath.length) {\n result.pathname = null;\n result.path = null;\n } else {\n result.pathname = srcPath.join('/');\n }\n\n //to support request.http\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');\n }\n result.auth = relative.auth || result.auth;\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n};\nUrl.prototype.parseHost = function () {\n var host = this.host;\n var port = portPattern.exec(host);\n if (port) {\n port = port[0];\n if (port !== ':') {\n this.port = port.substr(1);\n }\n host = host.substr(0, host.length - port.length);\n }\n if (host) this.hostname = host;\n};","map":{"version":3,"names":["punycode","require","util","exports","parse","urlParse","resolve","urlResolve","resolveObject","urlResolveObject","format","urlFormat","Url","protocol","slashes","auth","host","port","hostname","hash","search","query","pathname","path","href","protocolPattern","portPattern","simplePathPattern","delims","unwise","concat","autoEscape","nonHostChars","hostEndingChars","hostnameMaxLen","hostnamePartPattern","hostnamePartStart","unsafeProtocol","hostlessProtocol","slashedProtocol","querystring","url","parseQueryString","slashesDenoteHost","isObject","u","prototype","isString","TypeError","queryIndex","indexOf","splitter","uSplit","split","slashRegex","replace","join","rest","trim","length","simplePath","exec","substr","proto","lowerProto","toLowerCase","match","hostEnd","i","hec","atSign","lastIndexOf","slice","decodeURIComponent","parseHost","ipv6Hostname","hostparts","l","part","newpart","j","k","charCodeAt","validParts","notHost","bit","push","unshift","toASCII","p","h","ae","esc","encodeURIComponent","escape","qm","s","obj","call","Object","keys","stringify","charAt","source","relative","rel","result","tkeys","tk","tkey","rkeys","rk","rkey","v","relPath","shift","isSourceAbs","isRelAbs","mustEndAbs","removeAllDots","srcPath","psychotic","pop","isNullOrUndefined","authInHost","isNull","last","hasTrailingSlash","up","splice","isAbsolute"],"sources":["C:/Users/eudes.inacio/GabineteDigital/gabinete-digital-fo/node_modules/url/url.js"],"sourcesContent":["// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar punycode = require('punycode');\nvar util = require('./util');\n\nexports.parse = urlParse;\nexports.resolve = urlResolve;\nexports.resolveObject = urlResolveObject;\nexports.format = urlFormat;\n\nexports.Url = Url;\n\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.host = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.query = null;\n this.pathname = null;\n this.path = null;\n this.href = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n\n // Special case for a simple path URL\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n // RFC 2396: characters reserved for delimiting URLs.\n // We actually just auto-escape these.\n delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t'],\n\n // RFC 2396: characters not allowed for various reasons.\n unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims),\n\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\n autoEscape = ['\\''].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n // Note that any invalid chars are also handled, but these\n // are the ones that are *expected* to be seen, so we fast-path\n // them.\n nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),\n hostEndingChars = ['/', '?', '#'],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\n unsafeProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that never have a hostname.\n hostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that always contain a // bit.\n slashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n },\n querystring = require('querystring');\n\nfunction urlParse(url, parseQueryString, slashesDenoteHost) {\n if (url && util.isObject(url) && url instanceof Url) return url;\n\n var u = new Url;\n u.parse(url, parseQueryString, slashesDenoteHost);\n return u;\n}\n\nUrl.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {\n if (!util.isString(url)) {\n throw new TypeError(\"Parameter 'url' must be a string, not \" + typeof url);\n }\n\n // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n var queryIndex = url.indexOf('?'),\n splitter =\n (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',\n uSplit = url.split(splitter),\n slashRegex = /\\\\/g;\n uSplit[0] = uSplit[0].replace(slashRegex, '/');\n url = uSplit.join(splitter);\n\n var rest = url;\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim();\n\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n if (simplePath) {\n this.path = rest;\n this.href = rest;\n this.pathname = simplePath[1];\n if (simplePath[2]) {\n this.search = simplePath[2];\n if (parseQueryString) {\n this.query = querystring.parse(this.search.substr(1));\n } else {\n this.query = this.search.substr(1);\n }\n } else if (parseQueryString) {\n this.search = '';\n this.query = {};\n }\n return this;\n }\n }\n\n var proto = protocolPattern.exec(rest);\n if (proto) {\n proto = proto[0];\n var lowerProto = proto.toLowerCase();\n this.protocol = lowerProto;\n rest = rest.substr(proto.length);\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n var slashes = rest.substr(0, 2) === '//';\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n\n if (!hostlessProtocol[proto] &&\n (slashes || (proto && !slashedProtocol[proto]))) {\n\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n for (var i = 0; i < hostEndingChars.length; i++) {\n var hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n hostEnd = hec;\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n var auth, atSign;\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = decodeURIComponent(auth);\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1;\n for (var i = 0; i < nonHostChars.length; i++) {\n var hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n hostEnd = hec;\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1)\n hostEnd = rest.length;\n\n this.host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n\n // pull out port.\n this.parseHost();\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || '';\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n var ipv6Hostname = this.hostname[0] === '[' &&\n this.hostname[this.hostname.length - 1] === ']';\n\n // validate a little.\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n for (var i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) continue;\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n if (notHost.length) {\n rest = '/' + notHost.join('.') + rest;\n }\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n } else {\n // hostnames are always lower case.\n this.hostname = this.hostname.toLowerCase();\n }\n\n if (!ipv6Hostname) {\n // IDNA Support: Returns a punycoded representation of \"domain\".\n // It only converts parts of the domain name that\n // have non-ASCII characters, i.e. it doesn't matter if\n // you call it with a domain that already is ASCII-only.\n this.hostname = punycode.toASCII(this.hostname);\n }\n\n var p = this.port ? ':' + this.port : '';\n var h = this.hostname || '';\n this.host = h + p;\n this.href += this.host;\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n if (rest[0] !== '/') {\n rest = '/' + rest;\n }\n }\n }\n\n // now rest is set to the post-host stuff.\n // chop off any delim chars.\n if (!unsafeProtocol[lowerProto]) {\n\n // First, make 100% sure that any \"autoEscape\" chars get\n // escaped, even if encodeURIComponent doesn't think they\n // need to be.\n for (var i = 0, l = autoEscape.length; i < l; i++) {\n var ae = autoEscape[i];\n if (rest.indexOf(ae) === -1)\n continue;\n var esc = encodeURIComponent(ae);\n if (esc === ae) {\n esc = escape(ae);\n }\n rest = rest.split(ae).join(esc);\n }\n }\n\n\n // chop off from the tail first.\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var qm = rest.indexOf('?');\n if (qm !== -1) {\n this.search = rest.substr(qm);\n this.query = rest.substr(qm + 1);\n if (parseQueryString) {\n this.query = querystring.parse(this.query);\n }\n rest = rest.slice(0, qm);\n } else if (parseQueryString) {\n // no query string, but parseQueryString still requested\n this.search = '';\n this.query = {};\n }\n if (rest) this.pathname = rest;\n if (slashedProtocol[lowerProto] &&\n this.hostname && !this.pathname) {\n this.pathname = '/';\n }\n\n //to support http.request\n if (this.pathname || this.search) {\n var p = this.pathname || '';\n var s = this.search || '';\n this.path = p + s;\n }\n\n // finally, reconstruct the href based on what has been validated.\n this.href = this.format();\n return this;\n};\n\n// format a parsed object into a url string\nfunction urlFormat(obj) {\n // ensure it's an object, and not a string url.\n // If it's an obj, this is a no-op.\n // this way, you can call url_format() on strings\n // to clean up potentially wonky urls.\n if (util.isString(obj)) obj = urlParse(obj);\n if (!(obj instanceof Url)) return Url.prototype.format.call(obj);\n return obj.format();\n}\n\nUrl.prototype.format = function() {\n var auth = this.auth || '';\n if (auth) {\n auth = encodeURIComponent(auth);\n auth = auth.replace(/%3A/i, ':');\n auth += '@';\n }\n\n var protocol = this.protocol || '',\n pathname = this.pathname || '',\n hash = this.hash || '',\n host = false,\n query = '';\n\n if (this.host) {\n host = auth + this.host;\n } else if (this.hostname) {\n host = auth + (this.hostname.indexOf(':') === -1 ?\n this.hostname :\n '[' + this.hostname + ']');\n if (this.port) {\n host += ':' + this.port;\n }\n }\n\n if (this.query &&\n util.isObject(this.query) &&\n Object.keys(this.query).length) {\n query = querystring.stringify(this.query);\n }\n\n var search = this.search || (query && ('?' + query)) || '';\n\n if (protocol && protocol.substr(-1) !== ':') protocol += ':';\n\n // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.\n // unless they had them to begin with.\n if (this.slashes ||\n (!protocol || slashedProtocol[protocol]) && host !== false) {\n host = '//' + (host || '');\n if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;\n } else if (!host) {\n host = '';\n }\n\n if (hash && hash.charAt(0) !== '#') hash = '#' + hash;\n if (search && search.charAt(0) !== '?') search = '?' + search;\n\n pathname = pathname.replace(/[?#]/g, function(match) {\n return encodeURIComponent(match);\n });\n search = search.replace('#', '%23');\n\n return protocol + host + pathname + search + hash;\n};\n\nfunction urlResolve(source, relative) {\n return urlParse(source, false, true).resolve(relative);\n}\n\nUrl.prototype.resolve = function(relative) {\n return this.resolveObject(urlParse(relative, false, true)).format();\n};\n\nfunction urlResolveObject(source, relative) {\n if (!source) return relative;\n return urlParse(source, false, true).resolveObject(relative);\n}\n\nUrl.prototype.resolveObject = function(relative) {\n if (util.isString(relative)) {\n var rel = new Url();\n rel.parse(relative, false, true);\n relative = rel;\n }\n\n var result = new Url();\n var tkeys = Object.keys(this);\n for (var tk = 0; tk < tkeys.length; tk++) {\n var tkey = tkeys[tk];\n result[tkey] = this[tkey];\n }\n\n // hash is always overridden, no matter what.\n // even href=\"\" will remove it.\n result.hash = relative.hash;\n\n // if the relative url is empty, then there's nothing left to do here.\n if (relative.href === '') {\n result.href = result.format();\n return result;\n }\n\n // hrefs like //foo/bar always cut to the protocol.\n if (relative.slashes && !relative.protocol) {\n // take everything except the protocol from relative\n var rkeys = Object.keys(relative);\n for (var rk = 0; rk < rkeys.length; rk++) {\n var rkey = rkeys[rk];\n if (rkey !== 'protocol')\n result[rkey] = relative[rkey];\n }\n\n //urlParse appends trailing / to urls like http://www.example.com\n if (slashedProtocol[result.protocol] &&\n result.hostname && !result.pathname) {\n result.path = result.pathname = '/';\n }\n\n result.href = result.format();\n return result;\n }\n\n if (relative.protocol && relative.protocol !== result.protocol) {\n // if it's a known url protocol, then changing\n // the protocol does weird things\n // first, if it's not file:, then we MUST have a host,\n // and if there was a path\n // to begin with, then we MUST have a path.\n // if it is file:, then the host is dropped,\n // because that's known to be hostless.\n // anything else is assumed to be absolute.\n if (!slashedProtocol[relative.protocol]) {\n var keys = Object.keys(relative);\n for (var v = 0; v < keys.length; v++) {\n var k = keys[v];\n result[k] = relative[k];\n }\n result.href = result.format();\n return result;\n }\n\n result.protocol = relative.protocol;\n if (!relative.host && !hostlessProtocol[relative.protocol]) {\n var relPath = (relative.pathname || '').split('/');\n while (relPath.length && !(relative.host = relPath.shift()));\n if (!relative.host) relative.host = '';\n if (!relative.hostname) relative.hostname = '';\n if (relPath[0] !== '') relPath.unshift('');\n if (relPath.length < 2) relPath.unshift('');\n result.pathname = relPath.join('/');\n } else {\n result.pathname = relative.pathname;\n }\n result.search = relative.search;\n result.query = relative.query;\n result.host = relative.host || '';\n result.auth = relative.auth;\n result.hostname = relative.hostname || relative.host;\n result.port = relative.port;\n // to support http.request\n if (result.pathname || result.search) {\n var p = result.pathname || '';\n var s = result.search || '';\n result.path = p + s;\n }\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n }\n\n var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),\n isRelAbs = (\n relative.host ||\n relative.pathname && relative.pathname.charAt(0) === '/'\n ),\n mustEndAbs = (isRelAbs || isSourceAbs ||\n (result.host && relative.pathname)),\n removeAllDots = mustEndAbs,\n srcPath = result.pathname && result.pathname.split('/') || [],\n relPath = relative.pathname && relative.pathname.split('/') || [],\n psychotic = result.protocol && !slashedProtocol[result.protocol];\n\n // if the url is a non-slashed url, then relative\n // links like ../.. should be able\n // to crawl up to the hostname, as well. This is strange.\n // result.protocol has already been set by now.\n // Later on, put the first path part into the host field.\n if (psychotic) {\n result.hostname = '';\n result.port = null;\n if (result.host) {\n if (srcPath[0] === '') srcPath[0] = result.host;\n else srcPath.unshift(result.host);\n }\n result.host = '';\n if (relative.protocol) {\n relative.hostname = null;\n relative.port = null;\n if (relative.host) {\n if (relPath[0] === '') relPath[0] = relative.host;\n else relPath.unshift(relative.host);\n }\n relative.host = null;\n }\n mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');\n }\n\n if (isRelAbs) {\n // it's absolute.\n result.host = (relative.host || relative.host === '') ?\n relative.host : result.host;\n result.hostname = (relative.hostname || relative.hostname === '') ?\n relative.hostname : result.hostname;\n result.search = relative.search;\n result.query = relative.query;\n srcPath = relPath;\n // fall through to the dot-handling below.\n } else if (relPath.length) {\n // it's relative\n // throw away the existing file, and take the new path instead.\n if (!srcPath) srcPath = [];\n srcPath.pop();\n srcPath = srcPath.concat(relPath);\n result.search = relative.search;\n result.query = relative.query;\n } else if (!util.isNullOrUndefined(relative.search)) {\n // just pull out the search.\n // like href='?foo'.\n // Put this after the other two cases because it simplifies the booleans\n if (psychotic) {\n result.hostname = result.host = srcPath.shift();\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ?\n result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n result.search = relative.search;\n result.query = relative.query;\n //to support http.request\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') +\n (result.search ? result.search : '');\n }\n result.href = result.format();\n return result;\n }\n\n if (!srcPath.length) {\n // no path at all. easy.\n // we've already handled the other stuff above.\n result.pathname = null;\n //to support http.request\n if (result.search) {\n result.path = '/' + result.search;\n } else {\n result.path = null;\n }\n result.href = result.format();\n return result;\n }\n\n // if a url ENDs in . or .., then it must get a trailing slash.\n // however, if it ends in anything else non-slashy,\n // then it must NOT get a trailing slash.\n var last = srcPath.slice(-1)[0];\n var hasTrailingSlash = (\n (result.host || relative.host || srcPath.length > 1) &&\n (last === '.' || last === '..') || last === '');\n\n // strip single dots, resolve double dots to parent dir\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = srcPath.length; i >= 0; i--) {\n last = srcPath[i];\n if (last === '.') {\n srcPath.splice(i, 1);\n } else if (last === '..') {\n srcPath.splice(i, 1);\n up++;\n } else if (up) {\n srcPath.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (!mustEndAbs && !removeAllDots) {\n for (; up--; up) {\n srcPath.unshift('..');\n }\n }\n\n if (mustEndAbs && srcPath[0] !== '' &&\n (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {\n srcPath.unshift('');\n }\n\n if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {\n srcPath.push('');\n }\n\n var isAbsolute = srcPath[0] === '' ||\n (srcPath[0] && srcPath[0].charAt(0) === '/');\n\n // put the host back\n if (psychotic) {\n result.hostname = result.host = isAbsolute ? '' :\n srcPath.length ? srcPath.shift() : '';\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ?\n result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n\n mustEndAbs = mustEndAbs || (result.host && srcPath.length);\n\n if (mustEndAbs && !isAbsolute) {\n srcPath.unshift('');\n }\n\n if (!srcPath.length) {\n result.pathname = null;\n result.path = null;\n } else {\n result.pathname = srcPath.join('/');\n }\n\n //to support request.http\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') +\n (result.search ? result.search : '');\n }\n result.auth = relative.auth || result.auth;\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n};\n\nUrl.prototype.parseHost = function() {\n var host = this.host;\n var port = portPattern.exec(host);\n if (port) {\n port = port[0];\n if (port !== ':') {\n this.port = port.substr(1);\n }\n host = host.substr(0, host.length - port.length);\n }\n if (host) this.hostname = host;\n};\n"],"mappings":"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"},"metadata":{},"sourceType":"script"}