opennms
Version:
Client API for the OpenNMS network monitoring platform
1 lines • 204 kB
JSON
{"remainingRequest":"/data/node_modules/babel-loader/lib/index.js!/data/node_modules/urijs/src/URI.js","dependencies":[{"path":"/data/node_modules/urijs/src/URI.js","mtime":1553611387392},{"path":"/data/.babelrc","mtime":1553611371556},{"path":"/data/node_modules/cache-loader/dist/cjs.js","mtime":1553611387012},{"path":"/data/node_modules/babel-loader/lib/index.js","mtime":1553611386992}],"contextDependencies":[],"result":["'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/*!\n * URI.js - Mutating URLs\n *\n * Version: 1.19.1\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n * MIT License http://www.opensource.org/licenses/mit-license\n *\n */\n(function (root, factory) {\n 'use strict';\n // https://github.com/umdjs/umd/blob/master/returnExports.js\n\n if ((typeof module === 'undefined' ? 'undefined' : _typeof(module)) === 'object' && module.exports) {\n // Node\n module.exports = factory(require('./punycode'), require('./IPv6'), require('./SecondLevelDomains'));\n } else if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['./punycode', './IPv6', './SecondLevelDomains'], factory);\n } else {\n // Browser globals (root is window)\n root.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains, root);\n }\n})(undefined, function (punycode, IPv6, SLD, root) {\n 'use strict';\n /*global location, escape, unescape */\n // FIXME: v2.0.0 renamce non-camelCase properties to uppercase\n /*jshint camelcase: false */\n\n // save current URI variable, if any\n\n var _URI = root && root.URI;\n\n function URI(url, base) {\n var _urlSupplied = arguments.length >= 1;\n var _baseSupplied = arguments.length >= 2;\n\n // Allow instantiation without the 'new' keyword\n if (!(this instanceof URI)) {\n if (_urlSupplied) {\n if (_baseSupplied) {\n return new URI(url, base);\n }\n\n return new URI(url);\n }\n\n return new URI();\n }\n\n if (url === undefined) {\n if (_urlSupplied) {\n throw new TypeError('undefined is not a valid argument for URI');\n }\n\n if (typeof location !== 'undefined') {\n url = location.href + '';\n } else {\n url = '';\n }\n }\n\n if (url === null) {\n if (_urlSupplied) {\n throw new TypeError('null is not a valid argument for URI');\n }\n }\n\n this.href(url);\n\n // resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor\n if (base !== undefined) {\n return this.absoluteTo(base);\n }\n\n return this;\n }\n\n function isInteger(value) {\n return (/^[0-9]+$/.test(value)\n );\n }\n\n URI.version = '1.19.1';\n\n var p = URI.prototype;\n var hasOwn = Object.prototype.hasOwnProperty;\n\n function escapeRegEx(string) {\n // https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963\n return string.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\n }\n\n function getType(value) {\n // IE8 doesn't return [Object Undefined] but [Object Object] for undefined value\n if (value === undefined) {\n return 'Undefined';\n }\n\n return String(Object.prototype.toString.call(value)).slice(8, -1);\n }\n\n function isArray(obj) {\n return getType(obj) === 'Array';\n }\n\n function filterArrayValues(data, value) {\n var lookup = {};\n var i, length;\n\n if (getType(value) === 'RegExp') {\n lookup = null;\n } else if (isArray(value)) {\n for (i = 0, length = value.length; i < length; i++) {\n lookup[value[i]] = true;\n }\n } else {\n lookup[value] = true;\n }\n\n for (i = 0, length = data.length; i < length; i++) {\n /*jshint laxbreak: true */\n var _match = lookup && lookup[data[i]] !== undefined || !lookup && value.test(data[i]);\n /*jshint laxbreak: false */\n if (_match) {\n data.splice(i, 1);\n length--;\n i--;\n }\n }\n\n return data;\n }\n\n function arrayContains(list, value) {\n var i, length;\n\n // value may be string, number, array, regexp\n if (isArray(value)) {\n // Note: this can be optimized to O(n) (instead of current O(m * n))\n for (i = 0, length = value.length; i < length; i++) {\n if (!arrayContains(list, value[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n var _type = getType(value);\n for (i = 0, length = list.length; i < length; i++) {\n if (_type === 'RegExp') {\n if (typeof list[i] === 'string' && list[i].match(value)) {\n return true;\n }\n } else if (list[i] === value) {\n return true;\n }\n }\n\n return false;\n }\n\n function arraysEqual(one, two) {\n if (!isArray(one) || !isArray(two)) {\n return false;\n }\n\n // arrays can't be equal if they have different amount of content\n if (one.length !== two.length) {\n return false;\n }\n\n one.sort();\n two.sort();\n\n for (var i = 0, l = one.length; i < l; i++) {\n if (one[i] !== two[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n function trimSlashes(text) {\n var trim_expression = /^\\/+|\\/+$/g;\n return text.replace(trim_expression, '');\n }\n\n URI._parts = function () {\n return {\n protocol: null,\n username: null,\n password: null,\n hostname: null,\n urn: null,\n port: null,\n path: null,\n query: null,\n fragment: null,\n // state\n preventInvalidHostname: URI.preventInvalidHostname,\n duplicateQueryParameters: URI.duplicateQueryParameters,\n escapeQuerySpace: URI.escapeQuerySpace\n };\n };\n // state: throw on invalid hostname\n // see https://github.com/medialize/URI.js/pull/345\n // and https://github.com/medialize/URI.js/issues/354\n URI.preventInvalidHostname = false;\n // state: allow duplicate query parameters (a=1&a=1)\n URI.duplicateQueryParameters = false;\n // state: replaces + with %20 (space in query strings)\n URI.escapeQuerySpace = true;\n // static properties\n URI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i;\n URI.idn_expression = /[^a-z0-9\\._-]/i;\n URI.punycode_expression = /(xn--)/i;\n // well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care?\n URI.ip4_expression = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\n // credits to Rich Brown\n // source: http://forums.intermapper.com/viewtopic.php?p=1096#1096\n // specification: http://www.ietf.org/rfc/rfc4291.txt\n URI.ip6_expression = /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/;\n // expression used is \"gruber revised\" (@gruber v2) determined to be the\n // best solution in a regex-golf we did a couple of ages ago at\n // * http://mathiasbynens.be/demo/url-regex\n // * http://rodneyrehm.de/t/url-regex.html\n URI.find_uri_expression = /\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))/ig;\n URI.findUri = {\n // valid \"scheme://\" or \"www.\"\n start: /\\b(?:([a-z][a-z0-9.+-]*:\\/\\/)|www\\.)/gi,\n // everything up to the next whitespace\n end: /[\\s\\r\\n]|$/,\n // trim trailing punctuation captured by end RegExp\n trim: /[`!()\\[\\]{};:'\".,<>?«»“”„‘’]+$/,\n // balanced parens inclusion (), [], {}, <>\n parens: /(\\([^\\)]*\\)|\\[[^\\]]*\\]|\\{[^}]*\\}|<[^>]*>)/g\n };\n // http://www.iana.org/assignments/uri-schemes.html\n // http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports\n URI.defaultPorts = {\n http: '80',\n https: '443',\n ftp: '21',\n gopher: '70',\n ws: '80',\n wss: '443'\n };\n // list of protocols which always require a hostname\n URI.hostProtocols = ['http', 'https'];\n\n // allowed hostname characters according to RFC 3986\n // ALPHA DIGIT \"-\" \".\" \"_\" \"~\" \"!\" \"$\" \"&\" \"'\" \"(\" \")\" \"*\" \"+\" \",\" \";\" \"=\" %encoded\n // I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . - _\n URI.invalid_hostname_characters = /[^a-zA-Z0-9\\.\\-:_]/;\n // map DOM Elements to their URI attribute\n URI.domAttributes = {\n 'a': 'href',\n 'blockquote': 'cite',\n 'link': 'href',\n 'base': 'href',\n 'script': 'src',\n 'form': 'action',\n 'img': 'src',\n 'area': 'href',\n 'iframe': 'src',\n 'embed': 'src',\n 'source': 'src',\n 'track': 'src',\n 'input': 'src', // but only if type=\"image\"\n 'audio': 'src',\n 'video': 'src'\n };\n URI.getDomAttribute = function (node) {\n if (!node || !node.nodeName) {\n return undefined;\n }\n\n var nodeName = node.nodeName.toLowerCase();\n // <input> should only expose src for type=\"image\"\n if (nodeName === 'input' && node.type !== 'image') {\n return undefined;\n }\n\n return URI.domAttributes[nodeName];\n };\n\n function escapeForDumbFirefox36(value) {\n // https://github.com/medialize/URI.js/issues/91\n return escape(value);\n }\n\n // encoding / decoding according to RFC3986\n function strictEncodeURIComponent(string) {\n // see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent\n return encodeURIComponent(string).replace(/[!'()*]/g, escapeForDumbFirefox36).replace(/\\*/g, '%2A');\n }\n URI.encode = strictEncodeURIComponent;\n URI.decode = decodeURIComponent;\n URI.iso8859 = function () {\n URI.encode = escape;\n URI.decode = unescape;\n };\n URI.unicode = function () {\n URI.encode = strictEncodeURIComponent;\n URI.decode = decodeURIComponent;\n };\n URI.characters = {\n pathname: {\n encode: {\n // RFC3986 2.1: For consistency, URI producers and normalizers should\n // use uppercase hexadecimal digits for all percent-encodings.\n expression: /%(24|26|2B|2C|3B|3D|3A|40)/ig,\n map: {\n // -._~!'()*\n '%24': '$',\n '%26': '&',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '=',\n '%3A': ':',\n '%40': '@'\n }\n },\n decode: {\n expression: /[\\/\\?#]/g,\n map: {\n '/': '%2F',\n '?': '%3F',\n '#': '%23'\n }\n }\n },\n reserved: {\n encode: {\n // RFC3986 2.1: For consistency, URI producers and normalizers should\n // use uppercase hexadecimal digits for all percent-encodings.\n expression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,\n map: {\n // gen-delims\n '%3A': ':',\n '%2F': '/',\n '%3F': '?',\n '%23': '#',\n '%5B': '[',\n '%5D': ']',\n '%40': '@',\n // sub-delims\n '%21': '!',\n '%24': '$',\n '%26': '&',\n '%27': '\\'',\n '%28': '(',\n '%29': ')',\n '%2A': '*',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '='\n }\n }\n },\n urnpath: {\n // The characters under `encode` are the characters called out by RFC 2141 as being acceptable\n // for usage in a URN. RFC2141 also calls out \"-\", \".\", and \"_\" as acceptable characters, but\n // these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also\n // note that the colon character is not featured in the encoding map; this is because URI.js\n // gives the colons in URNs semantic meaning as the delimiters of path segements, and so it\n // should not appear unencoded in a segment itself.\n // See also the note above about RFC3986 and capitalalized hex digits.\n encode: {\n expression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,\n map: {\n '%21': '!',\n '%24': '$',\n '%27': '\\'',\n '%28': '(',\n '%29': ')',\n '%2A': '*',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '=',\n '%40': '@'\n }\n },\n // These characters are the characters called out by RFC2141 as \"reserved\" characters that\n // should never appear in a URN, plus the colon character (see note above).\n decode: {\n expression: /[\\/\\?#:]/g,\n map: {\n '/': '%2F',\n '?': '%3F',\n '#': '%23',\n ':': '%3A'\n }\n }\n }\n };\n URI.encodeQuery = function (string, escapeQuerySpace) {\n var escaped = URI.encode(string + '');\n if (escapeQuerySpace === undefined) {\n escapeQuerySpace = URI.escapeQuerySpace;\n }\n\n return escapeQuerySpace ? escaped.replace(/%20/g, '+') : escaped;\n };\n URI.decodeQuery = function (string, escapeQuerySpace) {\n string += '';\n if (escapeQuerySpace === undefined) {\n escapeQuerySpace = URI.escapeQuerySpace;\n }\n\n try {\n return URI.decode(escapeQuerySpace ? string.replace(/\\+/g, '%20') : string);\n } catch (e) {\n // we're not going to mess with weird encodings,\n // give up and return the undecoded original string\n // see https://github.com/medialize/URI.js/issues/87\n // see https://github.com/medialize/URI.js/issues/92\n return string;\n }\n };\n // generate encode/decode path functions\n var _parts = { 'encode': 'encode', 'decode': 'decode' };\n var _part;\n var generateAccessor = function generateAccessor(_group, _part) {\n return function (string) {\n try {\n return URI[_part](string + '').replace(URI.characters[_group][_part].expression, function (c) {\n return URI.characters[_group][_part].map[c];\n });\n } catch (e) {\n // we're not going to mess with weird encodings,\n // give up and return the undecoded original string\n // see https://github.com/medialize/URI.js/issues/87\n // see https://github.com/medialize/URI.js/issues/92\n return string;\n }\n };\n };\n\n for (_part in _parts) {\n URI[_part + 'PathSegment'] = generateAccessor('pathname', _parts[_part]);\n URI[_part + 'UrnPathSegment'] = generateAccessor('urnpath', _parts[_part]);\n }\n\n var generateSegmentedPathFunction = function generateSegmentedPathFunction(_sep, _codingFuncName, _innerCodingFuncName) {\n return function (string) {\n // Why pass in names of functions, rather than the function objects themselves? The\n // definitions of some functions (but in particular, URI.decode) will occasionally change due\n // to URI.js having ISO8859 and Unicode modes. Passing in the name and getting it will ensure\n // that the functions we use here are \"fresh\".\n var actualCodingFunc;\n if (!_innerCodingFuncName) {\n actualCodingFunc = URI[_codingFuncName];\n } else {\n actualCodingFunc = function actualCodingFunc(string) {\n return URI[_codingFuncName](URI[_innerCodingFuncName](string));\n };\n }\n\n var segments = (string + '').split(_sep);\n\n for (var i = 0, length = segments.length; i < length; i++) {\n segments[i] = actualCodingFunc(segments[i]);\n }\n\n return segments.join(_sep);\n };\n };\n\n // This takes place outside the above loop because we don't want, e.g., encodeUrnPath functions.\n URI.decodePath = generateSegmentedPathFunction('/', 'decodePathSegment');\n URI.decodeUrnPath = generateSegmentedPathFunction(':', 'decodeUrnPathSegment');\n URI.recodePath = generateSegmentedPathFunction('/', 'encodePathSegment', 'decode');\n URI.recodeUrnPath = generateSegmentedPathFunction(':', 'encodeUrnPathSegment', 'decode');\n\n URI.encodeReserved = generateAccessor('reserved', 'encode');\n\n URI.parse = function (string, parts) {\n var pos;\n if (!parts) {\n parts = {\n preventInvalidHostname: URI.preventInvalidHostname\n };\n }\n // [protocol\"://\"[username[\":\"password]\"@\"]hostname[\":\"port]\"/\"?][path][\"?\"querystring][\"#\"fragment]\n\n // extract fragment\n pos = string.indexOf('#');\n if (pos > -1) {\n // escaping?\n parts.fragment = string.substring(pos + 1) || null;\n string = string.substring(0, pos);\n }\n\n // extract query\n pos = string.indexOf('?');\n if (pos > -1) {\n // escaping?\n parts.query = string.substring(pos + 1) || null;\n string = string.substring(0, pos);\n }\n\n // extract protocol\n if (string.substring(0, 2) === '//') {\n // relative-scheme\n parts.protocol = null;\n string = string.substring(2);\n // extract \"user:pass@host:port\"\n string = URI.parseAuthority(string, parts);\n } else {\n pos = string.indexOf(':');\n if (pos > -1) {\n parts.protocol = string.substring(0, pos) || null;\n if (parts.protocol && !parts.protocol.match(URI.protocol_expression)) {\n // : may be within the path\n parts.protocol = undefined;\n } else if (string.substring(pos + 1, pos + 3) === '//') {\n string = string.substring(pos + 3);\n\n // extract \"user:pass@host:port\"\n string = URI.parseAuthority(string, parts);\n } else {\n string = string.substring(pos + 1);\n parts.urn = true;\n }\n }\n }\n\n // what's left must be the path\n parts.path = string;\n\n // and we're done\n return parts;\n };\n URI.parseHost = function (string, parts) {\n if (!string) {\n string = '';\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://github.com/joyent/node/blob/386fd24f49b0e9d1a8a076592a404168faeecc34/lib/url.js#L115-L124\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n // https://github.com/medialize/URI.js/pull/233\n string = string.replace(/\\\\/g, '/');\n\n // extract host:port\n var pos = string.indexOf('/');\n var bracketPos;\n var t;\n\n if (pos === -1) {\n pos = string.length;\n }\n\n if (string.charAt(0) === '[') {\n // IPv6 host - http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-6\n // I claim most client software breaks on IPv6 anyways. To simplify things, URI only accepts\n // IPv6+port in the format [2001:db8::1]:80 (for the time being)\n bracketPos = string.indexOf(']');\n parts.hostname = string.substring(1, bracketPos) || null;\n parts.port = string.substring(bracketPos + 2, pos) || null;\n if (parts.port === '/') {\n parts.port = null;\n }\n } else {\n var firstColon = string.indexOf(':');\n var firstSlash = string.indexOf('/');\n var nextColon = string.indexOf(':', firstColon + 1);\n if (nextColon !== -1 && (firstSlash === -1 || nextColon < firstSlash)) {\n // IPv6 host contains multiple colons - but no port\n // this notation is actually not allowed by RFC 3986, but we're a liberal parser\n parts.hostname = string.substring(0, pos) || null;\n parts.port = null;\n } else {\n t = string.substring(0, pos).split(':');\n parts.hostname = t[0] || null;\n parts.port = t[1] || null;\n }\n }\n\n if (parts.hostname && string.substring(pos).charAt(0) !== '/') {\n pos++;\n string = '/' + string;\n }\n\n if (parts.preventInvalidHostname) {\n URI.ensureValidHostname(parts.hostname, parts.protocol);\n }\n\n if (parts.port) {\n URI.ensureValidPort(parts.port);\n }\n\n return string.substring(pos) || '/';\n };\n URI.parseAuthority = function (string, parts) {\n string = URI.parseUserinfo(string, parts);\n return URI.parseHost(string, parts);\n };\n URI.parseUserinfo = function (string, parts) {\n // extract username:password\n var firstSlash = string.indexOf('/');\n var pos = string.lastIndexOf('@', firstSlash > -1 ? firstSlash : string.length - 1);\n var t;\n\n // authority@ must come before /path\n if (pos > -1 && (firstSlash === -1 || pos < firstSlash)) {\n t = string.substring(0, pos).split(':');\n parts.username = t[0] ? URI.decode(t[0]) : null;\n t.shift();\n parts.password = t[0] ? URI.decode(t.join(':')) : null;\n string = string.substring(pos + 1);\n } else {\n parts.username = null;\n parts.password = null;\n }\n\n return string;\n };\n URI.parseQuery = function (string, escapeQuerySpace) {\n if (!string) {\n return {};\n }\n\n // throw out the funky business - \"?\"[name\"=\"value\"&\"]+\n string = string.replace(/&+/g, '&').replace(/^\\?*&*|&+$/g, '');\n\n if (!string) {\n return {};\n }\n\n var items = {};\n var splits = string.split('&');\n var length = splits.length;\n var v, name, value;\n\n for (var i = 0; i < length; i++) {\n v = splits[i].split('=');\n name = URI.decodeQuery(v.shift(), escapeQuerySpace);\n // no \"=\" is null according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#collect-url-parameters\n value = v.length ? URI.decodeQuery(v.join('='), escapeQuerySpace) : null;\n\n if (hasOwn.call(items, name)) {\n if (typeof items[name] === 'string' || items[name] === null) {\n items[name] = [items[name]];\n }\n\n items[name].push(value);\n } else {\n items[name] = value;\n }\n }\n\n return items;\n };\n\n URI.build = function (parts) {\n var t = '';\n\n if (parts.protocol) {\n t += parts.protocol + ':';\n }\n\n if (!parts.urn && (t || parts.hostname)) {\n t += '//';\n }\n\n t += URI.buildAuthority(parts) || '';\n\n if (typeof parts.path === 'string') {\n if (parts.path.charAt(0) !== '/' && typeof parts.hostname === 'string') {\n t += '/';\n }\n\n t += parts.path;\n }\n\n if (typeof parts.query === 'string' && parts.query) {\n t += '?' + parts.query;\n }\n\n if (typeof parts.fragment === 'string' && parts.fragment) {\n t += '#' + parts.fragment;\n }\n return t;\n };\n URI.buildHost = function (parts) {\n var t = '';\n\n if (!parts.hostname) {\n return '';\n } else if (URI.ip6_expression.test(parts.hostname)) {\n t += '[' + parts.hostname + ']';\n } else {\n t += parts.hostname;\n }\n\n if (parts.port) {\n t += ':' + parts.port;\n }\n\n return t;\n };\n URI.buildAuthority = function (parts) {\n return URI.buildUserinfo(parts) + URI.buildHost(parts);\n };\n URI.buildUserinfo = function (parts) {\n var t = '';\n\n if (parts.username) {\n t += URI.encode(parts.username);\n }\n\n if (parts.password) {\n t += ':' + URI.encode(parts.password);\n }\n\n if (t) {\n t += '@';\n }\n\n return t;\n };\n URI.buildQuery = function (data, duplicateQueryParameters, escapeQuerySpace) {\n // according to http://tools.ietf.org/html/rfc3986 or http://labs.apache.org/webarch/uri/rfc/rfc3986.html\n // being »-._~!$&'()*+,;=:@/?« %HEX and alnum are allowed\n // the RFC explicitly states ?/foo being a valid use case, no mention of parameter syntax!\n // URI.js treats the query string as being application/x-www-form-urlencoded\n // see http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type\n\n var t = '';\n var unique, key, i, length;\n for (key in data) {\n if (hasOwn.call(data, key) && key) {\n if (isArray(data[key])) {\n unique = {};\n for (i = 0, length = data[key].length; i < length; i++) {\n if (data[key][i] !== undefined && unique[data[key][i] + ''] === undefined) {\n t += '&' + URI.buildQueryParameter(key, data[key][i], escapeQuerySpace);\n if (duplicateQueryParameters !== true) {\n unique[data[key][i] + ''] = true;\n }\n }\n }\n } else if (data[key] !== undefined) {\n t += '&' + URI.buildQueryParameter(key, data[key], escapeQuerySpace);\n }\n }\n }\n\n return t.substring(1);\n };\n URI.buildQueryParameter = function (name, value, escapeQuerySpace) {\n // http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type -- application/x-www-form-urlencoded\n // don't append \"=\" for null values, according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#url-parameter-serialization\n return URI.encodeQuery(name, escapeQuerySpace) + (value !== null ? '=' + URI.encodeQuery(value, escapeQuerySpace) : '');\n };\n\n URI.addQuery = function (data, name, value) {\n if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n URI.addQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n if (data[name] === undefined) {\n data[name] = value;\n return;\n } else if (typeof data[name] === 'string') {\n data[name] = [data[name]];\n }\n\n if (!isArray(value)) {\n value = [value];\n }\n\n data[name] = (data[name] || []).concat(value);\n } else {\n throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n }\n };\n\n URI.setQuery = function (data, name, value) {\n if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n URI.setQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n data[name] = value === undefined ? null : value;\n } else {\n throw new TypeError('URI.setQuery() accepts an object, string as the name parameter');\n }\n };\n\n URI.removeQuery = function (data, name, value) {\n var i, length, key;\n\n if (isArray(name)) {\n for (i = 0, length = name.length; i < length; i++) {\n data[name[i]] = undefined;\n }\n } else if (getType(name) === 'RegExp') {\n for (key in data) {\n if (name.test(key)) {\n data[key] = undefined;\n }\n }\n } else if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {\n for (key in name) {\n if (hasOwn.call(name, key)) {\n URI.removeQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n if (value !== undefined) {\n if (getType(value) === 'RegExp') {\n if (!isArray(data[name]) && value.test(data[name])) {\n data[name] = undefined;\n } else {\n data[name] = filterArrayValues(data[name], value);\n }\n } else if (data[name] === String(value) && (!isArray(value) || value.length === 1)) {\n data[name] = undefined;\n } else if (isArray(data[name])) {\n data[name] = filterArrayValues(data[name], value);\n }\n } else {\n data[name] = undefined;\n }\n } else {\n throw new TypeError('URI.removeQuery() accepts an object, string, RegExp as the first parameter');\n }\n };\n URI.hasQuery = function (data, name, value, withinArray) {\n switch (getType(name)) {\n case 'String':\n // Nothing to do here\n break;\n\n case 'RegExp':\n for (var key in data) {\n if (hasOwn.call(data, key)) {\n if (name.test(key) && (value === undefined || URI.hasQuery(data, key, value))) {\n return true;\n }\n }\n }\n\n return false;\n\n case 'Object':\n for (var _key in name) {\n if (hasOwn.call(name, _key)) {\n if (!URI.hasQuery(data, _key, name[_key])) {\n return false;\n }\n }\n }\n\n return true;\n\n default:\n throw new TypeError('URI.hasQuery() accepts a string, regular expression or object as the name parameter');\n }\n\n switch (getType(value)) {\n case 'Undefined':\n // true if exists (but may be empty)\n return name in data; // data[name] !== undefined;\n\n case 'Boolean':\n // true if exists and non-empty\n var _booly = Boolean(isArray(data[name]) ? data[name].length : data[name]);\n return value === _booly;\n\n case 'Function':\n // allow complex comparison\n return !!value(data[name], name, data);\n\n case 'Array':\n if (!isArray(data[name])) {\n return false;\n }\n\n var op = withinArray ? arrayContains : arraysEqual;\n return op(data[name], value);\n\n case 'RegExp':\n if (!isArray(data[name])) {\n return Boolean(data[name] && data[name].match(value));\n }\n\n if (!withinArray) {\n return false;\n }\n\n return arrayContains(data[name], value);\n\n case 'Number':\n value = String(value);\n /* falls through */\n case 'String':\n if (!isArray(data[name])) {\n return data[name] === value;\n }\n\n if (!withinArray) {\n return false;\n }\n\n return arrayContains(data[name], value);\n\n default:\n throw new TypeError('URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter');\n }\n };\n\n URI.joinPaths = function () {\n var input = [];\n var segments = [];\n var nonEmptySegments = 0;\n\n for (var i = 0; i < arguments.length; i++) {\n var url = new URI(arguments[i]);\n input.push(url);\n var _segments = url.segment();\n for (var s = 0; s < _segments.length; s++) {\n if (typeof _segments[s] === 'string') {\n segments.push(_segments[s]);\n }\n\n if (_segments[s]) {\n nonEmptySegments++;\n }\n }\n }\n\n if (!segments.length || !nonEmptySegments) {\n return new URI('');\n }\n\n var uri = new URI('').segment(segments);\n\n if (input[0].path() === '' || input[0].path().slice(0, 1) === '/') {\n uri.path('/' + uri.path());\n }\n\n return uri.normalize();\n };\n\n URI.commonPath = function (one, two) {\n var length = Math.min(one.length, two.length);\n var pos;\n\n // find first non-matching character\n for (pos = 0; pos < length; pos++) {\n if (one.charAt(pos) !== two.charAt(pos)) {\n pos--;\n break;\n }\n }\n\n if (pos < 1) {\n return one.charAt(0) === two.charAt(0) && one.charAt(0) === '/' ? '/' : '';\n }\n\n // revert to last /\n if (one.charAt(pos) !== '/' || two.charAt(pos) !== '/') {\n pos = one.substring(0, pos).lastIndexOf('/');\n }\n\n return one.substring(0, pos + 1);\n };\n\n URI.withinString = function (string, callback, options) {\n options || (options = {});\n var _start = options.start || URI.findUri.start;\n var _end = options.end || URI.findUri.end;\n var _trim = options.trim || URI.findUri.trim;\n var _parens = options.parens || URI.findUri.parens;\n var _attributeOpen = /[a-z0-9-]=[\"']?$/i;\n\n _start.lastIndex = 0;\n while (true) {\n var match = _start.exec(string);\n if (!match) {\n break;\n }\n\n var start = match.index;\n if (options.ignoreHtml) {\n // attribut(e=[\"']?$)\n var attributeOpen = string.slice(Math.max(start - 3, 0), start);\n if (attributeOpen && _attributeOpen.test(attributeOpen)) {\n continue;\n }\n }\n\n var end = start + string.slice(start).search(_end);\n var slice = string.slice(start, end);\n // make sure we include well balanced parens\n var parensEnd = -1;\n while (true) {\n var parensMatch = _parens.exec(slice);\n if (!parensMatch) {\n break;\n }\n\n var parensMatchEnd = parensMatch.index + parensMatch[0].length;\n parensEnd = Math.max(parensEnd, parensMatchEnd);\n }\n\n if (parensEnd > -1) {\n slice = slice.slice(0, parensEnd) + slice.slice(parensEnd).replace(_trim, '');\n } else {\n slice = slice.replace(_trim, '');\n }\n\n if (slice.length <= match[0].length) {\n // the extract only contains the starting marker of a URI,\n // e.g. \"www\" or \"http://\"\n continue;\n }\n\n if (options.ignore && options.ignore.test(slice)) {\n continue;\n }\n\n end = start + slice.length;\n var result = callback(slice, start, end, string);\n if (result === undefined) {\n _start.lastIndex = end;\n continue;\n }\n\n result = String(result);\n string = string.slice(0, start) + result + string.slice(end);\n _start.lastIndex = start + result.length;\n }\n\n _start.lastIndex = 0;\n return string;\n };\n\n URI.ensureValidHostname = function (v, protocol) {\n // Theoretically URIs allow percent-encoding in Hostnames (according to RFC 3986)\n // they are not part of DNS and therefore ignored by URI.js\n\n var hasHostname = !!v; // not null and not an empty string\n var hasProtocol = !!protocol;\n var rejectEmptyHostname = false;\n\n if (hasProtocol) {\n rejectEmptyHostname = arrayContains(URI.hostProtocols, protocol);\n }\n\n if (rejectEmptyHostname && !hasHostname) {\n throw new TypeError('Hostname cannot be empty, if protocol is ' + protocol);\n } else if (v && v.match(URI.invalid_hostname_characters)) {\n // test punycode\n if (!punycode) {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-:_] and Punycode.js is not available');\n }\n if (punycode.toASCII(v).match(URI.invalid_hostname_characters)) {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-:_]');\n }\n }\n };\n\n URI.ensureValidPort = function (v) {\n if (!v) {\n return;\n }\n\n var port = Number(v);\n if (isInteger(port) && port > 0 && port < 65536) {\n return;\n }\n\n throw new TypeError('Port \"' + v + '\" is not a valid port');\n };\n\n // noConflict\n URI.noConflict = function (removeAll) {\n if (removeAll) {\n var unconflicted = {\n URI: this.noConflict()\n };\n\n if (root.URITemplate && typeof root.URITemplate.noConflict === 'function') {\n unconflicted.URITemplate = root.URITemplate.noConflict();\n }\n\n if (root.IPv6 && typeof root.IPv6.noConflict === 'function') {\n unconflicted.IPv6 = root.IPv6.noConflict();\n }\n\n if (root.SecondLevelDomains && typeof root.SecondLevelDomains.noConflict === 'function') {\n unconflicted.SecondLevelDomains = root.SecondLevelDomains.noConflict();\n }\n\n return unconflicted;\n } else if (root.URI === this) {\n root.URI = _URI;\n }\n\n return this;\n };\n\n p.build = function (deferBuild) {\n if (deferBuild === true) {\n this._deferred_build = true;\n } else if (deferBuild === undefined || this._deferred_build) {\n this._string = URI.build(this._parts);\n this._deferred_build = false;\n }\n\n return this;\n };\n\n p.clone = function () {\n return new URI(this);\n };\n\n p.valueOf = p.toString = function () {\n return this.build(false)._string;\n };\n\n function generateSimpleAccessor(_part) {\n return function (v, build) {\n if (v === undefined) {\n return this._parts[_part] || '';\n } else {\n this._parts[_part] = v || null;\n this.build(!build);\n return this;\n }\n };\n }\n\n function generatePrefixAccessor(_part, _key) {\n return function (v, build) {\n if (v === undefined) {\n return this._parts[_part] || '';\n } else {\n if (v !== null) {\n v = v + '';\n if (v.charAt(0) === _key) {\n v = v.substring(1);\n }\n }\n\n this._parts[_part] = v;\n this.build(!build);\n return this;\n }\n };\n }\n\n p.protocol = generateSimpleAccessor('protocol');\n p.username = generateSimpleAccessor('username');\n p.password = generateSimpleAccessor('password');\n p.hostname = generateSimpleAccessor('hostname');\n p.port = generateSimpleAccessor('port');\n p.query = generatePrefixAccessor('query', '?');\n p.fragment = generatePrefixAccessor('fragment', '#');\n\n p.search = function (v, build) {\n var t = this.query(v, build);\n return typeof t === 'string' && t.length ? '?' + t : t;\n };\n p.hash = function (v, build) {\n var t = this.fragment(v, build);\n return typeof t === 'string' && t.length ? '#' + t : t;\n };\n\n p.pathname = function (v, build) {\n if (v === undefined || v === true) {\n var res = this._parts.path || (this._parts.hostname ? '/' : '');\n return v ? (this._parts.urn ? URI.decodeUrnPath : URI.decodePath)(res) : res;\n } else {\n if (this._parts.urn) {\n this._parts.path = v ? URI.recodeUrnPath(v) : '';\n } else {\n this._parts.path = v ? URI.recodePath(v) : '/';\n }\n this.build(!build);\n return this;\n }\n };\n p.path = p.pathname;\n p.href = function (href, build) {\n var key;\n\n if (href === undefined) {\n return this.toString();\n }\n\n this._string = '';\n this._parts = URI._parts();\n\n var _URI = href instanceof URI;\n var _object = (typeof href === 'undefined' ? 'undefined' : _typeof(href)) === 'object' && (href.hostname || href.path || href.pathname);\n if (href.nodeName) {\n var attribute = URI.getDomAttribute(href);\n href = href[attribute] || '';\n _object = false;\n }\n\n // window.location is reported to be an object, but it's not the sort\n // of object we're looking for:\n // * location.protocol ends with a colon\n // * location.query != object.search\n // * location.hash != object.fragment\n // simply serializing the unknown object should do the trick\n // (for location, not for everything...)\n if (!_URI && _object && href.pathname !== undefined) {\n href = href.toString();\n }\n\n if (typeof href === 'string' || href instanceof String) {\n this._parts = URI.parse(String(href), this._parts);\n } else if (_URI || _object) {\n var src = _URI ? href._parts : href;\n for (key in src) {\n if (key === 'query') {\n continue;\n }\n if (hasOwn.call(this._parts, key)) {\n this._parts[key] = src[key];\n }\n }\n if (src.query) {\n this.query(src.query, false);\n }\n } else {\n throw new TypeError('invalid input');\n }\n\n this.build(!build);\n return this;\n };\n\n // identification accessors\n p.is = function (what) {\n var ip = false;\n var ip4 = false;\n var ip6 = false;\n var name = false;\n var sld = false;\n var idn = false;\n var punycode = false;\n var relative = !this._parts.urn;\n\n if (this._parts.hostname) {\n relative = false;\n ip4 = URI.ip4_expression.test(this._parts.hostname);\n ip6 = URI.ip6_expression.test(this._parts.hostname);\n ip = ip4 || ip6;\n name = !ip;\n sld = name && SLD && SLD.has(this._parts.hostname);\n idn = name && URI.idn_expression.test(this._parts.hostname);\n punycode = name && URI.punycode_expression.test(this._parts.hostname);\n }\n\n switch (what.toLowerCase()) {\n case 'relative':\n return relative;\n\n case 'absolute':\n return !relative;\n\n // hostname identification\n case 'domain':\n case 'name':\n return name;\n\n case 'sld':\n return sld;\n\n case 'ip':\n return ip;\n\n case 'ip4':\n case 'ipv4':\n case 'inet4':\n return ip4;\n\n case 'ip6':\n case 'ipv6':\n case 'inet6':\n return ip6;\n\n case 'idn':\n return idn;\n\n case 'url':\n return !this._parts.urn;\n\n case 'urn':\n return !!this._parts.urn;\n\n case 'punycode':\n return punycode;\n }\n\n return null;\n };\n\n // component specific input validation\n var _protocol = p.protocol;\n var _port = p.port;\n var _hostname = p.hostname;\n\n p.protocol = function (v, build) {\n if (v) {\n // accept trailing ://\n v = v.replace(/:(\\/\\/)?$/, '');\n\n if (!v.match(URI.protocol_expression)) {\n throw new TypeError('Protocol \"' + v + '\" contains characters other than [A-Z0-9.+-] or doesn\\'t start with [A-Z]');\n }\n }\n\n return _protocol.call(this, v, build);\n };\n p.scheme = p.protocol;\n p.port = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v !== undefined) {\n if (v === 0) {\n v = null;\n }\n\n if (v) {\n v += '';\n if (v.charAt(0) === ':') {\n v = v.substring(1);\n }\n\n URI.ensureValidPort(v);\n }\n }\n return _port.call(this, v, build);\n };\n p.hostname = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v !== undefined) {\n var x = { preventInvalidHostname: this._parts.preventInvalidHostname };\n var res = URI.parseHost(v, x);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n v = x.hostname;\n if (this._parts.preventInvalidHostname) {\n URI.ensureValidHostname(v, this._parts.protocol);\n }\n }\n\n return _hostname.call(this, v, build);\n };\n\n // compound accessors\n p.origin = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n var protocol = this.protocol();\n var authority = this.authority();\n if (!authority) {\n return '';\n }\n\n return (protocol ? protocol + '://' : '') + this.authority();\n } else {\n var origin = URI(v);\n this.protocol(origin.protocol()).authority(origin.authority()).build(!build);\n return this;\n }\n };\n p.host = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n return this._parts.hostname ? URI.buildHost(this._parts) : '';\n } else {\n var res = URI.parseHost(v, this._parts);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n this.build(!build);\n return this;\n }\n };\n p.authority = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n return this._parts.hostname ? URI.buildAuthority(this._parts) : '';\n } else {\n var res = URI.parseAuthority(v, this._parts);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n this.build(!build);\n return this;\n }\n };\n p.userinfo = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n var t = URI.buildUserinfo(this._parts);\n return t ? t.substring(0, t.length - 1) : t;\n } else {\n if (v[v.length - 1] !== '@') {\n v += '@';\n }\n\n URI.parseUserinfo(v, this._parts);\n this.build(!build);\n return this;\n }\n };\n p.resource = function (v, build) {\n var parts;\n\n if (v === undefined) {\n return this.path() + this.search() + this.hash();\n }\n\n parts = URI.parse(v);\n this._parts.path = parts.path;\n this._parts.query = parts.query;\n this._parts.fragment = parts.fragment;\n this.build(!build);\n return this;\n };\n\n // fraction accessors\n p.subdomain = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n // convenience, return \"www\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n // grab domain and add another segment\n var end = this._parts.hostname.length - this.domain().length - 1;\n return this._parts.hostname.substring(0, end) || '';\n } else {\n var e = this._parts.hostname.length - this.domain().length;\n var sub = this._parts.hostname.substring(0, e);\n var replace = new RegExp('^' + escapeRegEx(sub));\n\n if (v && v.charAt(v.length - 1) !== '.') {\n v += '.';\n }\n\n if (v.indexOf(':') !== -1) {\n throw new TypeError('Domains cannot contain colons');\n }\n\n if (v) {\n URI.ensureValidHostname(v, this._parts.protocol);\n }\n\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n this.build(!build);\n return this;\n }\n };\n p.domain = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v === 'boolean') {\n build = v;\n v = undefined;\n }\n\n // convenience, return \"example.org\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n // if hostname consists of 1 or 2 segments, it must be the domain\n var t = this._parts.hostname.match(/\\./g);\n if (t && t.length < 2) {\n return this._parts.hostname;\n }\n\n // grab tld and add another segment\n var end = this._parts.hostname.length - this.tld(build).length - 1;\n end = this._parts.hostname.lastIndexOf('.', end - 1) + 1;\n return this._parts.hostname.substring(end) || '';\n } else {\n if (!v) {\n throw new TypeError('cannot set domain empty');\n }\n\n if (v.indexOf(':') !== -1) {\n throw new TypeError('Domains cannot contain colons');\n }\n\n URI.ensureValidHostname(v, this._parts.protocol);\n\n if (!this._parts.hostname || this.is('IP')) {\n this._parts.hostname = v;\n } else {\n var replace = new RegExp(escapeRegEx(this.domain()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.tld = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v === 'boolean') {\n build = v;\n v = undefined;\n }\n\n // return \"org\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n var pos = this._parts.hostname.lastIndexOf('.');\n var tld = this._parts.hostname.substring(pos + 1);\n\n if (build !== true && SLD && SLD.list[tld.toLowerCase()]) {\n return SLD.get(this._parts.hostname) || tld;\n }\n\n return tld;\n } else {\n var replace;\n\n if (!v) {\n throw new TypeError('cannot set TLD empty');\n } else if (v.match(/[^a-zA-Z0-9-]/)) {\n if (SLD && SLD.is(v)) {\n replace = new RegExp(escapeRegEx(this.tld()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n } else {\n throw new TypeError('TLD \"' + v + '\" contains characters other than [A-Z0-9]');\n }\n } else if (!this._parts.hostname || this.is('IP')) {\n throw new ReferenceError('cannot set TLD on non-domain host');\n } else {\n replace = new RegExp(escapeRegEx(this.tld()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.directory = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path && !this._parts.hostname) {\n return '';\n }\n\n if (this._parts.path === '/') {\n return '/';\n }\n\n var end = this._parts.path.length - this.filename().length - 1;\n var res = this._parts.path.substring(0, end) || (this._parts.hostname ? '/' : '');\n\n return v ? URI.decodePath(res) : res;\n } else {\n var e = this._parts.path.length - this.filename().length;\n var directory = this._parts.path.substring(0, e);\n var replace = new RegExp('^' + escapeRegEx(directory));\n\n // fully qualifier directories begin with a slash\n if (!this.is('relative')) {\n if (!v) {\n v = '/';\n }\n\n if (v.charAt(0) !== '/') {\n v = '/' + v;\n }\n }\n\n // directories always end with a slash\n if (v && v.charAt(v.length - 1) !== '/') {\n v += '/';\n }\n\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n this.build(!build);\n return this;\n }\n };\n p.filename = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v !== 'string') {\n if (!this._parts.path || this._parts.path === '/') {\n return '';\n }\n\n var pos = this._parts.path.lastIndexOf('/');\n var res = this._parts.path.substring(pos + 1);\n\n return v ? URI.decodePathSegment(res) : res;\n } else {\n var mutatedDirectory = false;\n\n if (v.charAt(0) === '/') {\n v = v.substring(1);\n }\n\n if (v.match(/\\.?\\//)) {\n mutatedDirectory = true;\n }\n\n var replace = new RegExp(escapeRegEx(this.filename()) + '$');\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n\n if (mutatedDirectory) {\n this.normalizePath(build);\n } else {\n this.build(!build);\n }\n\n return this;\n }\n };\n p.suffix = function (v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path || this._parts.path === '/') {\n return '';\n }\n\n var filename = this.filename();\n var pos = filename.lastIndexOf('.');\n var s, res;\n\n if (pos === -1) {\n return '';\n }\n\n // suffix may only contain alnum characters (yup, I made this up.)\n s = filename.substring(pos + 1);\n res = /^[a-z0-9%]+$/i.test(s) ? s : '';\n return v ? URI.decodePathSegment(res) : res;\n } else {\n if (v.charAt(0) === '.') {\n v = v.substring(1);\n }\n\n var suffix = this.suffix();\n var replace;\n\n if (!suffix) {\n if (!v) {\n return this;\n }\n\n this._parts.path += '.' + URI.recodePath(v);\n } else if (!v) {\n replace = new RegExp(escapeRegEx('.' + suffix) + '$');\n } else {\n replace = new RegExp(escapeRegEx(suffix) + '$');\n }\n\n if (replace) {\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.segment = function (segment, v, build) {\n var separator = this._parts.urn ? ':' : '/';\n var path = this.path();\n var absolute = path.substring(0, 1) === '/';\n var segments = path.split(separator);\n\n if (segment !== undefined && typeof segment !== 'number') {\n build = v;\n v = segment;\n segment = undefined;\n }\n\n if (segment !== undefined && typeof segment !== 'number') {\n throw new Error('Bad segment \"' + segment + '\", must be 0-based integer');\n }\n\n if (absolute) {\n segments.shift();\n }\n\n if (segment < 0) {\n // allow negative indexes to address from the end\n segment = Math.max(segments.length + segment, 0);\n }\n\n if (v === undefined) {\n /*jshint laxbreak: true */\n return segment === undefined ? segments : segments[segment];\n /*jshint laxbreak: false */\n } else if (segment === null || segments[segment] === undefined) {\n if (isArray(v)) {\n segments = [];\n // collapse empty elements within array\n for (var i = 0, l = v.length; i < l; i++) {\n if (!v[i].length && (!segments.length || !segments[segments.length - 1].length)) {\n continue;\n }\n\n if (segments.length && !segments[segments.length - 1].length) {\n segments.pop();\n }\n\n segments.push(trimSlashes(v[i]));\n }\n } else if (v || typeof v === 'string') {\n v = trimSlashes(v);\n if (segments[segments.length - 1] === '') {\n // empty trailing elements have to be overwritten\n // to prevent results such as /foo//bar\n segments[segments.length - 1] = v;\n } else {\n segments.push(v);\n }\n }\n } else {\n if (v) {\n segments[segment] = trimSlashes(v);\n } else {\n segments.splice(segment, 1);\n }\n }\n\n if (absolute) {\n segments.unshift('');\n }\n\n return this.path(segments.join(separator), build);\n };\n p.segmentCoded = function (segment, v, build) {\n var segments, i, l;\n\n if (typeof segment !== 'number') {\n build = v;\n v = segment;\n segment = undefined;\n }\n\n if (v === undefined) {\n segments = this.segment(segment, v, build);\n if (!isArray(segments)) {\n segments = segments !== undefined ? URI.decode(segments) : undefined;\n } else {\n for (i = 0, l = segments.length; i < l; i++) {\n segments[i] = URI.decode(segments[i]);\n }\n }\n\n return segments;\n }\n\n if (!isArray(v)) {\n v = typeof v === 'string' || v instanceof String ? URI.encode(v) : v;\n } else {\n for (i = 0, l = v.length; i < l; i++) {\n v[i] = URI.encode(v[i]);\n }\n }\n\n return this.segment(segment, v, build);\n };\n\n // mutating query string\n var q = p.query;\n p.query = function (v, build) {\n if (v === true) {\n return URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n } else if (typeof v === 'function') {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n var result = v.call(this, data);\n this._parts.query = URI.buildQuery(result || data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n this.build(!build);\n return this;\n } else if (v !== undefined && typeof v !== 'string') {\n this._parts.query = URI.buildQuery(v, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n this.build(!build);\n return this;\n } else {\n return q.call(this, v, build);\n }\n };\n p.setQuery = function (name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\n if (typeof name === 'string' || name instanceof String) {\n data[name] = value !== undefined ? value : null;\n } else if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n data[key] = name[key];\n }\n }\n } else {\n throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n }\n\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.addQuery = function (name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n URI.addQuery(data, name, value === undefined ? null : value);\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.removeQuery = function (name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n URI.removeQuery(data, name, value);\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.hasQuery = function (name, value, withinArray) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n return URI.hasQuery(data, name, value, withinArray);\n };\n p.setSearch = p.setQuery;\n p.addSearch = p.addQuery;\n p.removeSearch = p.removeQuery;\n p.hasSearch = p.hasQuery;\n\n // sanitizing URLs\n p.normalize = function () {\n if (this._parts.urn) {\n return this.normalizeProtocol(false).normalizePath(false).normalizeQuery(false).normalizeFragment(false).build();\n }\n\n return this.normalizeProtocol(false).normalizeHostname(false).normalizePort(false).normalizePath(false).normalizeQuery(false).normalizeFragment(false).build();\n };\n p.normalizeProtocol = function (build) {\n if (typeof this._parts.protocol === 'string') {\n this._parts.protocol = this._parts.protocol.toLowerCase();\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeHostname = function (build) {\n if (this._parts.hostname) {\n if (this.is('IDN') && punycode) {\n this._parts.hostname = punycode.toASCII(this._parts.hostname);\n } else if (this.is('IPv6') && IPv6) {\n this._parts.hostname = IPv6.best(this._parts.hostname);\n }\n\n this._parts.hostname = this._parts.hostname.toLowerCase();\n this.build(!build);\n }\n\n return this;\n };\n p.normalizePort = function (build) {\n // remove port of it's the protocol's default\n if (typeof this._parts.protocol === 'string' && this._parts.port === URI.defaultPorts[this._parts.protocol]) {\n this._parts.port = null;\n this.build(!build);\n }\n\n return this;\n };\n p.normalizePath = function (build) {\n var _path = this._parts.path;\n if (!_path) {\n return this;\n }\n\n if (this._parts.urn) {\n this._parts.path = URI.recodeUrnPath(this._parts.path);\n this.build(!build);\n return this;\n }\n\n if (this._parts.path === '/') {\n return this;\n }\n\n _path = URI.recodePath(_path);\n\n var _was_relative;\n var _leadingParents = '';\n var _parent, _pos;\n\n // handle relative paths\n if (_path.charAt(0) !== '/') {\n _was_relative = true;\n _path = '/' + _path;\n }\n\n // handle relative files (as opposed to directories)\n if (_path.slice(-3) === '/..' || _path.slice(-2) === '/.') {\n _path += '/';\n }\n\n // resolve simples\n _path = _path.replace(/(\\/(\\.\\/)+)|(\\/\\.$)/g, '/').replace(/\\/{2,}/g, '/');\n\n // remember leading parents\n if (_was_relative) {\n _leadingParents = _path.substring(1).match(/^(\\.\\.\\/)+/) || '';\n if (_leadingParents) {\n _leadingParents = _leadingParents[0];\n }\n }\n\n // resolve parents\n while (true) {\n _parent = _path.search(/\\/\\.\\.(\\/|$)/);\n if (_parent === -1) {\n // no more ../ to resolve\n break;\n } else if (_parent === 0) {\n // top level cannot be relative, skip it\n _path = _path.substring(3);\n continue;\n }\n\n _pos = _path.substring(0, _parent).lastIndexOf('/');\n if (_pos === -1) {\n _pos = _parent;\n }\n _path = _path.substring(0, _pos) + _path.substring(_parent + 3);\n }\n\n // revert to relative\n if (_was_relative && this.is('relative')) {\n _path = _leadingParents + _path.substring(1);\n }\n\n this._parts.path = _path;\n this.build(!build);\n return this;\n };\n p.normalizePathname = p.normalizePath;\n p.normalizeQuery = function (build) {\n if (typeof this._parts.query === 'string') {\n if (!this._parts.query.length) {\n this._parts.query = null;\n } else {\n this.query(URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace));\n }\n\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeFragment = function (build) {\n if (!this._parts.fragment) {\n this._parts.fragment = null;\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeSearch = p.normalizeQuery;\n p.normalizeHash = p.normalizeFragment;\n\n p.iso8859 = function () {\n // expect unicode input, iso8859 output\n var e = URI.encode;\n var d = URI.decode;\n\n URI.encode = escape;\n URI.decode = decodeURIComponent;\n try {\n this.normalize();\n } finally {\n URI.encode = e;\n URI.decode = d;\n }\n return this;\n };\n\n p.unicode = function () {\n // expect iso8859 input, unicode output\n var e = URI.encode;\n var d = URI.decode;\n\n URI.encode = strictEncodeURIComponent;\n URI.decode = unescape;\n try {\n this.normalize();\n } finally {\n URI.encode = e;\n URI.decode = d;\n }\n return this;\n };\n\n p.readable = function () {\n var uri = this.clone();\n // removing username, password, because they shouldn't be displayed according to RFC 3986\n uri.username('').password('').normalize();\n var t = '';\n if (uri._parts.protocol) {\n t += uri._parts.protocol + '://';\n }\n\n if (uri._parts.hostname) {\n if (uri.is('punycode') && punycode) {\n t += punycode.toUnicode(uri._parts.hostname);\n if (uri._parts.port) {\n t += ':' + uri._parts.port;\n }\n } else {\n t += uri.host();\n }\n }\n\n if (uri._parts.hostname && uri._parts.path && uri._parts.path.charAt(0) !== '/') {\n t += '/';\n }\n\n t += uri.path(true);\n if (uri._parts.query) {\n var q = '';\n for (var i = 0, qp = uri._parts.query.split('&'), l = qp.length; i < l; i++) {\n var kv = (qp[i] || '').split('=');\n q += '&' + URI.decodeQuery(kv[0], this._parts.escapeQuerySpace).replace(/&/g, '%26');\n\n if (kv[1] !== undefined) {\n q += '=' + URI.decodeQuery(kv[1], this._parts.escapeQuerySpace).replace(/&/g, '%26');\n }\n }\n t += '?' + q.substring(1);\n }\n\n t += URI.decodeQuery(uri.hash(), true);\n return t;\n };\n\n // resolving relative and absolute URLs\n p.absoluteTo = function (base) {\n var resolved = this.clone();\n var properties = ['protocol', 'username', 'password', 'hostname', 'port'];\n var basedir, i, p;\n\n if (this._parts.urn) {\n throw new Error('URNs do not have any generally defined hierarchical components');\n }\n\n if (!(base instanceof URI)) {\n base = new URI(base);\n }\n\n if (resolved._parts.protocol) {\n // Directly returns even if this._parts.hostname is empty.\n return resolved;\n } else {\n resolved._parts.protocol = base._parts.protocol;\n }\n\n if (this._parts.hostname) {\n return resolved;\n }\n\n for (i = 0; p = properties[i]; i++) {\n resolved._parts[p] = base._parts[p];\n }\n\n if (!resolved._parts.path) {\n resolved._parts.path = base._parts.path;\n if (!resolved._parts.query) {\n resolved._parts.query = base._parts.query;\n }\n } else {\n if (resolved._parts.path.substring(-2) === '..') {\n resolved._parts.path += '/';\n }\n\n if (resolved.path().charAt(0) !== '/') {\n basedir = base.directory();\n basedir = basedir ? basedir : base.path().indexOf('/') === 0 ? '/' : '';\n resolved._parts.path = (basedir ? basedir + '/' : '') + resolved._parts.path;\n resolved.normalizePath();\n }\n }\n\n resolved.build();\n return resolved;\n };\n p.relativeTo = function (base) {\n var relative = this.clone().normalize();\n var relativeParts, baseParts, common, relativePath, basePath;\n\n if (relative._parts.urn) {\n throw new Error('URNs do not have any generally defined hierarchical components');\n }\n\n base = new URI(base).normalize();\n relativeParts = relative._parts;\n baseParts = base._parts;\n relativePath = relative.path();\n basePath = base.path();\n\n if (relativePath.charAt(0) !== '/') {\n throw new Error('URI is already relative');\n }\n\n if (basePath.charAt(0) !== '/') {\n throw new Error('Cannot calculate a URI relative to another relative URI');\n }\n\n if (relativeParts.protocol === baseParts.protocol) {\n relativeParts.protocol = null;\n }\n\n if (relativeParts.username !== baseParts.username || relativeParts.password !== baseParts.password) {\n return relative.build();\n }\n\n if (relativeParts.protocol !== null || relativeParts.username !== null || relativeParts.password !== null) {\n return relative.build();\n }\n\n if (relativeParts.hostname === baseParts.hostname && relativeParts.port === baseParts.port) {\n relativeParts.hostname = null;\n relativeParts.port = null;\n } else {\n return relative.build();\n }\n\n if (relativePath === basePath) {\n relativeParts.path = '';\n return relative.build();\n }\n\n // determine common sub path\n common = URI.commonPath(relativePath, basePath);\n\n // If the paths have nothing in common, return a relative URL with the absolute path.\n if (!common) {\n return relative.build();\n }\n\n var parents = baseParts.path.substring(common.length).replace(/[^\\/]*$/, '').replace(/.*?\\//g, '../');\n\n relativeParts.path = parents + relativeParts.path.substring(common.length) || './';\n\n return relative.build();\n };\n\n // comparing URIs\n p.equals = function (uri) {\n var one = this.clone();\n var two = new URI(uri);\n var one_map = {};\n var two_map = {};\n var checked = {};\n var one_query, two_query, key;\n\n one.normalize();\n two.normalize();\n\n // exact match\n if (one.toString() === two.toString()) {\n return true;\n }\n\n // extract query string\n one_query = one.query();\n two_query = two.query();\n one.query('');\n two.query('');\n\n // definitely not equal if not even non-query parts match\n if (one.toString() !== two.toString()) {\n return false;\n }\n\n // query parameters have the same length, even if they're permuted\n if (one_query.length !== two_query.length) {\n return false;\n }\n\n one_map = URI.parseQuery(one_query, this._parts.escapeQuerySpace);\n two_map = URI.parseQuery(two_query, this._parts.escapeQuerySpace);\n\n for (key in one_map) {\n if (hasOwn.call(one_map, key)) {\n if (!isArray(one_map[key])) {\n if (one_map[key] !== two_map[key]) {\n return false;\n }\n } else if (!arraysEqual(one_map[key], two_map[key])) {\n return false;\n }\n\n checked[key] = true;\n }\n }\n\n for (key in two_map) {\n if (hasOwn.call(two_map, key)) {\n if (!checked[key]) {\n // two contains a parameter not present in one\n return false;\n }\n }\n }\n\n return true;\n };\n\n // state\n p.preventInvalidHostname = function (v) {\n this._parts.preventInvalidHostname = !!v;\n return this;\n };\n\n p.duplicateQueryParameters = function (v) {\n this._parts.duplicateQueryParameters = !!v;\n return this;\n };\n\n p.escapeQuerySpace = function (v) {\n this._parts.escapeQuerySpace = !!v;\n return this;\n };\n\n return URI;\n});",{"version":3,"sources":["node_modules/urijs/src/URI.js"],"names":["root","factory","module","exports","require","define","amd","URI","punycode","IPv6","SecondLevelDomains","SLD","_URI","url","base","_urlSupplied","arguments","length","_baseSupplied","undefined","TypeError","location","href","absoluteTo","isInteger","value","test","version","p","prototype","hasOwn","Object","hasOwnProperty","escapeRegEx","string","replace","getType","String","toString","call","slice","isArray","obj","filterArrayValues","data","lookup","i","_match","splice","arrayContains","list","_type","match","arraysEqual","one","two","sort","l","trimSlashes","text","trim_expression","_parts","protocol","username","password","hostname","urn","port","path","query","fragment","preventInvalidHostname","duplicateQueryParameters","escapeQuerySpace","protocol_expression","idn_expression","punycode_expression","ip4_expression","ip6_expression","find_uri_expression","findUri","start","end","trim","parens","defaultPorts","http","https","ftp","gopher","ws","wss","hostProtocols","invalid_hostname_characters","domAttributes","getDomAttribute","node","nodeName","toLowerCase","type","escapeForDumbFirefox36","escape","strictEncodeURIComponent","encodeURIComponent","encode","decode","decodeURIComponent","iso8859","unescape","unicode","characters","pathname","expression","map","reserved","urnpath","encodeQuery","escaped","decodeQuery","e","_part","generateAccessor","_group","c","generateSegmentedPathFunction","_sep","_codingFuncName","_innerCodingFuncName","actualCodingFunc","segments","split","join","decodePath","decodeUrnPath","recodePath","recodeUrnPath","encodeReserved","parse","parts","pos","indexOf","substring","parseAuthority","parseHost","bracketPos","t","charAt","firstColon","firstSlash","nextColon","ensureValidHostname","ensureValidPort","parseUserinfo","lastIndexOf","shift","parseQuery","items","splits","v","name","push","build","buildAuthority","buildHost","buildUserinfo","buildQuery","unique","key","buildQueryParameter","addQuery","concat","setQuery","removeQuery","hasQuery","withinArray","_key","_booly","Boolean","op","joinPaths","input","nonEmptySegments","_segments","segment","s","uri","normalize","commonPath","Math","min","withinString","callback","options","_start","_end","_trim","_parens","_attributeOpen","lastIndex","exec","index","ignoreHtml","attributeOpen","max","search","parensEnd","parensMatch","parensMatchEnd","ignore","result","hasHostname","hasProtocol","rejectEmptyHostname","toASCII","Number","noConflict","removeAll","unconflicted","URITemplate","deferBuild","_deferred_build","_string","clone","valueOf","generateSimpleAccessor","generatePrefixAccessor","hash","res","_object","attribute","src","is","what","ip","ip4","ip6","sld","idn","relative","has","_protocol","_port","_hostname","scheme","x","origin","authority","host","userinfo","resource","subdomain","domain","sub","RegExp","tld","get","ReferenceError","directory","filename","decodePathSegment","mutatedDirectory","normalizePath","suffix","separator","absolute","Error","pop","unshift","segmentCoded","q","setSearch","addSearch","removeSearch","hasSearch","normalizeProtocol","normalizeQuery","normalizeFragment","normalizeHostname","normalizePort","best","_path","_was_relative","_leadingParents","_parent","_pos","normalizePathname","normalizeSearch","normalizeHash","d","readable","toUnicode","qp","kv","resolved","properties","basedir","relativeTo","relativeParts","baseParts","common","relativePath","basePath","parents","equals","one_map","two_map","checked","one_query","two_query"],"mappings":"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","file":"URI.js","sourceRoot":"/data","sourcesContent":["/*!\n * URI.js - Mutating URLs\n *\n * Version: 1.19.1\n *\n * Author: Rodney Rehm\n * Web: http://medialize.github.io/URI.js/\n *\n * Licensed under\n * MIT License http://www.opensource.org/licenses/mit-license\n *\n */\n(function (root, factory) {\n 'use strict';\n // https://github.com/umdjs/umd/blob/master/returnExports.js\n if (typeof module === 'object' && module.exports) {\n // Node\n module.exports = factory(require('./punycode'), require('./IPv6'), require('./SecondLevelDomains'));\n } else if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(['./punycode', './IPv6', './SecondLevelDomains'], factory);\n } else {\n // Browser globals (root is window)\n root.URI = factory(root.punycode, root.IPv6, root.SecondLevelDomains, root);\n }\n}(this, function (punycode, IPv6, SLD, root) {\n 'use strict';\n /*global location, escape, unescape */\n // FIXME: v2.0.0 renamce non-camelCase properties to uppercase\n /*jshint camelcase: false */\n\n // save current URI variable, if any\n var _URI = root && root.URI;\n\n function URI(url, base) {\n var _urlSupplied = arguments.length >= 1;\n var _baseSupplied = arguments.length >= 2;\n\n // Allow instantiation without the 'new' keyword\n if (!(this instanceof URI)) {\n if (_urlSupplied) {\n if (_baseSupplied) {\n return new URI(url, base);\n }\n\n return new URI(url);\n }\n\n return new URI();\n }\n\n if (url === undefined) {\n if (_urlSupplied) {\n throw new TypeError('undefined is not a valid argument for URI');\n }\n\n if (typeof location !== 'undefined') {\n url = location.href + '';\n } else {\n url = '';\n }\n }\n\n if (url === null) {\n if (_urlSupplied) {\n throw new TypeError('null is not a valid argument for URI');\n }\n }\n\n this.href(url);\n\n // resolve to base according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#constructor\n if (base !== undefined) {\n return this.absoluteTo(base);\n }\n\n return this;\n }\n\n function isInteger(value) {\n return /^[0-9]+$/.test(value);\n }\n\n URI.version = '1.19.1';\n\n var p = URI.prototype;\n var hasOwn = Object.prototype.hasOwnProperty;\n\n function escapeRegEx(string) {\n // https://github.com/medialize/URI.js/commit/85ac21783c11f8ccab06106dba9735a31a86924d#commitcomment-821963\n return string.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1');\n }\n\n function getType(value) {\n // IE8 doesn't return [Object Undefined] but [Object Object] for undefined value\n if (value === undefined) {\n return 'Undefined';\n }\n\n return String(Object.prototype.toString.call(value)).slice(8, -1);\n }\n\n function isArray(obj) {\n return getType(obj) === 'Array';\n }\n\n function filterArrayValues(data, value) {\n var lookup = {};\n var i, length;\n\n if (getType(value) === 'RegExp') {\n lookup = null;\n } else if (isArray(value)) {\n for (i = 0, length = value.length; i < length; i++) {\n lookup[value[i]] = true;\n }\n } else {\n lookup[value] = true;\n }\n\n for (i = 0, length = data.length; i < length; i++) {\n /*jshint laxbreak: true */\n var _match = lookup && lookup[data[i]] !== undefined\n || !lookup && value.test(data[i]);\n /*jshint laxbreak: false */\n if (_match) {\n data.splice(i, 1);\n length--;\n i--;\n }\n }\n\n return data;\n }\n\n function arrayContains(list, value) {\n var i, length;\n\n // value may be string, number, array, regexp\n if (isArray(value)) {\n // Note: this can be optimized to O(n) (instead of current O(m * n))\n for (i = 0, length = value.length; i < length; i++) {\n if (!arrayContains(list, value[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n var _type = getType(value);\n for (i = 0, length = list.length; i < length; i++) {\n if (_type === 'RegExp') {\n if (typeof list[i] === 'string' && list[i].match(value)) {\n return true;\n }\n } else if (list[i] === value) {\n return true;\n }\n }\n\n return false;\n }\n\n function arraysEqual(one, two) {\n if (!isArray(one) || !isArray(two)) {\n return false;\n }\n\n // arrays can't be equal if they have different amount of content\n if (one.length !== two.length) {\n return false;\n }\n\n one.sort();\n two.sort();\n\n for (var i = 0, l = one.length; i < l; i++) {\n if (one[i] !== two[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n function trimSlashes(text) {\n var trim_expression = /^\\/+|\\/+$/g;\n return text.replace(trim_expression, '');\n }\n\n URI._parts = function() {\n return {\n protocol: null,\n username: null,\n password: null,\n hostname: null,\n urn: null,\n port: null,\n path: null,\n query: null,\n fragment: null,\n // state\n preventInvalidHostname: URI.preventInvalidHostname,\n duplicateQueryParameters: URI.duplicateQueryParameters,\n escapeQuerySpace: URI.escapeQuerySpace\n };\n };\n // state: throw on invalid hostname\n // see https://github.com/medialize/URI.js/pull/345\n // and https://github.com/medialize/URI.js/issues/354\n URI.preventInvalidHostname = false;\n // state: allow duplicate query parameters (a=1&a=1)\n URI.duplicateQueryParameters = false;\n // state: replaces + with %20 (space in query strings)\n URI.escapeQuerySpace = true;\n // static properties\n URI.protocol_expression = /^[a-z][a-z0-9.+-]*$/i;\n URI.idn_expression = /[^a-z0-9\\._-]/i;\n URI.punycode_expression = /(xn--)/i;\n // well, 333.444.555.666 matches, but it sure ain't no IPv4 - do we care?\n URI.ip4_expression = /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;\n // credits to Rich Brown\n // source: http://forums.intermapper.com/viewtopic.php?p=1096#1096\n // specification: http://www.ietf.org/rfc/rfc4291.txt\n URI.ip6_expression = /^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/;\n // expression used is \"gruber revised\" (@gruber v2) determined to be the\n // best solution in a regex-golf we did a couple of ages ago at\n // * http://mathiasbynens.be/demo/url-regex\n // * http://rodneyrehm.de/t/url-regex.html\n URI.find_uri_expression = /\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))/ig;\n URI.findUri = {\n // valid \"scheme://\" or \"www.\"\n start: /\\b(?:([a-z][a-z0-9.+-]*:\\/\\/)|www\\.)/gi,\n // everything up to the next whitespace\n end: /[\\s\\r\\n]|$/,\n // trim trailing punctuation captured by end RegExp\n trim: /[`!()\\[\\]{};:'\".,<>?«»“”„‘’]+$/,\n // balanced parens inclusion (), [], {}, <>\n parens: /(\\([^\\)]*\\)|\\[[^\\]]*\\]|\\{[^}]*\\}|<[^>]*>)/g,\n };\n // http://www.iana.org/assignments/uri-schemes.html\n // http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports\n URI.defaultPorts = {\n http: '80',\n https: '443',\n ftp: '21',\n gopher: '70',\n ws: '80',\n wss: '443'\n };\n // list of protocols which always require a hostname\n URI.hostProtocols = [\n 'http',\n 'https'\n ];\n\n // allowed hostname characters according to RFC 3986\n // ALPHA DIGIT \"-\" \".\" \"_\" \"~\" \"!\" \"$\" \"&\" \"'\" \"(\" \")\" \"*\" \"+\" \",\" \";\" \"=\" %encoded\n // I've never seen a (non-IDN) hostname other than: ALPHA DIGIT . - _\n URI.invalid_hostname_characters = /[^a-zA-Z0-9\\.\\-:_]/;\n // map DOM Elements to their URI attribute\n URI.domAttributes = {\n 'a': 'href',\n 'blockquote': 'cite',\n 'link': 'href',\n 'base': 'href',\n 'script': 'src',\n 'form': 'action',\n 'img': 'src',\n 'area': 'href',\n 'iframe': 'src',\n 'embed': 'src',\n 'source': 'src',\n 'track': 'src',\n 'input': 'src', // but only if type=\"image\"\n 'audio': 'src',\n 'video': 'src'\n };\n URI.getDomAttribute = function(node) {\n if (!node || !node.nodeName) {\n return undefined;\n }\n\n var nodeName = node.nodeName.toLowerCase();\n // <input> should only expose src for type=\"image\"\n if (nodeName === 'input' && node.type !== 'image') {\n return undefined;\n }\n\n return URI.domAttributes[nodeName];\n };\n\n function escapeForDumbFirefox36(value) {\n // https://github.com/medialize/URI.js/issues/91\n return escape(value);\n }\n\n // encoding / decoding according to RFC3986\n function strictEncodeURIComponent(string) {\n // see https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/encodeURIComponent\n return encodeURIComponent(string)\n .replace(/[!'()*]/g, escapeForDumbFirefox36)\n .replace(/\\*/g, '%2A');\n }\n URI.encode = strictEncodeURIComponent;\n URI.decode = decodeURIComponent;\n URI.iso8859 = function() {\n URI.encode = escape;\n URI.decode = unescape;\n };\n URI.unicode = function() {\n URI.encode = strictEncodeURIComponent;\n URI.decode = decodeURIComponent;\n };\n URI.characters = {\n pathname: {\n encode: {\n // RFC3986 2.1: For consistency, URI producers and normalizers should\n // use uppercase hexadecimal digits for all percent-encodings.\n expression: /%(24|26|2B|2C|3B|3D|3A|40)/ig,\n map: {\n // -._~!'()*\n '%24': '$',\n '%26': '&',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '=',\n '%3A': ':',\n '%40': '@'\n }\n },\n decode: {\n expression: /[\\/\\?#]/g,\n map: {\n '/': '%2F',\n '?': '%3F',\n '#': '%23'\n }\n }\n },\n reserved: {\n encode: {\n // RFC3986 2.1: For consistency, URI producers and normalizers should\n // use uppercase hexadecimal digits for all percent-encodings.\n expression: /%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,\n map: {\n // gen-delims\n '%3A': ':',\n '%2F': '/',\n '%3F': '?',\n '%23': '#',\n '%5B': '[',\n '%5D': ']',\n '%40': '@',\n // sub-delims\n '%21': '!',\n '%24': '$',\n '%26': '&',\n '%27': '\\'',\n '%28': '(',\n '%29': ')',\n '%2A': '*',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '='\n }\n }\n },\n urnpath: {\n // The characters under `encode` are the characters called out by RFC 2141 as being acceptable\n // for usage in a URN. RFC2141 also calls out \"-\", \".\", and \"_\" as acceptable characters, but\n // these aren't encoded by encodeURIComponent, so we don't have to call them out here. Also\n // note that the colon character is not featured in the encoding map; this is because URI.js\n // gives the colons in URNs semantic meaning as the delimiters of path segements, and so it\n // should not appear unencoded in a segment itself.\n // See also the note above about RFC3986 and capitalalized hex digits.\n encode: {\n expression: /%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,\n map: {\n '%21': '!',\n '%24': '$',\n '%27': '\\'',\n '%28': '(',\n '%29': ')',\n '%2A': '*',\n '%2B': '+',\n '%2C': ',',\n '%3B': ';',\n '%3D': '=',\n '%40': '@'\n }\n },\n // These characters are the characters called out by RFC2141 as \"reserved\" characters that\n // should never appear in a URN, plus the colon character (see note above).\n decode: {\n expression: /[\\/\\?#:]/g,\n map: {\n '/': '%2F',\n '?': '%3F',\n '#': '%23',\n ':': '%3A'\n }\n }\n }\n };\n URI.encodeQuery = function(string, escapeQuerySpace) {\n var escaped = URI.encode(string + '');\n if (escapeQuerySpace === undefined) {\n escapeQuerySpace = URI.escapeQuerySpace;\n }\n\n return escapeQuerySpace ? escaped.replace(/%20/g, '+') : escaped;\n };\n URI.decodeQuery = function(string, escapeQuerySpace) {\n string += '';\n if (escapeQuerySpace === undefined) {\n escapeQuerySpace = URI.escapeQuerySpace;\n }\n\n try {\n return URI.decode(escapeQuerySpace ? string.replace(/\\+/g, '%20') : string);\n } catch(e) {\n // we're not going to mess with weird encodings,\n // give up and return the undecoded original string\n // see https://github.com/medialize/URI.js/issues/87\n // see https://github.com/medialize/URI.js/issues/92\n return string;\n }\n };\n // generate encode/decode path functions\n var _parts = {'encode':'encode', 'decode':'decode'};\n var _part;\n var generateAccessor = function(_group, _part) {\n return function(string) {\n try {\n return URI[_part](string + '').replace(URI.characters[_group][_part].expression, function(c) {\n return URI.characters[_group][_part].map[c];\n });\n } catch (e) {\n // we're not going to mess with weird encodings,\n // give up and return the undecoded original string\n // see https://github.com/medialize/URI.js/issues/87\n // see https://github.com/medialize/URI.js/issues/92\n return string;\n }\n };\n };\n\n for (_part in _parts) {\n URI[_part + 'PathSegment'] = generateAccessor('pathname', _parts[_part]);\n URI[_part + 'UrnPathSegment'] = generateAccessor('urnpath', _parts[_part]);\n }\n\n var generateSegmentedPathFunction = function(_sep, _codingFuncName, _innerCodingFuncName) {\n return function(string) {\n // Why pass in names of functions, rather than the function objects themselves? The\n // definitions of some functions (but in particular, URI.decode) will occasionally change due\n // to URI.js having ISO8859 and Unicode modes. Passing in the name and getting it will ensure\n // that the functions we use here are \"fresh\".\n var actualCodingFunc;\n if (!_innerCodingFuncName) {\n actualCodingFunc = URI[_codingFuncName];\n } else {\n actualCodingFunc = function(string) {\n return URI[_codingFuncName](URI[_innerCodingFuncName](string));\n };\n }\n\n var segments = (string + '').split(_sep);\n\n for (var i = 0, length = segments.length; i < length; i++) {\n segments[i] = actualCodingFunc(segments[i]);\n }\n\n return segments.join(_sep);\n };\n };\n\n // This takes place outside the above loop because we don't want, e.g., encodeUrnPath functions.\n URI.decodePath = generateSegmentedPathFunction('/', 'decodePathSegment');\n URI.decodeUrnPath = generateSegmentedPathFunction(':', 'decodeUrnPathSegment');\n URI.recodePath = generateSegmentedPathFunction('/', 'encodePathSegment', 'decode');\n URI.recodeUrnPath = generateSegmentedPathFunction(':', 'encodeUrnPathSegment', 'decode');\n\n URI.encodeReserved = generateAccessor('reserved', 'encode');\n\n URI.parse = function(string, parts) {\n var pos;\n if (!parts) {\n parts = {\n preventInvalidHostname: URI.preventInvalidHostname\n };\n }\n // [protocol\"://\"[username[\":\"password]\"@\"]hostname[\":\"port]\"/\"?][path][\"?\"querystring][\"#\"fragment]\n\n // extract fragment\n pos = string.indexOf('#');\n if (pos > -1) {\n // escaping?\n parts.fragment = string.substring(pos + 1) || null;\n string = string.substring(0, pos);\n }\n\n // extract query\n pos = string.indexOf('?');\n if (pos > -1) {\n // escaping?\n parts.query = string.substring(pos + 1) || null;\n string = string.substring(0, pos);\n }\n\n // extract protocol\n if (string.substring(0, 2) === '//') {\n // relative-scheme\n parts.protocol = null;\n string = string.substring(2);\n // extract \"user:pass@host:port\"\n string = URI.parseAuthority(string, parts);\n } else {\n pos = string.indexOf(':');\n if (pos > -1) {\n parts.protocol = string.substring(0, pos) || null;\n if (parts.protocol && !parts.protocol.match(URI.protocol_expression)) {\n // : may be within the path\n parts.protocol = undefined;\n } else if (string.substring(pos + 1, pos + 3) === '//') {\n string = string.substring(pos + 3);\n\n // extract \"user:pass@host:port\"\n string = URI.parseAuthority(string, parts);\n } else {\n string = string.substring(pos + 1);\n parts.urn = true;\n }\n }\n }\n\n // what's left must be the path\n parts.path = string;\n\n // and we're done\n return parts;\n };\n URI.parseHost = function(string, parts) {\n if (!string) {\n string = '';\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://github.com/joyent/node/blob/386fd24f49b0e9d1a8a076592a404168faeecc34/lib/url.js#L115-L124\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n // https://github.com/medialize/URI.js/pull/233\n string = string.replace(/\\\\/g, '/');\n\n // extract host:port\n var pos = string.indexOf('/');\n var bracketPos;\n var t;\n\n if (pos === -1) {\n pos = string.length;\n }\n\n if (string.charAt(0) === '[') {\n // IPv6 host - http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-6\n // I claim most client software breaks on IPv6 anyways. To simplify things, URI only accepts\n // IPv6+port in the format [2001:db8::1]:80 (for the time being)\n bracketPos = string.indexOf(']');\n parts.hostname = string.substring(1, bracketPos) || null;\n parts.port = string.substring(bracketPos + 2, pos) || null;\n if (parts.port === '/') {\n parts.port = null;\n }\n } else {\n var firstColon = string.indexOf(':');\n var firstSlash = string.indexOf('/');\n var nextColon = string.indexOf(':', firstColon + 1);\n if (nextColon !== -1 && (firstSlash === -1 || nextColon < firstSlash)) {\n // IPv6 host contains multiple colons - but no port\n // this notation is actually not allowed by RFC 3986, but we're a liberal parser\n parts.hostname = string.substring(0, pos) || null;\n parts.port = null;\n } else {\n t = string.substring(0, pos).split(':');\n parts.hostname = t[0] || null;\n parts.port = t[1] || null;\n }\n }\n\n if (parts.hostname && string.substring(pos).charAt(0) !== '/') {\n pos++;\n string = '/' + string;\n }\n\n if (parts.preventInvalidHostname) {\n URI.ensureValidHostname(parts.hostname, parts.protocol);\n }\n\n if (parts.port) {\n URI.ensureValidPort(parts.port);\n }\n\n return string.substring(pos) || '/';\n };\n URI.parseAuthority = function(string, parts) {\n string = URI.parseUserinfo(string, parts);\n return URI.parseHost(string, parts);\n };\n URI.parseUserinfo = function(string, parts) {\n // extract username:password\n var firstSlash = string.indexOf('/');\n var pos = string.lastIndexOf('@', firstSlash > -1 ? firstSlash : string.length - 1);\n var t;\n\n // authority@ must come before /path\n if (pos > -1 && (firstSlash === -1 || pos < firstSlash)) {\n t = string.substring(0, pos).split(':');\n parts.username = t[0] ? URI.decode(t[0]) : null;\n t.shift();\n parts.password = t[0] ? URI.decode(t.join(':')) : null;\n string = string.substring(pos + 1);\n } else {\n parts.username = null;\n parts.password = null;\n }\n\n return string;\n };\n URI.parseQuery = function(string, escapeQuerySpace) {\n if (!string) {\n return {};\n }\n\n // throw out the funky business - \"?\"[name\"=\"value\"&\"]+\n string = string.replace(/&+/g, '&').replace(/^\\?*&*|&+$/g, '');\n\n if (!string) {\n return {};\n }\n\n var items = {};\n var splits = string.split('&');\n var length = splits.length;\n var v, name, value;\n\n for (var i = 0; i < length; i++) {\n v = splits[i].split('=');\n name = URI.decodeQuery(v.shift(), escapeQuerySpace);\n // no \"=\" is null according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#collect-url-parameters\n value = v.length ? URI.decodeQuery(v.join('='), escapeQuerySpace) : null;\n\n if (hasOwn.call(items, name)) {\n if (typeof items[name] === 'string' || items[name] === null) {\n items[name] = [items[name]];\n }\n\n items[name].push(value);\n } else {\n items[name] = value;\n }\n }\n\n return items;\n };\n\n URI.build = function(parts) {\n var t = '';\n\n if (parts.protocol) {\n t += parts.protocol + ':';\n }\n\n if (!parts.urn && (t || parts.hostname)) {\n t += '//';\n }\n\n t += (URI.buildAuthority(parts) || '');\n\n if (typeof parts.path === 'string') {\n if (parts.path.charAt(0) !== '/' && typeof parts.hostname === 'string') {\n t += '/';\n }\n\n t += parts.path;\n }\n\n if (typeof parts.query === 'string' && parts.query) {\n t += '?' + parts.query;\n }\n\n if (typeof parts.fragment === 'string' && parts.fragment) {\n t += '#' + parts.fragment;\n }\n return t;\n };\n URI.buildHost = function(parts) {\n var t = '';\n\n if (!parts.hostname) {\n return '';\n } else if (URI.ip6_expression.test(parts.hostname)) {\n t += '[' + parts.hostname + ']';\n } else {\n t += parts.hostname;\n }\n\n if (parts.port) {\n t += ':' + parts.port;\n }\n\n return t;\n };\n URI.buildAuthority = function(parts) {\n return URI.buildUserinfo(parts) + URI.buildHost(parts);\n };\n URI.buildUserinfo = function(parts) {\n var t = '';\n\n if (parts.username) {\n t += URI.encode(parts.username);\n }\n\n if (parts.password) {\n t += ':' + URI.encode(parts.password);\n }\n\n if (t) {\n t += '@';\n }\n\n return t;\n };\n URI.buildQuery = function(data, duplicateQueryParameters, escapeQuerySpace) {\n // according to http://tools.ietf.org/html/rfc3986 or http://labs.apache.org/webarch/uri/rfc/rfc3986.html\n // being »-._~!$&'()*+,;=:@/?« %HEX and alnum are allowed\n // the RFC explicitly states ?/foo being a valid use case, no mention of parameter syntax!\n // URI.js treats the query string as being application/x-www-form-urlencoded\n // see http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type\n\n var t = '';\n var unique, key, i, length;\n for (key in data) {\n if (hasOwn.call(data, key) && key) {\n if (isArray(data[key])) {\n unique = {};\n for (i = 0, length = data[key].length; i < length; i++) {\n if (data[key][i] !== undefined && unique[data[key][i] + ''] === undefined) {\n t += '&' + URI.buildQueryParameter(key, data[key][i], escapeQuerySpace);\n if (duplicateQueryParameters !== true) {\n unique[data[key][i] + ''] = true;\n }\n }\n }\n } else if (data[key] !== undefined) {\n t += '&' + URI.buildQueryParameter(key, data[key], escapeQuerySpace);\n }\n }\n }\n\n return t.substring(1);\n };\n URI.buildQueryParameter = function(name, value, escapeQuerySpace) {\n // http://www.w3.org/TR/REC-html40/interact/forms.html#form-content-type -- application/x-www-form-urlencoded\n // don't append \"=\" for null values, according to http://dvcs.w3.org/hg/url/raw-file/tip/Overview.html#url-parameter-serialization\n return URI.encodeQuery(name, escapeQuerySpace) + (value !== null ? '=' + URI.encodeQuery(value, escapeQuerySpace) : '');\n };\n\n URI.addQuery = function(data, name, value) {\n if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n URI.addQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n if (data[name] === undefined) {\n data[name] = value;\n return;\n } else if (typeof data[name] === 'string') {\n data[name] = [data[name]];\n }\n\n if (!isArray(value)) {\n value = [value];\n }\n\n data[name] = (data[name] || []).concat(value);\n } else {\n throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n }\n };\n\n URI.setQuery = function(data, name, value) {\n if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n URI.setQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n data[name] = value === undefined ? null : value;\n } else {\n throw new TypeError('URI.setQuery() accepts an object, string as the name parameter');\n }\n };\n\n URI.removeQuery = function(data, name, value) {\n var i, length, key;\n\n if (isArray(name)) {\n for (i = 0, length = name.length; i < length; i++) {\n data[name[i]] = undefined;\n }\n } else if (getType(name) === 'RegExp') {\n for (key in data) {\n if (name.test(key)) {\n data[key] = undefined;\n }\n }\n } else if (typeof name === 'object') {\n for (key in name) {\n if (hasOwn.call(name, key)) {\n URI.removeQuery(data, key, name[key]);\n }\n }\n } else if (typeof name === 'string') {\n if (value !== undefined) {\n if (getType(value) === 'RegExp') {\n if (!isArray(data[name]) && value.test(data[name])) {\n data[name] = undefined;\n } else {\n data[name] = filterArrayValues(data[name], value);\n }\n } else if (data[name] === String(value) && (!isArray(value) || value.length === 1)) {\n data[name] = undefined;\n } else if (isArray(data[name])) {\n data[name] = filterArrayValues(data[name], value);\n }\n } else {\n data[name] = undefined;\n }\n } else {\n throw new TypeError('URI.removeQuery() accepts an object, string, RegExp as the first parameter');\n }\n };\n URI.hasQuery = function(data, name, value, withinArray) {\n switch (getType(name)) {\n case 'String':\n // Nothing to do here\n break;\n\n case 'RegExp':\n for (var key in data) {\n if (hasOwn.call(data, key)) {\n if (name.test(key) && (value === undefined || URI.hasQuery(data, key, value))) {\n return true;\n }\n }\n }\n\n return false;\n\n case 'Object':\n for (var _key in name) {\n if (hasOwn.call(name, _key)) {\n if (!URI.hasQuery(data, _key, name[_key])) {\n return false;\n }\n }\n }\n\n return true;\n\n default:\n throw new TypeError('URI.hasQuery() accepts a string, regular expression or object as the name parameter');\n }\n\n switch (getType(value)) {\n case 'Undefined':\n // true if exists (but may be empty)\n return name in data; // data[name] !== undefined;\n\n case 'Boolean':\n // true if exists and non-empty\n var _booly = Boolean(isArray(data[name]) ? data[name].length : data[name]);\n return value === _booly;\n\n case 'Function':\n // allow complex comparison\n return !!value(data[name], name, data);\n\n case 'Array':\n if (!isArray(data[name])) {\n return false;\n }\n\n var op = withinArray ? arrayContains : arraysEqual;\n return op(data[name], value);\n\n case 'RegExp':\n if (!isArray(data[name])) {\n return Boolean(data[name] && data[name].match(value));\n }\n\n if (!withinArray) {\n return false;\n }\n\n return arrayContains(data[name], value);\n\n case 'Number':\n value = String(value);\n /* falls through */\n case 'String':\n if (!isArray(data[name])) {\n return data[name] === value;\n }\n\n if (!withinArray) {\n return false;\n }\n\n return arrayContains(data[name], value);\n\n default:\n throw new TypeError('URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter');\n }\n };\n\n\n URI.joinPaths = function() {\n var input = [];\n var segments = [];\n var nonEmptySegments = 0;\n\n for (var i = 0; i < arguments.length; i++) {\n var url = new URI(arguments[i]);\n input.push(url);\n var _segments = url.segment();\n for (var s = 0; s < _segments.length; s++) {\n if (typeof _segments[s] === 'string') {\n segments.push(_segments[s]);\n }\n\n if (_segments[s]) {\n nonEmptySegments++;\n }\n }\n }\n\n if (!segments.length || !nonEmptySegments) {\n return new URI('');\n }\n\n var uri = new URI('').segment(segments);\n\n if (input[0].path() === '' || input[0].path().slice(0, 1) === '/') {\n uri.path('/' + uri.path());\n }\n\n return uri.normalize();\n };\n\n URI.commonPath = function(one, two) {\n var length = Math.min(one.length, two.length);\n var pos;\n\n // find first non-matching character\n for (pos = 0; pos < length; pos++) {\n if (one.charAt(pos) !== two.charAt(pos)) {\n pos--;\n break;\n }\n }\n\n if (pos < 1) {\n return one.charAt(0) === two.charAt(0) && one.charAt(0) === '/' ? '/' : '';\n }\n\n // revert to last /\n if (one.charAt(pos) !== '/' || two.charAt(pos) !== '/') {\n pos = one.substring(0, pos).lastIndexOf('/');\n }\n\n return one.substring(0, pos + 1);\n };\n\n URI.withinString = function(string, callback, options) {\n options || (options = {});\n var _start = options.start || URI.findUri.start;\n var _end = options.end || URI.findUri.end;\n var _trim = options.trim || URI.findUri.trim;\n var _parens = options.parens || URI.findUri.parens;\n var _attributeOpen = /[a-z0-9-]=[\"']?$/i;\n\n _start.lastIndex = 0;\n while (true) {\n var match = _start.exec(string);\n if (!match) {\n break;\n }\n\n var start = match.index;\n if (options.ignoreHtml) {\n // attribut(e=[\"']?$)\n var attributeOpen = string.slice(Math.max(start - 3, 0), start);\n if (attributeOpen && _attributeOpen.test(attributeOpen)) {\n continue;\n }\n }\n\n var end = start + string.slice(start).search(_end);\n var slice = string.slice(start, end);\n // make sure we include well balanced parens\n var parensEnd = -1;\n while (true) {\n var parensMatch = _parens.exec(slice);\n if (!parensMatch) {\n break;\n }\n\n var parensMatchEnd = parensMatch.index + parensMatch[0].length;\n parensEnd = Math.max(parensEnd, parensMatchEnd);\n }\n\n if (parensEnd > -1) {\n slice = slice.slice(0, parensEnd) + slice.slice(parensEnd).replace(_trim, '');\n } else {\n slice = slice.replace(_trim, '');\n }\n\n if (slice.length <= match[0].length) {\n // the extract only contains the starting marker of a URI,\n // e.g. \"www\" or \"http://\"\n continue;\n }\n\n if (options.ignore && options.ignore.test(slice)) {\n continue;\n }\n\n end = start + slice.length;\n var result = callback(slice, start, end, string);\n if (result === undefined) {\n _start.lastIndex = end;\n continue;\n }\n\n result = String(result);\n string = string.slice(0, start) + result + string.slice(end);\n _start.lastIndex = start + result.length;\n }\n\n _start.lastIndex = 0;\n return string;\n };\n\n URI.ensureValidHostname = function(v, protocol) {\n // Theoretically URIs allow percent-encoding in Hostnames (according to RFC 3986)\n // they are not part of DNS and therefore ignored by URI.js\n\n var hasHostname = !!v; // not null and not an empty string\n var hasProtocol = !!protocol;\n var rejectEmptyHostname = false;\n\n if (hasProtocol) {\n rejectEmptyHostname = arrayContains(URI.hostProtocols, protocol);\n }\n\n if (rejectEmptyHostname && !hasHostname) {\n throw new TypeError('Hostname cannot be empty, if protocol is ' + protocol);\n } else if (v && v.match(URI.invalid_hostname_characters)) {\n // test punycode\n if (!punycode) {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-:_] and Punycode.js is not available');\n }\n if (punycode.toASCII(v).match(URI.invalid_hostname_characters)) {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-:_]');\n }\n }\n };\n\n URI.ensureValidPort = function (v) {\n if (!v) {\n return;\n }\n\n var port = Number(v);\n if (isInteger(port) && (port > 0) && (port < 65536)) {\n return;\n }\n\n throw new TypeError('Port \"' + v + '\" is not a valid port');\n };\n\n // noConflict\n URI.noConflict = function(removeAll) {\n if (removeAll) {\n var unconflicted = {\n URI: this.noConflict()\n };\n\n if (root.URITemplate && typeof root.URITemplate.noConflict === 'function') {\n unconflicted.URITemplate = root.URITemplate.noConflict();\n }\n\n if (root.IPv6 && typeof root.IPv6.noConflict === 'function') {\n unconflicted.IPv6 = root.IPv6.noConflict();\n }\n\n if (root.SecondLevelDomains && typeof root.SecondLevelDomains.noConflict === 'function') {\n unconflicted.SecondLevelDomains = root.SecondLevelDomains.noConflict();\n }\n\n return unconflicted;\n } else if (root.URI === this) {\n root.URI = _URI;\n }\n\n return this;\n };\n\n p.build = function(deferBuild) {\n if (deferBuild === true) {\n this._deferred_build = true;\n } else if (deferBuild === undefined || this._deferred_build) {\n this._string = URI.build(this._parts);\n this._deferred_build = false;\n }\n\n return this;\n };\n\n p.clone = function() {\n return new URI(this);\n };\n\n p.valueOf = p.toString = function() {\n return this.build(false)._string;\n };\n\n\n function generateSimpleAccessor(_part){\n return function(v, build) {\n if (v === undefined) {\n return this._parts[_part] || '';\n } else {\n this._parts[_part] = v || null;\n this.build(!build);\n return this;\n }\n };\n }\n\n function generatePrefixAccessor(_part, _key){\n return function(v, build) {\n if (v === undefined) {\n return this._parts[_part] || '';\n } else {\n if (v !== null) {\n v = v + '';\n if (v.charAt(0) === _key) {\n v = v.substring(1);\n }\n }\n\n this._parts[_part] = v;\n this.build(!build);\n return this;\n }\n };\n }\n\n p.protocol = generateSimpleAccessor('protocol');\n p.username = generateSimpleAccessor('username');\n p.password = generateSimpleAccessor('password');\n p.hostname = generateSimpleAccessor('hostname');\n p.port = generateSimpleAccessor('port');\n p.query = generatePrefixAccessor('query', '?');\n p.fragment = generatePrefixAccessor('fragment', '#');\n\n p.search = function(v, build) {\n var t = this.query(v, build);\n return typeof t === 'string' && t.length ? ('?' + t) : t;\n };\n p.hash = function(v, build) {\n var t = this.fragment(v, build);\n return typeof t === 'string' && t.length ? ('#' + t) : t;\n };\n\n p.pathname = function(v, build) {\n if (v === undefined || v === true) {\n var res = this._parts.path || (this._parts.hostname ? '/' : '');\n return v ? (this._parts.urn ? URI.decodeUrnPath : URI.decodePath)(res) : res;\n } else {\n if (this._parts.urn) {\n this._parts.path = v ? URI.recodeUrnPath(v) : '';\n } else {\n this._parts.path = v ? URI.recodePath(v) : '/';\n }\n this.build(!build);\n return this;\n }\n };\n p.path = p.pathname;\n p.href = function(href, build) {\n var key;\n\n if (href === undefined) {\n return this.toString();\n }\n\n this._string = '';\n this._parts = URI._parts();\n\n var _URI = href instanceof URI;\n var _object = typeof href === 'object' && (href.hostname || href.path || href.pathname);\n if (href.nodeName) {\n var attribute = URI.getDomAttribute(href);\n href = href[attribute] || '';\n _object = false;\n }\n\n // window.location is reported to be an object, but it's not the sort\n // of object we're looking for:\n // * location.protocol ends with a colon\n // * location.query != object.search\n // * location.hash != object.fragment\n // simply serializing the unknown object should do the trick\n // (for location, not for everything...)\n if (!_URI && _object && href.pathname !== undefined) {\n href = href.toString();\n }\n\n if (typeof href === 'string' || href instanceof String) {\n this._parts = URI.parse(String(href), this._parts);\n } else if (_URI || _object) {\n var src = _URI ? href._parts : href;\n for (key in src) {\n if (key === 'query') { continue; }\n if (hasOwn.call(this._parts, key)) {\n this._parts[key] = src[key];\n }\n }\n if (src.query) {\n this.query(src.query, false);\n }\n } else {\n throw new TypeError('invalid input');\n }\n\n this.build(!build);\n return this;\n };\n\n // identification accessors\n p.is = function(what) {\n var ip = false;\n var ip4 = false;\n var ip6 = false;\n var name = false;\n var sld = false;\n var idn = false;\n var punycode = false;\n var relative = !this._parts.urn;\n\n if (this._parts.hostname) {\n relative = false;\n ip4 = URI.ip4_expression.test(this._parts.hostname);\n ip6 = URI.ip6_expression.test(this._parts.hostname);\n ip = ip4 || ip6;\n name = !ip;\n sld = name && SLD && SLD.has(this._parts.hostname);\n idn = name && URI.idn_expression.test(this._parts.hostname);\n punycode = name && URI.punycode_expression.test(this._parts.hostname);\n }\n\n switch (what.toLowerCase()) {\n case 'relative':\n return relative;\n\n case 'absolute':\n return !relative;\n\n // hostname identification\n case 'domain':\n case 'name':\n return name;\n\n case 'sld':\n return sld;\n\n case 'ip':\n return ip;\n\n case 'ip4':\n case 'ipv4':\n case 'inet4':\n return ip4;\n\n case 'ip6':\n case 'ipv6':\n case 'inet6':\n return ip6;\n\n case 'idn':\n return idn;\n\n case 'url':\n return !this._parts.urn;\n\n case 'urn':\n return !!this._parts.urn;\n\n case 'punycode':\n return punycode;\n }\n\n return null;\n };\n\n // component specific input validation\n var _protocol = p.protocol;\n var _port = p.port;\n var _hostname = p.hostname;\n\n p.protocol = function(v, build) {\n if (v) {\n // accept trailing ://\n v = v.replace(/:(\\/\\/)?$/, '');\n\n if (!v.match(URI.protocol_expression)) {\n throw new TypeError('Protocol \"' + v + '\" contains characters other than [A-Z0-9.+-] or doesn\\'t start with [A-Z]');\n }\n }\n\n return _protocol.call(this, v, build);\n };\n p.scheme = p.protocol;\n p.port = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v !== undefined) {\n if (v === 0) {\n v = null;\n }\n\n if (v) {\n v += '';\n if (v.charAt(0) === ':') {\n v = v.substring(1);\n }\n\n URI.ensureValidPort(v);\n }\n }\n return _port.call(this, v, build);\n };\n p.hostname = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v !== undefined) {\n var x = { preventInvalidHostname: this._parts.preventInvalidHostname };\n var res = URI.parseHost(v, x);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n v = x.hostname;\n if (this._parts.preventInvalidHostname) {\n URI.ensureValidHostname(v, this._parts.protocol);\n }\n }\n\n return _hostname.call(this, v, build);\n };\n\n // compound accessors\n p.origin = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n var protocol = this.protocol();\n var authority = this.authority();\n if (!authority) {\n return '';\n }\n\n return (protocol ? protocol + '://' : '') + this.authority();\n } else {\n var origin = URI(v);\n this\n .protocol(origin.protocol())\n .authority(origin.authority())\n .build(!build);\n return this;\n }\n };\n p.host = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n return this._parts.hostname ? URI.buildHost(this._parts) : '';\n } else {\n var res = URI.parseHost(v, this._parts);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n this.build(!build);\n return this;\n }\n };\n p.authority = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n return this._parts.hostname ? URI.buildAuthority(this._parts) : '';\n } else {\n var res = URI.parseAuthority(v, this._parts);\n if (res !== '/') {\n throw new TypeError('Hostname \"' + v + '\" contains characters other than [A-Z0-9.-]');\n }\n\n this.build(!build);\n return this;\n }\n };\n p.userinfo = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined) {\n var t = URI.buildUserinfo(this._parts);\n return t ? t.substring(0, t.length -1) : t;\n } else {\n if (v[v.length-1] !== '@') {\n v += '@';\n }\n\n URI.parseUserinfo(v, this._parts);\n this.build(!build);\n return this;\n }\n };\n p.resource = function(v, build) {\n var parts;\n\n if (v === undefined) {\n return this.path() + this.search() + this.hash();\n }\n\n parts = URI.parse(v);\n this._parts.path = parts.path;\n this._parts.query = parts.query;\n this._parts.fragment = parts.fragment;\n this.build(!build);\n return this;\n };\n\n // fraction accessors\n p.subdomain = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n // convenience, return \"www\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n // grab domain and add another segment\n var end = this._parts.hostname.length - this.domain().length - 1;\n return this._parts.hostname.substring(0, end) || '';\n } else {\n var e = this._parts.hostname.length - this.domain().length;\n var sub = this._parts.hostname.substring(0, e);\n var replace = new RegExp('^' + escapeRegEx(sub));\n\n if (v && v.charAt(v.length - 1) !== '.') {\n v += '.';\n }\n\n if (v.indexOf(':') !== -1) {\n throw new TypeError('Domains cannot contain colons');\n }\n\n if (v) {\n URI.ensureValidHostname(v, this._parts.protocol);\n }\n\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n this.build(!build);\n return this;\n }\n };\n p.domain = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v === 'boolean') {\n build = v;\n v = undefined;\n }\n\n // convenience, return \"example.org\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n // if hostname consists of 1 or 2 segments, it must be the domain\n var t = this._parts.hostname.match(/\\./g);\n if (t && t.length < 2) {\n return this._parts.hostname;\n }\n\n // grab tld and add another segment\n var end = this._parts.hostname.length - this.tld(build).length - 1;\n end = this._parts.hostname.lastIndexOf('.', end -1) + 1;\n return this._parts.hostname.substring(end) || '';\n } else {\n if (!v) {\n throw new TypeError('cannot set domain empty');\n }\n\n if (v.indexOf(':') !== -1) {\n throw new TypeError('Domains cannot contain colons');\n }\n\n URI.ensureValidHostname(v, this._parts.protocol);\n\n if (!this._parts.hostname || this.is('IP')) {\n this._parts.hostname = v;\n } else {\n var replace = new RegExp(escapeRegEx(this.domain()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.tld = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v === 'boolean') {\n build = v;\n v = undefined;\n }\n\n // return \"org\" from \"www.example.org\"\n if (v === undefined) {\n if (!this._parts.hostname || this.is('IP')) {\n return '';\n }\n\n var pos = this._parts.hostname.lastIndexOf('.');\n var tld = this._parts.hostname.substring(pos + 1);\n\n if (build !== true && SLD && SLD.list[tld.toLowerCase()]) {\n return SLD.get(this._parts.hostname) || tld;\n }\n\n return tld;\n } else {\n var replace;\n\n if (!v) {\n throw new TypeError('cannot set TLD empty');\n } else if (v.match(/[^a-zA-Z0-9-]/)) {\n if (SLD && SLD.is(v)) {\n replace = new RegExp(escapeRegEx(this.tld()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n } else {\n throw new TypeError('TLD \"' + v + '\" contains characters other than [A-Z0-9]');\n }\n } else if (!this._parts.hostname || this.is('IP')) {\n throw new ReferenceError('cannot set TLD on non-domain host');\n } else {\n replace = new RegExp(escapeRegEx(this.tld()) + '$');\n this._parts.hostname = this._parts.hostname.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.directory = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path && !this._parts.hostname) {\n return '';\n }\n\n if (this._parts.path === '/') {\n return '/';\n }\n\n var end = this._parts.path.length - this.filename().length - 1;\n var res = this._parts.path.substring(0, end) || (this._parts.hostname ? '/' : '');\n\n return v ? URI.decodePath(res) : res;\n\n } else {\n var e = this._parts.path.length - this.filename().length;\n var directory = this._parts.path.substring(0, e);\n var replace = new RegExp('^' + escapeRegEx(directory));\n\n // fully qualifier directories begin with a slash\n if (!this.is('relative')) {\n if (!v) {\n v = '/';\n }\n\n if (v.charAt(0) !== '/') {\n v = '/' + v;\n }\n }\n\n // directories always end with a slash\n if (v && v.charAt(v.length - 1) !== '/') {\n v += '/';\n }\n\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n this.build(!build);\n return this;\n }\n };\n p.filename = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (typeof v !== 'string') {\n if (!this._parts.path || this._parts.path === '/') {\n return '';\n }\n\n var pos = this._parts.path.lastIndexOf('/');\n var res = this._parts.path.substring(pos+1);\n\n return v ? URI.decodePathSegment(res) : res;\n } else {\n var mutatedDirectory = false;\n\n if (v.charAt(0) === '/') {\n v = v.substring(1);\n }\n\n if (v.match(/\\.?\\//)) {\n mutatedDirectory = true;\n }\n\n var replace = new RegExp(escapeRegEx(this.filename()) + '$');\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n\n if (mutatedDirectory) {\n this.normalizePath(build);\n } else {\n this.build(!build);\n }\n\n return this;\n }\n };\n p.suffix = function(v, build) {\n if (this._parts.urn) {\n return v === undefined ? '' : this;\n }\n\n if (v === undefined || v === true) {\n if (!this._parts.path || this._parts.path === '/') {\n return '';\n }\n\n var filename = this.filename();\n var pos = filename.lastIndexOf('.');\n var s, res;\n\n if (pos === -1) {\n return '';\n }\n\n // suffix may only contain alnum characters (yup, I made this up.)\n s = filename.substring(pos+1);\n res = (/^[a-z0-9%]+$/i).test(s) ? s : '';\n return v ? URI.decodePathSegment(res) : res;\n } else {\n if (v.charAt(0) === '.') {\n v = v.substring(1);\n }\n\n var suffix = this.suffix();\n var replace;\n\n if (!suffix) {\n if (!v) {\n return this;\n }\n\n this._parts.path += '.' + URI.recodePath(v);\n } else if (!v) {\n replace = new RegExp(escapeRegEx('.' + suffix) + '$');\n } else {\n replace = new RegExp(escapeRegEx(suffix) + '$');\n }\n\n if (replace) {\n v = URI.recodePath(v);\n this._parts.path = this._parts.path.replace(replace, v);\n }\n\n this.build(!build);\n return this;\n }\n };\n p.segment = function(segment, v, build) {\n var separator = this._parts.urn ? ':' : '/';\n var path = this.path();\n var absolute = path.substring(0, 1) === '/';\n var segments = path.split(separator);\n\n if (segment !== undefined && typeof segment !== 'number') {\n build = v;\n v = segment;\n segment = undefined;\n }\n\n if (segment !== undefined && typeof segment !== 'number') {\n throw new Error('Bad segment \"' + segment + '\", must be 0-based integer');\n }\n\n if (absolute) {\n segments.shift();\n }\n\n if (segment < 0) {\n // allow negative indexes to address from the end\n segment = Math.max(segments.length + segment, 0);\n }\n\n if (v === undefined) {\n /*jshint laxbreak: true */\n return segment === undefined\n ? segments\n : segments[segment];\n /*jshint laxbreak: false */\n } else if (segment === null || segments[segment] === undefined) {\n if (isArray(v)) {\n segments = [];\n // collapse empty elements within array\n for (var i=0, l=v.length; i < l; i++) {\n if (!v[i].length && (!segments.length || !segments[segments.length -1].length)) {\n continue;\n }\n\n if (segments.length && !segments[segments.length -1].length) {\n segments.pop();\n }\n\n segments.push(trimSlashes(v[i]));\n }\n } else if (v || typeof v === 'string') {\n v = trimSlashes(v);\n if (segments[segments.length -1] === '') {\n // empty trailing elements have to be overwritten\n // to prevent results such as /foo//bar\n segments[segments.length -1] = v;\n } else {\n segments.push(v);\n }\n }\n } else {\n if (v) {\n segments[segment] = trimSlashes(v);\n } else {\n segments.splice(segment, 1);\n }\n }\n\n if (absolute) {\n segments.unshift('');\n }\n\n return this.path(segments.join(separator), build);\n };\n p.segmentCoded = function(segment, v, build) {\n var segments, i, l;\n\n if (typeof segment !== 'number') {\n build = v;\n v = segment;\n segment = undefined;\n }\n\n if (v === undefined) {\n segments = this.segment(segment, v, build);\n if (!isArray(segments)) {\n segments = segments !== undefined ? URI.decode(segments) : undefined;\n } else {\n for (i = 0, l = segments.length; i < l; i++) {\n segments[i] = URI.decode(segments[i]);\n }\n }\n\n return segments;\n }\n\n if (!isArray(v)) {\n v = (typeof v === 'string' || v instanceof String) ? URI.encode(v) : v;\n } else {\n for (i = 0, l = v.length; i < l; i++) {\n v[i] = URI.encode(v[i]);\n }\n }\n\n return this.segment(segment, v, build);\n };\n\n // mutating query string\n var q = p.query;\n p.query = function(v, build) {\n if (v === true) {\n return URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n } else if (typeof v === 'function') {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n var result = v.call(this, data);\n this._parts.query = URI.buildQuery(result || data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n this.build(!build);\n return this;\n } else if (v !== undefined && typeof v !== 'string') {\n this._parts.query = URI.buildQuery(v, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n this.build(!build);\n return this;\n } else {\n return q.call(this, v, build);\n }\n };\n p.setQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n\n if (typeof name === 'string' || name instanceof String) {\n data[name] = value !== undefined ? value : null;\n } else if (typeof name === 'object') {\n for (var key in name) {\n if (hasOwn.call(name, key)) {\n data[key] = name[key];\n }\n }\n } else {\n throw new TypeError('URI.addQuery() accepts an object, string as the name parameter');\n }\n\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.addQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n URI.addQuery(data, name, value === undefined ? null : value);\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.removeQuery = function(name, value, build) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n URI.removeQuery(data, name, value);\n this._parts.query = URI.buildQuery(data, this._parts.duplicateQueryParameters, this._parts.escapeQuerySpace);\n if (typeof name !== 'string') {\n build = value;\n }\n\n this.build(!build);\n return this;\n };\n p.hasQuery = function(name, value, withinArray) {\n var data = URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace);\n return URI.hasQuery(data, name, value, withinArray);\n };\n p.setSearch = p.setQuery;\n p.addSearch = p.addQuery;\n p.removeSearch = p.removeQuery;\n p.hasSearch = p.hasQuery;\n\n // sanitizing URLs\n p.normalize = function() {\n if (this._parts.urn) {\n return this\n .normalizeProtocol(false)\n .normalizePath(false)\n .normalizeQuery(false)\n .normalizeFragment(false)\n .build();\n }\n\n return this\n .normalizeProtocol(false)\n .normalizeHostname(false)\n .normalizePort(false)\n .normalizePath(false)\n .normalizeQuery(false)\n .normalizeFragment(false)\n .build();\n };\n p.normalizeProtocol = function(build) {\n if (typeof this._parts.protocol === 'string') {\n this._parts.protocol = this._parts.protocol.toLowerCase();\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeHostname = function(build) {\n if (this._parts.hostname) {\n if (this.is('IDN') && punycode) {\n this._parts.hostname = punycode.toASCII(this._parts.hostname);\n } else if (this.is('IPv6') && IPv6) {\n this._parts.hostname = IPv6.best(this._parts.hostname);\n }\n\n this._parts.hostname = this._parts.hostname.toLowerCase();\n this.build(!build);\n }\n\n return this;\n };\n p.normalizePort = function(build) {\n // remove port of it's the protocol's default\n if (typeof this._parts.protocol === 'string' && this._parts.port === URI.defaultPorts[this._parts.protocol]) {\n this._parts.port = null;\n this.build(!build);\n }\n\n return this;\n };\n p.normalizePath = function(build) {\n var _path = this._parts.path;\n if (!_path) {\n return this;\n }\n\n if (this._parts.urn) {\n this._parts.path = URI.recodeUrnPath(this._parts.path);\n this.build(!build);\n return this;\n }\n\n if (this._parts.path === '/') {\n return this;\n }\n\n _path = URI.recodePath(_path);\n\n var _was_relative;\n var _leadingParents = '';\n var _parent, _pos;\n\n // handle relative paths\n if (_path.charAt(0) !== '/') {\n _was_relative = true;\n _path = '/' + _path;\n }\n\n // handle relative files (as opposed to directories)\n if (_path.slice(-3) === '/..' || _path.slice(-2) === '/.') {\n _path += '/';\n }\n\n // resolve simples\n _path = _path\n .replace(/(\\/(\\.\\/)+)|(\\/\\.$)/g, '/')\n .replace(/\\/{2,}/g, '/');\n\n // remember leading parents\n if (_was_relative) {\n _leadingParents = _path.substring(1).match(/^(\\.\\.\\/)+/) || '';\n if (_leadingParents) {\n _leadingParents = _leadingParents[0];\n }\n }\n\n // resolve parents\n while (true) {\n _parent = _path.search(/\\/\\.\\.(\\/|$)/);\n if (_parent === -1) {\n // no more ../ to resolve\n break;\n } else if (_parent === 0) {\n // top level cannot be relative, skip it\n _path = _path.substring(3);\n continue;\n }\n\n _pos = _path.substring(0, _parent).lastIndexOf('/');\n if (_pos === -1) {\n _pos = _parent;\n }\n _path = _path.substring(0, _pos) + _path.substring(_parent + 3);\n }\n\n // revert to relative\n if (_was_relative && this.is('relative')) {\n _path = _leadingParents + _path.substring(1);\n }\n\n this._parts.path = _path;\n this.build(!build);\n return this;\n };\n p.normalizePathname = p.normalizePath;\n p.normalizeQuery = function(build) {\n if (typeof this._parts.query === 'string') {\n if (!this._parts.query.length) {\n this._parts.query = null;\n } else {\n this.query(URI.parseQuery(this._parts.query, this._parts.escapeQuerySpace));\n }\n\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeFragment = function(build) {\n if (!this._parts.fragment) {\n this._parts.fragment = null;\n this.build(!build);\n }\n\n return this;\n };\n p.normalizeSearch = p.normalizeQuery;\n p.normalizeHash = p.normalizeFragment;\n\n p.iso8859 = function() {\n // expect unicode input, iso8859 output\n var e = URI.encode;\n var d = URI.decode;\n\n URI.encode = escape;\n URI.decode = decodeURIComponent;\n try {\n this.normalize();\n } finally {\n URI.encode = e;\n URI.decode = d;\n }\n return this;\n };\n\n p.unicode = function() {\n // expect iso8859 input, unicode output\n var e = URI.encode;\n var d = URI.decode;\n\n URI.encode = strictEncodeURIComponent;\n URI.decode = unescape;\n try {\n this.normalize();\n } finally {\n URI.encode = e;\n URI.decode = d;\n }\n return this;\n };\n\n p.readable = function() {\n var uri = this.clone();\n // removing username, password, because they shouldn't be displayed according to RFC 3986\n uri.username('').password('').normalize();\n var t = '';\n if (uri._parts.protocol) {\n t += uri._parts.protocol + '://';\n }\n\n if (uri._parts.hostname) {\n if (uri.is('punycode') && punycode) {\n t += punycode.toUnicode(uri._parts.hostname);\n if (uri._parts.port) {\n t += ':' + uri._parts.port;\n }\n } else {\n t += uri.host();\n }\n }\n\n if (uri._parts.hostname && uri._parts.path && uri._parts.path.charAt(0) !== '/') {\n t += '/';\n }\n\n t += uri.path(true);\n if (uri._parts.query) {\n var q = '';\n for (var i = 0, qp = uri._parts.query.split('&'), l = qp.length; i < l; i++) {\n var kv = (qp[i] || '').split('=');\n q += '&' + URI.decodeQuery(kv[0], this._parts.escapeQuerySpace)\n .replace(/&/g, '%26');\n\n if (kv[1] !== undefined) {\n q += '=' + URI.decodeQuery(kv[1], this._parts.escapeQuerySpace)\n .replace(/&/g, '%26');\n }\n }\n t += '?' + q.substring(1);\n }\n\n t += URI.decodeQuery(uri.hash(), true);\n return t;\n };\n\n // resolving relative and absolute URLs\n p.absoluteTo = function(base) {\n var resolved = this.clone();\n var properties = ['protocol', 'username', 'password', 'hostname', 'port'];\n var basedir, i, p;\n\n if (this._parts.urn) {\n throw new Error('URNs do not have any generally defined hierarchical components');\n }\n\n if (!(base instanceof URI)) {\n base = new URI(base);\n }\n\n if (resolved._parts.protocol) {\n // Directly returns even if this._parts.hostname is empty.\n return resolved;\n } else {\n resolved._parts.protocol = base._parts.protocol;\n }\n\n if (this._parts.hostname) {\n return resolved;\n }\n\n for (i = 0; (p = properties[i]); i++) {\n resolved._parts[p] = base._parts[p];\n }\n\n if (!resolved._parts.path) {\n resolved._parts.path = base._parts.path;\n if (!resolved._parts.query) {\n resolved._parts.query = base._parts.query;\n }\n } else {\n if (resolved._parts.path.substring(-2) === '..') {\n resolved._parts.path += '/';\n }\n\n if (resolved.path().charAt(0) !== '/') {\n basedir = base.directory();\n basedir = basedir ? basedir : base.path().indexOf('/') === 0 ? '/' : '';\n resolved._parts.path = (basedir ? (basedir + '/') : '') + resolved._parts.path;\n resolved.normalizePath();\n }\n }\n\n resolved.build();\n return resolved;\n };\n p.relativeTo = function(base) {\n var relative = this.clone().normalize();\n var relativeParts, baseParts, common, relativePath, basePath;\n\n if (relative._parts.urn) {\n throw new Error('URNs do not have any generally defined hierarchical components');\n }\n\n base = new URI(base).normalize();\n relativeParts = relative._parts;\n baseParts = base._parts;\n relativePath = relative.path();\n basePath = base.path();\n\n if (relativePath.charAt(0) !== '/') {\n throw new Error('URI is already relative');\n }\n\n if (basePath.charAt(0) !== '/') {\n throw new Error('Cannot calculate a URI relative to another relative URI');\n }\n\n if (relativeParts.protocol === baseParts.protocol) {\n relativeParts.protocol = null;\n }\n\n if (relativeParts.username !== baseParts.username || relativeParts.password !== baseParts.password) {\n return relative.build();\n }\n\n if (relativeParts.protocol !== null || relativeParts.username !== null || relativeParts.password !== null) {\n return relative.build();\n }\n\n if (relativeParts.hostname === baseParts.hostname && relativeParts.port === baseParts.port) {\n relativeParts.hostname = null;\n relativeParts.port = null;\n } else {\n return relative.build();\n }\n\n if (relativePath === basePath) {\n relativeParts.path = '';\n return relative.build();\n }\n\n // determine common sub path\n common = URI.commonPath(relativePath, basePath);\n\n // If the paths have nothing in common, return a relative URL with the absolute path.\n if (!common) {\n return relative.build();\n }\n\n var parents = baseParts.path\n .substring(common.length)\n .replace(/[^\\/]*$/, '')\n .replace(/.*?\\//g, '../');\n\n relativeParts.path = (parents + relativeParts.path.substring(common.length)) || './';\n\n return relative.build();\n };\n\n // comparing URIs\n p.equals = function(uri) {\n var one = this.clone();\n var two = new URI(uri);\n var one_map = {};\n var two_map = {};\n var checked = {};\n var one_query, two_query, key;\n\n one.normalize();\n two.normalize();\n\n // exact match\n if (one.toString() === two.toString()) {\n return true;\n }\n\n // extract query string\n one_query = one.query();\n two_query = two.query();\n one.query('');\n two.query('');\n\n // definitely not equal if not even non-query parts match\n if (one.toString() !== two.toString()) {\n return false;\n }\n\n // query parameters have the same length, even if they're permuted\n if (one_query.length !== two_query.length) {\n return false;\n }\n\n one_map = URI.parseQuery(one_query, this._parts.escapeQuerySpace);\n two_map = URI.parseQuery(two_query, this._parts.escapeQuerySpace);\n\n for (key in one_map) {\n if (hasOwn.call(one_map, key)) {\n if (!isArray(one_map[key])) {\n if (one_map[key] !== two_map[key]) {\n return false;\n }\n } else if (!arraysEqual(one_map[key], two_map[key])) {\n return false;\n }\n\n checked[key] = true;\n }\n }\n\n for (key in two_map) {\n if (hasOwn.call(two_map, key)) {\n if (!checked[key]) {\n // two contains a parameter not present in one\n return false;\n }\n }\n }\n\n return true;\n };\n\n // state\n p.preventInvalidHostname = function(v) {\n this._parts.preventInvalidHostname = !!v;\n return this;\n };\n\n p.duplicateQueryParameters = function(v) {\n this._parts.duplicateQueryParameters = !!v;\n return this;\n };\n\n p.escapeQuerySpace = function(v) {\n this._parts.escapeQuerySpace = !!v;\n return this;\n };\n\n return URI;\n}));\n"]}]}