'use strict'; var token = '%[a-f0-9]{2}'; var singleMatcher = new RegExp(token, 'gi'); var multiMatcher = new RegExp('(' + token + ')+', 'gi'); function decodeComponents(components, split){ try { return decodeURIComponent(components.join('')); } catch (err) { } if (_AN_Read_length('length', components) === 1) { return components; } split = split || 1; var left = components.slice(0, split); var right = components.slice(split); return Array.prototype.concat.call([] , decodeComponents(left), decodeComponents(right)); } function decode(input){ try { return decodeURIComponent(input); } catch (err) { var tokens = input.match(singleMatcher); for (var i = 1; i < _AN_Read_length('length', tokens); i++ ){ input = decodeComponents(tokens, i).join(''); tokens = input.match(singleMatcher); } return input; } } function customDecodeURIComponent(input){ var replaceMap = { '%FE%FF': '\uFFFD\uFFFD', '%FF%FE': '\uFFFD\uFFFD'} ; var match = multiMatcher.exec(input); while (match){ try { replaceMap[match[0]] = decodeURIComponent(match[0]); } catch (err) { var result = decode(match[0]); if (result !== match[0]) { replaceMap[match[0]] = result; } } match = multiMatcher.exec(input); } replaceMap["%C2"] = '\uFFFD'; var entries = Object.keys(replaceMap); for (var i = 0; i < _AN_Read_length('length', entries); i++ ){ var key = entries[i]; input = _AN_Call_replace('replace', input, new RegExp(key, 'g'), replaceMap[key]); } return input; } module.exports = function (encodedURI){ if (typeof encodedURI !== 'string') { throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`') } try { encodedURI = _AN_Call_replace('replace', encodedURI, /\+/g, ' '); return decodeURIComponent(encodedURI); } catch (err) { return customDecodeURIComponent(encodedURI); } } ;