webpackJsonp([0],{"++K3":function(module,exports){eval("/**\n * Copyright 2004-present Facebook. All Rights Reserved.\n *\n * @providesModule UserAgent_DEPRECATED\n */\n\n/**\n * Provides entirely client-side User Agent and OS detection. You should prefer\n * the non-deprecated UserAgent module when possible, which exposes our\n * authoritative server-side PHP-based detection to the client.\n *\n * Usage is straightforward:\n *\n * if (UserAgent_DEPRECATED.ie()) {\n * // IE\n * }\n *\n * You can also do version checks:\n *\n * if (UserAgent_DEPRECATED.ie() >= 7) {\n * // IE7 or better\n * }\n *\n * The browser functions will return NaN if the browser does not match, so\n * you can also do version compares the other way:\n *\n * if (UserAgent_DEPRECATED.ie() < 7) {\n * // IE6 or worse\n * }\n *\n * Note that the version is a float and may include a minor version number,\n * so you should always use range operators to perform comparisons, not\n * strict equality.\n *\n * **Note:** You should **strongly** prefer capability detection to browser\n * version detection where it's reasonable:\n *\n * http://www.quirksmode.org/js/support.html\n *\n * Further, we have a large number of mature wrapper functions and classes\n * which abstract away many browser irregularities. Check the documentation,\n * grep for things, or ask on javascript@lists.facebook.com before writing yet\n * another copy of \"event || window.event\".\n *\n */\n\nvar _populated = false;\n\n// Browsers\nvar _ie, _firefox, _opera, _webkit, _chrome;\n\n// Actual IE browser for compatibility mode\nvar _ie_real_version;\n\n// Platforms\nvar _osx, _windows, _linux, _android;\n\n// Architectures\nvar _win64;\n\n// Devices\nvar _iphone, _ipad, _native;\n\nvar _mobile;\n\nfunction _populate() {\n if (_populated) {\n return;\n }\n\n _populated = true;\n\n // To work around buggy JS libraries that can't handle multi-digit\n // version numbers, Opera 10's user agent string claims it's Opera\n // 9, then later includes a Version/X.Y field:\n //\n // Opera/9.80 (foo) Presto/2.2.15 Version/10.10\n var uas = navigator.userAgent;\n var agent = /(?:MSIE.(\\d+\\.\\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\\d+\\.\\d+))|(?:Opera(?:.+Version.|.)(\\d+\\.\\d+))|(?:AppleWebKit.(\\d+(?:\\.\\d+)?))|(?:Trident\\/\\d+\\.\\d+.*rv:(\\d+\\.\\d+))/.exec(uas);\n var os = /(Mac OS X)|(Windows)|(Linux)/.exec(uas);\n\n _iphone = /\\b(iPhone|iP[ao]d)/.exec(uas);\n _ipad = /\\b(iP[ao]d)/.exec(uas);\n _android = /Android/i.exec(uas);\n _native = /FBAN\\/\\w+;/i.exec(uas);\n _mobile = /Mobile/i.exec(uas);\n\n // Note that the IE team blog would have you believe you should be checking\n // for 'Win64; x64'. But MSDN then reveals that you can actually be coming\n // from either x64 or ia64; so ultimately, you should just check for Win64\n // as in indicator of whether you're in 64-bit IE. 32-bit IE on 64-bit\n // Windows will send 'WOW64' instead.\n _win64 = !!(/Win64/.exec(uas));\n\n if (agent) {\n _ie = agent[1] ? parseFloat(agent[1]) : (\n agent[5] ? parseFloat(agent[5]) : NaN);\n // IE compatibility mode\n if (_ie && document && document.documentMode) {\n _ie = document.documentMode;\n }\n // grab the \"true\" ie version from the trident token if available\n var trident = /(?:Trident\\/(\\d+.\\d+))/.exec(uas);\n _ie_real_version = trident ? parseFloat(trident[1]) + 4 : _ie;\n\n _firefox = agent[2] ? parseFloat(agent[2]) : NaN;\n _opera = agent[3] ? parseFloat(agent[3]) : NaN;\n _webkit = agent[4] ? parseFloat(agent[4]) : NaN;\n if (_webkit) {\n // We do not add the regexp to the above test, because it will always\n // match 'safari' only since 'AppleWebKit' appears before 'Chrome' in\n // the userAgent string.\n agent = /(?:Chrome\\/(\\d+\\.\\d+))/.exec(uas);\n _chrome = agent && agent[1] ? parseFloat(agent[1]) : NaN;\n } else {\n _chrome = NaN;\n }\n } else {\n _ie = _firefox = _opera = _chrome = _webkit = NaN;\n }\n\n if (os) {\n if (os[1]) {\n // Detect OS X version. If no version number matches, set _osx to true.\n // Version examples: 10, 10_6_1, 10.7\n // Parses version number as a float, taking only first two sets of\n // digits. If only one set of digits is found, returns just the major\n // version number.\n var ver = /(?:Mac OS X (\\d+(?:[._]\\d+)?))/.exec(uas);\n\n _osx = ver ? parseFloat(ver[1].replace('_', '.')) : true;\n } else {\n _osx = false;\n }\n _windows = !!os[2];\n _linux = !!os[3];\n } else {\n _osx = _windows = _linux = false;\n }\n}\n\nvar UserAgent_DEPRECATED = {\n\n /**\n * Check if the UA is Internet Explorer.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n ie: function() {\n return _populate() || _ie;\n },\n\n /**\n * Check if we're in Internet Explorer compatibility mode.\n *\n * @return bool true if in compatibility mode, false if\n * not compatibility mode or not ie\n */\n ieCompatibilityMode: function() {\n return _populate() || (_ie_real_version > _ie);\n },\n\n\n /**\n * Whether the browser is 64-bit IE. Really, this is kind of weak sauce; we\n * only need this because Skype can't handle 64-bit IE yet. We need to remove\n * this when we don't need it -- tracked by #601957.\n */\n ie64: function() {\n return UserAgent_DEPRECATED.ie() && _win64;\n },\n\n /**\n * Check if the UA is Firefox.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n firefox: function() {\n return _populate() || _firefox;\n },\n\n\n /**\n * Check if the UA is Opera.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n opera: function() {\n return _populate() || _opera;\n },\n\n\n /**\n * Check if the UA is WebKit.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n webkit: function() {\n return _populate() || _webkit;\n },\n\n /**\n * For Push\n * WILL BE REMOVED VERY SOON. Use UserAgent_DEPRECATED.webkit\n */\n safari: function() {\n return UserAgent_DEPRECATED.webkit();\n },\n\n /**\n * Check if the UA is a Chrome browser.\n *\n *\n * @return float|NaN Version number (if match) or NaN.\n */\n chrome : function() {\n return _populate() || _chrome;\n },\n\n\n /**\n * Check if the user is running Windows.\n *\n * @return bool `true' if the user's OS is Windows.\n */\n windows: function() {\n return _populate() || _windows;\n },\n\n\n /**\n * Check if the user is running Mac OS X.\n *\n * @return float|bool Returns a float if a version number is detected,\n * otherwise true/false.\n */\n osx: function() {\n return _populate() || _osx;\n },\n\n /**\n * Check if the user is running Linux.\n *\n * @return bool `true' if the user's OS is some flavor of Linux.\n */\n linux: function() {\n return _populate() || _linux;\n },\n\n /**\n * Check if the user is running on an iPhone or iPod platform.\n *\n * @return bool `true' if the user is running some flavor of the\n * iPhone OS.\n */\n iphone: function() {\n return _populate() || _iphone;\n },\n\n mobile: function() {\n return _populate() || (_iphone || _ipad || _android || _mobile);\n },\n\n nativeApp: function() {\n // webviews inside of the native apps\n return _populate() || _native;\n },\n\n android: function() {\n return _populate() || _android;\n },\n\n ipad: function() {\n return _populate() || _ipad;\n }\n};\n\nmodule.exports = UserAgent_DEPRECATED;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKytLMy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ub3JtYWxpemUtd2hlZWwvc3JjL1VzZXJBZ2VudF9ERVBSRUNBVEVELmpzP2ZiZTIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgMjAwNC1wcmVzZW50IEZhY2Vib29rLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBVc2VyQWdlbnRfREVQUkVDQVRFRFxuICovXG5cbi8qKlxuICogIFByb3ZpZGVzIGVudGlyZWx5IGNsaWVudC1zaWRlIFVzZXIgQWdlbnQgYW5kIE9TIGRldGVjdGlvbi4gWW91IHNob3VsZCBwcmVmZXJcbiAqICB0aGUgbm9uLWRlcHJlY2F0ZWQgVXNlckFnZW50IG1vZHVsZSB3aGVuIHBvc3NpYmxlLCB3aGljaCBleHBvc2VzIG91clxuICogIGF1dGhvcml0YXRpdmUgc2VydmVyLXNpZGUgUEhQLWJhc2VkIGRldGVjdGlvbiB0byB0aGUgY2xpZW50LlxuICpcbiAqICBVc2FnZSBpcyBzdHJhaWdodGZvcndhcmQ6XG4gKlxuICogICAgaWYgKFVzZXJBZ2VudF9ERVBSRUNBVEVELmllKCkpIHtcbiAqICAgICAgLy8gIElFXG4gKiAgICB9XG4gKlxuICogIFlvdSBjYW4gYWxzbyBkbyB2ZXJzaW9uIGNoZWNrczpcbiAqXG4gKiAgICBpZiAoVXNlckFnZW50X0RFUFJFQ0FURUQuaWUoKSA+PSA3KSB7XG4gKiAgICAgIC8vICBJRTcgb3IgYmV0dGVyXG4gKiAgICB9XG4gKlxuICogIFRoZSBicm93c2VyIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBOYU4gaWYgdGhlIGJyb3dzZXIgZG9lcyBub3QgbWF0Y2gsIHNvXG4gKiAgeW91IGNhbiBhbHNvIGRvIHZlcnNpb24gY29tcGFyZXMgdGhlIG90aGVyIHdheTpcbiAqXG4gKiAgICBpZiAoVXNlckFnZW50X0RFUFJFQ0FURUQuaWUoKSA8IDcpIHtcbiAqICAgICAgLy8gIElFNiBvciB3b3JzZVxuICogICAgfVxuICpcbiAqICBOb3RlIHRoYXQgdGhlIHZlcnNpb24gaXMgYSBmbG9hdCBhbmQgbWF5IGluY2x1ZGUgYSBtaW5vciB2ZXJzaW9uIG51bWJlcixcbiAqICBzbyB5b3Ugc2hvdWxkIGFsd2F5cyB1c2UgcmFuZ2Ugb3BlcmF0b3JzIHRvIHBlcmZvcm0gY29tcGFyaXNvbnMsIG5vdFxuICogIHN0cmljdCBlcXVhbGl0eS5cbiAqXG4gKiAgKipOb3RlOioqIFlvdSBzaG91bGQgKipzdHJvbmdseSoqIHByZWZlciBjYXBhYmlsaXR5IGRldGVjdGlvbiB0byBicm93c2VyXG4gKiAgdmVyc2lvbiBkZXRlY3Rpb24gd2hlcmUgaXQncyByZWFzb25hYmxlOlxuICpcbiAqICAgIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvc3VwcG9ydC5odG1sXG4gKlxuICogIEZ1cnRoZXIsIHdlIGhhdmUgYSBsYXJnZSBudW1iZXIgb2YgbWF0dXJlIHdyYXBwZXIgZnVuY3Rpb25zIGFuZCBjbGFzc2VzXG4gKiAgd2hpY2ggYWJzdHJhY3QgYXdheSBtYW55IGJyb3dzZXIgaXJyZWd1bGFyaXRpZXMuIENoZWNrIHRoZSBkb2N1bWVudGF0aW9uLFxuICogIGdyZXAgZm9yIHRoaW5ncywgb3IgYXNrIG9uIGphdmFzY3JpcHRAbGlzdHMuZmFjZWJvb2suY29tIGJlZm9yZSB3cml0aW5nIHlldFxuICogIGFub3RoZXIgY29weSBvZiBcImV2ZW50IHx8IHdpbmRvdy5ldmVudFwiLlxuICpcbiAqL1xuXG52YXIgX3BvcHVsYXRlZCA9IGZhbHNlO1xuXG4vLyBCcm93c2Vyc1xudmFyIF9pZSwgX2ZpcmVmb3gsIF9vcGVyYSwgX3dlYmtpdCwgX2Nocm9tZTtcblxuLy8gQWN0dWFsIElFIGJyb3dzZXIgZm9yIGNvbXBhdGliaWxpdHkgbW9kZVxudmFyIF9pZV9yZWFsX3ZlcnNpb247XG5cbi8vIFBsYXRmb3Jtc1xudmFyIF9vc3gsIF93aW5kb3dzLCBfbGludXgsIF9hbmRyb2lkO1xuXG4vLyBBcmNoaXRlY3R1cmVzXG52YXIgX3dpbjY0O1xuXG4vLyBEZXZpY2VzXG52YXIgX2lwaG9uZSwgX2lwYWQsIF9uYXRpdmU7XG5cbnZhciBfbW9iaWxlO1xuXG5mdW5jdGlvbiBfcG9wdWxhdGUoKSB7XG4gIGlmIChfcG9wdWxhdGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgX3BvcHVsYXRlZCA9IHRydWU7XG5cbiAgLy8gVG8gd29yayBhcm91bmQgYnVnZ3kgSlMgbGlicmFyaWVzIHRoYXQgY2FuJ3QgaGFuZGxlIG11bHRpLWRpZ2l0XG4gIC8vIHZlcnNpb24gbnVtYmVycywgT3BlcmEgMTAncyB1c2VyIGFnZW50IHN0cmluZyBjbGFpbXMgaXQncyBPcGVyYVxuICAvLyA5LCB0aGVuIGxhdGVyIGluY2x1ZGVzIGEgVmVyc2lvbi9YLlkgZmllbGQ6XG4gIC8vXG4gIC8vIE9wZXJhLzkuODAgKGZvbykgUHJlc3RvLzIuMi4xNSBWZXJzaW9uLzEwLjEwXG4gIHZhciB1YXMgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xuICB2YXIgYWdlbnQgPSAvKD86TVNJRS4oXFxkK1xcLlxcZCspKXwoPzooPzpGaXJlZm94fEdyYW5QYXJhZGlzb3xJY2V3ZWFzZWwpLihcXGQrXFwuXFxkKykpfCg/Ok9wZXJhKD86LitWZXJzaW9uLnwuKShcXGQrXFwuXFxkKykpfCg/OkFwcGxlV2ViS2l0LihcXGQrKD86XFwuXFxkKyk/KSl8KD86VHJpZGVudFxcL1xcZCtcXC5cXGQrLipydjooXFxkK1xcLlxcZCspKS8uZXhlYyh1YXMpO1xuICB2YXIgb3MgICAgPSAvKE1hYyBPUyBYKXwoV2luZG93cyl8KExpbnV4KS8uZXhlYyh1YXMpO1xuXG4gIF9pcGhvbmUgPSAvXFxiKGlQaG9uZXxpUFthb11kKS8uZXhlYyh1YXMpO1xuICBfaXBhZCA9IC9cXGIoaVBbYW9dZCkvLmV4ZWModWFzKTtcbiAgX2FuZHJvaWQgPSAvQW5kcm9pZC9pLmV4ZWModWFzKTtcbiAgX25hdGl2ZSA9IC9GQkFOXFwvXFx3KzsvaS5leGVjKHVhcyk7XG4gIF9tb2JpbGUgPSAvTW9iaWxlL2kuZXhlYyh1YXMpO1xuXG4gIC8vIE5vdGUgdGhhdCB0aGUgSUUgdGVhbSBibG9nIHdvdWxkIGhhdmUgeW91IGJlbGlldmUgeW91IHNob3VsZCBiZSBjaGVja2luZ1xuICAvLyBmb3IgJ1dpbjY0OyB4NjQnLiAgQnV0IE1TRE4gdGhlbiByZXZlYWxzIHRoYXQgeW91IGNhbiBhY3R1YWxseSBiZSBjb21pbmdcbiAgLy8gZnJvbSBlaXRoZXIgeDY0IG9yIGlhNjQ7ICBzbyB1bHRpbWF0ZWx5LCB5b3Ugc2hvdWxkIGp1c3QgY2hlY2sgZm9yIFdpbjY0XG4gIC8vIGFzIGluIGluZGljYXRvciBvZiB3aGV0aGVyIHlvdSdyZSBpbiA2NC1iaXQgSUUuICAzMi1iaXQgSUUgb24gNjQtYml0XG4gIC8vIFdpbmRvd3Mgd2lsbCBzZW5kICdXT1c2NCcgaW5zdGVhZC5cbiAgX3dpbjY0ID0gISEoL1dpbjY0Ly5leGVjKHVhcykpO1xuXG4gIGlmIChhZ2VudCkge1xuICAgIF9pZSA9IGFnZW50WzFdID8gcGFyc2VGbG9hdChhZ2VudFsxXSkgOiAoXG4gICAgICAgICAgYWdlbnRbNV0gPyBwYXJzZUZsb2F0KGFnZW50WzVdKSA6IE5hTik7XG4gICAgLy8gSUUgY29tcGF0aWJpbGl0eSBtb2RlXG4gICAgaWYgKF9pZSAmJiBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudE1vZGUpIHtcbiAgICAgIF9pZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZTtcbiAgICB9XG4gICAgLy8gZ3JhYiB0aGUgXCJ0cnVlXCIgaWUgdmVyc2lvbiBmcm9tIHRoZSB0cmlkZW50IHRva2VuIGlmIGF2YWlsYWJsZVxuICAgIHZhciB0cmlkZW50ID0gLyg/OlRyaWRlbnRcXC8oXFxkKy5cXGQrKSkvLmV4ZWModWFzKTtcbiAgICBfaWVfcmVhbF92ZXJzaW9uID0gdHJpZGVudCA/IHBhcnNlRmxvYXQodHJpZGVudFsxXSkgKyA0IDogX2llO1xuXG4gICAgX2ZpcmVmb3ggPSBhZ2VudFsyXSA/IHBhcnNlRmxvYXQoYWdlbnRbMl0pIDogTmFOO1xuICAgIF9vcGVyYSAgID0gYWdlbnRbM10gPyBwYXJzZUZsb2F0KGFnZW50WzNdKSA6IE5hTjtcbiAgICBfd2Via2l0ICA9IGFnZW50WzRdID8gcGFyc2VGbG9hdChhZ2VudFs0XSkgOiBOYU47XG4gICAgaWYgKF93ZWJraXQpIHtcbiAgICAgIC8vIFdlIGRvIG5vdCBhZGQgdGhlIHJlZ2V4cCB0byB0aGUgYWJvdmUgdGVzdCwgYmVjYXVzZSBpdCB3aWxsIGFsd2F5c1xuICAgICAgLy8gbWF0Y2ggJ3NhZmFyaScgb25seSBzaW5jZSAnQXBwbGVXZWJLaXQnIGFwcGVhcnMgYmVmb3JlICdDaHJvbWUnIGluXG4gICAgICAvLyB0aGUgdXNlckFnZW50IHN0cmluZy5cbiAgICAgIGFnZW50ID0gLyg/OkNocm9tZVxcLyhcXGQrXFwuXFxkKykpLy5leGVjKHVhcyk7XG4gICAgICBfY2hyb21lID0gYWdlbnQgJiYgYWdlbnRbMV0gPyBwYXJzZUZsb2F0KGFnZW50WzFdKSA6IE5hTjtcbiAgICB9IGVsc2Uge1xuICAgICAgX2Nocm9tZSA9IE5hTjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgX2llID0gX2ZpcmVmb3ggPSBfb3BlcmEgPSBfY2hyb21lID0gX3dlYmtpdCA9IE5hTjtcbiAgfVxuXG4gIGlmIChvcykge1xuICAgIGlmIChvc1sxXSkge1xuICAgICAgLy8gRGV0ZWN0IE9TIFggdmVyc2lvbi4gIElmIG5vIHZlcnNpb24gbnVtYmVyIG1hdGNoZXMsIHNldCBfb3N4IHRvIHRydWUuXG4gICAgICAvLyBWZXJzaW9uIGV4YW1wbGVzOiAgMTAsIDEwXzZfMSwgMTAuN1xuICAgICAgLy8gUGFyc2VzIHZlcnNpb24gbnVtYmVyIGFzIGEgZmxvYXQsIHRha2luZyBvbmx5IGZpcnN0IHR3byBzZXRzIG9mXG4gICAgICAvLyBkaWdpdHMuICBJZiBvbmx5IG9uZSBzZXQgb2YgZGlnaXRzIGlzIGZvdW5kLCByZXR1cm5zIGp1c3QgdGhlIG1ham9yXG4gICAgICAvLyB2ZXJzaW9uIG51bWJlci5cbiAgICAgIHZhciB2ZXIgPSAvKD86TWFjIE9TIFggKFxcZCsoPzpbLl9dXFxkKyk/KSkvLmV4ZWModWFzKTtcblxuICAgICAgX29zeCA9IHZlciA/IHBhcnNlRmxvYXQodmVyWzFdLnJlcGxhY2UoJ18nLCAnLicpKSA6IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9vc3ggPSBmYWxzZTtcbiAgICB9XG4gICAgX3dpbmRvd3MgPSAhIW9zWzJdO1xuICAgIF9saW51eCAgID0gISFvc1szXTtcbiAgfSBlbHNlIHtcbiAgICBfb3N4ID0gX3dpbmRvd3MgPSBfbGludXggPSBmYWxzZTtcbiAgfVxufVxuXG52YXIgVXNlckFnZW50X0RFUFJFQ0FURUQgPSB7XG5cbiAgLyoqXG4gICAqICBDaGVjayBpZiB0aGUgVUEgaXMgSW50ZXJuZXQgRXhwbG9yZXIuXG4gICAqXG4gICAqXG4gICAqICBAcmV0dXJuIGZsb2F0fE5hTiBWZXJzaW9uIG51bWJlciAoaWYgbWF0Y2gpIG9yIE5hTi5cbiAgICovXG4gIGllOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gX3BvcHVsYXRlKCkgfHwgX2llO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB3ZSdyZSBpbiBJbnRlcm5ldCBFeHBsb3JlciBjb21wYXRpYmlsaXR5IG1vZGUuXG4gICAqXG4gICAqIEByZXR1cm4gYm9vbCB0cnVlIGlmIGluIGNvbXBhdGliaWxpdHkgbW9kZSwgZmFsc2UgaWZcbiAgICogbm90IGNvbXBhdGliaWxpdHkgbW9kZSBvciBub3QgaWVcbiAgICovXG4gIGllQ29tcGF0aWJpbGl0eU1vZGU6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBfcG9wdWxhdGUoKSB8fCAoX2llX3JlYWxfdmVyc2lvbiA+IF9pZSk7XG4gIH0sXG5cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnJvd3NlciBpcyA2NC1iaXQgSUUuICBSZWFsbHksIHRoaXMgaXMga2luZCBvZiB3ZWFrIHNhdWNlOyAgd2VcbiAgICogb25seSBuZWVkIHRoaXMgYmVjYXVzZSBTa3lwZSBjYW4ndCBoYW5kbGUgNjQtYml0IElFIHlldC4gIFdlIG5lZWQgdG8gcmVtb3ZlXG4gICAqIHRoaXMgd2hlbiB3ZSBkb24ndCBuZWVkIGl0IC0tIHRyYWNrZWQgYnkgIzYwMTk1Ny5cbiAgICovXG4gIGllNjQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBVc2VyQWdlbnRfREVQUkVDQVRFRC5pZSgpICYmIF93aW42NDtcbiAgfSxcblxuICAvKipcbiAgICogIENoZWNrIGlmIHRoZSBVQSBpcyBGaXJlZm94LlxuICAgKlxuICAgKlxuICAgKiAgQHJldHVybiBmbG9hdHxOYU4gVmVyc2lvbiBudW1iZXIgKGlmIG1hdGNoKSBvciBOYU4uXG4gICAqL1xuICBmaXJlZm94OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gX3BvcHVsYXRlKCkgfHwgX2ZpcmVmb3g7XG4gIH0sXG5cblxuICAvKipcbiAgICogIENoZWNrIGlmIHRoZSBVQSBpcyBPcGVyYS5cbiAgICpcbiAgICpcbiAgICogIEByZXR1cm4gZmxvYXR8TmFOIFZlcnNpb24gbnVtYmVyIChpZiBtYXRjaCkgb3IgTmFOLlxuICAgKi9cbiAgb3BlcmE6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBfcG9wdWxhdGUoKSB8fCBfb3BlcmE7XG4gIH0sXG5cblxuICAvKipcbiAgICogIENoZWNrIGlmIHRoZSBVQSBpcyBXZWJLaXQuXG4gICAqXG4gICAqXG4gICAqICBAcmV0dXJuIGZsb2F0fE5hTiBWZXJzaW9uIG51bWJlciAoaWYgbWF0Y2gpIG9yIE5hTi5cbiAgICovXG4gIHdlYmtpdDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIF9wb3B1bGF0ZSgpIHx8IF93ZWJraXQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqICBGb3IgUHVzaFxuICAgKiAgV0lMTCBCRSBSRU1PVkVEIFZFUlkgU09PTi4gVXNlIFVzZXJBZ2VudF9ERVBSRUNBVEVELndlYmtpdFxuICAgKi9cbiAgc2FmYXJpOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gVXNlckFnZW50X0RFUFJFQ0FURUQud2Via2l0KCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqICBDaGVjayBpZiB0aGUgVUEgaXMgYSBDaHJvbWUgYnJvd3Nlci5cbiAgICpcbiAgICpcbiAgICogIEByZXR1cm4gZmxvYXR8TmFOIFZlcnNpb24gbnVtYmVyIChpZiBtYXRjaCkgb3IgTmFOLlxuICAgKi9cbiAgY2hyb21lIDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIF9wb3B1bGF0ZSgpIHx8IF9jaHJvbWU7XG4gIH0sXG5cblxuICAvKipcbiAgICogIENoZWNrIGlmIHRoZSB1c2VyIGlzIHJ1bm5pbmcgV2luZG93cy5cbiAgICpcbiAgICogIEByZXR1cm4gYm9vbCBgdHJ1ZScgaWYgdGhlIHVzZXIncyBPUyBpcyBXaW5kb3dzLlxuICAgKi9cbiAgd2luZG93czogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIF9wb3B1bGF0ZSgpIHx8IF93aW5kb3dzO1xuICB9LFxuXG5cbiAgLyoqXG4gICAqICBDaGVjayBpZiB0aGUgdXNlciBpcyBydW5uaW5nIE1hYyBPUyBYLlxuICAgKlxuICAgKiAgQHJldHVybiBmbG9hdHxib29sICAgUmV0dXJucyBhIGZsb2F0IGlmIGEgdmVyc2lvbiBudW1iZXIgaXMgZGV0ZWN0ZWQsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgdHJ1ZS9mYWxzZS5cbiAgICovXG4gIG9zeDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIF9wb3B1bGF0ZSgpIHx8IF9vc3g7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSB1c2VyIGlzIHJ1bm5pbmcgTGludXguXG4gICAqXG4gICAqIEByZXR1cm4gYm9vbCBgdHJ1ZScgaWYgdGhlIHVzZXIncyBPUyBpcyBzb21lIGZsYXZvciBvZiBMaW51eC5cbiAgICovXG4gIGxpbnV4OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gX3BvcHVsYXRlKCkgfHwgX2xpbnV4O1xuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgdXNlciBpcyBydW5uaW5nIG9uIGFuIGlQaG9uZSBvciBpUG9kIHBsYXRmb3JtLlxuICAgKlxuICAgKiBAcmV0dXJuIGJvb2wgYHRydWUnIGlmIHRoZSB1c2VyIGlzIHJ1bm5pbmcgc29tZSBmbGF2b3Igb2YgdGhlXG4gICAqICAgIGlQaG9uZSBPUy5cbiAgICovXG4gIGlwaG9uZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIF9wb3B1bGF0ZSgpIHx8IF9pcGhvbmU7XG4gIH0sXG5cbiAgbW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gX3BvcHVsYXRlKCkgfHwgKF9pcGhvbmUgfHwgX2lwYWQgfHwgX2FuZHJvaWQgfHwgX21vYmlsZSk7XG4gIH0sXG5cbiAgbmF0aXZlQXBwOiBmdW5jdGlvbigpIHtcbiAgICAvLyB3ZWJ2aWV3cyBpbnNpZGUgb2YgdGhlIG5hdGl2ZSBhcHBzXG4gICAgcmV0dXJuIF9wb3B1bGF0ZSgpIHx8IF9uYXRpdmU7XG4gIH0sXG5cbiAgYW5kcm9pZDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIF9wb3B1bGF0ZSgpIHx8IF9hbmRyb2lkO1xuICB9LFxuXG4gIGlwYWQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBfcG9wdWxhdGUoKSB8fCBfaXBhZDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBVc2VyQWdlbnRfREVQUkVDQVRFRDtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL25vcm1hbGl6ZS13aGVlbC9zcmMvVXNlckFnZW50X0RFUFJFQ0FURUQuanNcbi8vIG1vZHVsZSBpZCA9ICsrSzNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///++K3\n")},"+E39":function(module,exports,__webpack_require__){eval("// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(\"S82l\")(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiK0UzOS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanM/Zjg0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kZXNjcmlwdG9ycy5qc1xuLy8gbW9kdWxlIGlkID0gK0UzOVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///+E39\n")},"+ZMJ":function(module,exports,__webpack_require__){eval('// optional / simple context binding\nvar aFunction = __webpack_require__("lOnJ");\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiK1pNSi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY3R4LmpzP2Y5OTMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2N0eC5qc1xuLy8gbW9kdWxlIGlkID0gK1pNSlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///+ZMJ\n')},"+tPU":function(module,exports,__webpack_require__){eval("__webpack_require__(\"xGkn\");\nvar global = __webpack_require__(\"7KvD\");\nvar hide = __webpack_require__(\"hJx8\");\nvar Iterators = __webpack_require__(\"/bQp\");\nvar TO_STRING_TAG = __webpack_require__(\"dSzd\")('toStringTag');\n\nvar DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +\n 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +\n 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +\n 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +\n 'TextTrackList,TouchList').split(',');\n\nfor (var i = 0; i < DOMIterables.length; i++) {\n var NAME = DOMIterables[i];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = Iterators.Array;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiK3RQVS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzP2ZhZDMiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIFRPX1NUUklOR19UQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxudmFyIERPTUl0ZXJhYmxlcyA9ICgnQ1NTUnVsZUxpc3QsQ1NTU3R5bGVEZWNsYXJhdGlvbixDU1NWYWx1ZUxpc3QsQ2xpZW50UmVjdExpc3QsRE9NUmVjdExpc3QsRE9NU3RyaW5nTGlzdCwnICtcbiAgJ0RPTVRva2VuTGlzdCxEYXRhVHJhbnNmZXJJdGVtTGlzdCxGaWxlTGlzdCxIVE1MQWxsQ29sbGVjdGlvbixIVE1MQ29sbGVjdGlvbixIVE1MRm9ybUVsZW1lbnQsSFRNTFNlbGVjdEVsZW1lbnQsJyArXG4gICdNZWRpYUxpc3QsTWltZVR5cGVBcnJheSxOYW1lZE5vZGVNYXAsTm9kZUxpc3QsUGFpbnRSZXF1ZXN0TGlzdCxQbHVnaW4sUGx1Z2luQXJyYXksU1ZHTGVuZ3RoTGlzdCxTVkdOdW1iZXJMaXN0LCcgK1xuICAnU1ZHUGF0aFNlZ0xpc3QsU1ZHUG9pbnRMaXN0LFNWR1N0cmluZ0xpc3QsU1ZHVHJhbnNmb3JtTGlzdCxTb3VyY2VCdWZmZXJMaXN0LFN0eWxlU2hlZXRMaXN0LFRleHRUcmFja0N1ZUxpc3QsJyArXG4gICdUZXh0VHJhY2tMaXN0LFRvdWNoTGlzdCcpLnNwbGl0KCcsJyk7XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgRE9NSXRlcmFibGVzLmxlbmd0aDsgaSsrKSB7XG4gIHZhciBOQU1FID0gRE9NSXRlcmFibGVzW2ldO1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgaWYgKHByb3RvICYmICFwcm90b1tUT19TVFJJTkdfVEFHXSkgaGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IEl0ZXJhdG9ycy5BcnJheTtcbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanNcbi8vIG1vZHVsZSBpZCA9ICt0UFVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///+tPU\n")},"//Fk":function(module,exports,__webpack_require__){eval('module.exports = { "default": __webpack_require__("U5ju"), __esModule: true };//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLy9Gay5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvcHJvbWlzZS5qcz9mZmYxIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9wcm9taXNlXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3Byb21pc2UuanNcbi8vIG1vZHVsZSBpZCA9IC8vRmtcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal://///Fk\n')},"/00o":function(module,exports,__webpack_require__){eval('var common = __webpack_require__("To6e");\nvar System = common.System;\nvar VbrMode = common.VbrMode;\nvar Float = common.Float;\nvar ShortBlock = common.ShortBlock;\nvar Util = common.Util;\nvar Arrays = common.Arrays;\nvar new_array_n = common.new_array_n;\nvar new_byte = common.new_byte;\nvar new_double = common.new_double;\nvar new_float = common.new_float;\nvar new_float_n = common.new_float_n;\nvar new_int = common.new_int;\nvar new_int_n = common.new_int_n;\nvar assert = common.assert;\n\n/**\n * ENCDELAY The encoder delay.\n *\n * Minimum allowed is MDCTDELAY (see below)\n *\n * The first 96 samples will be attenuated, so using a value less than 96\n * will result in corrupt data for the first 96-ENCDELAY samples.\n *\n * suggested: 576 set to 1160 to sync with FhG.\n */\nEncoder.ENCDELAY = 576;\n/**\n * make sure there is at least one complete frame after the last frame\n * containing real data\n *\n * Using a value of 288 would be sufficient for a a very sophisticated\n * decoder that can decode granule-by-granule instead of frame by frame. But\n * lets not assume this, and assume the decoder will not decode frame N\n * unless it also has data for frame N+1\n */\nEncoder.POSTDELAY = 1152;\n\n/**\n * delay of the MDCT used in mdct.c original ISO routines had a delay of\n * 528! Takehiro\'s routines:\n */\nEncoder.MDCTDELAY = 48;\nEncoder.FFTOFFSET = (224 + Encoder.MDCTDELAY);\n\n/**\n * Most decoders, including the one we use, have a delay of 528 samples.\n */\nEncoder.DECDELAY = 528;\n\n/**\n * number of subbands\n */\nEncoder.SBLIMIT = 32;\n\n/**\n * parition bands bands\n */\nEncoder.CBANDS = 64;\n\n/**\n * number of critical bands/scale factor bands where masking is computed\n */\nEncoder.SBPSY_l = 21;\nEncoder.SBPSY_s = 12;\n\n/**\n * total number of scalefactor bands encoded\n */\nEncoder.SBMAX_l = 22;\nEncoder.SBMAX_s = 13;\nEncoder.PSFB21 = 6;\nEncoder.PSFB12 = 6;\n\n/**\n * FFT sizes\n */\nEncoder.BLKSIZE = 1024;\nEncoder.HBLKSIZE = (Encoder.BLKSIZE / 2 + 1);\nEncoder.BLKSIZE_s = 256;\nEncoder.HBLKSIZE_s = (Encoder.BLKSIZE_s / 2 + 1);\n\nEncoder.NORM_TYPE = 0;\nEncoder.START_TYPE = 1;\nEncoder.SHORT_TYPE = 2;\nEncoder.STOP_TYPE = 3;\n\n/**\n *
\n * Mode Extention:\n * When we are in stereo mode, there are 4 possible methods to store these\n * two channels. The stereo modes -m? are using a subset of them.\n *\n * -ms: MPG_MD_LR_LR\n * -mj: MPG_MD_LR_LR and MPG_MD_MS_LR\n * -mf: MPG_MD_MS_LR\n * -mi: all\n *\n */\nEncoder.MPG_MD_LR_LR = 0;\nEncoder.MPG_MD_LR_I = 1;\nEncoder.MPG_MD_MS_LR = 2;\nEncoder.MPG_MD_MS_I = 3;\n\nEncoder.fircoef = [-0.0207887 * 5, -0.0378413 * 5,\n -0.0432472 * 5, -0.031183 * 5, 7.79609e-18 * 5, 0.0467745 * 5,\n 0.10091 * 5, 0.151365 * 5, 0.187098 * 5];\n\nfunction Encoder() {\n var NewMDCT = __webpack_require__("zEpL");\n var III_psy_ratio = __webpack_require__("1xnL");\n\n var FFTOFFSET = Encoder.FFTOFFSET;\n var MPG_MD_MS_LR = Encoder.MPG_MD_MS_LR;\n //BitStream bs;\n //PsyModel psy;\n //VBRTag vbr;\n //QuantizePVT qupvt;\n var bs = null;\n this.psy = null;\n var psy = null;\n var vbr = null;\n var qupvt = null;\n\n //public final void setModules(BitStream bs, PsyModel psy, QuantizePVT qupvt,\n // VBRTag vbr) {\n this.setModules = function (_bs, _psy, _qupvt, _vbr) {\n bs = _bs;\n this.psy = _psy;\n psy = _psy;\n vbr = _vbr;\n qupvt = _qupvt;\n };\n\n var newMDCT = new NewMDCT();\n\n /***********************************************************************\n *\n * encoder and decoder delays\n *\n ***********************************************************************/\n\n /**\n *
\n * layer III enc->dec delay: 1056 (1057?) (observed)\n * layer II enc->dec delay: 480 (481?) (observed)\n *\n * polyphase 256-16 (dec or enc) = 240\n * mdct 256+32 (9*32) (dec or enc) = 288\n * total: 512+16\n *\n * My guess is that delay of polyphase filterbank is actualy 240.5\n * (there are technical reasons for this, see postings in mp3encoder).\n * So total Encode+Decode delay = ENCDELAY + 528 + 1\n *\n */\n\n\n /**\n * auto-adjust of ATH, useful for low volume Gabriel Bouvigne 3 feb 2001\n *\n * modifies some values in gfp.internal_flags.ATH (gfc.ATH)\n */\n//private void adjust_ATH(final LameInternalFlags gfc) {\n function adjust_ATH(gfc) {\n var gr2_max, max_pow;\n\n if (gfc.ATH.useAdjust == 0) {\n gfc.ATH.adjust = 1.0;\n /* no adjustment */\n return;\n }\n\n /* jd - 2001 mar 12, 27, jun 30 */\n /* loudness based on equal loudness curve; */\n /* use granule with maximum combined loudness */\n max_pow = gfc.loudness_sq[0][0];\n gr2_max = gfc.loudness_sq[1][0];\n if (gfc.channels_out == 2) {\n max_pow += gfc.loudness_sq[0][1];\n gr2_max += gfc.loudness_sq[1][1];\n } else {\n max_pow += max_pow;\n gr2_max += gr2_max;\n }\n if (gfc.mode_gr == 2) {\n max_pow = Math.max(max_pow, gr2_max);\n }\n max_pow *= 0.5;\n /* max_pow approaches 1.0 for full band noise */\n\n /* jd - 2001 mar 31, jun 30 */\n /* user tuning of ATH adjustment region */\n max_pow *= gfc.ATH.aaSensitivityP;\n\n /*\n * adjust ATH depending on range of maximum value\n */\n\n /* jd - 2001 feb27, mar12,20, jun30, jul22 */\n /* continuous curves based on approximation */\n /* to GB\'s original values. */\n /* For an increase in approximate loudness, */\n /* set ATH adjust to adjust_limit immediately */\n /* after a delay of one frame. */\n /* For a loudness decrease, reduce ATH adjust */\n /* towards adjust_limit gradually. */\n /* max_pow is a loudness squared or a power. */\n if (max_pow > 0.03125) { /* ((1 - 0.000625)/ 31.98) from curve below */\n if (gfc.ATH.adjust >= 1.0) {\n gfc.ATH.adjust = 1.0;\n } else {\n /* preceding frame has lower ATH adjust; */\n /* ascend only to the preceding adjust_limit */\n /* in case there is leading low volume */\n if (gfc.ATH.adjust < gfc.ATH.adjustLimit) {\n gfc.ATH.adjust = gfc.ATH.adjustLimit;\n }\n }\n gfc.ATH.adjustLimit = 1.0;\n } else { /* adjustment curve */\n /* about 32 dB maximum adjust (0.000625) */\n var adj_lim_new = 31.98 * max_pow + 0.000625;\n if (gfc.ATH.adjust >= adj_lim_new) { /* descend gradually */\n gfc.ATH.adjust *= adj_lim_new * 0.075 + 0.925;\n if (gfc.ATH.adjust < adj_lim_new) { /* stop descent */\n gfc.ATH.adjust = adj_lim_new;\n }\n } else { /* ascend */\n if (gfc.ATH.adjustLimit >= adj_lim_new) {\n gfc.ATH.adjust = adj_lim_new;\n } else {\n /* preceding frame has lower ATH adjust; */\n /* ascend only to the preceding adjust_limit */\n if (gfc.ATH.adjust < gfc.ATH.adjustLimit) {\n gfc.ATH.adjust = gfc.ATH.adjustLimit;\n }\n }\n }\n gfc.ATH.adjustLimit = adj_lim_new;\n }\n }\n\n /**\n *
\n * some simple statistics\n *\n * bitrate index 0: free bitrate . not allowed in VBR mode\n * : bitrates, kbps depending on MPEG version\n * bitrate index 15: forbidden\n *\n * mode_ext:\n * 0: LR\n * 1: LR-i\n * 2: MS\n * 3: MS-i\n *\n */\n function updateStats(gfc) {\n var gr, ch;\n assert(0 <= gfc.bitrate_index && gfc.bitrate_index < 16);\n assert(0 <= gfc.mode_ext && gfc.mode_ext < 4);\n\n /* count bitrate indices */\n gfc.bitrate_stereoMode_Hist[gfc.bitrate_index][4]++;\n gfc.bitrate_stereoMode_Hist[15][4]++;\n\n /* count \'em for every mode extension in case of 2 channel encoding */\n if (gfc.channels_out == 2) {\n gfc.bitrate_stereoMode_Hist[gfc.bitrate_index][gfc.mode_ext]++;\n gfc.bitrate_stereoMode_Hist[15][gfc.mode_ext]++;\n }\n for (gr = 0; gr < gfc.mode_gr; ++gr) {\n for (ch = 0; ch < gfc.channels_out; ++ch) {\n var bt = gfc.l3_side.tt[gr][ch].block_type | 0;\n if (gfc.l3_side.tt[gr][ch].mixed_block_flag != 0)\n bt = 4;\n gfc.bitrate_blockType_Hist[gfc.bitrate_index][bt]++;\n gfc.bitrate_blockType_Hist[gfc.bitrate_index][5]++;\n gfc.bitrate_blockType_Hist[15][bt]++;\n gfc.bitrate_blockType_Hist[15][5]++;\n }\n }\n }\n\n function lame_encode_frame_init(gfp, inbuf) {\n var gfc = gfp.internal_flags;\n\n var ch, gr;\n\n if (gfc.lame_encode_frame_init == 0) {\n /* prime the MDCT/polyphase filterbank with a short block */\n var i, j;\n var primebuff0 = new_float(286 + 1152 + 576);\n var primebuff1 = new_float(286 + 1152 + 576);\n gfc.lame_encode_frame_init = 1;\n for (i = 0, j = 0; i < 286 + 576 * (1 + gfc.mode_gr); ++i) {\n if (i < 576 * gfc.mode_gr) {\n primebuff0[i] = 0;\n if (gfc.channels_out == 2)\n primebuff1[i] = 0;\n } else {\n primebuff0[i] = inbuf[0][j];\n if (gfc.channels_out == 2)\n primebuff1[i] = inbuf[1][j];\n ++j;\n }\n }\n /* polyphase filtering / mdct */\n for (gr = 0; gr < gfc.mode_gr; gr++) {\n for (ch = 0; ch < gfc.channels_out; ch++) {\n gfc.l3_side.tt[gr][ch].block_type = Encoder.SHORT_TYPE;\n }\n }\n newMDCT.mdct_sub48(gfc, primebuff0, primebuff1);\n\n /* check FFT will not use a negative starting offset */\n assert(576 >= Encoder.FFTOFFSET);\n /* check if we have enough data for FFT */\n assert(gfc.mf_size >= (Encoder.BLKSIZE + gfp.framesize - Encoder.FFTOFFSET));\n /* check if we have enough data for polyphase filterbank */\n assert(gfc.mf_size >= (512 + gfp.framesize - 32));\n }\n\n }\n\n /**\n *
\n * encodeframe() Layer 3\n *\n * encode a single frame\n *\n *\n * lame_encode_frame()\n *\n *\n * gr 0 gr 1\n * inbuf: |--------------|--------------|--------------|\n *\n *\n * Polyphase (18 windows, each shifted 32)\n * gr 0:\n * window1 <----512---.\n * window18 <----512---.\n *\n * gr 1:\n * window1 <----512---.\n * window18 <----512---.\n *\n *\n *\n * MDCT output: |--------------|--------------|--------------|\n *\n * FFT\'s <---------1024---------.\n * <---------1024-------.\n *\n *\n *\n * inbuf = buffer of PCM data size=MP3 framesize\n * encoder acts on inbuf[ch][0], but output is delayed by MDCTDELAY\n * so the MDCT coefficints are from inbuf[ch][-MDCTDELAY]\n *\n * psy-model FFT has a 1 granule delay, so we feed it data for the\n * next granule.\n * FFT is centered over granule: 224+576+224\n * So FFT starts at: 576-224-MDCTDELAY\n *\n * MPEG2: FFT ends at: BLKSIZE+576-224-MDCTDELAY (1328)\n * MPEG1: FFT ends at: BLKSIZE+2*576-224-MDCTDELAY (1904)\n *\n * MPEG2: polyphase first window: [0..511]\n * 18th window: [544..1055] (1056)\n * MPEG1: 36th window: [1120..1631] (1632)\n * data needed: 512+framesize-32\n *\n * A close look newmdct.c shows that the polyphase filterbank\n * only uses data from [0..510] for each window. Perhaps because the window\n * used by the filterbank is zero for the last point, so Takehiro\'s\n * code doesn\'t bother to compute with it.\n *\n * FFT starts at 576-224-MDCTDELAY (304) = 576-FFTOFFSET\n *\n *\n */\n\n\n this.lame_encode_mp3_frame = function (gfp, inbuf_l, inbuf_r, mp3buf, mp3bufPos, mp3buf_size) {\n var mp3count;\n var masking_LR = new_array_n([2, 2]);\n /*\n * LR masking &\n * energy\n */\n masking_LR[0][0] = new III_psy_ratio();\n masking_LR[0][1] = new III_psy_ratio();\n masking_LR[1][0] = new III_psy_ratio();\n masking_LR[1][1] = new III_psy_ratio();\n var masking_MS = new_array_n([2, 2]);\n /* MS masking & energy */\n masking_MS[0][0] = new III_psy_ratio();\n masking_MS[0][1] = new III_psy_ratio();\n masking_MS[1][0] = new III_psy_ratio();\n masking_MS[1][1] = new III_psy_ratio();\n //III_psy_ratio masking[][];\n var masking;\n /* pointer to selected maskings */\n var inbuf = [null, null];\n var gfc = gfp.internal_flags;\n\n var tot_ener = new_float_n([2, 4]);\n var ms_ener_ratio = [.5, .5];\n var pe = [[0., 0.], [0., 0.]];\n var pe_MS = [[0., 0.], [0., 0.]];\n\n//float[][] pe_use;\n var pe_use;\n\n var ch, gr;\n\n inbuf[0] = inbuf_l;\n inbuf[1] = inbuf_r;\n\n if (gfc.lame_encode_frame_init == 0) {\n /* first run? */\n lame_encode_frame_init(gfp, inbuf);\n\n }\n\n /********************** padding *****************************/\n /**\n *
\n * padding method as described in\n * "MPEG-Layer3 / Bitstream Syntax and Decoding"\n * by Martin Sieler, Ralph Sperschneider\n *\n * note: there is no padding for the very first frame\n *\n * Robert Hegemann 2000-06-22\n *\n */\n gfc.padding = 0;\n if ((gfc.slot_lag -= gfc.frac_SpF) < 0) {\n gfc.slot_lag += gfp.out_samplerate;\n gfc.padding = 1;\n }\n\n /****************************************\n * Stage 1: psychoacoustic model *\n ****************************************/\n\n if (gfc.psymodel != 0) {\n /*\n * psychoacoustic model psy model has a 1 granule (576) delay that\n * we must compensate for (mt 6/99).\n */\n var ret;\n var bufp = [null, null];\n /* address of beginning of left & right granule */\n var bufpPos = 0;\n /* address of beginning of left & right granule */\n var blocktype = new_int(2);\n\n for (gr = 0; gr < gfc.mode_gr; gr++) {\n\n for (ch = 0; ch < gfc.channels_out; ch++) {\n bufp[ch] = inbuf[ch];\n bufpPos = 576 + gr * 576 - Encoder.FFTOFFSET;\n }\n if (gfp.VBR == VbrMode.vbr_mtrh || gfp.VBR == VbrMode.vbr_mt) {\n ret = psy.L3psycho_anal_vbr(gfp, bufp, bufpPos, gr,\n masking_LR, masking_MS, pe[gr], pe_MS[gr],\n tot_ener[gr], blocktype);\n } else {\n ret = psy.L3psycho_anal_ns(gfp, bufp, bufpPos, gr,\n masking_LR, masking_MS, pe[gr], pe_MS[gr],\n tot_ener[gr], blocktype);\n }\n if (ret != 0)\n return -4;\n\n if (gfp.mode == MPEGMode.JOINT_STEREO) {\n ms_ener_ratio[gr] = tot_ener[gr][2] + tot_ener[gr][3];\n if (ms_ener_ratio[gr] > 0)\n ms_ener_ratio[gr] = tot_ener[gr][3] / ms_ener_ratio[gr];\n }\n\n /* block type flags */\n for (ch = 0; ch < gfc.channels_out; ch++) {\n var cod_info = gfc.l3_side.tt[gr][ch];\n cod_info.block_type = blocktype[ch];\n cod_info.mixed_block_flag = 0;\n }\n }\n } else {\n /* no psy model */\n for (gr = 0; gr < gfc.mode_gr; gr++)\n for (ch = 0; ch < gfc.channels_out; ch++) {\n gfc.l3_side.tt[gr][ch].block_type = Encoder.NORM_TYPE;\n gfc.l3_side.tt[gr][ch].mixed_block_flag = 0;\n pe_MS[gr][ch] = pe[gr][ch] = 700;\n }\n }\n\n /* auto-adjust of ATH, useful for low volume */\n adjust_ATH(gfc);\n\n /****************************************\n * Stage 2: MDCT *\n ****************************************/\n\n /* polyphase filtering / mdct */\n newMDCT.mdct_sub48(gfc, inbuf[0], inbuf[1]);\n\n /****************************************\n * Stage 3: MS/LR decision *\n ****************************************/\n\n /* Here will be selected MS or LR coding of the 2 stereo channels */\n gfc.mode_ext = Encoder.MPG_MD_LR_LR;\n\n if (gfp.force_ms) {\n gfc.mode_ext = Encoder.MPG_MD_MS_LR;\n } else if (gfp.mode == MPEGMode.JOINT_STEREO) {\n /*\n * ms_ratio = is scaled, for historical reasons, to look like a\n * ratio of side_channel / total. 0 = signal is 100% mono .5 = L & R\n * uncorrelated\n */\n\n /**\n *
\n * [0] and [1] are the results for the two granules in MPEG-1,\n * in MPEG-2 it\'s only a faked averaging of the same value\n * _prev is the value of the last granule of the previous frame\n * _next is the value of the first granule of the next frame\n *\n */\n\n var sum_pe_MS = 0.;\n var sum_pe_LR = 0.;\n for (gr = 0; gr < gfc.mode_gr; gr++) {\n for (ch = 0; ch < gfc.channels_out; ch++) {\n sum_pe_MS += pe_MS[gr][ch];\n sum_pe_LR += pe[gr][ch];\n }\n }\n\n /* based on PE: M/S coding would not use much more bits than L/R */\n if (sum_pe_MS <= 1.00 * sum_pe_LR) {\n\n var gi0 = gfc.l3_side.tt[0];\n var gi1 = gfc.l3_side.tt[gfc.mode_gr - 1];\n\n if (gi0[0].block_type == gi0[1].block_type\n && gi1[0].block_type == gi1[1].block_type) {\n\n gfc.mode_ext = Encoder.MPG_MD_MS_LR;\n }\n }\n }\n\n /* bit and noise allocation */\n if (gfc.mode_ext == MPG_MD_MS_LR) {\n masking = masking_MS;\n /* use MS masking */\n pe_use = pe_MS;\n } else {\n masking = masking_LR;\n /* use LR masking */\n pe_use = pe;\n }\n\n /* copy data for MP3 frame analyzer */\n if (gfp.analysis && gfc.pinfo != null) {\n for (gr = 0; gr < gfc.mode_gr; gr++) {\n for (ch = 0; ch < gfc.channels_out; ch++) {\n gfc.pinfo.ms_ratio[gr] = gfc.ms_ratio[gr];\n gfc.pinfo.ms_ener_ratio[gr] = ms_ener_ratio[gr];\n gfc.pinfo.blocktype[gr][ch] = gfc.l3_side.tt[gr][ch].block_type;\n gfc.pinfo.pe[gr][ch] = pe_use[gr][ch];\n System.arraycopy(gfc.l3_side.tt[gr][ch].xr, 0,\n gfc.pinfo.xr[gr][ch], 0, 576);\n /*\n * in psymodel, LR and MS data was stored in pinfo. switch\n * to MS data:\n */\n if (gfc.mode_ext == MPG_MD_MS_LR) {\n gfc.pinfo.ers[gr][ch] = gfc.pinfo.ers[gr][ch + 2];\n System.arraycopy(gfc.pinfo.energy[gr][ch + 2], 0,\n gfc.pinfo.energy[gr][ch], 0,\n gfc.pinfo.energy[gr][ch].length);\n }\n }\n }\n }\n\n /****************************************\n * Stage 4: quantization loop *\n ****************************************/\n\n if (gfp.VBR == VbrMode.vbr_off || gfp.VBR == VbrMode.vbr_abr) {\n\n var i;\n var f;\n\n for (i = 0; i < 18; i++)\n gfc.nsPsy.pefirbuf[i] = gfc.nsPsy.pefirbuf[i + 1];\n\n f = 0.0;\n for (gr = 0; gr < gfc.mode_gr; gr++)\n for (ch = 0; ch < gfc.channels_out; ch++)\n f += pe_use[gr][ch];\n gfc.nsPsy.pefirbuf[18] = f;\n\n f = gfc.nsPsy.pefirbuf[9];\n for (i = 0; i < 9; i++)\n f += (gfc.nsPsy.pefirbuf[i] + gfc.nsPsy.pefirbuf[18 - i])\n * Encoder.fircoef[i];\n\n f = (670 * 5 * gfc.mode_gr * gfc.channels_out) / f;\n for (gr = 0; gr < gfc.mode_gr; gr++) {\n for (ch = 0; ch < gfc.channels_out; ch++) {\n pe_use[gr][ch] *= f;\n }\n }\n }\n gfc.iteration_loop.iteration_loop(gfp, pe_use, ms_ener_ratio, masking);\n\n /****************************************\n * Stage 5: bitstream formatting *\n ****************************************/\n\n /* write the frame to the bitstream */\n bs.format_bitstream(gfp);\n\n /* copy mp3 bit buffer into array */\n mp3count = bs.copy_buffer(gfc, mp3buf, mp3bufPos, mp3buf_size, 1);\n\n if (gfp.bWriteVbrTag)\n vbr.addVbrFrame(gfp);\n\n if (gfp.analysis && gfc.pinfo != null) {\n for (ch = 0; ch < gfc.channels_out; ch++) {\n var j;\n for (j = 0; j < FFTOFFSET; j++)\n gfc.pinfo.pcmdata[ch][j] = gfc.pinfo.pcmdata[ch][j\n + gfp.framesize];\n for (j = FFTOFFSET; j < 1600; j++) {\n gfc.pinfo.pcmdata[ch][j] = inbuf[ch][j - FFTOFFSET];\n }\n }\n qupvt.set_frame_pinfo(gfp, masking);\n }\n\n updateStats(gfc);\n\n return mp3count;\n }\n}\n\n\nmodule.exports = Encoder;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLzAwby5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sYW1lanMvc3JjL2pzL0VuY29kZXIuanM/ZmY0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24uanMnKTtcbnZhciBTeXN0ZW0gPSBjb21tb24uU3lzdGVtO1xudmFyIFZick1vZGUgPSBjb21tb24uVmJyTW9kZTtcbnZhciBGbG9hdCA9IGNvbW1vbi5GbG9hdDtcbnZhciBTaG9ydEJsb2NrID0gY29tbW9uLlNob3J0QmxvY2s7XG52YXIgVXRpbCA9IGNvbW1vbi5VdGlsO1xudmFyIEFycmF5cyA9IGNvbW1vbi5BcnJheXM7XG52YXIgbmV3X2FycmF5X24gPSBjb21tb24ubmV3X2FycmF5X247XG52YXIgbmV3X2J5dGUgPSBjb21tb24ubmV3X2J5dGU7XG52YXIgbmV3X2RvdWJsZSA9IGNvbW1vbi5uZXdfZG91YmxlO1xudmFyIG5ld19mbG9hdCA9IGNvbW1vbi5uZXdfZmxvYXQ7XG52YXIgbmV3X2Zsb2F0X24gPSBjb21tb24ubmV3X2Zsb2F0X247XG52YXIgbmV3X2ludCA9IGNvbW1vbi5uZXdfaW50O1xudmFyIG5ld19pbnRfbiA9IGNvbW1vbi5uZXdfaW50X247XG52YXIgYXNzZXJ0ID0gY29tbW9uLmFzc2VydDtcblxuLyoqXG4gKiBFTkNERUxBWSBUaGUgZW5jb2RlciBkZWxheS5cbiAqXG4gKiBNaW5pbXVtIGFsbG93ZWQgaXMgTURDVERFTEFZIChzZWUgYmVsb3cpXG4gKlxuICogVGhlIGZpcnN0IDk2IHNhbXBsZXMgd2lsbCBiZSBhdHRlbnVhdGVkLCBzbyB1c2luZyBhIHZhbHVlIGxlc3MgdGhhbiA5NlxuICogd2lsbCByZXN1bHQgaW4gY29ycnVwdCBkYXRhIGZvciB0aGUgZmlyc3QgOTYtRU5DREVMQVkgc2FtcGxlcy5cbiAqXG4gKiBzdWdnZXN0ZWQ6IDU3NiBzZXQgdG8gMTE2MCB0byBzeW5jIHdpdGggRmhHLlxuICovXG5FbmNvZGVyLkVOQ0RFTEFZID0gNTc2O1xuLyoqXG4gKiBtYWtlIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNvbXBsZXRlIGZyYW1lIGFmdGVyIHRoZSBsYXN0IGZyYW1lXG4gKiBjb250YWluaW5nIHJlYWwgZGF0YVxuICpcbiAqIFVzaW5nIGEgdmFsdWUgb2YgMjg4IHdvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIGEgYSB2ZXJ5IHNvcGhpc3RpY2F0ZWRcbiAqIGRlY29kZXIgdGhhdCBjYW4gZGVjb2RlIGdyYW51bGUtYnktZ3JhbnVsZSBpbnN0ZWFkIG9mIGZyYW1lIGJ5IGZyYW1lLiBCdXRcbiAqIGxldHMgbm90IGFzc3VtZSB0aGlzLCBhbmQgYXNzdW1lIHRoZSBkZWNvZGVyIHdpbGwgbm90IGRlY29kZSBmcmFtZSBOXG4gKiB1bmxlc3MgaXQgYWxzbyBoYXMgZGF0YSBmb3IgZnJhbWUgTisxXG4gKi9cbkVuY29kZXIuUE9TVERFTEFZID0gMTE1MjtcblxuLyoqXG4gKiBkZWxheSBvZiB0aGUgTURDVCB1c2VkIGluIG1kY3QuYyBvcmlnaW5hbCBJU08gcm91dGluZXMgaGFkIGEgZGVsYXkgb2ZcbiAqIDUyOCEgVGFrZWhpcm8ncyByb3V0aW5lczpcbiAqL1xuRW5jb2Rlci5NRENUREVMQVkgPSA0ODtcbkVuY29kZXIuRkZUT0ZGU0VUID0gKDIyNCArIEVuY29kZXIuTURDVERFTEFZKTtcblxuLyoqXG4gKiBNb3N0IGRlY29kZXJzLCBpbmNsdWRpbmcgdGhlIG9uZSB3ZSB1c2UsIGhhdmUgYSBkZWxheSBvZiA1Mjggc2FtcGxlcy5cbiAqL1xuRW5jb2Rlci5ERUNERUxBWSA9IDUyODtcblxuLyoqXG4gKiBudW1iZXIgb2Ygc3ViYmFuZHNcbiAqL1xuRW5jb2Rlci5TQkxJTUlUID0gMzI7XG5cbi8qKlxuICogcGFyaXRpb24gYmFuZHMgYmFuZHNcbiAqL1xuRW5jb2Rlci5DQkFORFMgPSA2NDtcblxuLyoqXG4gKiBudW1iZXIgb2YgY3JpdGljYWwgYmFuZHMvc2NhbGUgZmFjdG9yIGJhbmRzIHdoZXJlIG1hc2tpbmcgaXMgY29tcHV0ZWRcbiAqL1xuRW5jb2Rlci5TQlBTWV9sID0gMjE7XG5FbmNvZGVyLlNCUFNZX3MgPSAxMjtcblxuLyoqXG4gKiB0b3RhbCBudW1iZXIgb2Ygc2NhbGVmYWN0b3IgYmFuZHMgZW5jb2RlZFxuICovXG5FbmNvZGVyLlNCTUFYX2wgPSAyMjtcbkVuY29kZXIuU0JNQVhfcyA9IDEzO1xuRW5jb2Rlci5QU0ZCMjEgPSA2O1xuRW5jb2Rlci5QU0ZCMTIgPSA2O1xuXG4vKipcbiAqIEZGVCBzaXplc1xuICovXG5FbmNvZGVyLkJMS1NJWkUgPSAxMDI0O1xuRW5jb2Rlci5IQkxLU0laRSA9IChFbmNvZGVyLkJMS1NJWkUgLyAyICsgMSk7XG5FbmNvZGVyLkJMS1NJWkVfcyA9IDI1NjtcbkVuY29kZXIuSEJMS1NJWkVfcyA9IChFbmNvZGVyLkJMS1NJWkVfcyAvIDIgKyAxKTtcblxuRW5jb2Rlci5OT1JNX1RZUEUgPSAwO1xuRW5jb2Rlci5TVEFSVF9UWVBFID0gMTtcbkVuY29kZXIuU0hPUlRfVFlQRSA9IDI7XG5FbmNvZGVyLlNUT1BfVFlQRSA9IDM7XG5cbi8qKlxuICogPFBSRT5cbiAqIE1vZGUgRXh0ZW50aW9uOlxuICogV2hlbiB3ZSBhcmUgaW4gc3RlcmVvIG1vZGUsIHRoZXJlIGFyZSA0IHBvc3NpYmxlIG1ldGhvZHMgdG8gc3RvcmUgdGhlc2VcbiAqIHR3byBjaGFubmVscy4gVGhlIHN0ZXJlbyBtb2RlcyAtbT8gYXJlIHVzaW5nIGEgc3Vic2V0IG9mIHRoZW0uXG4gKlxuICogIC1tczogTVBHX01EX0xSX0xSXG4gKiAgLW1qOiBNUEdfTURfTFJfTFIgYW5kIE1QR19NRF9NU19MUlxuICogIC1tZjogTVBHX01EX01TX0xSXG4gKiAgLW1pOiBhbGxcbiAqIDwvUFJFPlxuICovXG5FbmNvZGVyLk1QR19NRF9MUl9MUiA9IDA7XG5FbmNvZGVyLk1QR19NRF9MUl9JID0gMTtcbkVuY29kZXIuTVBHX01EX01TX0xSID0gMjtcbkVuY29kZXIuTVBHX01EX01TX0kgPSAzO1xuXG5FbmNvZGVyLmZpcmNvZWYgPSBbLTAuMDIwNzg4NyAqIDUsIC0wLjAzNzg0MTMgKiA1LFxuICAgIC0wLjA0MzI0NzIgKiA1LCAtMC4wMzExODMgKiA1LCA3Ljc5NjA5ZS0xOCAqIDUsIDAuMDQ2Nzc0NSAqIDUsXG4gICAgMC4xMDA5MSAqIDUsIDAuMTUxMzY1ICogNSwgMC4xODcwOTggKiA1XTtcblxuZnVuY3Rpb24gRW5jb2RlcigpIHtcbiAgICB2YXIgTmV3TURDVCA9IHJlcXVpcmUoJy4vTmV3TURDVC5qcycpO1xuICAgIHZhciBJSUlfcHN5X3JhdGlvID0gcmVxdWlyZSgnLi9JSUlfcHN5X3JhdGlvLmpzJyk7XG5cbiAgICB2YXIgRkZUT0ZGU0VUID0gRW5jb2Rlci5GRlRPRkZTRVQ7XG4gICAgdmFyIE1QR19NRF9NU19MUiA9IEVuY29kZXIuTVBHX01EX01TX0xSO1xuICAgIC8vQml0U3RyZWFtIGJzO1xuICAgIC8vUHN5TW9kZWwgcHN5O1xuICAgIC8vVkJSVGFnIHZicjtcbiAgICAvL1F1YW50aXplUFZUIHF1cHZ0O1xuICAgIHZhciBicyA9IG51bGw7XG4gICAgdGhpcy5wc3kgPSBudWxsO1xuICAgIHZhciBwc3kgPSBudWxsO1xuICAgIHZhciB2YnIgPSBudWxsO1xuICAgIHZhciBxdXB2dCA9IG51bGw7XG5cbiAgICAvL3B1YmxpYyBmaW5hbCB2b2lkIHNldE1vZHVsZXMoQml0U3RyZWFtIGJzLCBQc3lNb2RlbCBwc3ksIFF1YW50aXplUFZUIHF1cHZ0LFxuICAgIC8vICAgIFZCUlRhZyB2YnIpIHtcbiAgICB0aGlzLnNldE1vZHVsZXMgPSBmdW5jdGlvbiAoX2JzLCBfcHN5LCBfcXVwdnQsIF92YnIpIHtcbiAgICAgICAgYnMgPSBfYnM7XG4gICAgICAgIHRoaXMucHN5ID0gX3BzeTtcbiAgICAgICAgcHN5ID0gX3BzeTtcbiAgICAgICAgdmJyID0gX3ZicjtcbiAgICAgICAgcXVwdnQgPSBfcXVwdnQ7XG4gICAgfTtcblxuICAgIHZhciBuZXdNRENUID0gbmV3IE5ld01EQ1QoKTtcblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAqXG4gICAgICogZW5jb2RlciBhbmQgZGVjb2RlciBkZWxheXNcbiAgICAgKlxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIC8qKlxuICAgICAqIDxQUkU+XG4gICAgICogbGF5ZXIgSUlJIGVuYy0+ZGVjIGRlbGF5OiAgMTA1NiAoMTA1Nz8pICAgKG9ic2VydmVkKVxuICAgICAqIGxheWVyICBJSSBlbmMtPmRlYyBkZWxheTogICA0ODAgICg0ODE/KSAgIChvYnNlcnZlZClcbiAgICAgKlxuICAgICAqIHBvbHlwaGFzZSAyNTYtMTYgICAgICAgICAgICAgKGRlYyBvciBlbmMpICAgICAgICA9IDI0MFxuICAgICAqIG1kY3QgICAgICAyNTYrMzIgICg5KjMyKSAgICAgKGRlYyBvciBlbmMpICAgICAgICA9IDI4OFxuICAgICAqIHRvdGFsOiAgICA1MTIrMTZcbiAgICAgKlxuICAgICAqIE15IGd1ZXNzIGlzIHRoYXQgZGVsYXkgb2YgcG9seXBoYXNlIGZpbHRlcmJhbmsgaXMgYWN0dWFseSAyNDAuNVxuICAgICAqICh0aGVyZSBhcmUgdGVjaG5pY2FsIHJlYXNvbnMgZm9yIHRoaXMsIHNlZSBwb3N0aW5ncyBpbiBtcDNlbmNvZGVyKS5cbiAgICAgKiBTbyB0b3RhbCBFbmNvZGUrRGVjb2RlIGRlbGF5ID0gRU5DREVMQVkgKyA1MjggKyAxXG4gICAgICogPC9QUkU+XG4gICAgICovXG5cblxuICAgIC8qKlxuICAgICAqIGF1dG8tYWRqdXN0IG9mIEFUSCwgdXNlZnVsIGZvciBsb3cgdm9sdW1lIEdhYnJpZWwgQm91dmlnbmUgMyBmZWIgMjAwMVxuICAgICAqXG4gICAgICogbW9kaWZpZXMgc29tZSB2YWx1ZXMgaW4gZ2ZwLmludGVybmFsX2ZsYWdzLkFUSCAoZ2ZjLkFUSClcbiAgICAgKi9cbi8vcHJpdmF0ZSB2b2lkIGFkanVzdF9BVEgoZmluYWwgTGFtZUludGVybmFsRmxhZ3MgZ2ZjKSB7XG4gICAgZnVuY3Rpb24gYWRqdXN0X0FUSChnZmMpIHtcbiAgICAgICAgdmFyIGdyMl9tYXgsIG1heF9wb3c7XG5cbiAgICAgICAgaWYgKGdmYy5BVEgudXNlQWRqdXN0ID09IDApIHtcbiAgICAgICAgICAgIGdmYy5BVEguYWRqdXN0ID0gMS4wO1xuICAgICAgICAgICAgLyogbm8gYWRqdXN0bWVudCAqL1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogamQgLSAyMDAxIG1hciAxMiwgMjcsIGp1biAzMCAqL1xuICAgICAgICAvKiBsb3VkbmVzcyBiYXNlZCBvbiBlcXVhbCBsb3VkbmVzcyBjdXJ2ZTsgKi9cbiAgICAgICAgLyogdXNlIGdyYW51bGUgd2l0aCBtYXhpbXVtIGNvbWJpbmVkIGxvdWRuZXNzICovXG4gICAgICAgIG1heF9wb3cgPSBnZmMubG91ZG5lc3Nfc3FbMF1bMF07XG4gICAgICAgIGdyMl9tYXggPSBnZmMubG91ZG5lc3Nfc3FbMV1bMF07XG4gICAgICAgIGlmIChnZmMuY2hhbm5lbHNfb3V0ID09IDIpIHtcbiAgICAgICAgICAgIG1heF9wb3cgKz0gZ2ZjLmxvdWRuZXNzX3NxWzBdWzFdO1xuICAgICAgICAgICAgZ3IyX21heCArPSBnZmMubG91ZG5lc3Nfc3FbMV1bMV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYXhfcG93ICs9IG1heF9wb3c7XG4gICAgICAgICAgICBncjJfbWF4ICs9IGdyMl9tYXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdmYy5tb2RlX2dyID09IDIpIHtcbiAgICAgICAgICAgIG1heF9wb3cgPSBNYXRoLm1heChtYXhfcG93LCBncjJfbWF4KTtcbiAgICAgICAgfVxuICAgICAgICBtYXhfcG93ICo9IDAuNTtcbiAgICAgICAgLyogbWF4X3BvdyBhcHByb2FjaGVzIDEuMCBmb3IgZnVsbCBiYW5kIG5vaXNlICovXG5cbiAgICAgICAgLyogamQgLSAyMDAxIG1hciAzMSwganVuIDMwICovXG4gICAgICAgIC8qIHVzZXIgdHVuaW5nIG9mIEFUSCBhZGp1c3RtZW50IHJlZ2lvbiAqL1xuICAgICAgICBtYXhfcG93ICo9IGdmYy5BVEguYWFTZW5zaXRpdml0eVA7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogYWRqdXN0IEFUSCBkZXBlbmRpbmcgb24gcmFuZ2Ugb2YgbWF4aW11bSB2YWx1ZVxuICAgICAgICAgKi9cblxuICAgICAgICAvKiBqZCAtIDIwMDEgZmViMjcsIG1hcjEyLDIwLCBqdW4zMCwganVsMjIgKi9cbiAgICAgICAgLyogY29udGludW91cyBjdXJ2ZXMgYmFzZWQgb24gYXBwcm94aW1hdGlvbiAqL1xuICAgICAgICAvKiB0byBHQidzIG9yaWdpbmFsIHZhbHVlcy4gKi9cbiAgICAgICAgLyogRm9yIGFuIGluY3JlYXNlIGluIGFwcHJveGltYXRlIGxvdWRuZXNzLCAqL1xuICAgICAgICAvKiBzZXQgQVRIIGFkanVzdCB0byBhZGp1c3RfbGltaXQgaW1tZWRpYXRlbHkgKi9cbiAgICAgICAgLyogYWZ0ZXIgYSBkZWxheSBvZiBvbmUgZnJhbWUuICovXG4gICAgICAgIC8qIEZvciBhIGxvdWRuZXNzIGRlY3JlYXNlLCByZWR1Y2UgQVRIIGFkanVzdCAqL1xuICAgICAgICAvKiB0b3dhcmRzIGFkanVzdF9saW1pdCBncmFkdWFsbHkuICovXG4gICAgICAgIC8qIG1heF9wb3cgaXMgYSBsb3VkbmVzcyBzcXVhcmVkIG9yIGEgcG93ZXIuICovXG4gICAgICAgIGlmIChtYXhfcG93ID4gMC4wMzEyNSkgeyAvKiAoKDEgLSAwLjAwMDYyNSkvIDMxLjk4KSBmcm9tIGN1cnZlIGJlbG93ICovXG4gICAgICAgICAgICBpZiAoZ2ZjLkFUSC5hZGp1c3QgPj0gMS4wKSB7XG4gICAgICAgICAgICAgICAgZ2ZjLkFUSC5hZGp1c3QgPSAxLjA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8qIHByZWNlZGluZyBmcmFtZSBoYXMgbG93ZXIgQVRIIGFkanVzdDsgKi9cbiAgICAgICAgICAgICAgICAvKiBhc2NlbmQgb25seSB0byB0aGUgcHJlY2VkaW5nIGFkanVzdF9saW1pdCAqL1xuICAgICAgICAgICAgICAgIC8qIGluIGNhc2UgdGhlcmUgaXMgbGVhZGluZyBsb3cgdm9sdW1lICovXG4gICAgICAgICAgICAgICAgaWYgKGdmYy5BVEguYWRqdXN0IDwgZ2ZjLkFUSC5hZGp1c3RMaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICBnZmMuQVRILmFkanVzdCA9IGdmYy5BVEguYWRqdXN0TGltaXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2ZjLkFUSC5hZGp1c3RMaW1pdCA9IDEuMDtcbiAgICAgICAgfSBlbHNlIHsgLyogYWRqdXN0bWVudCBjdXJ2ZSAqL1xuICAgICAgICAgICAgLyogYWJvdXQgMzIgZEIgbWF4aW11bSBhZGp1c3QgKDAuMDAwNjI1KSAqL1xuICAgICAgICAgICAgdmFyIGFkal9saW1fbmV3ID0gMzEuOTggKiBtYXhfcG93ICsgMC4wMDA2MjU7XG4gICAgICAgICAgICBpZiAoZ2ZjLkFUSC5hZGp1c3QgPj0gYWRqX2xpbV9uZXcpIHsgLyogZGVzY2VuZCBncmFkdWFsbHkgKi9cbiAgICAgICAgICAgICAgICBnZmMuQVRILmFkanVzdCAqPSBhZGpfbGltX25ldyAqIDAuMDc1ICsgMC45MjU7XG4gICAgICAgICAgICAgICAgaWYgKGdmYy5BVEguYWRqdXN0IDwgYWRqX2xpbV9uZXcpIHsgLyogc3RvcCBkZXNjZW50ICovXG4gICAgICAgICAgICAgICAgICAgIGdmYy5BVEguYWRqdXN0ID0gYWRqX2xpbV9uZXc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHsgLyogYXNjZW5kICovXG4gICAgICAgICAgICAgICAgaWYgKGdmYy5BVEguYWRqdXN0TGltaXQgPj0gYWRqX2xpbV9uZXcpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2ZjLkFUSC5hZGp1c3QgPSBhZGpfbGltX25ldztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvKiBwcmVjZWRpbmcgZnJhbWUgaGFzIGxvd2VyIEFUSCBhZGp1c3Q7ICovXG4gICAgICAgICAgICAgICAgICAgIC8qIGFzY2VuZCBvbmx5IHRvIHRoZSBwcmVjZWRpbmcgYWRqdXN0X2xpbWl0ICovXG4gICAgICAgICAgICAgICAgICAgIGlmIChnZmMuQVRILmFkanVzdCA8IGdmYy5BVEguYWRqdXN0TGltaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdmYy5BVEguYWRqdXN0ID0gZ2ZjLkFUSC5hZGp1c3RMaW1pdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdmYy5BVEguYWRqdXN0TGltaXQgPSBhZGpfbGltX25ldztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxQUkU+XG4gICAgICogIHNvbWUgc2ltcGxlIHN0YXRpc3RpY3NcbiAgICAgKlxuICAgICAqICBiaXRyYXRlIGluZGV4IDA6IGZyZWUgYml0cmF0ZSAuIG5vdCBhbGxvd2VkIGluIFZCUiBtb2RlXG4gICAgICogIDogYml0cmF0ZXMsIGticHMgZGVwZW5kaW5nIG9uIE1QRUcgdmVyc2lvblxuICAgICAqICBiaXRyYXRlIGluZGV4IDE1OiBmb3JiaWRkZW5cbiAgICAgKlxuICAgICAqICBtb2RlX2V4dDpcbiAgICAgKiAgMDogIExSXG4gICAgICogIDE6ICBMUi1pXG4gICAgICogIDI6ICBNU1xuICAgICAqICAzOiAgTVMtaVxuICAgICAqIDwvUFJFPlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVN0YXRzKGdmYykge1xuICAgICAgICB2YXIgZ3IsIGNoO1xuICAgICAgICBhc3NlcnQoMCA8PSBnZmMuYml0cmF0ZV9pbmRleCAmJiBnZmMuYml0cmF0ZV9pbmRleCA8IDE2KTtcbiAgICAgICAgYXNzZXJ0KDAgPD0gZ2ZjLm1vZGVfZXh0ICYmIGdmYy5tb2RlX2V4dCA8IDQpO1xuXG4gICAgICAgIC8qIGNvdW50IGJpdHJhdGUgaW5kaWNlcyAqL1xuICAgICAgICBnZmMuYml0cmF0ZV9zdGVyZW9Nb2RlX0hpc3RbZ2ZjLmJpdHJhdGVfaW5kZXhdWzRdKys7XG4gICAgICAgIGdmYy5iaXRyYXRlX3N0ZXJlb01vZGVfSGlzdFsxNV1bNF0rKztcblxuICAgICAgICAvKiBjb3VudCAnZW0gZm9yIGV2ZXJ5IG1vZGUgZXh0ZW5zaW9uIGluIGNhc2Ugb2YgMiBjaGFubmVsIGVuY29kaW5nICovXG4gICAgICAgIGlmIChnZmMuY2hhbm5lbHNfb3V0ID09IDIpIHtcbiAgICAgICAgICAgIGdmYy5iaXRyYXRlX3N0ZXJlb01vZGVfSGlzdFtnZmMuYml0cmF0ZV9pbmRleF1bZ2ZjLm1vZGVfZXh0XSsrO1xuICAgICAgICAgICAgZ2ZjLmJpdHJhdGVfc3RlcmVvTW9kZV9IaXN0WzE1XVtnZmMubW9kZV9leHRdKys7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgZ2ZjLm1vZGVfZ3I7ICsrZ3IpIHtcbiAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGdmYy5jaGFubmVsc19vdXQ7ICsrY2gpIHtcbiAgICAgICAgICAgICAgICB2YXIgYnQgPSBnZmMubDNfc2lkZS50dFtncl1bY2hdLmJsb2NrX3R5cGUgfCAwO1xuICAgICAgICAgICAgICAgIGlmIChnZmMubDNfc2lkZS50dFtncl1bY2hdLm1peGVkX2Jsb2NrX2ZsYWcgIT0gMClcbiAgICAgICAgICAgICAgICAgICAgYnQgPSA0O1xuICAgICAgICAgICAgICAgIGdmYy5iaXRyYXRlX2Jsb2NrVHlwZV9IaXN0W2dmYy5iaXRyYXRlX2luZGV4XVtidF0rKztcbiAgICAgICAgICAgICAgICBnZmMuYml0cmF0ZV9ibG9ja1R5cGVfSGlzdFtnZmMuYml0cmF0ZV9pbmRleF1bNV0rKztcbiAgICAgICAgICAgICAgICBnZmMuYml0cmF0ZV9ibG9ja1R5cGVfSGlzdFsxNV1bYnRdKys7XG4gICAgICAgICAgICAgICAgZ2ZjLmJpdHJhdGVfYmxvY2tUeXBlX0hpc3RbMTVdWzVdKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsYW1lX2VuY29kZV9mcmFtZV9pbml0KGdmcCwgaW5idWYpIHtcbiAgICAgICAgdmFyIGdmYyA9IGdmcC5pbnRlcm5hbF9mbGFncztcblxuICAgICAgICB2YXIgY2gsIGdyO1xuXG4gICAgICAgIGlmIChnZmMubGFtZV9lbmNvZGVfZnJhbWVfaW5pdCA9PSAwKSB7XG4gICAgICAgICAgICAvKiBwcmltZSB0aGUgTURDVC9wb2x5cGhhc2UgZmlsdGVyYmFuayB3aXRoIGEgc2hvcnQgYmxvY2sgKi9cbiAgICAgICAgICAgIHZhciBpLCBqO1xuICAgICAgICAgICAgdmFyIHByaW1lYnVmZjAgPSBuZXdfZmxvYXQoMjg2ICsgMTE1MiArIDU3Nik7XG4gICAgICAgICAgICB2YXIgcHJpbWVidWZmMSA9IG5ld19mbG9hdCgyODYgKyAxMTUyICsgNTc2KTtcbiAgICAgICAgICAgIGdmYy5sYW1lX2VuY29kZV9mcmFtZV9pbml0ID0gMTtcbiAgICAgICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgMjg2ICsgNTc2ICogKDEgKyBnZmMubW9kZV9ncik7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgNTc2ICogZ2ZjLm1vZGVfZ3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbWVidWZmMFtpXSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZmMuY2hhbm5lbHNfb3V0ID09IDIpXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltZWJ1ZmYxW2ldID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwcmltZWJ1ZmYwW2ldID0gaW5idWZbMF1bal07XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZmMuY2hhbm5lbHNfb3V0ID09IDIpXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltZWJ1ZmYxW2ldID0gaW5idWZbMV1bal07XG4gICAgICAgICAgICAgICAgICAgICsrajtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBwb2x5cGhhc2UgZmlsdGVyaW5nIC8gbWRjdCAqL1xuICAgICAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgZ2ZjLm1vZGVfZ3I7IGdyKyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMuY2hhbm5lbHNfb3V0OyBjaCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGdmYy5sM19zaWRlLnR0W2dyXVtjaF0uYmxvY2tfdHlwZSA9IEVuY29kZXIuU0hPUlRfVFlQRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdNRENULm1kY3Rfc3ViNDgoZ2ZjLCBwcmltZWJ1ZmYwLCBwcmltZWJ1ZmYxKTtcblxuICAgICAgICAgICAgLyogY2hlY2sgRkZUIHdpbGwgbm90IHVzZSBhIG5lZ2F0aXZlIHN0YXJ0aW5nIG9mZnNldCAqL1xuICAgICAgICAgICAgYXNzZXJ0KDU3NiA+PSBFbmNvZGVyLkZGVE9GRlNFVCk7XG4gICAgICAgICAgICAvKiBjaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBkYXRhIGZvciBGRlQgKi9cbiAgICAgICAgICAgIGFzc2VydChnZmMubWZfc2l6ZSA+PSAoRW5jb2Rlci5CTEtTSVpFICsgZ2ZwLmZyYW1lc2l6ZSAtIEVuY29kZXIuRkZUT0ZGU0VUKSk7XG4gICAgICAgICAgICAvKiBjaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBkYXRhIGZvciBwb2x5cGhhc2UgZmlsdGVyYmFuayAqL1xuICAgICAgICAgICAgYXNzZXJ0KGdmYy5tZl9zaXplID49ICg1MTIgKyBnZnAuZnJhbWVzaXplIC0gMzIpKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPFBSRT5cbiAgICAgKiBlbmNvZGVmcmFtZSgpICAgICAgICAgICBMYXllciAzXG4gICAgICpcbiAgICAgKiBlbmNvZGUgYSBzaW5nbGUgZnJhbWVcbiAgICAgKlxuICAgICAqXG4gICAgICogICAgbGFtZV9lbmNvZGVfZnJhbWUoKVxuICAgICAqXG4gICAgICpcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyIDAgICAgICAgICAgICBnciAxXG4gICAgICogICAgaW5idWY6ICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18XG4gICAgICpcbiAgICAgKlxuICAgICAqICAgIFBvbHlwaGFzZSAoMTggd2luZG93cywgZWFjaCBzaGlmdGVkIDMyKVxuICAgICAqICAgIGdyIDA6XG4gICAgICogICAgd2luZG93MSAgICAgICAgICA8LS0tLTUxMi0tLS5cbiAgICAgKiAgICB3aW5kb3cxOCAgICAgICAgICAgICAgICAgPC0tLS01MTItLS0uXG4gICAgICpcbiAgICAgKiAgICBnciAxOlxuICAgICAqICAgIHdpbmRvdzEgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLS01MTItLS0uXG4gICAgICogICAgd2luZG93MTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tNTEyLS0tLlxuICAgICAqXG4gICAgICpcbiAgICAgKlxuICAgICAqICAgIE1EQ1Qgb3V0cHV0OiAgfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tfFxuICAgICAqXG4gICAgICogICAgRkZUJ3MgICAgICAgICAgICAgICAgICAgIDwtLS0tLS0tLS0xMDI0LS0tLS0tLS0tLlxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0tLS0tLS0tLTEwMjQtLS0tLS0tLlxuICAgICAqXG4gICAgICpcbiAgICAgKlxuICAgICAqICAgICAgICBpbmJ1ZiA9IGJ1ZmZlciBvZiBQQ00gZGF0YSBzaXplPU1QMyBmcmFtZXNpemVcbiAgICAgKiAgICAgICAgZW5jb2RlciBhY3RzIG9uIGluYnVmW2NoXVswXSwgYnV0IG91dHB1dCBpcyBkZWxheWVkIGJ5IE1EQ1RERUxBWVxuICAgICAqICAgICAgICBzbyB0aGUgTURDVCBjb2VmZmljaW50cyBhcmUgZnJvbSBpbmJ1ZltjaF1bLU1EQ1RERUxBWV1cbiAgICAgKlxuICAgICAqICAgICAgICBwc3ktbW9kZWwgRkZUIGhhcyBhIDEgZ3JhbnVsZSBkZWxheSwgc28gd2UgZmVlZCBpdCBkYXRhIGZvciB0aGVcbiAgICAgKiAgICAgICAgbmV4dCBncmFudWxlLlxuICAgICAqICAgICAgICBGRlQgaXMgY2VudGVyZWQgb3ZlciBncmFudWxlOiAgMjI0KzU3NisyMjRcbiAgICAgKiAgICAgICAgU28gRkZUIHN0YXJ0cyBhdDogICA1NzYtMjI0LU1EQ1RERUxBWVxuICAgICAqXG4gICAgICogICAgICAgIE1QRUcyOiAgRkZUIGVuZHMgYXQ6ICBCTEtTSVpFKzU3Ni0yMjQtTURDVERFTEFZICAgICAgKDEzMjgpXG4gICAgICogICAgICAgIE1QRUcxOiAgRkZUIGVuZHMgYXQ6ICBCTEtTSVpFKzIqNTc2LTIyNC1NRENUREVMQVkgICAgKDE5MDQpXG4gICAgICpcbiAgICAgKiAgICAgICAgTVBFRzI6ICBwb2x5cGhhc2UgZmlyc3Qgd2luZG93OiAgWzAuLjUxMV1cbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMTh0aCB3aW5kb3c6ICAgWzU0NC4uMTA1NV0gICAgICAgICAgKDEwNTYpXG4gICAgICogICAgICAgIE1QRUcxOiAgICAgICAgICAgIDM2dGggd2luZG93OiAgIFsxMTIwLi4xNjMxXSAgICAgICAgICgxNjMyKVxuICAgICAqICAgICAgICAgICAgICAgIGRhdGEgbmVlZGVkOiAgNTEyK2ZyYW1lc2l6ZS0zMlxuICAgICAqXG4gICAgICogICAgICAgIEEgY2xvc2UgbG9vayBuZXdtZGN0LmMgc2hvd3MgdGhhdCB0aGUgcG9seXBoYXNlIGZpbHRlcmJhbmtcbiAgICAgKiAgICAgICAgb25seSB1c2VzIGRhdGEgZnJvbSBbMC4uNTEwXSBmb3IgZWFjaCB3aW5kb3cuICBQZXJoYXBzIGJlY2F1c2UgdGhlIHdpbmRvd1xuICAgICAqICAgICAgICB1c2VkIGJ5IHRoZSBmaWx0ZXJiYW5rIGlzIHplcm8gZm9yIHRoZSBsYXN0IHBvaW50LCBzbyBUYWtlaGlybydzXG4gICAgICogICAgICAgIGNvZGUgZG9lc24ndCBib3RoZXIgdG8gY29tcHV0ZSB3aXRoIGl0LlxuICAgICAqXG4gICAgICogICAgICAgIEZGVCBzdGFydHMgYXQgNTc2LTIyNC1NRENUREVMQVkgKDMwNCkgID0gNTc2LUZGVE9GRlNFVFxuICAgICAqXG4gICAgICogPC9QUkU+XG4gICAgICovXG5cblxuICAgIHRoaXMubGFtZV9lbmNvZGVfbXAzX2ZyYW1lID0gZnVuY3Rpb24gKGdmcCwgaW5idWZfbCwgaW5idWZfciwgbXAzYnVmLCBtcDNidWZQb3MsIG1wM2J1Zl9zaXplKSB7XG4gICAgICAgIHZhciBtcDNjb3VudDtcbiAgICAgICAgdmFyIG1hc2tpbmdfTFIgPSBuZXdfYXJyYXlfbihbMiwgMl0pO1xuICAgICAgICAvKlxuICAgICAgICAgKiBMUiBtYXNraW5nICZcbiAgICAgICAgICogZW5lcmd5XG4gICAgICAgICAqL1xuICAgICAgICBtYXNraW5nX0xSWzBdWzBdID0gbmV3IElJSV9wc3lfcmF0aW8oKTtcbiAgICAgICAgbWFza2luZ19MUlswXVsxXSA9IG5ldyBJSUlfcHN5X3JhdGlvKCk7XG4gICAgICAgIG1hc2tpbmdfTFJbMV1bMF0gPSBuZXcgSUlJX3BzeV9yYXRpbygpO1xuICAgICAgICBtYXNraW5nX0xSWzFdWzFdID0gbmV3IElJSV9wc3lfcmF0aW8oKTtcbiAgICAgICAgdmFyIG1hc2tpbmdfTVMgPSBuZXdfYXJyYXlfbihbMiwgMl0pO1xuICAgICAgICAvKiBNUyBtYXNraW5nICYgZW5lcmd5ICovXG4gICAgICAgIG1hc2tpbmdfTVNbMF1bMF0gPSBuZXcgSUlJX3BzeV9yYXRpbygpO1xuICAgICAgICBtYXNraW5nX01TWzBdWzFdID0gbmV3IElJSV9wc3lfcmF0aW8oKTtcbiAgICAgICAgbWFza2luZ19NU1sxXVswXSA9IG5ldyBJSUlfcHN5X3JhdGlvKCk7XG4gICAgICAgIG1hc2tpbmdfTVNbMV1bMV0gPSBuZXcgSUlJX3BzeV9yYXRpbygpO1xuICAgICAgICAvL0lJSV9wc3lfcmF0aW8gbWFza2luZ1tdW107XG4gICAgICAgIHZhciBtYXNraW5nO1xuICAgICAgICAvKiBwb2ludGVyIHRvIHNlbGVjdGVkIG1hc2tpbmdzICovXG4gICAgICAgIHZhciBpbmJ1ZiA9IFtudWxsLCBudWxsXTtcbiAgICAgICAgdmFyIGdmYyA9IGdmcC5pbnRlcm5hbF9mbGFncztcblxuICAgICAgICB2YXIgdG90X2VuZXIgPSBuZXdfZmxvYXRfbihbMiwgNF0pO1xuICAgICAgICB2YXIgbXNfZW5lcl9yYXRpbyA9IFsuNSwgLjVdO1xuICAgICAgICB2YXIgcGUgPSBbWzAuLCAwLl0sIFswLiwgMC5dXTtcbiAgICAgICAgdmFyIHBlX01TID0gW1swLiwgMC5dLCBbMC4sIDAuXV07XG5cbi8vZmxvYXRbXVtdIHBlX3VzZTtcbiAgICAgICAgdmFyIHBlX3VzZTtcblxuICAgICAgICB2YXIgY2gsIGdyO1xuXG4gICAgICAgIGluYnVmWzBdID0gaW5idWZfbDtcbiAgICAgICAgaW5idWZbMV0gPSBpbmJ1Zl9yO1xuXG4gICAgICAgIGlmIChnZmMubGFtZV9lbmNvZGVfZnJhbWVfaW5pdCA9PSAwKSB7XG4gICAgICAgICAgICAvKiBmaXJzdCBydW4/ICovXG4gICAgICAgICAgICBsYW1lX2VuY29kZV9mcmFtZV9pbml0KGdmcCwgaW5idWYpO1xuXG4gICAgICAgIH1cblxuICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKiBwYWRkaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgICAgICAvKipcbiAgICAgICAgICogPFBSRT5cbiAgICAgICAgICogcGFkZGluZyBtZXRob2QgYXMgZGVzY3JpYmVkIGluXG4gICAgICAgICAqIFwiTVBFRy1MYXllcjMgLyBCaXRzdHJlYW0gU3ludGF4IGFuZCBEZWNvZGluZ1wiXG4gICAgICAgICAqIGJ5IE1hcnRpbiBTaWVsZXIsIFJhbHBoIFNwZXJzY2huZWlkZXJcbiAgICAgICAgICpcbiAgICAgICAgICogbm90ZTogdGhlcmUgaXMgbm8gcGFkZGluZyBmb3IgdGhlIHZlcnkgZmlyc3QgZnJhbWVcbiAgICAgICAgICpcbiAgICAgICAgICogUm9iZXJ0IEhlZ2VtYW5uIDIwMDAtMDYtMjJcbiAgICAgICAgICogPC9QUkU+XG4gICAgICAgICAqL1xuICAgICAgICBnZmMucGFkZGluZyA9IDA7XG4gICAgICAgIGlmICgoZ2ZjLnNsb3RfbGFnIC09IGdmYy5mcmFjX1NwRikgPCAwKSB7XG4gICAgICAgICAgICBnZmMuc2xvdF9sYWcgKz0gZ2ZwLm91dF9zYW1wbGVyYXRlO1xuICAgICAgICAgICAgZ2ZjLnBhZGRpbmcgPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICogU3RhZ2UgMTogcHN5Y2hvYWNvdXN0aWMgbW9kZWwgKlxuICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgICAgICBpZiAoZ2ZjLnBzeW1vZGVsICE9IDApIHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBwc3ljaG9hY291c3RpYyBtb2RlbCBwc3kgbW9kZWwgaGFzIGEgMSBncmFudWxlICg1NzYpIGRlbGF5IHRoYXRcbiAgICAgICAgICAgICAqIHdlIG11c3QgY29tcGVuc2F0ZSBmb3IgKG10IDYvOTkpLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB2YXIgcmV0O1xuICAgICAgICAgICAgdmFyIGJ1ZnAgPSBbbnVsbCwgbnVsbF07XG4gICAgICAgICAgICAvKiBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBsZWZ0ICYgcmlnaHQgZ3JhbnVsZSAqL1xuICAgICAgICAgICAgdmFyIGJ1ZnBQb3MgPSAwO1xuICAgICAgICAgICAgLyogYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2YgbGVmdCAmIHJpZ2h0IGdyYW51bGUgKi9cbiAgICAgICAgICAgIHZhciBibG9ja3R5cGUgPSBuZXdfaW50KDIpO1xuXG4gICAgICAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBnZmMubW9kZV9ncjsgZ3IrKykge1xuXG4gICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZ2ZjLmNoYW5uZWxzX291dDsgY2grKykge1xuICAgICAgICAgICAgICAgICAgICBidWZwW2NoXSA9IGluYnVmW2NoXTtcbiAgICAgICAgICAgICAgICAgICAgYnVmcFBvcyA9IDU3NiArIGdyICogNTc2IC0gRW5jb2Rlci5GRlRPRkZTRVQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChnZnAuVkJSID09IFZick1vZGUudmJyX210cmggfHwgZ2ZwLlZCUiA9PSBWYnJNb2RlLnZicl9tdCkge1xuICAgICAgICAgICAgICAgICAgICByZXQgPSBwc3kuTDNwc3ljaG9fYW5hbF92YnIoZ2ZwLCBidWZwLCBidWZwUG9zLCBncixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tpbmdfTFIsIG1hc2tpbmdfTVMsIHBlW2dyXSwgcGVfTVNbZ3JdLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG90X2VuZXJbZ3JdLCBibG9ja3R5cGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldCA9IHBzeS5MM3BzeWNob19hbmFsX25zKGdmcCwgYnVmcCwgYnVmcFBvcywgZ3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNraW5nX0xSLCBtYXNraW5nX01TLCBwZVtncl0sIHBlX01TW2dyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9lbmVyW2dyXSwgYmxvY2t0eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJldCAhPSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTQ7XG5cbiAgICAgICAgICAgICAgICBpZiAoZ2ZwLm1vZGUgPT0gTVBFR01vZGUuSk9JTlRfU1RFUkVPKSB7XG4gICAgICAgICAgICAgICAgICAgIG1zX2VuZXJfcmF0aW9bZ3JdID0gdG90X2VuZXJbZ3JdWzJdICsgdG90X2VuZXJbZ3JdWzNdO1xuICAgICAgICAgICAgICAgICAgICBpZiAobXNfZW5lcl9yYXRpb1tncl0gPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgbXNfZW5lcl9yYXRpb1tncl0gPSB0b3RfZW5lcltncl1bM10gLyBtc19lbmVyX3JhdGlvW2dyXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvKiBibG9jayB0eXBlIGZsYWdzICovXG4gICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZ2ZjLmNoYW5uZWxzX291dDsgY2grKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29kX2luZm8gPSBnZmMubDNfc2lkZS50dFtncl1bY2hdO1xuICAgICAgICAgICAgICAgICAgICBjb2RfaW5mby5ibG9ja190eXBlID0gYmxvY2t0eXBlW2NoXTtcbiAgICAgICAgICAgICAgICAgICAgY29kX2luZm8ubWl4ZWRfYmxvY2tfZmxhZyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogbm8gcHN5IG1vZGVsICovXG4gICAgICAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBnZmMubW9kZV9ncjsgZ3IrKylcbiAgICAgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMuY2hhbm5lbHNfb3V0OyBjaCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGdmYy5sM19zaWRlLnR0W2dyXVtjaF0uYmxvY2tfdHlwZSA9IEVuY29kZXIuTk9STV9UWVBFO1xuICAgICAgICAgICAgICAgICAgICBnZmMubDNfc2lkZS50dFtncl1bY2hdLm1peGVkX2Jsb2NrX2ZsYWcgPSAwO1xuICAgICAgICAgICAgICAgICAgICBwZV9NU1tncl1bY2hdID0gcGVbZ3JdW2NoXSA9IDcwMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKiBhdXRvLWFkanVzdCBvZiBBVEgsIHVzZWZ1bCBmb3IgbG93IHZvbHVtZSAqL1xuICAgICAgICBhZGp1c3RfQVRIKGdmYyk7XG5cbiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICogU3RhZ2UgMjogTURDVCAqXG4gICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgICAgIC8qIHBvbHlwaGFzZSBmaWx0ZXJpbmcgLyBtZGN0ICovXG4gICAgICAgIG5ld01EQ1QubWRjdF9zdWI0OChnZmMsIGluYnVmWzBdLCBpbmJ1ZlsxXSk7XG5cbiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgICAgICogU3RhZ2UgMzogTVMvTFIgZGVjaXNpb24gKlxuICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgICAgICAvKiBIZXJlIHdpbGwgYmUgc2VsZWN0ZWQgTVMgb3IgTFIgY29kaW5nIG9mIHRoZSAyIHN0ZXJlbyBjaGFubmVscyAqL1xuICAgICAgICBnZmMubW9kZV9leHQgPSBFbmNvZGVyLk1QR19NRF9MUl9MUjtcblxuICAgICAgICBpZiAoZ2ZwLmZvcmNlX21zKSB7XG4gICAgICAgICAgICBnZmMubW9kZV9leHQgPSBFbmNvZGVyLk1QR19NRF9NU19MUjtcbiAgICAgICAgfSBlbHNlIGlmIChnZnAubW9kZSA9PSBNUEVHTW9kZS5KT0lOVF9TVEVSRU8pIHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBtc19yYXRpbyA9IGlzIHNjYWxlZCwgZm9yIGhpc3RvcmljYWwgcmVhc29ucywgdG8gbG9vayBsaWtlIGFcbiAgICAgICAgICAgICAqIHJhdGlvIG9mIHNpZGVfY2hhbm5lbCAvIHRvdGFsLiAwID0gc2lnbmFsIGlzIDEwMCUgbW9ubyAuNSA9IEwgJiBSXG4gICAgICAgICAgICAgKiB1bmNvcnJlbGF0ZWRcbiAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIDxQUkU+XG4gICAgICAgICAgICAgKiBbMF0gYW5kIFsxXSBhcmUgdGhlIHJlc3VsdHMgZm9yIHRoZSB0d28gZ3JhbnVsZXMgaW4gTVBFRy0xLFxuICAgICAgICAgICAgICogaW4gTVBFRy0yIGl0J3Mgb25seSBhIGZha2VkIGF2ZXJhZ2luZyBvZiB0aGUgc2FtZSB2YWx1ZVxuICAgICAgICAgICAgICogX3ByZXYgaXMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IGdyYW51bGUgb2YgdGhlIHByZXZpb3VzIGZyYW1lXG4gICAgICAgICAgICAgKiBfbmV4dCBpcyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGdyYW51bGUgb2YgdGhlIG5leHQgZnJhbWVcbiAgICAgICAgICAgICAqIDwvUFJFPlxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIHZhciBzdW1fcGVfTVMgPSAwLjtcbiAgICAgICAgICAgIHZhciBzdW1fcGVfTFIgPSAwLjtcbiAgICAgICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IGdmYy5tb2RlX2dyOyBncisrKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZ2ZjLmNoYW5uZWxzX291dDsgY2grKykge1xuICAgICAgICAgICAgICAgICAgICBzdW1fcGVfTVMgKz0gcGVfTVNbZ3JdW2NoXTtcbiAgICAgICAgICAgICAgICAgICAgc3VtX3BlX0xSICs9IHBlW2dyXVtjaF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBiYXNlZCBvbiBQRTogTS9TIGNvZGluZyB3b3VsZCBub3QgdXNlIG11Y2ggbW9yZSBiaXRzIHRoYW4gTC9SICovXG4gICAgICAgICAgICBpZiAoc3VtX3BlX01TIDw9IDEuMDAgKiBzdW1fcGVfTFIpIHtcblxuICAgICAgICAgICAgICAgIHZhciBnaTAgPSBnZmMubDNfc2lkZS50dFswXTtcbiAgICAgICAgICAgICAgICB2YXIgZ2kxID0gZ2ZjLmwzX3NpZGUudHRbZ2ZjLm1vZGVfZ3IgLSAxXTtcblxuICAgICAgICAgICAgICAgIGlmIChnaTBbMF0uYmxvY2tfdHlwZSA9PSBnaTBbMV0uYmxvY2tfdHlwZVxuICAgICAgICAgICAgICAgICAgICAmJiBnaTFbMF0uYmxvY2tfdHlwZSA9PSBnaTFbMV0uYmxvY2tfdHlwZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGdmYy5tb2RlX2V4dCA9IEVuY29kZXIuTVBHX01EX01TX0xSO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGJpdCBhbmQgbm9pc2UgYWxsb2NhdGlvbiAqL1xuICAgICAgICBpZiAoZ2ZjLm1vZGVfZXh0ID09IE1QR19NRF9NU19MUikge1xuICAgICAgICAgICAgbWFza2luZyA9IG1hc2tpbmdfTVM7XG4gICAgICAgICAgICAvKiB1c2UgTVMgbWFza2luZyAqL1xuICAgICAgICAgICAgcGVfdXNlID0gcGVfTVM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYXNraW5nID0gbWFza2luZ19MUjtcbiAgICAgICAgICAgIC8qIHVzZSBMUiBtYXNraW5nICovXG4gICAgICAgICAgICBwZV91c2UgPSBwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGNvcHkgZGF0YSBmb3IgTVAzIGZyYW1lIGFuYWx5emVyICovXG4gICAgICAgIGlmIChnZnAuYW5hbHlzaXMgJiYgZ2ZjLnBpbmZvICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAoZ3IgPSAwOyBnciA8IGdmYy5tb2RlX2dyOyBncisrKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZ2ZjLmNoYW5uZWxzX291dDsgY2grKykge1xuICAgICAgICAgICAgICAgICAgICBnZmMucGluZm8ubXNfcmF0aW9bZ3JdID0gZ2ZjLm1zX3JhdGlvW2dyXTtcbiAgICAgICAgICAgICAgICAgICAgZ2ZjLnBpbmZvLm1zX2VuZXJfcmF0aW9bZ3JdID0gbXNfZW5lcl9yYXRpb1tncl07XG4gICAgICAgICAgICAgICAgICAgIGdmYy5waW5mby5ibG9ja3R5cGVbZ3JdW2NoXSA9IGdmYy5sM19zaWRlLnR0W2dyXVtjaF0uYmxvY2tfdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgZ2ZjLnBpbmZvLnBlW2dyXVtjaF0gPSBwZV91c2VbZ3JdW2NoXTtcbiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShnZmMubDNfc2lkZS50dFtncl1bY2hdLnhyLCAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2ZjLnBpbmZvLnhyW2dyXVtjaF0sIDAsIDU3Nik7XG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAqIGluIHBzeW1vZGVsLCBMUiBhbmQgTVMgZGF0YSB3YXMgc3RvcmVkIGluIHBpbmZvLiBzd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICogdG8gTVMgZGF0YTpcbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGlmIChnZmMubW9kZV9leHQgPT0gTVBHX01EX01TX0xSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZmMucGluZm8uZXJzW2dyXVtjaF0gPSBnZmMucGluZm8uZXJzW2dyXVtjaCArIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShnZmMucGluZm8uZW5lcmd5W2dyXVtjaCArIDJdLCAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdmYy5waW5mby5lbmVyZ3lbZ3JdW2NoXSwgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZmMucGluZm8uZW5lcmd5W2dyXVtjaF0ubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgICAgICAqIFN0YWdlIDQ6IHF1YW50aXphdGlvbiBsb29wICpcbiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgICAgICAgaWYgKGdmcC5WQlIgPT0gVmJyTW9kZS52YnJfb2ZmIHx8IGdmcC5WQlIgPT0gVmJyTW9kZS52YnJfYWJyKSB7XG5cbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgdmFyIGY7XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxODsgaSsrKVxuICAgICAgICAgICAgICAgIGdmYy5uc1BzeS5wZWZpcmJ1ZltpXSA9IGdmYy5uc1BzeS5wZWZpcmJ1ZltpICsgMV07XG5cbiAgICAgICAgICAgIGYgPSAwLjA7XG4gICAgICAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBnZmMubW9kZV9ncjsgZ3IrKylcbiAgICAgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMuY2hhbm5lbHNfb3V0OyBjaCsrKVxuICAgICAgICAgICAgICAgICAgICBmICs9IHBlX3VzZVtncl1bY2hdO1xuICAgICAgICAgICAgZ2ZjLm5zUHN5LnBlZmlyYnVmWzE4XSA9IGY7XG5cbiAgICAgICAgICAgIGYgPSBnZmMubnNQc3kucGVmaXJidWZbOV07XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKVxuICAgICAgICAgICAgICAgIGYgKz0gKGdmYy5uc1BzeS5wZWZpcmJ1ZltpXSArIGdmYy5uc1BzeS5wZWZpcmJ1ZlsxOCAtIGldKVxuICAgICAgICAgICAgICAgICAgICAqIEVuY29kZXIuZmlyY29lZltpXTtcblxuICAgICAgICAgICAgZiA9ICg2NzAgKiA1ICogZ2ZjLm1vZGVfZ3IgKiBnZmMuY2hhbm5lbHNfb3V0KSAvIGY7XG4gICAgICAgICAgICBmb3IgKGdyID0gMDsgZ3IgPCBnZmMubW9kZV9ncjsgZ3IrKykge1xuICAgICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGdmYy5jaGFubmVsc19vdXQ7IGNoKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcGVfdXNlW2dyXVtjaF0gKj0gZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZ2ZjLml0ZXJhdGlvbl9sb29wLml0ZXJhdGlvbl9sb29wKGdmcCwgcGVfdXNlLCBtc19lbmVyX3JhdGlvLCBtYXNraW5nKTtcblxuICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICAgICAgKiBTdGFnZSA1OiBiaXRzdHJlYW0gZm9ybWF0dGluZyAqXG4gICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgICAgIC8qIHdyaXRlIHRoZSBmcmFtZSB0byB0aGUgYml0c3RyZWFtICovXG4gICAgICAgIGJzLmZvcm1hdF9iaXRzdHJlYW0oZ2ZwKTtcblxuICAgICAgICAvKiBjb3B5IG1wMyBiaXQgYnVmZmVyIGludG8gYXJyYXkgKi9cbiAgICAgICAgbXAzY291bnQgPSBicy5jb3B5X2J1ZmZlcihnZmMsIG1wM2J1ZiwgbXAzYnVmUG9zLCBtcDNidWZfc2l6ZSwgMSk7XG5cbiAgICAgICAgaWYgKGdmcC5iV3JpdGVWYnJUYWcpXG4gICAgICAgICAgICB2YnIuYWRkVmJyRnJhbWUoZ2ZwKTtcblxuICAgICAgICBpZiAoZ2ZwLmFuYWx5c2lzICYmIGdmYy5waW5mbyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBnZmMuY2hhbm5lbHNfb3V0OyBjaCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGo7XG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IEZGVE9GRlNFVDsgaisrKVxuICAgICAgICAgICAgICAgICAgICBnZmMucGluZm8ucGNtZGF0YVtjaF1bal0gPSBnZmMucGluZm8ucGNtZGF0YVtjaF1balxuICAgICAgICAgICAgICAgICAgICArIGdmcC5mcmFtZXNpemVdO1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IEZGVE9GRlNFVDsgaiA8IDE2MDA7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBnZmMucGluZm8ucGNtZGF0YVtjaF1bal0gPSBpbmJ1ZltjaF1baiAtIEZGVE9GRlNFVF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVwdnQuc2V0X2ZyYW1lX3BpbmZvKGdmcCwgbWFza2luZyk7XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVTdGF0cyhnZmMpO1xuXG4gICAgICAgIHJldHVybiBtcDNjb3VudDtcbiAgICB9XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBFbmNvZGVyO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvbGFtZWpzL3NyYy9qcy9FbmNvZGVyLmpzXG4vLyBtb2R1bGUgaWQgPSAvMDBvXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:////00o\n')},"/506":function(module,exports,__webpack_require__){"use strict";eval("\n\nvar pkg = __webpack_require__(\"75l9\");\n\nvar validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nvar deprecatedWarnings = {};\nvar currentVerArr = pkg.version.split('.');\n\n/**\n * Compare package versions\n * @param {string} version\n * @param {string?} thanVersion\n * @returns {boolean}\n */\nfunction isOlderVersion(version, thanVersion) {\n var pkgVersionArr = thanVersion ? thanVersion.split('.') : currentVerArr;\n var destVer = version.split('.');\n for (var i = 0; i < 3; i++) {\n if (pkgVersionArr[i] > destVer[i]) {\n return true;\n } else if (pkgVersionArr[i] < destVer[i]) {\n return false;\n }\n }\n return false;\n}\n\n/**\n * Transitional option validator\n * @param {function|boolean?} validator\n * @param {string?} version\n * @param {string} message\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n var isDeprecated = version && isOlderVersion(version);\n\n function formatMessage(opt, desc) {\n return '[Axios v' + pkg.version + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return function(value, opt, opts) {\n if (validator === false) {\n throw new Error(formatMessage(opt, ' has been removed in ' + version));\n }\n\n if (isDeprecated && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n var keys = Object.keys(options);\n var i = keys.length;\n while (i-- > 0) {\n var opt = keys[i];\n var validator = schema[opt];\n if (validator) {\n var value = options[opt];\n var result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new TypeError('option ' + opt + ' must be ' + result);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw Error('Unknown option ' + opt);\n }\n }\n}\n\nmodule.exports = {\n isOlderVersion: isOlderVersion,\n assertOptions: assertOptions,\n validators: validators\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLzUwNi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy92YWxpZGF0b3IuanM/ZmY5ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBwa2cgPSByZXF1aXJlKCcuLy4uLy4uL3BhY2thZ2UuanNvbicpO1xuXG52YXIgdmFsaWRhdG9ycyA9IHt9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuWydvYmplY3QnLCAnYm9vbGVhbicsICdudW1iZXInLCAnZnVuY3Rpb24nLCAnc3RyaW5nJywgJ3N5bWJvbCddLmZvckVhY2goZnVuY3Rpb24odHlwZSwgaSkge1xuICB2YWxpZGF0b3JzW3R5cGVdID0gZnVuY3Rpb24gdmFsaWRhdG9yKHRoaW5nKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGluZyA9PT0gdHlwZSB8fCAnYScgKyAoaSA8IDEgPyAnbiAnIDogJyAnKSArIHR5cGU7XG4gIH07XG59KTtcblxudmFyIGRlcHJlY2F0ZWRXYXJuaW5ncyA9IHt9O1xudmFyIGN1cnJlbnRWZXJBcnIgPSBwa2cudmVyc2lvbi5zcGxpdCgnLicpO1xuXG4vKipcbiAqIENvbXBhcmUgcGFja2FnZSB2ZXJzaW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb25cbiAqIEBwYXJhbSB7c3RyaW5nP30gdGhhblZlcnNpb25cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc09sZGVyVmVyc2lvbih2ZXJzaW9uLCB0aGFuVmVyc2lvbikge1xuICB2YXIgcGtnVmVyc2lvbkFyciA9IHRoYW5WZXJzaW9uID8gdGhhblZlcnNpb24uc3BsaXQoJy4nKSA6IGN1cnJlbnRWZXJBcnI7XG4gIHZhciBkZXN0VmVyID0gdmVyc2lvbi5zcGxpdCgnLicpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgIGlmIChwa2dWZXJzaW9uQXJyW2ldID4gZGVzdFZlcltpXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChwa2dWZXJzaW9uQXJyW2ldIDwgZGVzdFZlcltpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVHJhbnNpdGlvbmFsIG9wdGlvbiB2YWxpZGF0b3JcbiAqIEBwYXJhbSB7ZnVuY3Rpb258Ym9vbGVhbj99IHZhbGlkYXRvclxuICogQHBhcmFtIHtzdHJpbmc/fSB2ZXJzaW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG52YWxpZGF0b3JzLnRyYW5zaXRpb25hbCA9IGZ1bmN0aW9uIHRyYW5zaXRpb25hbCh2YWxpZGF0b3IsIHZlcnNpb24sIG1lc3NhZ2UpIHtcbiAgdmFyIGlzRGVwcmVjYXRlZCA9IHZlcnNpb24gJiYgaXNPbGRlclZlcnNpb24odmVyc2lvbik7XG5cbiAgZnVuY3Rpb24gZm9ybWF0TWVzc2FnZShvcHQsIGRlc2MpIHtcbiAgICByZXR1cm4gJ1tBeGlvcyB2JyArIHBrZy52ZXJzaW9uICsgJ10gVHJhbnNpdGlvbmFsIG9wdGlvbiBcXCcnICsgb3B0ICsgJ1xcJycgKyBkZXNjICsgKG1lc3NhZ2UgPyAnLiAnICsgbWVzc2FnZSA6ICcnKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3B0LCBvcHRzKSB7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihmb3JtYXRNZXNzYWdlKG9wdCwgJyBoYXMgYmVlbiByZW1vdmVkIGluICcgKyB2ZXJzaW9uKSk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGVwcmVjYXRlZCAmJiAhZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0pIHtcbiAgICAgIGRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdID0gdHJ1ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAgb3B0LFxuICAgICAgICAgICcgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2JyArIHZlcnNpb24gKyAnIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3IgPyB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0cykgOiB0cnVlO1xuICB9O1xufTtcblxuLyoqXG4gKiBBc3NlcnQgb2JqZWN0J3MgcHJvcGVydGllcyB0eXBlXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtvYmplY3R9IHNjaGVtYVxuICogQHBhcmFtIHtib29sZWFuP30gYWxsb3dVbmtub3duXG4gKi9cblxuZnVuY3Rpb24gYXNzZXJ0T3B0aW9ucyhvcHRpb25zLCBzY2hlbWEsIGFsbG93VW5rbm93bikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICB9XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgdmFyIG9wdCA9IGtleXNbaV07XG4gICAgdmFyIHZhbGlkYXRvciA9IHNjaGVtYVtvcHRdO1xuICAgIGlmICh2YWxpZGF0b3IpIHtcbiAgICAgIHZhciB2YWx1ZSA9IG9wdGlvbnNbb3B0XTtcbiAgICAgIHZhciByZXN1bHQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRpb25zKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uICcgKyBvcHQgKyAnIG11c3QgYmUgJyArIHJlc3VsdCk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFsbG93VW5rbm93biAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ1Vua25vd24gb3B0aW9uICcgKyBvcHQpO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNPbGRlclZlcnNpb246IGlzT2xkZXJWZXJzaW9uLFxuICBhc3NlcnRPcHRpb25zOiBhc3NlcnRPcHRpb25zLFxuICB2YWxpZGF0b3JzOiB2YWxpZGF0b3JzXG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdmFsaWRhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAvNTA2XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:////506\n")},"/bQp":function(module,exports){eval("module.exports = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL2JRcC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlcmF0b3JzLmpzP2ZkYjQiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyYXRvcnMuanNcbi8vIG1vZHVsZSBpZCA9IC9iUXBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:////bQp\n")},"/n6Q":function(module,exports,__webpack_require__){eval('__webpack_require__("zQR9");\n__webpack_require__("+tPU");\nmodule.exports = __webpack_require__("Kh4W").f(\'iterator\');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL242US5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2l0ZXJhdG9yLmpzP2ZlN2UiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fd2tzLWV4dCcpLmYoJ2l0ZXJhdG9yJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2l0ZXJhdG9yLmpzXG4vLyBtb2R1bGUgaWQgPSAvbjZRXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:////n6Q\n')},"/ocq":function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/*!\n * vue-router v3.5.2\n * (c) 2021 Evan You\n * @license MIT\n */\n/* */\n\nfunction assert (condition, message) {\n if (!condition) {\n throw new Error((\"[vue-router] \" + message))\n }\n}\n\nfunction warn (condition, message) {\n if (false) {\n typeof console !== 'undefined' && console.warn((\"[vue-router] \" + message));\n }\n}\n\nfunction extend (a, b) {\n for (var key in b) {\n a[key] = b[key];\n }\n return a\n}\n\n/* */\n\nvar encodeReserveRE = /[!'()*]/g;\nvar encodeReserveReplacer = function (c) { return '%' + c.charCodeAt(0).toString(16); };\nvar commaRE = /%2C/g;\n\n// fixed encodeURIComponent which is more conformant to RFC3986:\n// - escapes [!'()*]\n// - preserve commas\nvar encode = function (str) { return encodeURIComponent(str)\n .replace(encodeReserveRE, encodeReserveReplacer)\n .replace(commaRE, ','); };\n\nfunction decode (str) {\n try {\n return decodeURIComponent(str)\n } catch (err) {\n if (false) {\n warn(false, (\"Error decoding \\\"\" + str + \"\\\". Leaving it intact.\"));\n }\n }\n return str\n}\n\nfunction resolveQuery (\n query,\n extraQuery,\n _parseQuery\n) {\n if ( extraQuery === void 0 ) extraQuery = {};\n\n var parse = _parseQuery || parseQuery;\n var parsedQuery;\n try {\n parsedQuery = parse(query || '');\n } catch (e) {\n \"production\" !== 'production' && warn(false, e.message);\n parsedQuery = {};\n }\n for (var key in extraQuery) {\n var value = extraQuery[key];\n parsedQuery[key] = Array.isArray(value)\n ? value.map(castQueryParamValue)\n : castQueryParamValue(value);\n }\n return parsedQuery\n}\n\nvar castQueryParamValue = function (value) { return (value == null || typeof value === 'object' ? value : String(value)); };\n\nfunction parseQuery (query) {\n var res = {};\n\n query = query.trim().replace(/^(\\?|#|&)/, '');\n\n if (!query) {\n return res\n }\n\n query.split('&').forEach(function (param) {\n var parts = param.replace(/\\+/g, ' ').split('=');\n var key = decode(parts.shift());\n var val = parts.length > 0 ? decode(parts.join('=')) : null;\n\n if (res[key] === undefined) {\n res[key] = val;\n } else if (Array.isArray(res[key])) {\n res[key].push(val);\n } else {\n res[key] = [res[key], val];\n }\n });\n\n return res\n}\n\nfunction stringifyQuery (obj) {\n var res = obj\n ? Object.keys(obj)\n .map(function (key) {\n var val = obj[key];\n\n if (val === undefined) {\n return ''\n }\n\n if (val === null) {\n return encode(key)\n }\n\n if (Array.isArray(val)) {\n var result = [];\n val.forEach(function (val2) {\n if (val2 === undefined) {\n return\n }\n if (val2 === null) {\n result.push(encode(key));\n } else {\n result.push(encode(key) + '=' + encode(val2));\n }\n });\n return result.join('&')\n }\n\n return encode(key) + '=' + encode(val)\n })\n .filter(function (x) { return x.length > 0; })\n .join('&')\n : null;\n return res ? (\"?\" + res) : ''\n}\n\n/* */\n\nvar trailingSlashRE = /\\/?$/;\n\nfunction createRoute (\n record,\n location,\n redirectedFrom,\n router\n) {\n var stringifyQuery = router && router.options.stringifyQuery;\n\n var query = location.query || {};\n try {\n query = clone(query);\n } catch (e) {}\n\n var route = {\n name: location.name || (record && record.name),\n meta: (record && record.meta) || {},\n path: location.path || '/',\n hash: location.hash || '',\n query: query,\n params: location.params || {},\n fullPath: getFullPath(location, stringifyQuery),\n matched: record ? formatMatch(record) : []\n };\n if (redirectedFrom) {\n route.redirectedFrom = getFullPath(redirectedFrom, stringifyQuery);\n }\n return Object.freeze(route)\n}\n\nfunction clone (value) {\n if (Array.isArray(value)) {\n return value.map(clone)\n } else if (value && typeof value === 'object') {\n var res = {};\n for (var key in value) {\n res[key] = clone(value[key]);\n }\n return res\n } else {\n return value\n }\n}\n\n// the starting route that represents the initial state\nvar START = createRoute(null, {\n path: '/'\n});\n\nfunction formatMatch (record) {\n var res = [];\n while (record) {\n res.unshift(record);\n record = record.parent;\n }\n return res\n}\n\nfunction getFullPath (\n ref,\n _stringifyQuery\n) {\n var path = ref.path;\n var query = ref.query; if ( query === void 0 ) query = {};\n var hash = ref.hash; if ( hash === void 0 ) hash = '';\n\n var stringify = _stringifyQuery || stringifyQuery;\n return (path || '/') + stringify(query) + hash\n}\n\nfunction isSameRoute (a, b, onlyPath) {\n if (b === START) {\n return a === b\n } else if (!b) {\n return false\n } else if (a.path && b.path) {\n return a.path.replace(trailingSlashRE, '') === b.path.replace(trailingSlashRE, '') && (onlyPath ||\n a.hash === b.hash &&\n isObjectEqual(a.query, b.query))\n } else if (a.name && b.name) {\n return (\n a.name === b.name &&\n (onlyPath || (\n a.hash === b.hash &&\n isObjectEqual(a.query, b.query) &&\n isObjectEqual(a.params, b.params))\n )\n )\n } else {\n return false\n }\n}\n\nfunction isObjectEqual (a, b) {\n if ( a === void 0 ) a = {};\n if ( b === void 0 ) b = {};\n\n // handle null value #1566\n if (!a || !b) { return a === b }\n var aKeys = Object.keys(a).sort();\n var bKeys = Object.keys(b).sort();\n if (aKeys.length !== bKeys.length) {\n return false\n }\n return aKeys.every(function (key, i) {\n var aVal = a[key];\n var bKey = bKeys[i];\n if (bKey !== key) { return false }\n var bVal = b[key];\n // query values can be null and undefined\n if (aVal == null || bVal == null) { return aVal === bVal }\n // check nested equality\n if (typeof aVal === 'object' && typeof bVal === 'object') {\n return isObjectEqual(aVal, bVal)\n }\n return String(aVal) === String(bVal)\n })\n}\n\nfunction isIncludedRoute (current, target) {\n return (\n current.path.replace(trailingSlashRE, '/').indexOf(\n target.path.replace(trailingSlashRE, '/')\n ) === 0 &&\n (!target.hash || current.hash === target.hash) &&\n queryIncludes(current.query, target.query)\n )\n}\n\nfunction queryIncludes (current, target) {\n for (var key in target) {\n if (!(key in current)) {\n return false\n }\n }\n return true\n}\n\nfunction handleRouteEntered (route) {\n for (var i = 0; i < route.matched.length; i++) {\n var record = route.matched[i];\n for (var name in record.instances) {\n var instance = record.instances[name];\n var cbs = record.enteredCbs[name];\n if (!instance || !cbs) { continue }\n delete record.enteredCbs[name];\n for (var i$1 = 0; i$1 < cbs.length; i$1++) {\n if (!instance._isBeingDestroyed) { cbs[i$1](instance); }\n }\n }\n }\n}\n\nvar View = {\n name: 'RouterView',\n functional: true,\n props: {\n name: {\n type: String,\n default: 'default'\n }\n },\n render: function render (_, ref) {\n var props = ref.props;\n var children = ref.children;\n var parent = ref.parent;\n var data = ref.data;\n\n // used by devtools to display a router-view badge\n data.routerView = true;\n\n // directly use parent context's createElement() function\n // so that components rendered by router-view can resolve named slots\n var h = parent.$createElement;\n var name = props.name;\n var route = parent.$route;\n var cache = parent._routerViewCache || (parent._routerViewCache = {});\n\n // determine current view depth, also check to see if the tree\n // has been toggled inactive but kept-alive.\n var depth = 0;\n var inactive = false;\n while (parent && parent._routerRoot !== parent) {\n var vnodeData = parent.$vnode ? parent.$vnode.data : {};\n if (vnodeData.routerView) {\n depth++;\n }\n if (vnodeData.keepAlive && parent._directInactive && parent._inactive) {\n inactive = true;\n }\n parent = parent.$parent;\n }\n data.routerViewDepth = depth;\n\n // render previous view if the tree is inactive and kept-alive\n if (inactive) {\n var cachedData = cache[name];\n var cachedComponent = cachedData && cachedData.component;\n if (cachedComponent) {\n // #2301\n // pass props\n if (cachedData.configProps) {\n fillPropsinData(cachedComponent, data, cachedData.route, cachedData.configProps);\n }\n return h(cachedComponent, data, children)\n } else {\n // render previous empty view\n return h()\n }\n }\n\n var matched = route.matched[depth];\n var component = matched && matched.components[name];\n\n // render empty node if no matched route or no config component\n if (!matched || !component) {\n cache[name] = null;\n return h()\n }\n\n // cache component\n cache[name] = { component: component };\n\n // attach instance registration hook\n // this will be called in the instance's injected lifecycle hooks\n data.registerRouteInstance = function (vm, val) {\n // val could be undefined for unregistration\n var current = matched.instances[name];\n if (\n (val && current !== vm) ||\n (!val && current === vm)\n ) {\n matched.instances[name] = val;\n }\n }\n\n // also register instance in prepatch hook\n // in case the same component instance is reused across different routes\n ;(data.hook || (data.hook = {})).prepatch = function (_, vnode) {\n matched.instances[name] = vnode.componentInstance;\n };\n\n // register instance in init hook\n // in case kept-alive component be actived when routes changed\n data.hook.init = function (vnode) {\n if (vnode.data.keepAlive &&\n vnode.componentInstance &&\n vnode.componentInstance !== matched.instances[name]\n ) {\n matched.instances[name] = vnode.componentInstance;\n }\n\n // if the route transition has already been confirmed then we weren't\n // able to call the cbs during confirmation as the component was not\n // registered yet, so we call it here.\n handleRouteEntered(route);\n };\n\n var configProps = matched.props && matched.props[name];\n // save route and configProps in cache\n if (configProps) {\n extend(cache[name], {\n route: route,\n configProps: configProps\n });\n fillPropsinData(component, data, route, configProps);\n }\n\n return h(component, data, children)\n }\n};\n\nfunction fillPropsinData (component, data, route, configProps) {\n // resolve props\n var propsToPass = data.props = resolveProps(route, configProps);\n if (propsToPass) {\n // clone to prevent mutation\n propsToPass = data.props = extend({}, propsToPass);\n // pass non-declared props as attrs\n var attrs = data.attrs = data.attrs || {};\n for (var key in propsToPass) {\n if (!component.props || !(key in component.props)) {\n attrs[key] = propsToPass[key];\n delete propsToPass[key];\n }\n }\n }\n}\n\nfunction resolveProps (route, config) {\n switch (typeof config) {\n case 'undefined':\n return\n case 'object':\n return config\n case 'function':\n return config(route)\n case 'boolean':\n return config ? route.params : undefined\n default:\n if (false) {\n warn(\n false,\n \"props in \\\"\" + (route.path) + \"\\\" is a \" + (typeof config) + \", \" +\n \"expecting an object, function or boolean.\"\n );\n }\n }\n}\n\n/* */\n\nfunction resolvePath (\n relative,\n base,\n append\n) {\n var firstChar = relative.charAt(0);\n if (firstChar === '/') {\n return relative\n }\n\n if (firstChar === '?' || firstChar === '#') {\n return base + relative\n }\n\n var stack = base.split('/');\n\n // remove trailing segment if:\n // - not appending\n // - appending to trailing slash (last segment is empty)\n if (!append || !stack[stack.length - 1]) {\n stack.pop();\n }\n\n // resolve relative path\n var segments = relative.replace(/^\\//, '').split('/');\n for (var i = 0; i < segments.length; i++) {\n var segment = segments[i];\n if (segment === '..') {\n stack.pop();\n } else if (segment !== '.') {\n stack.push(segment);\n }\n }\n\n // ensure leading slash\n if (stack[0] !== '') {\n stack.unshift('');\n }\n\n return stack.join('/')\n}\n\nfunction parsePath (path) {\n var hash = '';\n var query = '';\n\n var hashIndex = path.indexOf('#');\n if (hashIndex >= 0) {\n hash = path.slice(hashIndex);\n path = path.slice(0, hashIndex);\n }\n\n var queryIndex = path.indexOf('?');\n if (queryIndex >= 0) {\n query = path.slice(queryIndex + 1);\n path = path.slice(0, queryIndex);\n }\n\n return {\n path: path,\n query: query,\n hash: hash\n }\n}\n\nfunction cleanPath (path) {\n return path.replace(/\\/\\//g, '/')\n}\n\nvar isarray = Array.isArray || function (arr) {\n return Object.prototype.toString.call(arr) == '[object Array]';\n};\n\n/**\n * Expose `pathToRegexp`.\n */\nvar pathToRegexp_1 = pathToRegexp;\nvar parse_1 = parse;\nvar compile_1 = compile;\nvar tokensToFunction_1 = tokensToFunction;\nvar tokensToRegExp_1 = tokensToRegExp;\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n // Match escaped characters that would otherwise appear in future matches.\n // This allows the user to escape special characters that won't transform.\n '(\\\\\\\\.)',\n // Match Express-style parameters and un-named parameters with a prefix\n // and optional suffixes. Matches appear as:\n //\n // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n // \"/*\" => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n '([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?|(\\\\*))'\n].join('|'), 'g');\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n var tokens = [];\n var key = 0;\n var index = 0;\n var path = '';\n var defaultDelimiter = options && options.delimiter || '/';\n var res;\n\n while ((res = PATH_REGEXP.exec(str)) != null) {\n var m = res[0];\n var escaped = res[1];\n var offset = res.index;\n path += str.slice(index, offset);\n index = offset + m.length;\n\n // Ignore already escaped sequences.\n if (escaped) {\n path += escaped[1];\n continue\n }\n\n var next = str[index];\n var prefix = res[2];\n var name = res[3];\n var capture = res[4];\n var group = res[5];\n var modifier = res[6];\n var asterisk = res[7];\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path);\n path = '';\n }\n\n var partial = prefix != null && next != null && next !== prefix;\n var repeat = modifier === '+' || modifier === '*';\n var optional = modifier === '?' || modifier === '*';\n var delimiter = res[2] || defaultDelimiter;\n var pattern = capture || group;\n\n tokens.push({\n name: name || key++,\n prefix: prefix || '',\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n partial: partial,\n asterisk: !!asterisk,\n pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')\n });\n }\n\n // Match any characters still remaining.\n if (index < str.length) {\n path += str.substr(index);\n }\n\n // If the path exists, push it onto the end.\n if (path) {\n tokens.push(path);\n }\n\n return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n return tokensToFunction(parse(str, options), options)\n}\n\n/**\n * Prettier encoding of URI path segments.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeURIComponentPretty (str) {\n return encodeURI(str).replace(/[\\/?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\n}\n\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param {string}\n * @return {string}\n */\nfunction encodeAsterisk (str) {\n return encodeURI(str).replace(/[?#]/g, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n })\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens, options) {\n // Compile all the tokens into regexps.\n var matches = new Array(tokens.length);\n\n // Compile all the patterns before compilation.\n for (var i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] === 'object') {\n matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options));\n }\n }\n\n return function (obj, opts) {\n var path = '';\n var data = obj || {};\n var options = opts || {};\n var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent;\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n\n if (typeof token === 'string') {\n path += token;\n\n continue\n }\n\n var value = data[token.name];\n var segment;\n\n if (value == null) {\n if (token.optional) {\n // Prepend partial segment prefixes.\n if (token.partial) {\n path += token.prefix;\n }\n\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to be defined')\n }\n }\n\n if (isarray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`')\n }\n\n if (value.length === 0) {\n if (token.optional) {\n continue\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\n }\n\n for (var j = 0; j < value.length; j++) {\n segment = encode(value[j]);\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received `' + JSON.stringify(segment) + '`')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment;\n }\n\n continue\n }\n\n segment = token.asterisk ? encodeAsterisk(value) : encode(value);\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"')\n }\n\n path += token.prefix + segment;\n }\n\n return path\n }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n return str.replace(/([.+*?=^!:${}()[\\]|\\/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n return group.replace(/([=!:$\\/()])/g, '\\\\$1')\n}\n\n/**\n * Attach the keys as a property of the regexp.\n *\n * @param {!RegExp} re\n * @param {Array} keys\n * @return {!RegExp}\n */\nfunction attachKeys (re, keys) {\n re.keys = keys;\n return re\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param {Object} options\n * @return {string}\n */\nfunction flags (options) {\n return options && options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param {!RegExp} path\n * @param {!Array} keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n // Use a negative lookahead to match only capturing groups.\n var groups = path.source.match(/\\((?!\\?)/g);\n\n if (groups) {\n for (var i = 0; i < groups.length; i++) {\n keys.push({\n name: i,\n prefix: null,\n delimiter: null,\n optional: false,\n repeat: false,\n partial: false,\n asterisk: false,\n pattern: null\n });\n }\n }\n\n return attachKeys(path, keys)\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param {!Array} path\n * @param {Array} keys\n * @param {!Object} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n var parts = [];\n\n for (var i = 0; i < path.length; i++) {\n parts.push(pathToRegexp(path[i], keys, options).source);\n }\n\n var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options));\n\n return attachKeys(regexp, keys)\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param {string} path\n * @param {!Array} keys\n * @param {!Object} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param {!Array} tokens\n * @param {(Array|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options);\n keys = [];\n }\n\n options = options || {};\n\n var strict = options.strict;\n var end = options.end !== false;\n var route = '';\n\n // Iterate over the tokens and create our regexp string.\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i];\n\n if (typeof token === 'string') {\n route += escapeString(token);\n } else {\n var prefix = escapeString(token.prefix);\n var capture = '(?:' + token.pattern + ')';\n\n keys.push(token);\n\n if (token.repeat) {\n capture += '(?:' + prefix + capture + ')*';\n }\n\n if (token.optional) {\n if (!token.partial) {\n capture = '(?:' + prefix + '(' + capture + '))?';\n } else {\n capture = prefix + '(' + capture + ')?';\n }\n } else {\n capture = prefix + '(' + capture + ')';\n }\n\n route += capture;\n }\n }\n\n var delimiter = escapeString(options.delimiter || '/');\n var endsWithDelimiter = route.slice(-delimiter.length) === delimiter;\n\n // In non-strict mode we allow a slash at the end of match. If the path to\n // match already ends with a slash, we remove it for consistency. The slash\n // is valid at the end of a path match, not in the middle. This is important\n // in non-ending mode, where \"/test/\" shouldn't match \"/test//route\".\n if (!strict) {\n route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?';\n }\n\n if (end) {\n route += '$';\n } else {\n // In non-ending mode, we need the capturing groups to match as much as\n // possible by using a positive lookahead to the end or next path segment.\n route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)';\n }\n\n return attachKeys(new RegExp('^' + route, flags(options)), keys)\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param {(string|RegExp|Array)} path\n * @param {(Array|Object)=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n if (!isarray(keys)) {\n options = /** @type {!Object} */ (keys || options);\n keys = [];\n }\n\n options = options || {};\n\n if (path instanceof RegExp) {\n return regexpToRegexp(path, /** @type {!Array} */ (keys))\n }\n\n if (isarray(path)) {\n return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)\n }\n\n return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)\n}\npathToRegexp_1.parse = parse_1;\npathToRegexp_1.compile = compile_1;\npathToRegexp_1.tokensToFunction = tokensToFunction_1;\npathToRegexp_1.tokensToRegExp = tokensToRegExp_1;\n\n/* */\n\n// $flow-disable-line\nvar regexpCompileCache = Object.create(null);\n\nfunction fillParams (\n path,\n params,\n routeMsg\n) {\n params = params || {};\n try {\n var filler =\n regexpCompileCache[path] ||\n (regexpCompileCache[path] = pathToRegexp_1.compile(path));\n\n // Fix #2505 resolving asterisk routes { name: 'not-found', params: { pathMatch: '/not-found' }}\n // and fix #3106 so that you can work with location descriptor object having params.pathMatch equal to empty string\n if (typeof params.pathMatch === 'string') { params[0] = params.pathMatch; }\n\n return filler(params, { pretty: true })\n } catch (e) {\n if (false) {\n // Fix #3072 no warn if `pathMatch` is string\n warn(typeof params.pathMatch === 'string', (\"missing param for \" + routeMsg + \": \" + (e.message)));\n }\n return ''\n } finally {\n // delete the 0 if it was added\n delete params[0];\n }\n}\n\n/* */\n\nfunction normalizeLocation (\n raw,\n current,\n append,\n router\n) {\n var next = typeof raw === 'string' ? { path: raw } : raw;\n // named target\n if (next._normalized) {\n return next\n } else if (next.name) {\n next = extend({}, raw);\n var params = next.params;\n if (params && typeof params === 'object') {\n next.params = extend({}, params);\n }\n return next\n }\n\n // relative params\n if (!next.path && next.params && current) {\n next = extend({}, next);\n next._normalized = true;\n var params$1 = extend(extend({}, current.params), next.params);\n if (current.name) {\n next.name = current.name;\n next.params = params$1;\n } else if (current.matched.length) {\n var rawPath = current.matched[current.matched.length - 1].path;\n next.path = fillParams(rawPath, params$1, (\"path \" + (current.path)));\n } else if (false) {\n warn(false, \"relative params navigation requires a current route.\");\n }\n return next\n }\n\n var parsedPath = parsePath(next.path || '');\n var basePath = (current && current.path) || '/';\n var path = parsedPath.path\n ? resolvePath(parsedPath.path, basePath, append || next.append)\n : basePath;\n\n var query = resolveQuery(\n parsedPath.query,\n next.query,\n router && router.options.parseQuery\n );\n\n var hash = next.hash || parsedPath.hash;\n if (hash && hash.charAt(0) !== '#') {\n hash = \"#\" + hash;\n }\n\n return {\n _normalized: true,\n path: path,\n query: query,\n hash: hash\n }\n}\n\n/* */\n\n// work around weird flow bug\nvar toTypes = [String, Object];\nvar eventTypes = [String, Array];\n\nvar noop = function () {};\n\nvar warnedCustomSlot;\nvar warnedTagProp;\nvar warnedEventProp;\n\nvar Link = {\n name: 'RouterLink',\n props: {\n to: {\n type: toTypes,\n required: true\n },\n tag: {\n type: String,\n default: 'a'\n },\n custom: Boolean,\n exact: Boolean,\n exactPath: Boolean,\n append: Boolean,\n replace: Boolean,\n activeClass: String,\n exactActiveClass: String,\n ariaCurrentValue: {\n type: String,\n default: 'page'\n },\n event: {\n type: eventTypes,\n default: 'click'\n }\n },\n render: function render (h) {\n var this$1 = this;\n\n var router = this.$router;\n var current = this.$route;\n var ref = router.resolve(\n this.to,\n current,\n this.append\n );\n var location = ref.location;\n var route = ref.route;\n var href = ref.href;\n\n var classes = {};\n var globalActiveClass = router.options.linkActiveClass;\n var globalExactActiveClass = router.options.linkExactActiveClass;\n // Support global empty active class\n var activeClassFallback =\n globalActiveClass == null ? 'router-link-active' : globalActiveClass;\n var exactActiveClassFallback =\n globalExactActiveClass == null\n ? 'router-link-exact-active'\n : globalExactActiveClass;\n var activeClass =\n this.activeClass == null ? activeClassFallback : this.activeClass;\n var exactActiveClass =\n this.exactActiveClass == null\n ? exactActiveClassFallback\n : this.exactActiveClass;\n\n var compareTarget = route.redirectedFrom\n ? createRoute(null, normalizeLocation(route.redirectedFrom), null, router)\n : route;\n\n classes[exactActiveClass] = isSameRoute(current, compareTarget, this.exactPath);\n classes[activeClass] = this.exact || this.exactPath\n ? classes[exactActiveClass]\n : isIncludedRoute(current, compareTarget);\n\n var ariaCurrentValue = classes[exactActiveClass] ? this.ariaCurrentValue : null;\n\n var handler = function (e) {\n if (guardEvent(e)) {\n if (this$1.replace) {\n router.replace(location, noop);\n } else {\n router.push(location, noop);\n }\n }\n };\n\n var on = { click: guardEvent };\n if (Array.isArray(this.event)) {\n this.event.forEach(function (e) {\n on[e] = handler;\n });\n } else {\n on[this.event] = handler;\n }\n\n var data = { class: classes };\n\n var scopedSlot =\n !this.$scopedSlots.$hasNormal &&\n this.$scopedSlots.default &&\n this.$scopedSlots.default({\n href: href,\n route: route,\n navigate: handler,\n isActive: classes[activeClass],\n isExactActive: classes[exactActiveClass]\n });\n\n if (scopedSlot) {\n if (false) {\n !warnedCustomSlot && warn(false, 'In Vue Router 4, the v-slot API will by default wrap its content with an element. Use the custom prop to remove this warning:\\n
, or missing
. Bailing hydration and performing ' +\n 'full client-side render.'\n );\n }\n }\n // either not server-rendered, or hydration failed.\n // create an empty node and replace it\n oldVnode = emptyNodeAt(oldVnode);\n }\n\n // replacing existing element\n var oldElm = oldVnode.elm;\n var parentElm = nodeOps.parentNode(oldElm);\n\n // create new node\n createElm(\n vnode,\n insertedVnodeQueue,\n // extremely rare edge case: do not insert if old element is in a\n // leaving transition. Only happens when combining transition +\n // keep-alive + HOCs. (#4590)\n oldElm._leaveCb ? null : parentElm,\n nodeOps.nextSibling(oldElm)\n );\n\n // update parent placeholder node element, recursively\n if (isDef(vnode.parent)) {\n var ancestor = vnode.parent;\n var patchable = isPatchable(vnode);\n while (ancestor) {\n for (var i = 0; i < cbs.destroy.length; ++i) {\n cbs.destroy[i](ancestor);\n }\n ancestor.elm = vnode.elm;\n if (patchable) {\n for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n cbs.create[i$1](emptyNode, ancestor);\n }\n // #6513\n // invoke insert hooks that may have been merged by create hooks.\n // e.g. for directives that uses the \"inserted\" hook.\n var insert = ancestor.data.hook.insert;\n if (insert.merged) {\n // start at index 1 to avoid re-invoking component mounted hook\n for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {\n insert.fns[i$2]();\n }\n }\n } else {\n registerRef(ancestor);\n }\n ancestor = ancestor.parent;\n }\n }\n\n // destroy old node\n if (isDef(parentElm)) {\n removeVnodes([oldVnode], 0, 0);\n } else if (isDef(oldVnode.tag)) {\n invokeDestroyHook(oldVnode);\n }\n }\n }\n\n invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);\n return vnode.elm\n }\n}\n\n/* */\n\nvar directives = {\n create: updateDirectives,\n update: updateDirectives,\n destroy: function unbindDirectives (vnode) {\n updateDirectives(vnode, emptyNode);\n }\n};\n\nfunction updateDirectives (oldVnode, vnode) {\n if (oldVnode.data.directives || vnode.data.directives) {\n _update(oldVnode, vnode);\n }\n}\n\nfunction _update (oldVnode, vnode) {\n var isCreate = oldVnode === emptyNode;\n var isDestroy = vnode === emptyNode;\n var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);\n var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);\n\n var dirsWithInsert = [];\n var dirsWithPostpatch = [];\n\n var key, oldDir, dir;\n for (key in newDirs) {\n oldDir = oldDirs[key];\n dir = newDirs[key];\n if (!oldDir) {\n // new directive, bind\n callHook$1(dir, 'bind', vnode, oldVnode);\n if (dir.def && dir.def.inserted) {\n dirsWithInsert.push(dir);\n }\n } else {\n // existing directive, update\n dir.oldValue = oldDir.value;\n dir.oldArg = oldDir.arg;\n callHook$1(dir, 'update', vnode, oldVnode);\n if (dir.def && dir.def.componentUpdated) {\n dirsWithPostpatch.push(dir);\n }\n }\n }\n\n if (dirsWithInsert.length) {\n var callInsert = function () {\n for (var i = 0; i < dirsWithInsert.length; i++) {\n callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);\n }\n };\n if (isCreate) {\n mergeVNodeHook(vnode, 'insert', callInsert);\n } else {\n callInsert();\n }\n }\n\n if (dirsWithPostpatch.length) {\n mergeVNodeHook(vnode, 'postpatch', function () {\n for (var i = 0; i < dirsWithPostpatch.length; i++) {\n callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);\n }\n });\n }\n\n if (!isCreate) {\n for (key in oldDirs) {\n if (!newDirs[key]) {\n // no longer present, unbind\n callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);\n }\n }\n }\n}\n\nvar emptyModifiers = Object.create(null);\n\nfunction normalizeDirectives$1 (\n dirs,\n vm\n) {\n var res = Object.create(null);\n if (!dirs) {\n // $flow-disable-line\n return res\n }\n var i, dir;\n for (i = 0; i < dirs.length; i++) {\n dir = dirs[i];\n if (!dir.modifiers) {\n // $flow-disable-line\n dir.modifiers = emptyModifiers;\n }\n res[getRawDirName(dir)] = dir;\n dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);\n }\n // $flow-disable-line\n return res\n}\n\nfunction getRawDirName (dir) {\n return dir.rawName || ((dir.name) + \".\" + (Object.keys(dir.modifiers || {}).join('.')))\n}\n\nfunction callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {\n var fn = dir.def && dir.def[hook];\n if (fn) {\n try {\n fn(vnode.elm, dir, vnode, oldVnode, isDestroy);\n } catch (e) {\n handleError(e, vnode.context, (\"directive \" + (dir.name) + \" \" + hook + \" hook\"));\n }\n }\n}\n\nvar baseModules = [\n ref,\n directives\n];\n\n/* */\n\nfunction updateAttrs (oldVnode, vnode) {\n var opts = vnode.componentOptions;\n if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {\n return\n }\n if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {\n return\n }\n var key, cur, old;\n var elm = vnode.elm;\n var oldAttrs = oldVnode.data.attrs || {};\n var attrs = vnode.data.attrs || {};\n // clone observed objects, as the user probably wants to mutate it\n if (isDef(attrs.__ob__)) {\n attrs = vnode.data.attrs = extend({}, attrs);\n }\n\n for (key in attrs) {\n cur = attrs[key];\n old = oldAttrs[key];\n if (old !== cur) {\n setAttr(elm, key, cur, vnode.data.pre);\n }\n }\n // #4391: in IE9, setting type can reset value for input[type=radio]\n // #6666: IE/Edge forces progress value down to 1 before setting a max\n /* istanbul ignore if */\n if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {\n setAttr(elm, 'value', attrs.value);\n }\n for (key in oldAttrs) {\n if (isUndef(attrs[key])) {\n if (isXlink(key)) {\n elm.removeAttributeNS(xlinkNS, getXlinkProp(key));\n } else if (!isEnumeratedAttr(key)) {\n elm.removeAttribute(key);\n }\n }\n }\n}\n\nfunction setAttr (el, key, value, isInPre) {\n if (isInPre || el.tagName.indexOf('-') > -1) {\n baseSetAttr(el, key, value);\n } else if (isBooleanAttr(key)) {\n // set attribute for blank value\n // e.g. \n if (isFalsyAttrValue(value)) {\n el.removeAttribute(key);\n } else {\n // technically allowfullscreen is a boolean attribute for