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\\n');\n warnedCustomSlot = true;\n }\n if (scopedSlot.length === 1) {\n return scopedSlot[0]\n } else if (scopedSlot.length > 1 || !scopedSlot.length) {\n if (false) {\n warn(\n false,\n (\" with to=\\\"\" + (this.to) + \"\\\" is trying to use a scoped slot but it didn't provide exactly one child. Wrapping the content with a span element.\")\n );\n }\n return scopedSlot.length === 0 ? h() : h('span', {}, scopedSlot)\n }\n }\n\n if (false) {\n if ('tag' in this.$options.propsData && !warnedTagProp) {\n warn(\n false,\n \"'s tag prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning: https://next.router.vuejs.org/guide/migration/#removal-of-event-and-tag-props-in-router-link.\"\n );\n warnedTagProp = true;\n }\n if ('event' in this.$options.propsData && !warnedEventProp) {\n warn(\n false,\n \"'s event prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning: https://next.router.vuejs.org/guide/migration/#removal-of-event-and-tag-props-in-router-link.\"\n );\n warnedEventProp = true;\n }\n }\n\n if (this.tag === 'a') {\n data.on = on;\n data.attrs = { href: href, 'aria-current': ariaCurrentValue };\n } else {\n // find the first child and apply listener and href\n var a = findAnchor(this.$slots.default);\n if (a) {\n // in case the is a static node\n a.isStatic = false;\n var aData = (a.data = extend({}, a.data));\n aData.on = aData.on || {};\n // transform existing events in both objects into arrays so we can push later\n for (var event in aData.on) {\n var handler$1 = aData.on[event];\n if (event in on) {\n aData.on[event] = Array.isArray(handler$1) ? handler$1 : [handler$1];\n }\n }\n // append new listeners for router-link\n for (var event$1 in on) {\n if (event$1 in aData.on) {\n // on[event] is always a function\n aData.on[event$1].push(on[event$1]);\n } else {\n aData.on[event$1] = handler;\n }\n }\n\n var aAttrs = (a.data.attrs = extend({}, a.data.attrs));\n aAttrs.href = href;\n aAttrs['aria-current'] = ariaCurrentValue;\n } else {\n // doesn't have child, apply listener to self\n data.on = on;\n }\n }\n\n return h(this.tag, data, this.$slots.default)\n }\n};\n\nfunction guardEvent (e) {\n // don't redirect with control keys\n if (e.metaKey || e.altKey || e.ctrlKey || e.shiftKey) { return }\n // don't redirect when preventDefault called\n if (e.defaultPrevented) { return }\n // don't redirect on right click\n if (e.button !== undefined && e.button !== 0) { return }\n // don't redirect if `target=\"_blank\"`\n if (e.currentTarget && e.currentTarget.getAttribute) {\n var target = e.currentTarget.getAttribute('target');\n if (/\\b_blank\\b/i.test(target)) { return }\n }\n // this may be a Weex event which doesn't have this method\n if (e.preventDefault) {\n e.preventDefault();\n }\n return true\n}\n\nfunction findAnchor (children) {\n if (children) {\n var child;\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n if (child.tag === 'a') {\n return child\n }\n if (child.children && (child = findAnchor(child.children))) {\n return child\n }\n }\n }\n}\n\nvar _Vue;\n\nfunction install (Vue) {\n if (install.installed && _Vue === Vue) { return }\n install.installed = true;\n\n _Vue = Vue;\n\n var isDef = function (v) { return v !== undefined; };\n\n var registerInstance = function (vm, callVal) {\n var i = vm.$options._parentVnode;\n if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) {\n i(vm, callVal);\n }\n };\n\n Vue.mixin({\n beforeCreate: function beforeCreate () {\n if (isDef(this.$options.router)) {\n this._routerRoot = this;\n this._router = this.$options.router;\n this._router.init(this);\n Vue.util.defineReactive(this, '_route', this._router.history.current);\n } else {\n this._routerRoot = (this.$parent && this.$parent._routerRoot) || this;\n }\n registerInstance(this, this);\n },\n destroyed: function destroyed () {\n registerInstance(this);\n }\n });\n\n Object.defineProperty(Vue.prototype, '$router', {\n get: function get () { return this._routerRoot._router }\n });\n\n Object.defineProperty(Vue.prototype, '$route', {\n get: function get () { return this._routerRoot._route }\n });\n\n Vue.component('RouterView', View);\n Vue.component('RouterLink', Link);\n\n var strats = Vue.config.optionMergeStrategies;\n // use the same hook merging strategy for route hooks\n strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created;\n}\n\n/* */\n\nvar inBrowser = typeof window !== 'undefined';\n\n/* */\n\nfunction createRouteMap (\n routes,\n oldPathList,\n oldPathMap,\n oldNameMap,\n parentRoute\n) {\n // the path list is used to control path matching priority\n var pathList = oldPathList || [];\n // $flow-disable-line\n var pathMap = oldPathMap || Object.create(null);\n // $flow-disable-line\n var nameMap = oldNameMap || Object.create(null);\n\n routes.forEach(function (route) {\n addRouteRecord(pathList, pathMap, nameMap, route, parentRoute);\n });\n\n // ensure wildcard routes are always at the end\n for (var i = 0, l = pathList.length; i < l; i++) {\n if (pathList[i] === '*') {\n pathList.push(pathList.splice(i, 1)[0]);\n l--;\n i--;\n }\n }\n\n if (false) {\n // warn if routes do not include leading slashes\n var found = pathList\n // check for missing leading slash\n .filter(function (path) { return path && path.charAt(0) !== '*' && path.charAt(0) !== '/'; });\n\n if (found.length > 0) {\n var pathNames = found.map(function (path) { return (\"- \" + path); }).join('\\n');\n warn(false, (\"Non-nested routes must include a leading slash character. Fix the following routes: \\n\" + pathNames));\n }\n }\n\n return {\n pathList: pathList,\n pathMap: pathMap,\n nameMap: nameMap\n }\n}\n\nfunction addRouteRecord (\n pathList,\n pathMap,\n nameMap,\n route,\n parent,\n matchAs\n) {\n var path = route.path;\n var name = route.name;\n if (false) {\n assert(path != null, \"\\\"path\\\" is required in a route configuration.\");\n assert(\n typeof route.component !== 'string',\n \"route config \\\"component\\\" for path: \" + (String(\n path || name\n )) + \" cannot be a \" + \"string id. Use an actual component instead.\"\n );\n\n warn(\n // eslint-disable-next-line no-control-regex\n !/[^\\u0000-\\u007F]+/.test(path),\n \"Route with path \\\"\" + path + \"\\\" contains unencoded characters, make sure \" +\n \"your path is correctly encoded before passing it to the router. Use \" +\n \"encodeURI to encode static segments of your path.\"\n );\n }\n\n var pathToRegexpOptions =\n route.pathToRegexpOptions || {};\n var normalizedPath = normalizePath(path, parent, pathToRegexpOptions.strict);\n\n if (typeof route.caseSensitive === 'boolean') {\n pathToRegexpOptions.sensitive = route.caseSensitive;\n }\n\n var record = {\n path: normalizedPath,\n regex: compileRouteRegex(normalizedPath, pathToRegexpOptions),\n components: route.components || { default: route.component },\n alias: route.alias\n ? typeof route.alias === 'string'\n ? [route.alias]\n : route.alias\n : [],\n instances: {},\n enteredCbs: {},\n name: name,\n parent: parent,\n matchAs: matchAs,\n redirect: route.redirect,\n beforeEnter: route.beforeEnter,\n meta: route.meta || {},\n props:\n route.props == null\n ? {}\n : route.components\n ? route.props\n : { default: route.props }\n };\n\n if (route.children) {\n // Warn if route is named, does not redirect and has a default child route.\n // If users navigate to this route by name, the default child will\n // not be rendered (GH Issue #629)\n if (false) {\n if (\n route.name &&\n !route.redirect &&\n route.children.some(function (child) { return /^\\/?$/.test(child.path); })\n ) {\n warn(\n false,\n \"Named Route '\" + (route.name) + \"' has a default child route. \" +\n \"When navigating to this named route (:to=\\\"{name: '\" + (route.name) + \"'\\\"), \" +\n \"the default child route will not be rendered. Remove the name from \" +\n \"this route and use the name of the default child route for named \" +\n \"links instead.\"\n );\n }\n }\n route.children.forEach(function (child) {\n var childMatchAs = matchAs\n ? cleanPath((matchAs + \"/\" + (child.path)))\n : undefined;\n addRouteRecord(pathList, pathMap, nameMap, child, record, childMatchAs);\n });\n }\n\n if (!pathMap[record.path]) {\n pathList.push(record.path);\n pathMap[record.path] = record;\n }\n\n if (route.alias !== undefined) {\n var aliases = Array.isArray(route.alias) ? route.alias : [route.alias];\n for (var i = 0; i < aliases.length; ++i) {\n var alias = aliases[i];\n if (false) {\n warn(\n false,\n (\"Found an alias with the same value as the path: \\\"\" + path + \"\\\". You have to remove that alias. It will be ignored in development.\")\n );\n // skip in dev to make it work\n continue\n }\n\n var aliasRoute = {\n path: alias,\n children: route.children\n };\n addRouteRecord(\n pathList,\n pathMap,\n nameMap,\n aliasRoute,\n parent,\n record.path || '/' // matchAs\n );\n }\n }\n\n if (name) {\n if (!nameMap[name]) {\n nameMap[name] = record;\n } else if (false) {\n warn(\n false,\n \"Duplicate named routes definition: \" +\n \"{ name: \\\"\" + name + \"\\\", path: \\\"\" + (record.path) + \"\\\" }\"\n );\n }\n }\n}\n\nfunction compileRouteRegex (\n path,\n pathToRegexpOptions\n) {\n var regex = pathToRegexp_1(path, [], pathToRegexpOptions);\n if (false) {\n var keys = Object.create(null);\n regex.keys.forEach(function (key) {\n warn(\n !keys[key.name],\n (\"Duplicate param keys in route with path: \\\"\" + path + \"\\\"\")\n );\n keys[key.name] = true;\n });\n }\n return regex\n}\n\nfunction normalizePath (\n path,\n parent,\n strict\n) {\n if (!strict) { path = path.replace(/\\/$/, ''); }\n if (path[0] === '/') { return path }\n if (parent == null) { return path }\n return cleanPath(((parent.path) + \"/\" + path))\n}\n\n/* */\n\n\n\nfunction createMatcher (\n routes,\n router\n) {\n var ref = createRouteMap(routes);\n var pathList = ref.pathList;\n var pathMap = ref.pathMap;\n var nameMap = ref.nameMap;\n\n function addRoutes (routes) {\n createRouteMap(routes, pathList, pathMap, nameMap);\n }\n\n function addRoute (parentOrRoute, route) {\n var parent = (typeof parentOrRoute !== 'object') ? nameMap[parentOrRoute] : undefined;\n // $flow-disable-line\n createRouteMap([route || parentOrRoute], pathList, pathMap, nameMap, parent);\n\n // add aliases of parent\n if (parent && parent.alias.length) {\n createRouteMap(\n // $flow-disable-line route is defined if parent is\n parent.alias.map(function (alias) { return ({ path: alias, children: [route] }); }),\n pathList,\n pathMap,\n nameMap,\n parent\n );\n }\n }\n\n function getRoutes () {\n return pathList.map(function (path) { return pathMap[path]; })\n }\n\n function match (\n raw,\n currentRoute,\n redirectedFrom\n ) {\n var location = normalizeLocation(raw, currentRoute, false, router);\n var name = location.name;\n\n if (name) {\n var record = nameMap[name];\n if (false) {\n warn(record, (\"Route with name '\" + name + \"' does not exist\"));\n }\n if (!record) { return _createRoute(null, location) }\n var paramNames = record.regex.keys\n .filter(function (key) { return !key.optional; })\n .map(function (key) { return key.name; });\n\n if (typeof location.params !== 'object') {\n location.params = {};\n }\n\n if (currentRoute && typeof currentRoute.params === 'object') {\n for (var key in currentRoute.params) {\n if (!(key in location.params) && paramNames.indexOf(key) > -1) {\n location.params[key] = currentRoute.params[key];\n }\n }\n }\n\n location.path = fillParams(record.path, location.params, (\"named route \\\"\" + name + \"\\\"\"));\n return _createRoute(record, location, redirectedFrom)\n } else if (location.path) {\n location.params = {};\n for (var i = 0; i < pathList.length; i++) {\n var path = pathList[i];\n var record$1 = pathMap[path];\n if (matchRoute(record$1.regex, location.path, location.params)) {\n return _createRoute(record$1, location, redirectedFrom)\n }\n }\n }\n // no match\n return _createRoute(null, location)\n }\n\n function redirect (\n record,\n location\n ) {\n var originalRedirect = record.redirect;\n var redirect = typeof originalRedirect === 'function'\n ? originalRedirect(createRoute(record, location, null, router))\n : originalRedirect;\n\n if (typeof redirect === 'string') {\n redirect = { path: redirect };\n }\n\n if (!redirect || typeof redirect !== 'object') {\n if (false) {\n warn(\n false, (\"invalid redirect option: \" + (JSON.stringify(redirect)))\n );\n }\n return _createRoute(null, location)\n }\n\n var re = redirect;\n var name = re.name;\n var path = re.path;\n var query = location.query;\n var hash = location.hash;\n var params = location.params;\n query = re.hasOwnProperty('query') ? re.query : query;\n hash = re.hasOwnProperty('hash') ? re.hash : hash;\n params = re.hasOwnProperty('params') ? re.params : params;\n\n if (name) {\n // resolved named direct\n var targetRecord = nameMap[name];\n if (false) {\n assert(targetRecord, (\"redirect failed: named route \\\"\" + name + \"\\\" not found.\"));\n }\n return match({\n _normalized: true,\n name: name,\n query: query,\n hash: hash,\n params: params\n }, undefined, location)\n } else if (path) {\n // 1. resolve relative redirect\n var rawPath = resolveRecordPath(path, record);\n // 2. resolve params\n var resolvedPath = fillParams(rawPath, params, (\"redirect route with path \\\"\" + rawPath + \"\\\"\"));\n // 3. rematch with existing query and hash\n return match({\n _normalized: true,\n path: resolvedPath,\n query: query,\n hash: hash\n }, undefined, location)\n } else {\n if (false) {\n warn(false, (\"invalid redirect option: \" + (JSON.stringify(redirect))));\n }\n return _createRoute(null, location)\n }\n }\n\n function alias (\n record,\n location,\n matchAs\n ) {\n var aliasedPath = fillParams(matchAs, location.params, (\"aliased route with path \\\"\" + matchAs + \"\\\"\"));\n var aliasedMatch = match({\n _normalized: true,\n path: aliasedPath\n });\n if (aliasedMatch) {\n var matched = aliasedMatch.matched;\n var aliasedRecord = matched[matched.length - 1];\n location.params = aliasedMatch.params;\n return _createRoute(aliasedRecord, location)\n }\n return _createRoute(null, location)\n }\n\n function _createRoute (\n record,\n location,\n redirectedFrom\n ) {\n if (record && record.redirect) {\n return redirect(record, redirectedFrom || location)\n }\n if (record && record.matchAs) {\n return alias(record, location, record.matchAs)\n }\n return createRoute(record, location, redirectedFrom, router)\n }\n\n return {\n match: match,\n addRoute: addRoute,\n getRoutes: getRoutes,\n addRoutes: addRoutes\n }\n}\n\nfunction matchRoute (\n regex,\n path,\n params\n) {\n var m = path.match(regex);\n\n if (!m) {\n return false\n } else if (!params) {\n return true\n }\n\n for (var i = 1, len = m.length; i < len; ++i) {\n var key = regex.keys[i - 1];\n if (key) {\n // Fix #1994: using * with props: true generates a param named 0\n params[key.name || 'pathMatch'] = typeof m[i] === 'string' ? decode(m[i]) : m[i];\n }\n }\n\n return true\n}\n\nfunction resolveRecordPath (path, record) {\n return resolvePath(path, record.parent ? record.parent.path : '/', true)\n}\n\n/* */\n\n// use User Timing api (if present) for more accurate key precision\nvar Time =\n inBrowser && window.performance && window.performance.now\n ? window.performance\n : Date;\n\nfunction genStateKey () {\n return Time.now().toFixed(3)\n}\n\nvar _key = genStateKey();\n\nfunction getStateKey () {\n return _key\n}\n\nfunction setStateKey (key) {\n return (_key = key)\n}\n\n/* */\n\nvar positionStore = Object.create(null);\n\nfunction setupScroll () {\n // Prevent browser scroll behavior on History popstate\n if ('scrollRestoration' in window.history) {\n window.history.scrollRestoration = 'manual';\n }\n // Fix for #1585 for Firefox\n // Fix for #2195 Add optional third attribute to workaround a bug in safari https://bugs.webkit.org/show_bug.cgi?id=182678\n // Fix for #2774 Support for apps loaded from Windows file shares not mapped to network drives: replaced location.origin with\n // window.location.protocol + '//' + window.location.host\n // location.host contains the port and location.hostname doesn't\n var protocolAndPath = window.location.protocol + '//' + window.location.host;\n var absolutePath = window.location.href.replace(protocolAndPath, '');\n // preserve existing history state as it could be overriden by the user\n var stateCopy = extend({}, window.history.state);\n stateCopy.key = getStateKey();\n window.history.replaceState(stateCopy, '', absolutePath);\n window.addEventListener('popstate', handlePopState);\n return function () {\n window.removeEventListener('popstate', handlePopState);\n }\n}\n\nfunction handleScroll (\n router,\n to,\n from,\n isPop\n) {\n if (!router.app) {\n return\n }\n\n var behavior = router.options.scrollBehavior;\n if (!behavior) {\n return\n }\n\n if (false) {\n assert(typeof behavior === 'function', \"scrollBehavior must be a function\");\n }\n\n // wait until re-render finishes before scrolling\n router.app.$nextTick(function () {\n var position = getScrollPosition();\n var shouldScroll = behavior.call(\n router,\n to,\n from,\n isPop ? position : null\n );\n\n if (!shouldScroll) {\n return\n }\n\n if (typeof shouldScroll.then === 'function') {\n shouldScroll\n .then(function (shouldScroll) {\n scrollToPosition((shouldScroll), position);\n })\n .catch(function (err) {\n if (false) {\n assert(false, err.toString());\n }\n });\n } else {\n scrollToPosition(shouldScroll, position);\n }\n });\n}\n\nfunction saveScrollPosition () {\n var key = getStateKey();\n if (key) {\n positionStore[key] = {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n }\n}\n\nfunction handlePopState (e) {\n saveScrollPosition();\n if (e.state && e.state.key) {\n setStateKey(e.state.key);\n }\n}\n\nfunction getScrollPosition () {\n var key = getStateKey();\n if (key) {\n return positionStore[key]\n }\n}\n\nfunction getElementPosition (el, offset) {\n var docEl = document.documentElement;\n var docRect = docEl.getBoundingClientRect();\n var elRect = el.getBoundingClientRect();\n return {\n x: elRect.left - docRect.left - offset.x,\n y: elRect.top - docRect.top - offset.y\n }\n}\n\nfunction isValidPosition (obj) {\n return isNumber(obj.x) || isNumber(obj.y)\n}\n\nfunction normalizePosition (obj) {\n return {\n x: isNumber(obj.x) ? obj.x : window.pageXOffset,\n y: isNumber(obj.y) ? obj.y : window.pageYOffset\n }\n}\n\nfunction normalizeOffset (obj) {\n return {\n x: isNumber(obj.x) ? obj.x : 0,\n y: isNumber(obj.y) ? obj.y : 0\n }\n}\n\nfunction isNumber (v) {\n return typeof v === 'number'\n}\n\nvar hashStartsWithNumberRE = /^#\\d/;\n\nfunction scrollToPosition (shouldScroll, position) {\n var isObject = typeof shouldScroll === 'object';\n if (isObject && typeof shouldScroll.selector === 'string') {\n // getElementById would still fail if the selector contains a more complicated query like #main[data-attr]\n // but at the same time, it doesn't make much sense to select an element with an id and an extra selector\n var el = hashStartsWithNumberRE.test(shouldScroll.selector) // $flow-disable-line\n ? document.getElementById(shouldScroll.selector.slice(1)) // $flow-disable-line\n : document.querySelector(shouldScroll.selector);\n\n if (el) {\n var offset =\n shouldScroll.offset && typeof shouldScroll.offset === 'object'\n ? shouldScroll.offset\n : {};\n offset = normalizeOffset(offset);\n position = getElementPosition(el, offset);\n } else if (isValidPosition(shouldScroll)) {\n position = normalizePosition(shouldScroll);\n }\n } else if (isObject && isValidPosition(shouldScroll)) {\n position = normalizePosition(shouldScroll);\n }\n\n if (position) {\n // $flow-disable-line\n if ('scrollBehavior' in document.documentElement.style) {\n window.scrollTo({\n left: position.x,\n top: position.y,\n // $flow-disable-line\n behavior: shouldScroll.behavior\n });\n } else {\n window.scrollTo(position.x, position.y);\n }\n }\n}\n\n/* */\n\nvar supportsPushState =\n inBrowser &&\n (function () {\n var ua = window.navigator.userAgent;\n\n if (\n (ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) &&\n ua.indexOf('Mobile Safari') !== -1 &&\n ua.indexOf('Chrome') === -1 &&\n ua.indexOf('Windows Phone') === -1\n ) {\n return false\n }\n\n return window.history && typeof window.history.pushState === 'function'\n })();\n\nfunction pushState (url, replace) {\n saveScrollPosition();\n // try...catch the pushState call to get around Safari\n // DOM Exception 18 where it limits to 100 pushState calls\n var history = window.history;\n try {\n if (replace) {\n // preserve existing history state as it could be overriden by the user\n var stateCopy = extend({}, history.state);\n stateCopy.key = getStateKey();\n history.replaceState(stateCopy, '', url);\n } else {\n history.pushState({ key: setStateKey(genStateKey()) }, '', url);\n }\n } catch (e) {\n window.location[replace ? 'replace' : 'assign'](url);\n }\n}\n\nfunction replaceState (url) {\n pushState(url, true);\n}\n\n/* */\n\nfunction runQueue (queue, fn, cb) {\n var step = function (index) {\n if (index >= queue.length) {\n cb();\n } else {\n if (queue[index]) {\n fn(queue[index], function () {\n step(index + 1);\n });\n } else {\n step(index + 1);\n }\n }\n };\n step(0);\n}\n\n// When changing thing, also edit router.d.ts\nvar NavigationFailureType = {\n redirected: 2,\n aborted: 4,\n cancelled: 8,\n duplicated: 16\n};\n\nfunction createNavigationRedirectedError (from, to) {\n return createRouterError(\n from,\n to,\n NavigationFailureType.redirected,\n (\"Redirected when going from \\\"\" + (from.fullPath) + \"\\\" to \\\"\" + (stringifyRoute(\n to\n )) + \"\\\" via a navigation guard.\")\n )\n}\n\nfunction createNavigationDuplicatedError (from, to) {\n var error = createRouterError(\n from,\n to,\n NavigationFailureType.duplicated,\n (\"Avoided redundant navigation to current location: \\\"\" + (from.fullPath) + \"\\\".\")\n );\n // backwards compatible with the first introduction of Errors\n error.name = 'NavigationDuplicated';\n return error\n}\n\nfunction createNavigationCancelledError (from, to) {\n return createRouterError(\n from,\n to,\n NavigationFailureType.cancelled,\n (\"Navigation cancelled from \\\"\" + (from.fullPath) + \"\\\" to \\\"\" + (to.fullPath) + \"\\\" with a new navigation.\")\n )\n}\n\nfunction createNavigationAbortedError (from, to) {\n return createRouterError(\n from,\n to,\n NavigationFailureType.aborted,\n (\"Navigation aborted from \\\"\" + (from.fullPath) + \"\\\" to \\\"\" + (to.fullPath) + \"\\\" via a navigation guard.\")\n )\n}\n\nfunction createRouterError (from, to, type, message) {\n var error = new Error(message);\n error._isRouter = true;\n error.from = from;\n error.to = to;\n error.type = type;\n\n return error\n}\n\nvar propertiesToLog = ['params', 'query', 'hash'];\n\nfunction stringifyRoute (to) {\n if (typeof to === 'string') { return to }\n if ('path' in to) { return to.path }\n var location = {};\n propertiesToLog.forEach(function (key) {\n if (key in to) { location[key] = to[key]; }\n });\n return JSON.stringify(location, null, 2)\n}\n\nfunction isError (err) {\n return Object.prototype.toString.call(err).indexOf('Error') > -1\n}\n\nfunction isNavigationFailure (err, errorType) {\n return (\n isError(err) &&\n err._isRouter &&\n (errorType == null || err.type === errorType)\n )\n}\n\n/* */\n\nfunction resolveAsyncComponents (matched) {\n return function (to, from, next) {\n var hasAsync = false;\n var pending = 0;\n var error = null;\n\n flatMapComponents(matched, function (def, _, match, key) {\n // if it's a function and doesn't have cid attached,\n // assume it's an async component resolve function.\n // we are not using Vue's default async resolving mechanism because\n // we want to halt the navigation until the incoming component has been\n // resolved.\n if (typeof def === 'function' && def.cid === undefined) {\n hasAsync = true;\n pending++;\n\n var resolve = once(function (resolvedDef) {\n if (isESModule(resolvedDef)) {\n resolvedDef = resolvedDef.default;\n }\n // save resolved on async factory in case it's used elsewhere\n def.resolved = typeof resolvedDef === 'function'\n ? resolvedDef\n : _Vue.extend(resolvedDef);\n match.components[key] = resolvedDef;\n pending--;\n if (pending <= 0) {\n next();\n }\n });\n\n var reject = once(function (reason) {\n var msg = \"Failed to resolve async component \" + key + \": \" + reason;\n \"production\" !== 'production' && warn(false, msg);\n if (!error) {\n error = isError(reason)\n ? reason\n : new Error(msg);\n next(error);\n }\n });\n\n var res;\n try {\n res = def(resolve, reject);\n } catch (e) {\n reject(e);\n }\n if (res) {\n if (typeof res.then === 'function') {\n res.then(resolve, reject);\n } else {\n // new syntax in Vue 2.3\n var comp = res.component;\n if (comp && typeof comp.then === 'function') {\n comp.then(resolve, reject);\n }\n }\n }\n }\n });\n\n if (!hasAsync) { next(); }\n }\n}\n\nfunction flatMapComponents (\n matched,\n fn\n) {\n return flatten(matched.map(function (m) {\n return Object.keys(m.components).map(function (key) { return fn(\n m.components[key],\n m.instances[key],\n m, key\n ); })\n }))\n}\n\nfunction flatten (arr) {\n return Array.prototype.concat.apply([], arr)\n}\n\nvar hasSymbol =\n typeof Symbol === 'function' &&\n typeof Symbol.toStringTag === 'symbol';\n\nfunction isESModule (obj) {\n return obj.__esModule || (hasSymbol && obj[Symbol.toStringTag] === 'Module')\n}\n\n// in Webpack 2, require.ensure now also returns a Promise\n// so the resolve/reject functions may get called an extra time\n// if the user uses an arrow function shorthand that happens to\n// return that Promise.\nfunction once (fn) {\n var called = false;\n return function () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n if (called) { return }\n called = true;\n return fn.apply(this, args)\n }\n}\n\n/* */\n\nvar History = function History (router, base) {\n this.router = router;\n this.base = normalizeBase(base);\n // start with a route object that stands for \"nowhere\"\n this.current = START;\n this.pending = null;\n this.ready = false;\n this.readyCbs = [];\n this.readyErrorCbs = [];\n this.errorCbs = [];\n this.listeners = [];\n};\n\nHistory.prototype.listen = function listen (cb) {\n this.cb = cb;\n};\n\nHistory.prototype.onReady = function onReady (cb, errorCb) {\n if (this.ready) {\n cb();\n } else {\n this.readyCbs.push(cb);\n if (errorCb) {\n this.readyErrorCbs.push(errorCb);\n }\n }\n};\n\nHistory.prototype.onError = function onError (errorCb) {\n this.errorCbs.push(errorCb);\n};\n\nHistory.prototype.transitionTo = function transitionTo (\n location,\n onComplete,\n onAbort\n) {\n var this$1 = this;\n\n var route;\n // catch redirect option https://github.com/vuejs/vue-router/issues/3201\n try {\n route = this.router.match(location, this.current);\n } catch (e) {\n this.errorCbs.forEach(function (cb) {\n cb(e);\n });\n // Exception should still be thrown\n throw e\n }\n var prev = this.current;\n this.confirmTransition(\n route,\n function () {\n this$1.updateRoute(route);\n onComplete && onComplete(route);\n this$1.ensureURL();\n this$1.router.afterHooks.forEach(function (hook) {\n hook && hook(route, prev);\n });\n\n // fire ready cbs once\n if (!this$1.ready) {\n this$1.ready = true;\n this$1.readyCbs.forEach(function (cb) {\n cb(route);\n });\n }\n },\n function (err) {\n if (onAbort) {\n onAbort(err);\n }\n if (err && !this$1.ready) {\n // Initial redirection should not mark the history as ready yet\n // because it's triggered by the redirection instead\n // https://github.com/vuejs/vue-router/issues/3225\n // https://github.com/vuejs/vue-router/issues/3331\n if (!isNavigationFailure(err, NavigationFailureType.redirected) || prev !== START) {\n this$1.ready = true;\n this$1.readyErrorCbs.forEach(function (cb) {\n cb(err);\n });\n }\n }\n }\n );\n};\n\nHistory.prototype.confirmTransition = function confirmTransition (route, onComplete, onAbort) {\n var this$1 = this;\n\n var current = this.current;\n this.pending = route;\n var abort = function (err) {\n // changed after adding errors with\n // https://github.com/vuejs/vue-router/pull/3047 before that change,\n // redirect and aborted navigation would produce an err == null\n if (!isNavigationFailure(err) && isError(err)) {\n if (this$1.errorCbs.length) {\n this$1.errorCbs.forEach(function (cb) {\n cb(err);\n });\n } else {\n warn(false, 'uncaught error during route navigation:');\n console.error(err);\n }\n }\n onAbort && onAbort(err);\n };\n var lastRouteIndex = route.matched.length - 1;\n var lastCurrentIndex = current.matched.length - 1;\n if (\n isSameRoute(route, current) &&\n // in the case the route map has been dynamically appended to\n lastRouteIndex === lastCurrentIndex &&\n route.matched[lastRouteIndex] === current.matched[lastCurrentIndex]\n ) {\n this.ensureURL();\n return abort(createNavigationDuplicatedError(current, route))\n }\n\n var ref = resolveQueue(\n this.current.matched,\n route.matched\n );\n var updated = ref.updated;\n var deactivated = ref.deactivated;\n var activated = ref.activated;\n\n var queue = [].concat(\n // in-component leave guards\n extractLeaveGuards(deactivated),\n // global before hooks\n this.router.beforeHooks,\n // in-component update hooks\n extractUpdateHooks(updated),\n // in-config enter guards\n activated.map(function (m) { return m.beforeEnter; }),\n // async components\n resolveAsyncComponents(activated)\n );\n\n var iterator = function (hook, next) {\n if (this$1.pending !== route) {\n return abort(createNavigationCancelledError(current, route))\n }\n try {\n hook(route, current, function (to) {\n if (to === false) {\n // next(false) -> abort navigation, ensure current URL\n this$1.ensureURL(true);\n abort(createNavigationAbortedError(current, route));\n } else if (isError(to)) {\n this$1.ensureURL(true);\n abort(to);\n } else if (\n typeof to === 'string' ||\n (typeof to === 'object' &&\n (typeof to.path === 'string' || typeof to.name === 'string'))\n ) {\n // next('/') or next({ path: '/' }) -> redirect\n abort(createNavigationRedirectedError(current, route));\n if (typeof to === 'object' && to.replace) {\n this$1.replace(to);\n } else {\n this$1.push(to);\n }\n } else {\n // confirm transition and pass on the value\n next(to);\n }\n });\n } catch (e) {\n abort(e);\n }\n };\n\n runQueue(queue, iterator, function () {\n // wait until async components are resolved before\n // extracting in-component enter guards\n var enterGuards = extractEnterGuards(activated);\n var queue = enterGuards.concat(this$1.router.resolveHooks);\n runQueue(queue, iterator, function () {\n if (this$1.pending !== route) {\n return abort(createNavigationCancelledError(current, route))\n }\n this$1.pending = null;\n onComplete(route);\n if (this$1.router.app) {\n this$1.router.app.$nextTick(function () {\n handleRouteEntered(route);\n });\n }\n });\n });\n};\n\nHistory.prototype.updateRoute = function updateRoute (route) {\n this.current = route;\n this.cb && this.cb(route);\n};\n\nHistory.prototype.setupListeners = function setupListeners () {\n // Default implementation is empty\n};\n\nHistory.prototype.teardown = function teardown () {\n // clean up event listeners\n // https://github.com/vuejs/vue-router/issues/2341\n this.listeners.forEach(function (cleanupListener) {\n cleanupListener();\n });\n this.listeners = [];\n\n // reset current history route\n // https://github.com/vuejs/vue-router/issues/3294\n this.current = START;\n this.pending = null;\n};\n\nfunction normalizeBase (base) {\n if (!base) {\n if (inBrowser) {\n // respect tag\n var baseEl = document.querySelector('base');\n base = (baseEl && baseEl.getAttribute('href')) || '/';\n // strip full URL origin\n base = base.replace(/^https?:\\/\\/[^\\/]+/, '');\n } else {\n base = '/';\n }\n }\n // make sure there's the starting slash\n if (base.charAt(0) !== '/') {\n base = '/' + base;\n }\n // remove trailing slash\n return base.replace(/\\/$/, '')\n}\n\nfunction resolveQueue (\n current,\n next\n) {\n var i;\n var max = Math.max(current.length, next.length);\n for (i = 0; i < max; i++) {\n if (current[i] !== next[i]) {\n break\n }\n }\n return {\n updated: next.slice(0, i),\n activated: next.slice(i),\n deactivated: current.slice(i)\n }\n}\n\nfunction extractGuards (\n records,\n name,\n bind,\n reverse\n) {\n var guards = flatMapComponents(records, function (def, instance, match, key) {\n var guard = extractGuard(def, name);\n if (guard) {\n return Array.isArray(guard)\n ? guard.map(function (guard) { return bind(guard, instance, match, key); })\n : bind(guard, instance, match, key)\n }\n });\n return flatten(reverse ? guards.reverse() : guards)\n}\n\nfunction extractGuard (\n def,\n key\n) {\n if (typeof def !== 'function') {\n // extend now so that global mixins are applied.\n def = _Vue.extend(def);\n }\n return def.options[key]\n}\n\nfunction extractLeaveGuards (deactivated) {\n return extractGuards(deactivated, 'beforeRouteLeave', bindGuard, true)\n}\n\nfunction extractUpdateHooks (updated) {\n return extractGuards(updated, 'beforeRouteUpdate', bindGuard)\n}\n\nfunction bindGuard (guard, instance) {\n if (instance) {\n return function boundRouteGuard () {\n return guard.apply(instance, arguments)\n }\n }\n}\n\nfunction extractEnterGuards (\n activated\n) {\n return extractGuards(\n activated,\n 'beforeRouteEnter',\n function (guard, _, match, key) {\n return bindEnterGuard(guard, match, key)\n }\n )\n}\n\nfunction bindEnterGuard (\n guard,\n match,\n key\n) {\n return function routeEnterGuard (to, from, next) {\n return guard(to, from, function (cb) {\n if (typeof cb === 'function') {\n if (!match.enteredCbs[key]) {\n match.enteredCbs[key] = [];\n }\n match.enteredCbs[key].push(cb);\n }\n next(cb);\n })\n }\n}\n\n/* */\n\nvar HTML5History = /*@__PURE__*/(function (History) {\n function HTML5History (router, base) {\n History.call(this, router, base);\n\n this._startLocation = getLocation(this.base);\n }\n\n if ( History ) HTML5History.__proto__ = History;\n HTML5History.prototype = Object.create( History && History.prototype );\n HTML5History.prototype.constructor = HTML5History;\n\n HTML5History.prototype.setupListeners = function setupListeners () {\n var this$1 = this;\n\n if (this.listeners.length > 0) {\n return\n }\n\n var router = this.router;\n var expectScroll = router.options.scrollBehavior;\n var supportsScroll = supportsPushState && expectScroll;\n\n if (supportsScroll) {\n this.listeners.push(setupScroll());\n }\n\n var handleRoutingEvent = function () {\n var current = this$1.current;\n\n // Avoiding first `popstate` event dispatched in some browsers but first\n // history route not updated since async guard at the same time.\n var location = getLocation(this$1.base);\n if (this$1.current === START && location === this$1._startLocation) {\n return\n }\n\n this$1.transitionTo(location, function (route) {\n if (supportsScroll) {\n handleScroll(router, route, current, true);\n }\n });\n };\n window.addEventListener('popstate', handleRoutingEvent);\n this.listeners.push(function () {\n window.removeEventListener('popstate', handleRoutingEvent);\n });\n };\n\n HTML5History.prototype.go = function go (n) {\n window.history.go(n);\n };\n\n HTML5History.prototype.push = function push (location, onComplete, onAbort) {\n var this$1 = this;\n\n var ref = this;\n var fromRoute = ref.current;\n this.transitionTo(location, function (route) {\n pushState(cleanPath(this$1.base + route.fullPath));\n handleScroll(this$1.router, route, fromRoute, false);\n onComplete && onComplete(route);\n }, onAbort);\n };\n\n HTML5History.prototype.replace = function replace (location, onComplete, onAbort) {\n var this$1 = this;\n\n var ref = this;\n var fromRoute = ref.current;\n this.transitionTo(location, function (route) {\n replaceState(cleanPath(this$1.base + route.fullPath));\n handleScroll(this$1.router, route, fromRoute, false);\n onComplete && onComplete(route);\n }, onAbort);\n };\n\n HTML5History.prototype.ensureURL = function ensureURL (push) {\n if (getLocation(this.base) !== this.current.fullPath) {\n var current = cleanPath(this.base + this.current.fullPath);\n push ? pushState(current) : replaceState(current);\n }\n };\n\n HTML5History.prototype.getCurrentLocation = function getCurrentLocation () {\n return getLocation(this.base)\n };\n\n return HTML5History;\n}(History));\n\nfunction getLocation (base) {\n var path = window.location.pathname;\n var pathLowerCase = path.toLowerCase();\n var baseLowerCase = base.toLowerCase();\n // base=\"/a\" shouldn't turn path=\"/app\" into \"/a/pp\"\n // https://github.com/vuejs/vue-router/issues/3555\n // so we ensure the trailing slash in the base\n if (base && ((pathLowerCase === baseLowerCase) ||\n (pathLowerCase.indexOf(cleanPath(baseLowerCase + '/')) === 0))) {\n path = path.slice(base.length);\n }\n return (path || '/') + window.location.search + window.location.hash\n}\n\n/* */\n\nvar HashHistory = /*@__PURE__*/(function (History) {\n function HashHistory (router, base, fallback) {\n History.call(this, router, base);\n // check history fallback deeplinking\n if (fallback && checkFallback(this.base)) {\n return\n }\n ensureSlash();\n }\n\n if ( History ) HashHistory.__proto__ = History;\n HashHistory.prototype = Object.create( History && History.prototype );\n HashHistory.prototype.constructor = HashHistory;\n\n // this is delayed until the app mounts\n // to avoid the hashchange listener being fired too early\n HashHistory.prototype.setupListeners = function setupListeners () {\n var this$1 = this;\n\n if (this.listeners.length > 0) {\n return\n }\n\n var router = this.router;\n var expectScroll = router.options.scrollBehavior;\n var supportsScroll = supportsPushState && expectScroll;\n\n if (supportsScroll) {\n this.listeners.push(setupScroll());\n }\n\n var handleRoutingEvent = function () {\n var current = this$1.current;\n if (!ensureSlash()) {\n return\n }\n this$1.transitionTo(getHash(), function (route) {\n if (supportsScroll) {\n handleScroll(this$1.router, route, current, true);\n }\n if (!supportsPushState) {\n replaceHash(route.fullPath);\n }\n });\n };\n var eventType = supportsPushState ? 'popstate' : 'hashchange';\n window.addEventListener(\n eventType,\n handleRoutingEvent\n );\n this.listeners.push(function () {\n window.removeEventListener(eventType, handleRoutingEvent);\n });\n };\n\n HashHistory.prototype.push = function push (location, onComplete, onAbort) {\n var this$1 = this;\n\n var ref = this;\n var fromRoute = ref.current;\n this.transitionTo(\n location,\n function (route) {\n pushHash(route.fullPath);\n handleScroll(this$1.router, route, fromRoute, false);\n onComplete && onComplete(route);\n },\n onAbort\n );\n };\n\n HashHistory.prototype.replace = function replace (location, onComplete, onAbort) {\n var this$1 = this;\n\n var ref = this;\n var fromRoute = ref.current;\n this.transitionTo(\n location,\n function (route) {\n replaceHash(route.fullPath);\n handleScroll(this$1.router, route, fromRoute, false);\n onComplete && onComplete(route);\n },\n onAbort\n );\n };\n\n HashHistory.prototype.go = function go (n) {\n window.history.go(n);\n };\n\n HashHistory.prototype.ensureURL = function ensureURL (push) {\n var current = this.current.fullPath;\n if (getHash() !== current) {\n push ? pushHash(current) : replaceHash(current);\n }\n };\n\n HashHistory.prototype.getCurrentLocation = function getCurrentLocation () {\n return getHash()\n };\n\n return HashHistory;\n}(History));\n\nfunction checkFallback (base) {\n var location = getLocation(base);\n if (!/^\\/#/.test(location)) {\n window.location.replace(cleanPath(base + '/#' + location));\n return true\n }\n}\n\nfunction ensureSlash () {\n var path = getHash();\n if (path.charAt(0) === '/') {\n return true\n }\n replaceHash('/' + path);\n return false\n}\n\nfunction getHash () {\n // We can't use window.location.hash here because it's not\n // consistent across browsers - Firefox will pre-decode it!\n var href = window.location.href;\n var index = href.indexOf('#');\n // empty path\n if (index < 0) { return '' }\n\n href = href.slice(index + 1);\n\n return href\n}\n\nfunction getUrl (path) {\n var href = window.location.href;\n var i = href.indexOf('#');\n var base = i >= 0 ? href.slice(0, i) : href;\n return (base + \"#\" + path)\n}\n\nfunction pushHash (path) {\n if (supportsPushState) {\n pushState(getUrl(path));\n } else {\n window.location.hash = path;\n }\n}\n\nfunction replaceHash (path) {\n if (supportsPushState) {\n replaceState(getUrl(path));\n } else {\n window.location.replace(getUrl(path));\n }\n}\n\n/* */\n\nvar AbstractHistory = /*@__PURE__*/(function (History) {\n function AbstractHistory (router, base) {\n History.call(this, router, base);\n this.stack = [];\n this.index = -1;\n }\n\n if ( History ) AbstractHistory.__proto__ = History;\n AbstractHistory.prototype = Object.create( History && History.prototype );\n AbstractHistory.prototype.constructor = AbstractHistory;\n\n AbstractHistory.prototype.push = function push (location, onComplete, onAbort) {\n var this$1 = this;\n\n this.transitionTo(\n location,\n function (route) {\n this$1.stack = this$1.stack.slice(0, this$1.index + 1).concat(route);\n this$1.index++;\n onComplete && onComplete(route);\n },\n onAbort\n );\n };\n\n AbstractHistory.prototype.replace = function replace (location, onComplete, onAbort) {\n var this$1 = this;\n\n this.transitionTo(\n location,\n function (route) {\n this$1.stack = this$1.stack.slice(0, this$1.index).concat(route);\n onComplete && onComplete(route);\n },\n onAbort\n );\n };\n\n AbstractHistory.prototype.go = function go (n) {\n var this$1 = this;\n\n var targetIndex = this.index + n;\n if (targetIndex < 0 || targetIndex >= this.stack.length) {\n return\n }\n var route = this.stack[targetIndex];\n this.confirmTransition(\n route,\n function () {\n var prev = this$1.current;\n this$1.index = targetIndex;\n this$1.updateRoute(route);\n this$1.router.afterHooks.forEach(function (hook) {\n hook && hook(route, prev);\n });\n },\n function (err) {\n if (isNavigationFailure(err, NavigationFailureType.duplicated)) {\n this$1.index = targetIndex;\n }\n }\n );\n };\n\n AbstractHistory.prototype.getCurrentLocation = function getCurrentLocation () {\n var current = this.stack[this.stack.length - 1];\n return current ? current.fullPath : '/'\n };\n\n AbstractHistory.prototype.ensureURL = function ensureURL () {\n // noop\n };\n\n return AbstractHistory;\n}(History));\n\n/* */\n\nvar VueRouter = function VueRouter (options) {\n if ( options === void 0 ) options = {};\n\n this.app = null;\n this.apps = [];\n this.options = options;\n this.beforeHooks = [];\n this.resolveHooks = [];\n this.afterHooks = [];\n this.matcher = createMatcher(options.routes || [], this);\n\n var mode = options.mode || 'hash';\n this.fallback =\n mode === 'history' && !supportsPushState && options.fallback !== false;\n if (this.fallback) {\n mode = 'hash';\n }\n if (!inBrowser) {\n mode = 'abstract';\n }\n this.mode = mode;\n\n switch (mode) {\n case 'history':\n this.history = new HTML5History(this, options.base);\n break\n case 'hash':\n this.history = new HashHistory(this, options.base, this.fallback);\n break\n case 'abstract':\n this.history = new AbstractHistory(this, options.base);\n break\n default:\n if (false) {\n assert(false, (\"invalid mode: \" + mode));\n }\n }\n};\n\nvar prototypeAccessors = { currentRoute: { configurable: true } };\n\nVueRouter.prototype.match = function match (raw, current, redirectedFrom) {\n return this.matcher.match(raw, current, redirectedFrom)\n};\n\nprototypeAccessors.currentRoute.get = function () {\n return this.history && this.history.current\n};\n\nVueRouter.prototype.init = function init (app /* Vue component instance */) {\n var this$1 = this;\n\n \"production\" !== 'production' &&\n assert(\n install.installed,\n \"not installed. Make sure to call `Vue.use(VueRouter)` \" +\n \"before creating root instance.\"\n );\n\n this.apps.push(app);\n\n // set up app destroyed handler\n // https://github.com/vuejs/vue-router/issues/2639\n app.$once('hook:destroyed', function () {\n // clean out app from this.apps array once destroyed\n var index = this$1.apps.indexOf(app);\n if (index > -1) { this$1.apps.splice(index, 1); }\n // ensure we still have a main app or null if no apps\n // we do not release the router so it can be reused\n if (this$1.app === app) { this$1.app = this$1.apps[0] || null; }\n\n if (!this$1.app) { this$1.history.teardown(); }\n });\n\n // main app previously initialized\n // return as we don't need to set up new history listener\n if (this.app) {\n return\n }\n\n this.app = app;\n\n var history = this.history;\n\n if (history instanceof HTML5History || history instanceof HashHistory) {\n var handleInitialScroll = function (routeOrError) {\n var from = history.current;\n var expectScroll = this$1.options.scrollBehavior;\n var supportsScroll = supportsPushState && expectScroll;\n\n if (supportsScroll && 'fullPath' in routeOrError) {\n handleScroll(this$1, routeOrError, from, false);\n }\n };\n var setupListeners = function (routeOrError) {\n history.setupListeners();\n handleInitialScroll(routeOrError);\n };\n history.transitionTo(\n history.getCurrentLocation(),\n setupListeners,\n setupListeners\n );\n }\n\n history.listen(function (route) {\n this$1.apps.forEach(function (app) {\n app._route = route;\n });\n });\n};\n\nVueRouter.prototype.beforeEach = function beforeEach (fn) {\n return registerHook(this.beforeHooks, fn)\n};\n\nVueRouter.prototype.beforeResolve = function beforeResolve (fn) {\n return registerHook(this.resolveHooks, fn)\n};\n\nVueRouter.prototype.afterEach = function afterEach (fn) {\n return registerHook(this.afterHooks, fn)\n};\n\nVueRouter.prototype.onReady = function onReady (cb, errorCb) {\n this.history.onReady(cb, errorCb);\n};\n\nVueRouter.prototype.onError = function onError (errorCb) {\n this.history.onError(errorCb);\n};\n\nVueRouter.prototype.push = function push (location, onComplete, onAbort) {\n var this$1 = this;\n\n // $flow-disable-line\n if (!onComplete && !onAbort && typeof Promise !== 'undefined') {\n return new Promise(function (resolve, reject) {\n this$1.history.push(location, resolve, reject);\n })\n } else {\n this.history.push(location, onComplete, onAbort);\n }\n};\n\nVueRouter.prototype.replace = function replace (location, onComplete, onAbort) {\n var this$1 = this;\n\n // $flow-disable-line\n if (!onComplete && !onAbort && typeof Promise !== 'undefined') {\n return new Promise(function (resolve, reject) {\n this$1.history.replace(location, resolve, reject);\n })\n } else {\n this.history.replace(location, onComplete, onAbort);\n }\n};\n\nVueRouter.prototype.go = function go (n) {\n this.history.go(n);\n};\n\nVueRouter.prototype.back = function back () {\n this.go(-1);\n};\n\nVueRouter.prototype.forward = function forward () {\n this.go(1);\n};\n\nVueRouter.prototype.getMatchedComponents = function getMatchedComponents (to) {\n var route = to\n ? to.matched\n ? to\n : this.resolve(to).route\n : this.currentRoute;\n if (!route) {\n return []\n }\n return [].concat.apply(\n [],\n route.matched.map(function (m) {\n return Object.keys(m.components).map(function (key) {\n return m.components[key]\n })\n })\n )\n};\n\nVueRouter.prototype.resolve = function resolve (\n to,\n current,\n append\n) {\n current = current || this.history.current;\n var location = normalizeLocation(to, current, append, this);\n var route = this.match(location, current);\n var fullPath = route.redirectedFrom || route.fullPath;\n var base = this.history.base;\n var href = createHref(base, fullPath, this.mode);\n return {\n location: location,\n route: route,\n href: href,\n // for backwards compat\n normalizedTo: location,\n resolved: route\n }\n};\n\nVueRouter.prototype.getRoutes = function getRoutes () {\n return this.matcher.getRoutes()\n};\n\nVueRouter.prototype.addRoute = function addRoute (parentOrRoute, route) {\n this.matcher.addRoute(parentOrRoute, route);\n if (this.history.current !== START) {\n this.history.transitionTo(this.history.getCurrentLocation());\n }\n};\n\nVueRouter.prototype.addRoutes = function addRoutes (routes) {\n if (false) {\n warn(false, 'router.addRoutes() is deprecated and has been removed in Vue Router 4. Use router.addRoute() instead.');\n }\n this.matcher.addRoutes(routes);\n if (this.history.current !== START) {\n this.history.transitionTo(this.history.getCurrentLocation());\n }\n};\n\nObject.defineProperties( VueRouter.prototype, prototypeAccessors );\n\nfunction registerHook (list, fn) {\n list.push(fn);\n return function () {\n var i = list.indexOf(fn);\n if (i > -1) { list.splice(i, 1); }\n }\n}\n\nfunction createHref (base, fullPath, mode) {\n var path = mode === 'hash' ? '#' + fullPath : fullPath;\n return base ? cleanPath(base + '/' + path) : path\n}\n\nVueRouter.install = install;\nVueRouter.version = '3.5.2';\nVueRouter.isNavigationFailure = isNavigationFailure;\nVueRouter.NavigationFailureType = NavigationFailureType;\nVueRouter.START_LOCATION = START;\n\nif (inBrowser && window.Vue) {\n window.Vue.use(VueRouter);\n}\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (VueRouter);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL29jcS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy92dWUtcm91dGVyL2Rpc3QvdnVlLXJvdXRlci5lc20uanM/ZmU4NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAgKiB2dWUtcm91dGVyIHYzLjUuMlxuICAqIChjKSAyMDIxIEV2YW4gWW91XG4gICogQGxpY2Vuc2UgTUlUXG4gICovXG4vKiAgKi9cblxuZnVuY3Rpb24gYXNzZXJ0IChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoKFwiW3Z1ZS1yb3V0ZXJdIFwiICsgbWVzc2FnZSkpXG4gIH1cbn1cblxuZnVuY3Rpb24gd2FybiAoY29uZGl0aW9uLCBtZXNzYWdlKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFjb25kaXRpb24pIHtcbiAgICB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgY29uc29sZS53YXJuKChcIlt2dWUtcm91dGVyXSBcIiArIG1lc3NhZ2UpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRlbmQgKGEsIGIpIHtcbiAgZm9yICh2YXIga2V5IGluIGIpIHtcbiAgICBhW2tleV0gPSBiW2tleV07XG4gIH1cbiAgcmV0dXJuIGFcbn1cblxuLyogICovXG5cbnZhciBlbmNvZGVSZXNlcnZlUkUgPSAvWyEnKCkqXS9nO1xudmFyIGVuY29kZVJlc2VydmVSZXBsYWNlciA9IGZ1bmN0aW9uIChjKSB7IHJldHVybiAnJScgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpOyB9O1xudmFyIGNvbW1hUkUgPSAvJTJDL2c7XG5cbi8vIGZpeGVkIGVuY29kZVVSSUNvbXBvbmVudCB3aGljaCBpcyBtb3JlIGNvbmZvcm1hbnQgdG8gUkZDMzk4Njpcbi8vIC0gZXNjYXBlcyBbIScoKSpdXG4vLyAtIHByZXNlcnZlIGNvbW1hc1xudmFyIGVuY29kZSA9IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpXG4gICAgLnJlcGxhY2UoZW5jb2RlUmVzZXJ2ZVJFLCBlbmNvZGVSZXNlcnZlUmVwbGFjZXIpXG4gICAgLnJlcGxhY2UoY29tbWFSRSwgJywnKTsgfTtcblxuZnVuY3Rpb24gZGVjb2RlIChzdHIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cilcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oZmFsc2UsIChcIkVycm9yIGRlY29kaW5nIFxcXCJcIiArIHN0ciArIFwiXFxcIi4gTGVhdmluZyBpdCBpbnRhY3QuXCIpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiByZXNvbHZlUXVlcnkgKFxuICBxdWVyeSxcbiAgZXh0cmFRdWVyeSxcbiAgX3BhcnNlUXVlcnlcbikge1xuICBpZiAoIGV4dHJhUXVlcnkgPT09IHZvaWQgMCApIGV4dHJhUXVlcnkgPSB7fTtcblxuICB2YXIgcGFyc2UgPSBfcGFyc2VRdWVyeSB8fCBwYXJzZVF1ZXJ5O1xuICB2YXIgcGFyc2VkUXVlcnk7XG4gIHRyeSB7XG4gICAgcGFyc2VkUXVlcnkgPSBwYXJzZShxdWVyeSB8fCAnJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oZmFsc2UsIGUubWVzc2FnZSk7XG4gICAgcGFyc2VkUXVlcnkgPSB7fTtcbiAgfVxuICBmb3IgKHZhciBrZXkgaW4gZXh0cmFRdWVyeSkge1xuICAgIHZhciB2YWx1ZSA9IGV4dHJhUXVlcnlba2V5XTtcbiAgICBwYXJzZWRRdWVyeVtrZXldID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWUubWFwKGNhc3RRdWVyeVBhcmFtVmFsdWUpXG4gICAgICA6IGNhc3RRdWVyeVBhcmFtVmFsdWUodmFsdWUpO1xuICB9XG4gIHJldHVybiBwYXJzZWRRdWVyeVxufVxuXG52YXIgY2FzdFF1ZXJ5UGFyYW1WYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gKHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKSk7IH07XG5cbmZ1bmN0aW9uIHBhcnNlUXVlcnkgKHF1ZXJ5KSB7XG4gIHZhciByZXMgPSB7fTtcblxuICBxdWVyeSA9IHF1ZXJ5LnRyaW0oKS5yZXBsYWNlKC9eKFxcP3wjfCYpLywgJycpO1xuXG4gIGlmICghcXVlcnkpIHtcbiAgICByZXR1cm4gcmVzXG4gIH1cblxuICBxdWVyeS5zcGxpdCgnJicpLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgdmFyIHBhcnRzID0gcGFyYW0ucmVwbGFjZSgvXFwrL2csICcgJykuc3BsaXQoJz0nKTtcbiAgICB2YXIga2V5ID0gZGVjb2RlKHBhcnRzLnNoaWZ0KCkpO1xuICAgIHZhciB2YWwgPSBwYXJ0cy5sZW5ndGggPiAwID8gZGVjb2RlKHBhcnRzLmpvaW4oJz0nKSkgOiBudWxsO1xuXG4gICAgaWYgKHJlc1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc1trZXldID0gdmFsO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXNba2V5XSkpIHtcbiAgICAgIHJlc1trZXldLnB1c2godmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzW2tleV0gPSBbcmVzW2tleV0sIHZhbF07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVF1ZXJ5IChvYmopIHtcbiAgdmFyIHJlcyA9IG9ialxuICAgID8gT2JqZWN0LmtleXMob2JqKVxuICAgICAgLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWwgPSBvYmpba2V5XTtcblxuICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gJydcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlKGtleSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgdmFsLmZvckVhY2goZnVuY3Rpb24gKHZhbDIpIHtcbiAgICAgICAgICAgIGlmICh2YWwyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsMiA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXN1bHQucHVzaChlbmNvZGUoa2V5KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHQucHVzaChlbmNvZGUoa2V5KSArICc9JyArIGVuY29kZSh2YWwyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcmJylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbmNvZGUoa2V5KSArICc9JyArIGVuY29kZSh2YWwpXG4gICAgICB9KVxuICAgICAgLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4geC5sZW5ndGggPiAwOyB9KVxuICAgICAgLmpvaW4oJyYnKVxuICAgIDogbnVsbDtcbiAgcmV0dXJuIHJlcyA/IChcIj9cIiArIHJlcykgOiAnJ1xufVxuXG4vKiAgKi9cblxudmFyIHRyYWlsaW5nU2xhc2hSRSA9IC9cXC8/JC87XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvdXRlIChcbiAgcmVjb3JkLFxuICBsb2NhdGlvbixcbiAgcmVkaXJlY3RlZEZyb20sXG4gIHJvdXRlclxuKSB7XG4gIHZhciBzdHJpbmdpZnlRdWVyeSA9IHJvdXRlciAmJiByb3V0ZXIub3B0aW9ucy5zdHJpbmdpZnlRdWVyeTtcblxuICB2YXIgcXVlcnkgPSBsb2NhdGlvbi5xdWVyeSB8fCB7fTtcbiAgdHJ5IHtcbiAgICBxdWVyeSA9IGNsb25lKHF1ZXJ5KTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcm91dGUgPSB7XG4gICAgbmFtZTogbG9jYXRpb24ubmFtZSB8fCAocmVjb3JkICYmIHJlY29yZC5uYW1lKSxcbiAgICBtZXRhOiAocmVjb3JkICYmIHJlY29yZC5tZXRhKSB8fCB7fSxcbiAgICBwYXRoOiBsb2NhdGlvbi5wYXRoIHx8ICcvJyxcbiAgICBoYXNoOiBsb2NhdGlvbi5oYXNoIHx8ICcnLFxuICAgIHF1ZXJ5OiBxdWVyeSxcbiAgICBwYXJhbXM6IGxvY2F0aW9uLnBhcmFtcyB8fCB7fSxcbiAgICBmdWxsUGF0aDogZ2V0RnVsbFBhdGgobG9jYXRpb24sIHN0cmluZ2lmeVF1ZXJ5KSxcbiAgICBtYXRjaGVkOiByZWNvcmQgPyBmb3JtYXRNYXRjaChyZWNvcmQpIDogW11cbiAgfTtcbiAgaWYgKHJlZGlyZWN0ZWRGcm9tKSB7XG4gICAgcm91dGUucmVkaXJlY3RlZEZyb20gPSBnZXRGdWxsUGF0aChyZWRpcmVjdGVkRnJvbSwgc3RyaW5naWZ5UXVlcnkpO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHJvdXRlKVxufVxuXG5mdW5jdGlvbiBjbG9uZSAodmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcChjbG9uZSlcbiAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIHJlcyA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgcmVzW2tleV0gPSBjbG9uZSh2YWx1ZVtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG59XG5cbi8vIHRoZSBzdGFydGluZyByb3V0ZSB0aGF0IHJlcHJlc2VudHMgdGhlIGluaXRpYWwgc3RhdGVcbnZhciBTVEFSVCA9IGNyZWF0ZVJvdXRlKG51bGwsIHtcbiAgcGF0aDogJy8nXG59KTtcblxuZnVuY3Rpb24gZm9ybWF0TWF0Y2ggKHJlY29yZCkge1xuICB2YXIgcmVzID0gW107XG4gIHdoaWxlIChyZWNvcmQpIHtcbiAgICByZXMudW5zaGlmdChyZWNvcmQpO1xuICAgIHJlY29yZCA9IHJlY29yZC5wYXJlbnQ7XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBnZXRGdWxsUGF0aCAoXG4gIHJlZixcbiAgX3N0cmluZ2lmeVF1ZXJ5XG4pIHtcbiAgdmFyIHBhdGggPSByZWYucGF0aDtcbiAgdmFyIHF1ZXJ5ID0gcmVmLnF1ZXJ5OyBpZiAoIHF1ZXJ5ID09PSB2b2lkIDAgKSBxdWVyeSA9IHt9O1xuICB2YXIgaGFzaCA9IHJlZi5oYXNoOyBpZiAoIGhhc2ggPT09IHZvaWQgMCApIGhhc2ggPSAnJztcblxuICB2YXIgc3RyaW5naWZ5ID0gX3N0cmluZ2lmeVF1ZXJ5IHx8IHN0cmluZ2lmeVF1ZXJ5O1xuICByZXR1cm4gKHBhdGggfHwgJy8nKSArIHN0cmluZ2lmeShxdWVyeSkgKyBoYXNoXG59XG5cbmZ1bmN0aW9uIGlzU2FtZVJvdXRlIChhLCBiLCBvbmx5UGF0aCkge1xuICBpZiAoYiA9PT0gU1RBUlQpIHtcbiAgICByZXR1cm4gYSA9PT0gYlxuICB9IGVsc2UgaWYgKCFiKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH0gZWxzZSBpZiAoYS5wYXRoICYmIGIucGF0aCkge1xuICAgIHJldHVybiBhLnBhdGgucmVwbGFjZSh0cmFpbGluZ1NsYXNoUkUsICcnKSA9PT0gYi5wYXRoLnJlcGxhY2UodHJhaWxpbmdTbGFzaFJFLCAnJykgJiYgKG9ubHlQYXRoIHx8XG4gICAgICBhLmhhc2ggPT09IGIuaGFzaCAmJlxuICAgICAgaXNPYmplY3RFcXVhbChhLnF1ZXJ5LCBiLnF1ZXJ5KSlcbiAgfSBlbHNlIGlmIChhLm5hbWUgJiYgYi5uYW1lKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGEubmFtZSA9PT0gYi5uYW1lICYmXG4gICAgICAob25seVBhdGggfHwgKFxuICAgICAgICBhLmhhc2ggPT09IGIuaGFzaCAmJlxuICAgICAgaXNPYmplY3RFcXVhbChhLnF1ZXJ5LCBiLnF1ZXJ5KSAmJlxuICAgICAgaXNPYmplY3RFcXVhbChhLnBhcmFtcywgYi5wYXJhbXMpKVxuICAgICAgKVxuICAgIClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBpc09iamVjdEVxdWFsIChhLCBiKSB7XG4gIGlmICggYSA9PT0gdm9pZCAwICkgYSA9IHt9O1xuICBpZiAoIGIgPT09IHZvaWQgMCApIGIgPSB7fTtcblxuICAvLyBoYW5kbGUgbnVsbCB2YWx1ZSAjMTU2NlxuICBpZiAoIWEgfHwgIWIpIHsgcmV0dXJuIGEgPT09IGIgfVxuICB2YXIgYUtleXMgPSBPYmplY3Qua2V5cyhhKS5zb3J0KCk7XG4gIHZhciBiS2V5cyA9IE9iamVjdC5rZXlzKGIpLnNvcnQoKTtcbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXksIGkpIHtcbiAgICB2YXIgYVZhbCA9IGFba2V5XTtcbiAgICB2YXIgYktleSA9IGJLZXlzW2ldO1xuICAgIGlmIChiS2V5ICE9PSBrZXkpIHsgcmV0dXJuIGZhbHNlIH1cbiAgICB2YXIgYlZhbCA9IGJba2V5XTtcbiAgICAvLyBxdWVyeSB2YWx1ZXMgY2FuIGJlIG51bGwgYW5kIHVuZGVmaW5lZFxuICAgIGlmIChhVmFsID09IG51bGwgfHwgYlZhbCA9PSBudWxsKSB7IHJldHVybiBhVmFsID09PSBiVmFsIH1cbiAgICAvLyBjaGVjayBuZXN0ZWQgZXF1YWxpdHlcbiAgICBpZiAodHlwZW9mIGFWYWwgPT09ICdvYmplY3QnICYmIHR5cGVvZiBiVmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0RXF1YWwoYVZhbCwgYlZhbClcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyhhVmFsKSA9PT0gU3RyaW5nKGJWYWwpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGlzSW5jbHVkZWRSb3V0ZSAoY3VycmVudCwgdGFyZ2V0KSB7XG4gIHJldHVybiAoXG4gICAgY3VycmVudC5wYXRoLnJlcGxhY2UodHJhaWxpbmdTbGFzaFJFLCAnLycpLmluZGV4T2YoXG4gICAgICB0YXJnZXQucGF0aC5yZXBsYWNlKHRyYWlsaW5nU2xhc2hSRSwgJy8nKVxuICAgICkgPT09IDAgJiZcbiAgICAoIXRhcmdldC5oYXNoIHx8IGN1cnJlbnQuaGFzaCA9PT0gdGFyZ2V0Lmhhc2gpICYmXG4gICAgcXVlcnlJbmNsdWRlcyhjdXJyZW50LnF1ZXJ5LCB0YXJnZXQucXVlcnkpXG4gIClcbn1cblxuZnVuY3Rpb24gcXVlcnlJbmNsdWRlcyAoY3VycmVudCwgdGFyZ2V0KSB7XG4gIGZvciAodmFyIGtleSBpbiB0YXJnZXQpIHtcbiAgICBpZiAoIShrZXkgaW4gY3VycmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBoYW5kbGVSb3V0ZUVudGVyZWQgKHJvdXRlKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcm91dGUubWF0Y2hlZC5sZW5ndGg7IGkrKykge1xuICAgIHZhciByZWNvcmQgPSByb3V0ZS5tYXRjaGVkW2ldO1xuICAgIGZvciAodmFyIG5hbWUgaW4gcmVjb3JkLmluc3RhbmNlcykge1xuICAgICAgdmFyIGluc3RhbmNlID0gcmVjb3JkLmluc3RhbmNlc1tuYW1lXTtcbiAgICAgIHZhciBjYnMgPSByZWNvcmQuZW50ZXJlZENic1tuYW1lXTtcbiAgICAgIGlmICghaW5zdGFuY2UgfHwgIWNicykgeyBjb250aW51ZSB9XG4gICAgICBkZWxldGUgcmVjb3JkLmVudGVyZWRDYnNbbmFtZV07XG4gICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBjYnMubGVuZ3RoOyBpJDErKykge1xuICAgICAgICBpZiAoIWluc3RhbmNlLl9pc0JlaW5nRGVzdHJveWVkKSB7IGNic1tpJDFdKGluc3RhbmNlKTsgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgVmlldyA9IHtcbiAgbmFtZTogJ1JvdXRlclZpZXcnLFxuICBmdW5jdGlvbmFsOiB0cnVlLFxuICBwcm9wczoge1xuICAgIG5hbWU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdkZWZhdWx0J1xuICAgIH1cbiAgfSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKF8sIHJlZikge1xuICAgIHZhciBwcm9wcyA9IHJlZi5wcm9wcztcbiAgICB2YXIgY2hpbGRyZW4gPSByZWYuY2hpbGRyZW47XG4gICAgdmFyIHBhcmVudCA9IHJlZi5wYXJlbnQ7XG4gICAgdmFyIGRhdGEgPSByZWYuZGF0YTtcblxuICAgIC8vIHVzZWQgYnkgZGV2dG9vbHMgdG8gZGlzcGxheSBhIHJvdXRlci12aWV3IGJhZGdlXG4gICAgZGF0YS5yb3V0ZXJWaWV3ID0gdHJ1ZTtcblxuICAgIC8vIGRpcmVjdGx5IHVzZSBwYXJlbnQgY29udGV4dCdzIGNyZWF0ZUVsZW1lbnQoKSBmdW5jdGlvblxuICAgIC8vIHNvIHRoYXQgY29tcG9uZW50cyByZW5kZXJlZCBieSByb3V0ZXItdmlldyBjYW4gcmVzb2x2ZSBuYW1lZCBzbG90c1xuICAgIHZhciBoID0gcGFyZW50LiRjcmVhdGVFbGVtZW50O1xuICAgIHZhciBuYW1lID0gcHJvcHMubmFtZTtcbiAgICB2YXIgcm91dGUgPSBwYXJlbnQuJHJvdXRlO1xuICAgIHZhciBjYWNoZSA9IHBhcmVudC5fcm91dGVyVmlld0NhY2hlIHx8IChwYXJlbnQuX3JvdXRlclZpZXdDYWNoZSA9IHt9KTtcblxuICAgIC8vIGRldGVybWluZSBjdXJyZW50IHZpZXcgZGVwdGgsIGFsc28gY2hlY2sgdG8gc2VlIGlmIHRoZSB0cmVlXG4gICAgLy8gaGFzIGJlZW4gdG9nZ2xlZCBpbmFjdGl2ZSBidXQga2VwdC1hbGl2ZS5cbiAgICB2YXIgZGVwdGggPSAwO1xuICAgIHZhciBpbmFjdGl2ZSA9IGZhbHNlO1xuICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Ll9yb3V0ZXJSb290ICE9PSBwYXJlbnQpIHtcbiAgICAgIHZhciB2bm9kZURhdGEgPSBwYXJlbnQuJHZub2RlID8gcGFyZW50LiR2bm9kZS5kYXRhIDoge307XG4gICAgICBpZiAodm5vZGVEYXRhLnJvdXRlclZpZXcpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICAgIGlmICh2bm9kZURhdGEua2VlcEFsaXZlICYmIHBhcmVudC5fZGlyZWN0SW5hY3RpdmUgJiYgcGFyZW50Ll9pbmFjdGl2ZSkge1xuICAgICAgICBpbmFjdGl2ZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICB9XG4gICAgZGF0YS5yb3V0ZXJWaWV3RGVwdGggPSBkZXB0aDtcblxuICAgIC8vIHJlbmRlciBwcmV2aW91cyB2aWV3IGlmIHRoZSB0cmVlIGlzIGluYWN0aXZlIGFuZCBrZXB0LWFsaXZlXG4gICAgaWYgKGluYWN0aXZlKSB7XG4gICAgICB2YXIgY2FjaGVkRGF0YSA9IGNhY2hlW25hbWVdO1xuICAgICAgdmFyIGNhY2hlZENvbXBvbmVudCA9IGNhY2hlZERhdGEgJiYgY2FjaGVkRGF0YS5jb21wb25lbnQ7XG4gICAgICBpZiAoY2FjaGVkQ29tcG9uZW50KSB7XG4gICAgICAgIC8vICMyMzAxXG4gICAgICAgIC8vIHBhc3MgcHJvcHNcbiAgICAgICAgaWYgKGNhY2hlZERhdGEuY29uZmlnUHJvcHMpIHtcbiAgICAgICAgICBmaWxsUHJvcHNpbkRhdGEoY2FjaGVkQ29tcG9uZW50LCBkYXRhLCBjYWNoZWREYXRhLnJvdXRlLCBjYWNoZWREYXRhLmNvbmZpZ1Byb3BzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaChjYWNoZWRDb21wb25lbnQsIGRhdGEsIGNoaWxkcmVuKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVuZGVyIHByZXZpb3VzIGVtcHR5IHZpZXdcbiAgICAgICAgcmV0dXJuIGgoKVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBtYXRjaGVkID0gcm91dGUubWF0Y2hlZFtkZXB0aF07XG4gICAgdmFyIGNvbXBvbmVudCA9IG1hdGNoZWQgJiYgbWF0Y2hlZC5jb21wb25lbnRzW25hbWVdO1xuXG4gICAgLy8gcmVuZGVyIGVtcHR5IG5vZGUgaWYgbm8gbWF0Y2hlZCByb3V0ZSBvciBubyBjb25maWcgY29tcG9uZW50XG4gICAgaWYgKCFtYXRjaGVkIHx8ICFjb21wb25lbnQpIHtcbiAgICAgIGNhY2hlW25hbWVdID0gbnVsbDtcbiAgICAgIHJldHVybiBoKClcbiAgICB9XG5cbiAgICAvLyBjYWNoZSBjb21wb25lbnRcbiAgICBjYWNoZVtuYW1lXSA9IHsgY29tcG9uZW50OiBjb21wb25lbnQgfTtcblxuICAgIC8vIGF0dGFjaCBpbnN0YW5jZSByZWdpc3RyYXRpb24gaG9va1xuICAgIC8vIHRoaXMgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGluc3RhbmNlJ3MgaW5qZWN0ZWQgbGlmZWN5Y2xlIGhvb2tzXG4gICAgZGF0YS5yZWdpc3RlclJvdXRlSW5zdGFuY2UgPSBmdW5jdGlvbiAodm0sIHZhbCkge1xuICAgICAgLy8gdmFsIGNvdWxkIGJlIHVuZGVmaW5lZCBmb3IgdW5yZWdpc3RyYXRpb25cbiAgICAgIHZhciBjdXJyZW50ID0gbWF0Y2hlZC5pbnN0YW5jZXNbbmFtZV07XG4gICAgICBpZiAoXG4gICAgICAgICh2YWwgJiYgY3VycmVudCAhPT0gdm0pIHx8XG4gICAgICAgICghdmFsICYmIGN1cnJlbnQgPT09IHZtKVxuICAgICAgKSB7XG4gICAgICAgIG1hdGNoZWQuaW5zdGFuY2VzW25hbWVdID0gdmFsO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFsc28gcmVnaXN0ZXIgaW5zdGFuY2UgaW4gcHJlcGF0Y2ggaG9va1xuICAgIC8vIGluIGNhc2UgdGhlIHNhbWUgY29tcG9uZW50IGluc3RhbmNlIGlzIHJldXNlZCBhY3Jvc3MgZGlmZmVyZW50IHJvdXRlc1xuICAgIDsoZGF0YS5ob29rIHx8IChkYXRhLmhvb2sgPSB7fSkpLnByZXBhdGNoID0gZnVuY3Rpb24gKF8sIHZub2RlKSB7XG4gICAgICBtYXRjaGVkLmluc3RhbmNlc1tuYW1lXSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlO1xuICAgIH07XG5cbiAgICAvLyByZWdpc3RlciBpbnN0YW5jZSBpbiBpbml0IGhvb2tcbiAgICAvLyBpbiBjYXNlIGtlcHQtYWxpdmUgY29tcG9uZW50IGJlIGFjdGl2ZWQgd2hlbiByb3V0ZXMgY2hhbmdlZFxuICAgIGRhdGEuaG9vay5pbml0ID0gZnVuY3Rpb24gKHZub2RlKSB7XG4gICAgICBpZiAodm5vZGUuZGF0YS5rZWVwQWxpdmUgJiZcbiAgICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgJiZcbiAgICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgIT09IG1hdGNoZWQuaW5zdGFuY2VzW25hbWVdXG4gICAgICApIHtcbiAgICAgICAgbWF0Y2hlZC5pbnN0YW5jZXNbbmFtZV0gPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHJvdXRlIHRyYW5zaXRpb24gaGFzIGFscmVhZHkgYmVlbiBjb25maXJtZWQgdGhlbiB3ZSB3ZXJlbid0XG4gICAgICAvLyBhYmxlIHRvIGNhbGwgdGhlIGNicyBkdXJpbmcgY29uZmlybWF0aW9uIGFzIHRoZSBjb21wb25lbnQgd2FzIG5vdFxuICAgICAgLy8gcmVnaXN0ZXJlZCB5ZXQsIHNvIHdlIGNhbGwgaXQgaGVyZS5cbiAgICAgIGhhbmRsZVJvdXRlRW50ZXJlZChyb3V0ZSk7XG4gICAgfTtcblxuICAgIHZhciBjb25maWdQcm9wcyA9IG1hdGNoZWQucHJvcHMgJiYgbWF0Y2hlZC5wcm9wc1tuYW1lXTtcbiAgICAvLyBzYXZlIHJvdXRlIGFuZCBjb25maWdQcm9wcyBpbiBjYWNoZVxuICAgIGlmIChjb25maWdQcm9wcykge1xuICAgICAgZXh0ZW5kKGNhY2hlW25hbWVdLCB7XG4gICAgICAgIHJvdXRlOiByb3V0ZSxcbiAgICAgICAgY29uZmlnUHJvcHM6IGNvbmZpZ1Byb3BzXG4gICAgICB9KTtcbiAgICAgIGZpbGxQcm9wc2luRGF0YShjb21wb25lbnQsIGRhdGEsIHJvdXRlLCBjb25maWdQcm9wcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGgoY29tcG9uZW50LCBkYXRhLCBjaGlsZHJlbilcbiAgfVxufTtcblxuZnVuY3Rpb24gZmlsbFByb3BzaW5EYXRhIChjb21wb25lbnQsIGRhdGEsIHJvdXRlLCBjb25maWdQcm9wcykge1xuICAvLyByZXNvbHZlIHByb3BzXG4gIHZhciBwcm9wc1RvUGFzcyA9IGRhdGEucHJvcHMgPSByZXNvbHZlUHJvcHMocm91dGUsIGNvbmZpZ1Byb3BzKTtcbiAgaWYgKHByb3BzVG9QYXNzKSB7XG4gICAgLy8gY2xvbmUgdG8gcHJldmVudCBtdXRhdGlvblxuICAgIHByb3BzVG9QYXNzID0gZGF0YS5wcm9wcyA9IGV4dGVuZCh7fSwgcHJvcHNUb1Bhc3MpO1xuICAgIC8vIHBhc3Mgbm9uLWRlY2xhcmVkIHByb3BzIGFzIGF0dHJzXG4gICAgdmFyIGF0dHJzID0gZGF0YS5hdHRycyA9IGRhdGEuYXR0cnMgfHwge307XG4gICAgZm9yICh2YXIga2V5IGluIHByb3BzVG9QYXNzKSB7XG4gICAgICBpZiAoIWNvbXBvbmVudC5wcm9wcyB8fCAhKGtleSBpbiBjb21wb25lbnQucHJvcHMpKSB7XG4gICAgICAgIGF0dHJzW2tleV0gPSBwcm9wc1RvUGFzc1trZXldO1xuICAgICAgICBkZWxldGUgcHJvcHNUb1Bhc3Nba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVByb3BzIChyb3V0ZSwgY29uZmlnKSB7XG4gIHN3aXRjaCAodHlwZW9mIGNvbmZpZykge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICByZXR1cm5cbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgcmV0dXJuIGNvbmZpZ1xuICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbiAgICAgIHJldHVybiBjb25maWcocm91dGUpXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICByZXR1cm4gY29uZmlnID8gcm91dGUucGFyYW1zIDogdW5kZWZpbmVkXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgXCJwcm9wcyBpbiBcXFwiXCIgKyAocm91dGUucGF0aCkgKyBcIlxcXCIgaXMgYSBcIiArICh0eXBlb2YgY29uZmlnKSArIFwiLCBcIiArXG4gICAgICAgICAgXCJleHBlY3RpbmcgYW4gb2JqZWN0LCBmdW5jdGlvbiBvciBib29sZWFuLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIHJlc29sdmVQYXRoIChcbiAgcmVsYXRpdmUsXG4gIGJhc2UsXG4gIGFwcGVuZFxuKSB7XG4gIHZhciBmaXJzdENoYXIgPSByZWxhdGl2ZS5jaGFyQXQoMCk7XG4gIGlmIChmaXJzdENoYXIgPT09ICcvJykge1xuICAgIHJldHVybiByZWxhdGl2ZVxuICB9XG5cbiAgaWYgKGZpcnN0Q2hhciA9PT0gJz8nIHx8IGZpcnN0Q2hhciA9PT0gJyMnKSB7XG4gICAgcmV0dXJuIGJhc2UgKyByZWxhdGl2ZVxuICB9XG5cbiAgdmFyIHN0YWNrID0gYmFzZS5zcGxpdCgnLycpO1xuXG4gIC8vIHJlbW92ZSB0cmFpbGluZyBzZWdtZW50IGlmOlxuICAvLyAtIG5vdCBhcHBlbmRpbmdcbiAgLy8gLSBhcHBlbmRpbmcgdG8gdHJhaWxpbmcgc2xhc2ggKGxhc3Qgc2VnbWVudCBpcyBlbXB0eSlcbiAgaWYgKCFhcHBlbmQgfHwgIXN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdKSB7XG4gICAgc3RhY2sucG9wKCk7XG4gIH1cblxuICAvLyByZXNvbHZlIHJlbGF0aXZlIHBhdGhcbiAgdmFyIHNlZ21lbnRzID0gcmVsYXRpdmUucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcbiAgICBpZiAoc2VnbWVudCA9PT0gJy4uJykge1xuICAgICAgc3RhY2sucG9wKCk7XG4gICAgfSBlbHNlIGlmIChzZWdtZW50ICE9PSAnLicpIHtcbiAgICAgIHN0YWNrLnB1c2goc2VnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgLy8gZW5zdXJlIGxlYWRpbmcgc2xhc2hcbiAgaWYgKHN0YWNrWzBdICE9PSAnJykge1xuICAgIHN0YWNrLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgcmV0dXJuIHN0YWNrLmpvaW4oJy8nKVxufVxuXG5mdW5jdGlvbiBwYXJzZVBhdGggKHBhdGgpIHtcbiAgdmFyIGhhc2ggPSAnJztcbiAgdmFyIHF1ZXJ5ID0gJyc7XG5cbiAgdmFyIGhhc2hJbmRleCA9IHBhdGguaW5kZXhPZignIycpO1xuICBpZiAoaGFzaEluZGV4ID49IDApIHtcbiAgICBoYXNoID0gcGF0aC5zbGljZShoYXNoSW5kZXgpO1xuICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIGhhc2hJbmRleCk7XG4gIH1cblxuICB2YXIgcXVlcnlJbmRleCA9IHBhdGguaW5kZXhPZignPycpO1xuICBpZiAocXVlcnlJbmRleCA+PSAwKSB7XG4gICAgcXVlcnkgPSBwYXRoLnNsaWNlKHF1ZXJ5SW5kZXggKyAxKTtcbiAgICBwYXRoID0gcGF0aC5zbGljZSgwLCBxdWVyeUluZGV4KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGF0aDogcGF0aCxcbiAgICBxdWVyeTogcXVlcnksXG4gICAgaGFzaDogaGFzaFxuICB9XG59XG5cbmZ1bmN0aW9uIGNsZWFuUGF0aCAocGF0aCkge1xuICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxufVxuXG52YXIgaXNhcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFycikgPT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cbi8qKlxuICogRXhwb3NlIGBwYXRoVG9SZWdleHBgLlxuICovXG52YXIgcGF0aFRvUmVnZXhwXzEgPSBwYXRoVG9SZWdleHA7XG52YXIgcGFyc2VfMSA9IHBhcnNlO1xudmFyIGNvbXBpbGVfMSA9IGNvbXBpbGU7XG52YXIgdG9rZW5zVG9GdW5jdGlvbl8xID0gdG9rZW5zVG9GdW5jdGlvbjtcbnZhciB0b2tlbnNUb1JlZ0V4cF8xID0gdG9rZW5zVG9SZWdFeHA7XG5cbi8qKlxuICogVGhlIG1haW4gcGF0aCBtYXRjaGluZyByZWdleHAgdXRpbGl0eS5cbiAqXG4gKiBAdHlwZSB7UmVnRXhwfVxuICovXG52YXIgUEFUSF9SRUdFWFAgPSBuZXcgUmVnRXhwKFtcbiAgLy8gTWF0Y2ggZXNjYXBlZCBjaGFyYWN0ZXJzIHRoYXQgd291bGQgb3RoZXJ3aXNlIGFwcGVhciBpbiBmdXR1cmUgbWF0Y2hlcy5cbiAgLy8gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gZXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IHdvbid0IHRyYW5zZm9ybS5cbiAgJyhcXFxcXFxcXC4pJyxcbiAgLy8gTWF0Y2ggRXhwcmVzcy1zdHlsZSBwYXJhbWV0ZXJzIGFuZCB1bi1uYW1lZCBwYXJhbWV0ZXJzIHdpdGggYSBwcmVmaXhcbiAgLy8gYW5kIG9wdGlvbmFsIHN1ZmZpeGVzLiBNYXRjaGVzIGFwcGVhciBhczpcbiAgLy9cbiAgLy8gXCIvOnRlc3QoXFxcXGQrKT9cIiA9PiBbXCIvXCIsIFwidGVzdFwiLCBcIlxcZCtcIiwgdW5kZWZpbmVkLCBcIj9cIiwgdW5kZWZpbmVkXVxuICAvLyBcIi9yb3V0ZShcXFxcZCspXCIgID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBcIlxcZCtcIiwgdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gIC8vIFwiLypcIiAgICAgICAgICAgID0+IFtcIi9cIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBcIipcIl1cbiAgJyhbXFxcXC8uXSk/KD86KD86XFxcXDooXFxcXHcrKSg/OlxcXFwoKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKCldKSspXFxcXCkpP3xcXFxcKCgoPzpcXFxcXFxcXC58W15cXFxcXFxcXCgpXSkrKVxcXFwpKShbKyo/XSk/fChcXFxcKikpJ1xuXS5qb2luKCd8JyksICdnJyk7XG5cbi8qKlxuICogUGFyc2UgYSBzdHJpbmcgZm9yIHRoZSByYXcgdG9rZW5zLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gIHN0clxuICogQHBhcmFtICB7T2JqZWN0PX0gb3B0aW9uc1xuICogQHJldHVybiB7IUFycmF5fVxuICovXG5mdW5jdGlvbiBwYXJzZSAoc3RyLCBvcHRpb25zKSB7XG4gIHZhciB0b2tlbnMgPSBbXTtcbiAgdmFyIGtleSA9IDA7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBwYXRoID0gJyc7XG4gIHZhciBkZWZhdWx0RGVsaW1pdGVyID0gb3B0aW9ucyAmJiBvcHRpb25zLmRlbGltaXRlciB8fCAnLyc7XG4gIHZhciByZXM7XG5cbiAgd2hpbGUgKChyZXMgPSBQQVRIX1JFR0VYUC5leGVjKHN0cikpICE9IG51bGwpIHtcbiAgICB2YXIgbSA9IHJlc1swXTtcbiAgICB2YXIgZXNjYXBlZCA9IHJlc1sxXTtcbiAgICB2YXIgb2Zmc2V0ID0gcmVzLmluZGV4O1xuICAgIHBhdGggKz0gc3RyLnNsaWNlKGluZGV4LCBvZmZzZXQpO1xuICAgIGluZGV4ID0gb2Zmc2V0ICsgbS5sZW5ndGg7XG5cbiAgICAvLyBJZ25vcmUgYWxyZWFkeSBlc2NhcGVkIHNlcXVlbmNlcy5cbiAgICBpZiAoZXNjYXBlZCkge1xuICAgICAgcGF0aCArPSBlc2NhcGVkWzFdO1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICB2YXIgbmV4dCA9IHN0cltpbmRleF07XG4gICAgdmFyIHByZWZpeCA9IHJlc1syXTtcbiAgICB2YXIgbmFtZSA9IHJlc1szXTtcbiAgICB2YXIgY2FwdHVyZSA9IHJlc1s0XTtcbiAgICB2YXIgZ3JvdXAgPSByZXNbNV07XG4gICAgdmFyIG1vZGlmaWVyID0gcmVzWzZdO1xuICAgIHZhciBhc3RlcmlzayA9IHJlc1s3XTtcblxuICAgIC8vIFB1c2ggdGhlIGN1cnJlbnQgcGF0aCBvbnRvIHRoZSB0b2tlbnMuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAgIHRva2Vucy5wdXNoKHBhdGgpO1xuICAgICAgcGF0aCA9ICcnO1xuICAgIH1cblxuICAgIHZhciBwYXJ0aWFsID0gcHJlZml4ICE9IG51bGwgJiYgbmV4dCAhPSBudWxsICYmIG5leHQgIT09IHByZWZpeDtcbiAgICB2YXIgcmVwZWF0ID0gbW9kaWZpZXIgPT09ICcrJyB8fCBtb2RpZmllciA9PT0gJyonO1xuICAgIHZhciBvcHRpb25hbCA9IG1vZGlmaWVyID09PSAnPycgfHwgbW9kaWZpZXIgPT09ICcqJztcbiAgICB2YXIgZGVsaW1pdGVyID0gcmVzWzJdIHx8IGRlZmF1bHREZWxpbWl0ZXI7XG4gICAgdmFyIHBhdHRlcm4gPSBjYXB0dXJlIHx8IGdyb3VwO1xuXG4gICAgdG9rZW5zLnB1c2goe1xuICAgICAgbmFtZTogbmFtZSB8fCBrZXkrKyxcbiAgICAgIHByZWZpeDogcHJlZml4IHx8ICcnLFxuICAgICAgZGVsaW1pdGVyOiBkZWxpbWl0ZXIsXG4gICAgICBvcHRpb25hbDogb3B0aW9uYWwsXG4gICAgICByZXBlYXQ6IHJlcGVhdCxcbiAgICAgIHBhcnRpYWw6IHBhcnRpYWwsXG4gICAgICBhc3RlcmlzazogISFhc3RlcmlzayxcbiAgICAgIHBhdHRlcm46IHBhdHRlcm4gPyBlc2NhcGVHcm91cChwYXR0ZXJuKSA6IChhc3RlcmlzayA/ICcuKicgOiAnW14nICsgZXNjYXBlU3RyaW5nKGRlbGltaXRlcikgKyAnXSs/JylcbiAgICB9KTtcbiAgfVxuXG4gIC8vIE1hdGNoIGFueSBjaGFyYWN0ZXJzIHN0aWxsIHJlbWFpbmluZy5cbiAgaWYgKGluZGV4IDwgc3RyLmxlbmd0aCkge1xuICAgIHBhdGggKz0gc3RyLnN1YnN0cihpbmRleCk7XG4gIH1cblxuICAvLyBJZiB0aGUgcGF0aCBleGlzdHMsIHB1c2ggaXQgb250byB0aGUgZW5kLlxuICBpZiAocGF0aCkge1xuICAgIHRva2Vucy5wdXNoKHBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vuc1xufVxuXG4vKipcbiAqIENvbXBpbGUgYSBzdHJpbmcgdG8gYSB0ZW1wbGF0ZSBmdW5jdGlvbiBmb3IgdGhlIHBhdGguXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICAgICAgICBzdHJcbiAqIEBwYXJhbSAge09iamVjdD19ICAgICAgICAgICAgb3B0aW9uc1xuICogQHJldHVybiB7IWZ1bmN0aW9uKE9iamVjdD0sIE9iamVjdD0pfVxuICovXG5mdW5jdGlvbiBjb21waWxlIChzdHIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRva2Vuc1RvRnVuY3Rpb24ocGFyc2Uoc3RyLCBvcHRpb25zKSwgb3B0aW9ucylcbn1cblxuLyoqXG4gKiBQcmV0dGllciBlbmNvZGluZyBvZiBVUkkgcGF0aCBzZWdtZW50cy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVuY29kZVVSSUNvbXBvbmVudFByZXR0eSAoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUkkoc3RyKS5yZXBsYWNlKC9bXFwvPyNdL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKVxuICB9KVxufVxuXG4vKipcbiAqIEVuY29kZSB0aGUgYXN0ZXJpc2sgcGFyYW1ldGVyLiBTaW1pbGFyIHRvIGBwcmV0dHlgLCBidXQgYWxsb3dzIHNsYXNoZXMuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlbmNvZGVBc3RlcmlzayAoc3RyKSB7XG4gIHJldHVybiBlbmNvZGVVUkkoc3RyKS5yZXBsYWNlKC9bPyNdL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKVxuICB9KVxufVxuXG4vKipcbiAqIEV4cG9zZSBhIG1ldGhvZCBmb3IgdHJhbnNmb3JtaW5nIHRva2VucyBpbnRvIHRoZSBwYXRoIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiB0b2tlbnNUb0Z1bmN0aW9uICh0b2tlbnMsIG9wdGlvbnMpIHtcbiAgLy8gQ29tcGlsZSBhbGwgdGhlIHRva2VucyBpbnRvIHJlZ2V4cHMuXG4gIHZhciBtYXRjaGVzID0gbmV3IEFycmF5KHRva2Vucy5sZW5ndGgpO1xuXG4gIC8vIENvbXBpbGUgYWxsIHRoZSBwYXR0ZXJucyBiZWZvcmUgY29tcGlsYXRpb24uXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHR5cGVvZiB0b2tlbnNbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICBtYXRjaGVzW2ldID0gbmV3IFJlZ0V4cCgnXig/OicgKyB0b2tlbnNbaV0ucGF0dGVybiArICcpJCcsIGZsYWdzKG9wdGlvbnMpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG9iaiwgb3B0cykge1xuICAgIHZhciBwYXRoID0gJyc7XG4gICAgdmFyIGRhdGEgPSBvYmogfHwge307XG4gICAgdmFyIG9wdGlvbnMgPSBvcHRzIHx8IHt9O1xuICAgIHZhciBlbmNvZGUgPSBvcHRpb25zLnByZXR0eSA/IGVuY29kZVVSSUNvbXBvbmVudFByZXR0eSA6IGVuY29kZVVSSUNvbXBvbmVudDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07XG5cbiAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHBhdGggKz0gdG9rZW47XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlID0gZGF0YVt0b2tlbi5uYW1lXTtcbiAgICAgIHZhciBzZWdtZW50O1xuXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICBpZiAodG9rZW4ub3B0aW9uYWwpIHtcbiAgICAgICAgICAvLyBQcmVwZW5kIHBhcnRpYWwgc2VnbWVudCBwcmVmaXhlcy5cbiAgICAgICAgICBpZiAodG9rZW4ucGFydGlhbCkge1xuICAgICAgICAgICAgcGF0aCArPSB0b2tlbi5wcmVmaXg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIGJlIGRlZmluZWQnKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc2FycmF5KHZhbHVlKSkge1xuICAgICAgICBpZiAoIXRva2VuLnJlcGVhdCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiJyArIHRva2VuLm5hbWUgKyAnXCIgdG8gbm90IHJlcGVhdCwgYnV0IHJlY2VpdmVkIGAnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpICsgJ2AnKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGlmICh0b2tlbi5vcHRpb25hbCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBub3QgYmUgZW1wdHknKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsdWUubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBzZWdtZW50ID0gZW5jb2RlKHZhbHVlW2pdKTtcblxuICAgICAgICAgIGlmICghbWF0Y2hlc1tpXS50ZXN0KHNlZ21lbnQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhbGwgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBtYXRjaCBcIicgKyB0b2tlbi5wYXR0ZXJuICsgJ1wiLCBidXQgcmVjZWl2ZWQgYCcgKyBKU09OLnN0cmluZ2lmeShzZWdtZW50KSArICdgJylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXRoICs9IChqID09PSAwID8gdG9rZW4ucHJlZml4IDogdG9rZW4uZGVsaW1pdGVyKSArIHNlZ21lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBzZWdtZW50ID0gdG9rZW4uYXN0ZXJpc2sgPyBlbmNvZGVBc3Rlcmlzayh2YWx1ZSkgOiBlbmNvZGUodmFsdWUpO1xuXG4gICAgICBpZiAoIW1hdGNoZXNbaV0udGVzdChzZWdtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIG1hdGNoIFwiJyArIHRva2VuLnBhdHRlcm4gKyAnXCIsIGJ1dCByZWNlaXZlZCBcIicgKyBzZWdtZW50ICsgJ1wiJylcbiAgICAgIH1cblxuICAgICAgcGF0aCArPSB0b2tlbi5wcmVmaXggKyBzZWdtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoXG4gIH1cbn1cblxuLyoqXG4gKiBFc2NhcGUgYSByZWd1bGFyIGV4cHJlc3Npb24gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVN0cmluZyAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvKFsuKyo/PV4hOiR7fSgpW1xcXXxcXC9cXFxcXSkvZywgJ1xcXFwkMScpXG59XG5cbi8qKlxuICogRXNjYXBlIHRoZSBjYXB0dXJpbmcgZ3JvdXAgYnkgZXNjYXBpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCBtZWFuaW5nLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gZ3JvdXBcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZXNjYXBlR3JvdXAgKGdyb3VwKSB7XG4gIHJldHVybiBncm91cC5yZXBsYWNlKC8oWz0hOiRcXC8oKV0pL2csICdcXFxcJDEnKVxufVxuXG4vKipcbiAqIEF0dGFjaCB0aGUga2V5cyBhcyBhIHByb3BlcnR5IG9mIHRoZSByZWdleHAuXG4gKlxuICogQHBhcmFtICB7IVJlZ0V4cH0gcmVcbiAqIEBwYXJhbSAge0FycmF5fSAgIGtleXNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIGF0dGFjaEtleXMgKHJlLCBrZXlzKSB7XG4gIHJlLmtleXMgPSBrZXlzO1xuICByZXR1cm4gcmVcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGZsYWdzIGZvciBhIHJlZ2V4cCBmcm9tIHRoZSBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBmbGFncyAob3B0aW9ucykge1xuICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLnNlbnNpdGl2ZSA/ICcnIDogJ2knXG59XG5cbi8qKlxuICogUHVsbCBvdXQga2V5cyBmcm9tIGEgcmVnZXhwLlxuICpcbiAqIEBwYXJhbSAgeyFSZWdFeHB9IHBhdGhcbiAqIEBwYXJhbSAgeyFBcnJheX0gIGtleXNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIHJlZ2V4cFRvUmVnZXhwIChwYXRoLCBrZXlzKSB7XG4gIC8vIFVzZSBhIG5lZ2F0aXZlIGxvb2thaGVhZCB0byBtYXRjaCBvbmx5IGNhcHR1cmluZyBncm91cHMuXG4gIHZhciBncm91cHMgPSBwYXRoLnNvdXJjZS5tYXRjaCgvXFwoKD8hXFw/KS9nKTtcblxuICBpZiAoZ3JvdXBzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleXMucHVzaCh7XG4gICAgICAgIG5hbWU6IGksXG4gICAgICAgIHByZWZpeDogbnVsbCxcbiAgICAgICAgZGVsaW1pdGVyOiBudWxsLFxuICAgICAgICBvcHRpb25hbDogZmFsc2UsXG4gICAgICAgIHJlcGVhdDogZmFsc2UsXG4gICAgICAgIHBhcnRpYWw6IGZhbHNlLFxuICAgICAgICBhc3RlcmlzazogZmFsc2UsXG4gICAgICAgIHBhdHRlcm46IG51bGxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhdHRhY2hLZXlzKHBhdGgsIGtleXMpXG59XG5cbi8qKlxuICogVHJhbnNmb3JtIGFuIGFycmF5IGludG8gYSByZWdleHAuXG4gKlxuICogQHBhcmFtICB7IUFycmF5fSAgcGF0aFxuICogQHBhcmFtICB7QXJyYXl9ICAga2V5c1xuICogQHBhcmFtICB7IU9iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gYXJyYXlUb1JlZ2V4cCAocGF0aCwga2V5cywgb3B0aW9ucykge1xuICB2YXIgcGFydHMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBwYXJ0cy5wdXNoKHBhdGhUb1JlZ2V4cChwYXRoW2ldLCBrZXlzLCBvcHRpb25zKS5zb3VyY2UpO1xuICB9XG5cbiAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAoJyg/OicgKyBwYXJ0cy5qb2luKCd8JykgKyAnKScsIGZsYWdzKG9wdGlvbnMpKTtcblxuICByZXR1cm4gYXR0YWNoS2V5cyhyZWdleHAsIGtleXMpXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcGF0aCByZWdleHAgZnJvbSBzdHJpbmcgaW5wdXQuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgcGF0aFxuICogQHBhcmFtICB7IUFycmF5fSAga2V5c1xuICogQHBhcmFtICB7IU9iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7IVJlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVG9SZWdleHAgKHBhdGgsIGtleXMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRva2Vuc1RvUmVnRXhwKHBhcnNlKHBhdGgsIG9wdGlvbnMpLCBrZXlzLCBvcHRpb25zKVxufVxuXG4vKipcbiAqIEV4cG9zZSBhIGZ1bmN0aW9uIGZvciB0YWtpbmcgdG9rZW5zIGFuZCByZXR1cm5pbmcgYSBSZWdFeHAuXG4gKlxuICogQHBhcmFtICB7IUFycmF5fSAgICAgICAgICB0b2tlbnNcbiAqIEBwYXJhbSAgeyhBcnJheXxPYmplY3QpPX0ga2V5c1xuICogQHBhcmFtICB7T2JqZWN0PX0gICAgICAgICBvcHRpb25zXG4gKiBAcmV0dXJuIHshUmVnRXhwfVxuICovXG5mdW5jdGlvbiB0b2tlbnNUb1JlZ0V4cCAodG9rZW5zLCBrZXlzLCBvcHRpb25zKSB7XG4gIGlmICghaXNhcnJheShrZXlzKSkge1xuICAgIG9wdGlvbnMgPSAvKiogQHR5cGUgeyFPYmplY3R9ICovIChrZXlzIHx8IG9wdGlvbnMpO1xuICAgIGtleXMgPSBbXTtcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIHZhciBzdHJpY3QgPSBvcHRpb25zLnN0cmljdDtcbiAgdmFyIGVuZCA9IG9wdGlvbnMuZW5kICE9PSBmYWxzZTtcbiAgdmFyIHJvdXRlID0gJyc7XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSB0b2tlbnMgYW5kIGNyZWF0ZSBvdXIgcmVnZXhwIHN0cmluZy5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdG9rZW4gPSB0b2tlbnNbaV07XG5cbiAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgcm91dGUgKz0gZXNjYXBlU3RyaW5nKHRva2VuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHByZWZpeCA9IGVzY2FwZVN0cmluZyh0b2tlbi5wcmVmaXgpO1xuICAgICAgdmFyIGNhcHR1cmUgPSAnKD86JyArIHRva2VuLnBhdHRlcm4gKyAnKSc7XG5cbiAgICAgIGtleXMucHVzaCh0b2tlbik7XG5cbiAgICAgIGlmICh0b2tlbi5yZXBlYXQpIHtcbiAgICAgICAgY2FwdHVyZSArPSAnKD86JyArIHByZWZpeCArIGNhcHR1cmUgKyAnKSonO1xuICAgICAgfVxuXG4gICAgICBpZiAodG9rZW4ub3B0aW9uYWwpIHtcbiAgICAgICAgaWYgKCF0b2tlbi5wYXJ0aWFsKSB7XG4gICAgICAgICAgY2FwdHVyZSA9ICcoPzonICsgcHJlZml4ICsgJygnICsgY2FwdHVyZSArICcpKT8nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhcHR1cmUgPSBwcmVmaXggKyAnKCcgKyBjYXB0dXJlICsgJyk/JztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FwdHVyZSA9IHByZWZpeCArICcoJyArIGNhcHR1cmUgKyAnKSc7XG4gICAgICB9XG5cbiAgICAgIHJvdXRlICs9IGNhcHR1cmU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGRlbGltaXRlciA9IGVzY2FwZVN0cmluZyhvcHRpb25zLmRlbGltaXRlciB8fCAnLycpO1xuICB2YXIgZW5kc1dpdGhEZWxpbWl0ZXIgPSByb3V0ZS5zbGljZSgtZGVsaW1pdGVyLmxlbmd0aCkgPT09IGRlbGltaXRlcjtcblxuICAvLyBJbiBub24tc3RyaWN0IG1vZGUgd2UgYWxsb3cgYSBzbGFzaCBhdCB0aGUgZW5kIG9mIG1hdGNoLiBJZiB0aGUgcGF0aCB0b1xuICAvLyBtYXRjaCBhbHJlYWR5IGVuZHMgd2l0aCBhIHNsYXNoLCB3ZSByZW1vdmUgaXQgZm9yIGNvbnNpc3RlbmN5LiBUaGUgc2xhc2hcbiAgLy8gaXMgdmFsaWQgYXQgdGhlIGVuZCBvZiBhIHBhdGggbWF0Y2gsIG5vdCBpbiB0aGUgbWlkZGxlLiBUaGlzIGlzIGltcG9ydGFudFxuICAvLyBpbiBub24tZW5kaW5nIG1vZGUsIHdoZXJlIFwiL3Rlc3QvXCIgc2hvdWxkbid0IG1hdGNoIFwiL3Rlc3QvL3JvdXRlXCIuXG4gIGlmICghc3RyaWN0KSB7XG4gICAgcm91dGUgPSAoZW5kc1dpdGhEZWxpbWl0ZXIgPyByb3V0ZS5zbGljZSgwLCAtZGVsaW1pdGVyLmxlbmd0aCkgOiByb3V0ZSkgKyAnKD86JyArIGRlbGltaXRlciArICcoPz0kKSk/JztcbiAgfVxuXG4gIGlmIChlbmQpIHtcbiAgICByb3V0ZSArPSAnJCc7XG4gIH0gZWxzZSB7XG4gICAgLy8gSW4gbm9uLWVuZGluZyBtb2RlLCB3ZSBuZWVkIHRoZSBjYXB0dXJpbmcgZ3JvdXBzIHRvIG1hdGNoIGFzIG11Y2ggYXNcbiAgICAvLyBwb3NzaWJsZSBieSB1c2luZyBhIHBvc2l0aXZlIGxvb2thaGVhZCB0byB0aGUgZW5kIG9yIG5leHQgcGF0aCBzZWdtZW50LlxuICAgIHJvdXRlICs9IHN0cmljdCAmJiBlbmRzV2l0aERlbGltaXRlciA/ICcnIDogJyg/PScgKyBkZWxpbWl0ZXIgKyAnfCQpJztcbiAgfVxuXG4gIHJldHVybiBhdHRhY2hLZXlzKG5ldyBSZWdFeHAoJ14nICsgcm91dGUsIGZsYWdzKG9wdGlvbnMpKSwga2V5cylcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIGdpdmVuIHBhdGggc3RyaW5nLCByZXR1cm5pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24uXG4gKlxuICogQW4gZW1wdHkgYXJyYXkgY2FuIGJlIHBhc3NlZCBpbiBmb3IgdGhlIGtleXMsIHdoaWNoIHdpbGwgaG9sZCB0aGVcbiAqIHBsYWNlaG9sZGVyIGtleSBkZXNjcmlwdGlvbnMuIEZvciBleGFtcGxlLCB1c2luZyBgL3VzZXIvOmlkYCwgYGtleXNgIHdpbGxcbiAqIGNvbnRhaW4gYFt7IG5hbWU6ICdpZCcsIGRlbGltaXRlcjogJy8nLCBvcHRpb25hbDogZmFsc2UsIHJlcGVhdDogZmFsc2UgfV1gLlxuICpcbiAqIEBwYXJhbSAgeyhzdHJpbmd8UmVnRXhwfEFycmF5KX0gcGF0aFxuICogQHBhcmFtICB7KEFycmF5fE9iamVjdCk9fSAgICAgICBrZXlzXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSAgICAgICAgICAgICAgIG9wdGlvbnNcbiAqIEByZXR1cm4geyFSZWdFeHB9XG4gKi9cbmZ1bmN0aW9uIHBhdGhUb1JlZ2V4cCAocGF0aCwga2V5cywgb3B0aW9ucykge1xuICBpZiAoIWlzYXJyYXkoa2V5cykpIHtcbiAgICBvcHRpb25zID0gLyoqIEB0eXBlIHshT2JqZWN0fSAqLyAoa2V5cyB8fCBvcHRpb25zKTtcbiAgICBrZXlzID0gW107XG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBpZiAocGF0aCBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiByZWdleHBUb1JlZ2V4cChwYXRoLCAvKiogQHR5cGUgeyFBcnJheX0gKi8gKGtleXMpKVxuICB9XG5cbiAgaWYgKGlzYXJyYXkocGF0aCkpIHtcbiAgICByZXR1cm4gYXJyYXlUb1JlZ2V4cCgvKiogQHR5cGUgeyFBcnJheX0gKi8gKHBhdGgpLCAvKiogQHR5cGUgeyFBcnJheX0gKi8gKGtleXMpLCBvcHRpb25zKVxuICB9XG5cbiAgcmV0dXJuIHN0cmluZ1RvUmVnZXhwKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGF0aCksIC8qKiBAdHlwZSB7IUFycmF5fSAqLyAoa2V5cyksIG9wdGlvbnMpXG59XG5wYXRoVG9SZWdleHBfMS5wYXJzZSA9IHBhcnNlXzE7XG5wYXRoVG9SZWdleHBfMS5jb21waWxlID0gY29tcGlsZV8xO1xucGF0aFRvUmVnZXhwXzEudG9rZW5zVG9GdW5jdGlvbiA9IHRva2Vuc1RvRnVuY3Rpb25fMTtcbnBhdGhUb1JlZ2V4cF8xLnRva2Vuc1RvUmVnRXhwID0gdG9rZW5zVG9SZWdFeHBfMTtcblxuLyogICovXG5cbi8vICRmbG93LWRpc2FibGUtbGluZVxudmFyIHJlZ2V4cENvbXBpbGVDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIGZpbGxQYXJhbXMgKFxuICBwYXRoLFxuICBwYXJhbXMsXG4gIHJvdXRlTXNnXG4pIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICB0cnkge1xuICAgIHZhciBmaWxsZXIgPVxuICAgICAgcmVnZXhwQ29tcGlsZUNhY2hlW3BhdGhdIHx8XG4gICAgICAocmVnZXhwQ29tcGlsZUNhY2hlW3BhdGhdID0gcGF0aFRvUmVnZXhwXzEuY29tcGlsZShwYXRoKSk7XG5cbiAgICAvLyBGaXggIzI1MDUgcmVzb2x2aW5nIGFzdGVyaXNrIHJvdXRlcyB7IG5hbWU6ICdub3QtZm91bmQnLCBwYXJhbXM6IHsgcGF0aE1hdGNoOiAnL25vdC1mb3VuZCcgfX1cbiAgICAvLyBhbmQgZml4ICMzMTA2IHNvIHRoYXQgeW91IGNhbiB3b3JrIHdpdGggbG9jYXRpb24gZGVzY3JpcHRvciBvYmplY3QgaGF2aW5nIHBhcmFtcy5wYXRoTWF0Y2ggZXF1YWwgdG8gZW1wdHkgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBwYXJhbXMucGF0aE1hdGNoID09PSAnc3RyaW5nJykgeyBwYXJhbXNbMF0gPSBwYXJhbXMucGF0aE1hdGNoOyB9XG5cbiAgICByZXR1cm4gZmlsbGVyKHBhcmFtcywgeyBwcmV0dHk6IHRydWUgfSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvLyBGaXggIzMwNzIgbm8gd2FybiBpZiBgcGF0aE1hdGNoYCBpcyBzdHJpbmdcbiAgICAgIHdhcm4odHlwZW9mIHBhcmFtcy5wYXRoTWF0Y2ggPT09ICdzdHJpbmcnLCAoXCJtaXNzaW5nIHBhcmFtIGZvciBcIiArIHJvdXRlTXNnICsgXCI6IFwiICsgKGUubWVzc2FnZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuICcnXG4gIH0gZmluYWxseSB7XG4gICAgLy8gZGVsZXRlIHRoZSAwIGlmIGl0IHdhcyBhZGRlZFxuICAgIGRlbGV0ZSBwYXJhbXNbMF07XG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2F0aW9uIChcbiAgcmF3LFxuICBjdXJyZW50LFxuICBhcHBlbmQsXG4gIHJvdXRlclxuKSB7XG4gIHZhciBuZXh0ID0gdHlwZW9mIHJhdyA9PT0gJ3N0cmluZycgPyB7IHBhdGg6IHJhdyB9IDogcmF3O1xuICAvLyBuYW1lZCB0YXJnZXRcbiAgaWYgKG5leHQuX25vcm1hbGl6ZWQpIHtcbiAgICByZXR1cm4gbmV4dFxuICB9IGVsc2UgaWYgKG5leHQubmFtZSkge1xuICAgIG5leHQgPSBleHRlbmQoe30sIHJhdyk7XG4gICAgdmFyIHBhcmFtcyA9IG5leHQucGFyYW1zO1xuICAgIGlmIChwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG5leHQucGFyYW1zID0gZXh0ZW5kKHt9LCBwYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dFxuICB9XG5cbiAgLy8gcmVsYXRpdmUgcGFyYW1zXG4gIGlmICghbmV4dC5wYXRoICYmIG5leHQucGFyYW1zICYmIGN1cnJlbnQpIHtcbiAgICBuZXh0ID0gZXh0ZW5kKHt9LCBuZXh0KTtcbiAgICBuZXh0Ll9ub3JtYWxpemVkID0gdHJ1ZTtcbiAgICB2YXIgcGFyYW1zJDEgPSBleHRlbmQoZXh0ZW5kKHt9LCBjdXJyZW50LnBhcmFtcyksIG5leHQucGFyYW1zKTtcbiAgICBpZiAoY3VycmVudC5uYW1lKSB7XG4gICAgICBuZXh0Lm5hbWUgPSBjdXJyZW50Lm5hbWU7XG4gICAgICBuZXh0LnBhcmFtcyA9IHBhcmFtcyQxO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudC5tYXRjaGVkLmxlbmd0aCkge1xuICAgICAgdmFyIHJhd1BhdGggPSBjdXJyZW50Lm1hdGNoZWRbY3VycmVudC5tYXRjaGVkLmxlbmd0aCAtIDFdLnBhdGg7XG4gICAgICBuZXh0LnBhdGggPSBmaWxsUGFyYW1zKHJhd1BhdGgsIHBhcmFtcyQxLCAoXCJwYXRoIFwiICsgKGN1cnJlbnQucGF0aCkpKTtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oZmFsc2UsIFwicmVsYXRpdmUgcGFyYW1zIG5hdmlnYXRpb24gcmVxdWlyZXMgYSBjdXJyZW50IHJvdXRlLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHRcbiAgfVxuXG4gIHZhciBwYXJzZWRQYXRoID0gcGFyc2VQYXRoKG5leHQucGF0aCB8fCAnJyk7XG4gIHZhciBiYXNlUGF0aCA9IChjdXJyZW50ICYmIGN1cnJlbnQucGF0aCkgfHwgJy8nO1xuICB2YXIgcGF0aCA9IHBhcnNlZFBhdGgucGF0aFxuICAgID8gcmVzb2x2ZVBhdGgocGFyc2VkUGF0aC5wYXRoLCBiYXNlUGF0aCwgYXBwZW5kIHx8IG5leHQuYXBwZW5kKVxuICAgIDogYmFzZVBhdGg7XG5cbiAgdmFyIHF1ZXJ5ID0gcmVzb2x2ZVF1ZXJ5KFxuICAgIHBhcnNlZFBhdGgucXVlcnksXG4gICAgbmV4dC5xdWVyeSxcbiAgICByb3V0ZXIgJiYgcm91dGVyLm9wdGlvbnMucGFyc2VRdWVyeVxuICApO1xuXG4gIHZhciBoYXNoID0gbmV4dC5oYXNoIHx8IHBhcnNlZFBhdGguaGFzaDtcbiAgaWYgKGhhc2ggJiYgaGFzaC5jaGFyQXQoMCkgIT09ICcjJykge1xuICAgIGhhc2ggPSBcIiNcIiArIGhhc2g7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIF9ub3JtYWxpemVkOiB0cnVlLFxuICAgIHBhdGg6IHBhdGgsXG4gICAgcXVlcnk6IHF1ZXJ5LFxuICAgIGhhc2g6IGhhc2hcbiAgfVxufVxuXG4vKiAgKi9cblxuLy8gd29yayBhcm91bmQgd2VpcmQgZmxvdyBidWdcbnZhciB0b1R5cGVzID0gW1N0cmluZywgT2JqZWN0XTtcbnZhciBldmVudFR5cGVzID0gW1N0cmluZywgQXJyYXldO1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uICgpIHt9O1xuXG52YXIgd2FybmVkQ3VzdG9tU2xvdDtcbnZhciB3YXJuZWRUYWdQcm9wO1xudmFyIHdhcm5lZEV2ZW50UHJvcDtcblxudmFyIExpbmsgPSB7XG4gIG5hbWU6ICdSb3V0ZXJMaW5rJyxcbiAgcHJvcHM6IHtcbiAgICB0bzoge1xuICAgICAgdHlwZTogdG9UeXBlcyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgfSxcbiAgICB0YWc6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdhJ1xuICAgIH0sXG4gICAgY3VzdG9tOiBCb29sZWFuLFxuICAgIGV4YWN0OiBCb29sZWFuLFxuICAgIGV4YWN0UGF0aDogQm9vbGVhbixcbiAgICBhcHBlbmQ6IEJvb2xlYW4sXG4gICAgcmVwbGFjZTogQm9vbGVhbixcbiAgICBhY3RpdmVDbGFzczogU3RyaW5nLFxuICAgIGV4YWN0QWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgICBhcmlhQ3VycmVudFZhbHVlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICBkZWZhdWx0OiAncGFnZSdcbiAgICB9LFxuICAgIGV2ZW50OiB7XG4gICAgICB0eXBlOiBldmVudFR5cGVzLFxuICAgICAgZGVmYXVsdDogJ2NsaWNrJ1xuICAgIH1cbiAgfSxcbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKGgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciByb3V0ZXIgPSB0aGlzLiRyb3V0ZXI7XG4gICAgdmFyIGN1cnJlbnQgPSB0aGlzLiRyb3V0ZTtcbiAgICB2YXIgcmVmID0gcm91dGVyLnJlc29sdmUoXG4gICAgICB0aGlzLnRvLFxuICAgICAgY3VycmVudCxcbiAgICAgIHRoaXMuYXBwZW5kXG4gICAgKTtcbiAgICB2YXIgbG9jYXRpb24gPSByZWYubG9jYXRpb247XG4gICAgdmFyIHJvdXRlID0gcmVmLnJvdXRlO1xuICAgIHZhciBocmVmID0gcmVmLmhyZWY7XG5cbiAgICB2YXIgY2xhc3NlcyA9IHt9O1xuICAgIHZhciBnbG9iYWxBY3RpdmVDbGFzcyA9IHJvdXRlci5vcHRpb25zLmxpbmtBY3RpdmVDbGFzcztcbiAgICB2YXIgZ2xvYmFsRXhhY3RBY3RpdmVDbGFzcyA9IHJvdXRlci5vcHRpb25zLmxpbmtFeGFjdEFjdGl2ZUNsYXNzO1xuICAgIC8vIFN1cHBvcnQgZ2xvYmFsIGVtcHR5IGFjdGl2ZSBjbGFzc1xuICAgIHZhciBhY3RpdmVDbGFzc0ZhbGxiYWNrID1cbiAgICAgIGdsb2JhbEFjdGl2ZUNsYXNzID09IG51bGwgPyAncm91dGVyLWxpbmstYWN0aXZlJyA6IGdsb2JhbEFjdGl2ZUNsYXNzO1xuICAgIHZhciBleGFjdEFjdGl2ZUNsYXNzRmFsbGJhY2sgPVxuICAgICAgZ2xvYmFsRXhhY3RBY3RpdmVDbGFzcyA9PSBudWxsXG4gICAgICAgID8gJ3JvdXRlci1saW5rLWV4YWN0LWFjdGl2ZSdcbiAgICAgICAgOiBnbG9iYWxFeGFjdEFjdGl2ZUNsYXNzO1xuICAgIHZhciBhY3RpdmVDbGFzcyA9XG4gICAgICB0aGlzLmFjdGl2ZUNsYXNzID09IG51bGwgPyBhY3RpdmVDbGFzc0ZhbGxiYWNrIDogdGhpcy5hY3RpdmVDbGFzcztcbiAgICB2YXIgZXhhY3RBY3RpdmVDbGFzcyA9XG4gICAgICB0aGlzLmV4YWN0QWN0aXZlQ2xhc3MgPT0gbnVsbFxuICAgICAgICA/IGV4YWN0QWN0aXZlQ2xhc3NGYWxsYmFja1xuICAgICAgICA6IHRoaXMuZXhhY3RBY3RpdmVDbGFzcztcblxuICAgIHZhciBjb21wYXJlVGFyZ2V0ID0gcm91dGUucmVkaXJlY3RlZEZyb21cbiAgICAgID8gY3JlYXRlUm91dGUobnVsbCwgbm9ybWFsaXplTG9jYXRpb24ocm91dGUucmVkaXJlY3RlZEZyb20pLCBudWxsLCByb3V0ZXIpXG4gICAgICA6IHJvdXRlO1xuXG4gICAgY2xhc3Nlc1tleGFjdEFjdGl2ZUNsYXNzXSA9IGlzU2FtZVJvdXRlKGN1cnJlbnQsIGNvbXBhcmVUYXJnZXQsIHRoaXMuZXhhY3RQYXRoKTtcbiAgICBjbGFzc2VzW2FjdGl2ZUNsYXNzXSA9IHRoaXMuZXhhY3QgfHwgdGhpcy5leGFjdFBhdGhcbiAgICAgID8gY2xhc3Nlc1tleGFjdEFjdGl2ZUNsYXNzXVxuICAgICAgOiBpc0luY2x1ZGVkUm91dGUoY3VycmVudCwgY29tcGFyZVRhcmdldCk7XG5cbiAgICB2YXIgYXJpYUN1cnJlbnRWYWx1ZSA9IGNsYXNzZXNbZXhhY3RBY3RpdmVDbGFzc10gPyB0aGlzLmFyaWFDdXJyZW50VmFsdWUgOiBudWxsO1xuXG4gICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGd1YXJkRXZlbnQoZSkpIHtcbiAgICAgICAgaWYgKHRoaXMkMS5yZXBsYWNlKSB7XG4gICAgICAgICAgcm91dGVyLnJlcGxhY2UobG9jYXRpb24sIG5vb3ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJvdXRlci5wdXNoKGxvY2F0aW9uLCBub29wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgb24gPSB7IGNsaWNrOiBndWFyZEV2ZW50IH07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5ldmVudCkpIHtcbiAgICAgIHRoaXMuZXZlbnQuZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgICAgICBvbltlXSA9IGhhbmRsZXI7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25bdGhpcy5ldmVudF0gPSBoYW5kbGVyO1xuICAgIH1cblxuICAgIHZhciBkYXRhID0geyBjbGFzczogY2xhc3NlcyB9O1xuXG4gICAgdmFyIHNjb3BlZFNsb3QgPVxuICAgICAgIXRoaXMuJHNjb3BlZFNsb3RzLiRoYXNOb3JtYWwgJiZcbiAgICAgIHRoaXMuJHNjb3BlZFNsb3RzLmRlZmF1bHQgJiZcbiAgICAgIHRoaXMuJHNjb3BlZFNsb3RzLmRlZmF1bHQoe1xuICAgICAgICBocmVmOiBocmVmLFxuICAgICAgICByb3V0ZTogcm91dGUsXG4gICAgICAgIG5hdmlnYXRlOiBoYW5kbGVyLFxuICAgICAgICBpc0FjdGl2ZTogY2xhc3Nlc1thY3RpdmVDbGFzc10sXG4gICAgICAgIGlzRXhhY3RBY3RpdmU6IGNsYXNzZXNbZXhhY3RBY3RpdmVDbGFzc11cbiAgICAgIH0pO1xuXG4gICAgaWYgKHNjb3BlZFNsb3QpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICF0aGlzLmN1c3RvbSkge1xuICAgICAgICAhd2FybmVkQ3VzdG9tU2xvdCAmJiB3YXJuKGZhbHNlLCAnSW4gVnVlIFJvdXRlciA0LCB0aGUgdi1zbG90IEFQSSB3aWxsIGJ5IGRlZmF1bHQgd3JhcCBpdHMgY29udGVudCB3aXRoIGFuIDxhPiBlbGVtZW50LiBVc2UgdGhlIGN1c3RvbSBwcm9wIHRvIHJlbW92ZSB0aGlzIHdhcm5pbmc6XFxuPHJvdXRlci1saW5rIHYtc2xvdD1cInsgbmF2aWdhdGUsIGhyZWYgfVwiIGN1c3RvbT48L3JvdXRlci1saW5rPlxcbicpO1xuICAgICAgICB3YXJuZWRDdXN0b21TbG90ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzY29wZWRTbG90Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gc2NvcGVkU2xvdFswXVxuICAgICAgfSBlbHNlIGlmIChzY29wZWRTbG90Lmxlbmd0aCA+IDEgfHwgIXNjb3BlZFNsb3QubGVuZ3RoKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgKFwiPHJvdXRlci1saW5rPiB3aXRoIHRvPVxcXCJcIiArICh0aGlzLnRvKSArIFwiXFxcIiBpcyB0cnlpbmcgdG8gdXNlIGEgc2NvcGVkIHNsb3QgYnV0IGl0IGRpZG4ndCBwcm92aWRlIGV4YWN0bHkgb25lIGNoaWxkLiBXcmFwcGluZyB0aGUgY29udGVudCB3aXRoIGEgc3BhbiBlbGVtZW50LlwiKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjb3BlZFNsb3QubGVuZ3RoID09PSAwID8gaCgpIDogaCgnc3BhbicsIHt9LCBzY29wZWRTbG90KVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoJ3RhZycgaW4gdGhpcy4kb3B0aW9ucy5wcm9wc0RhdGEgJiYgIXdhcm5lZFRhZ1Byb3ApIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBcIjxyb3V0ZXItbGluaz4ncyB0YWcgcHJvcCBpcyBkZXByZWNhdGVkIGFuZCBoYXMgYmVlbiByZW1vdmVkIGluIFZ1ZSBSb3V0ZXIgNC4gVXNlIHRoZSB2LXNsb3QgQVBJIHRvIHJlbW92ZSB0aGlzIHdhcm5pbmc6IGh0dHBzOi8vbmV4dC5yb3V0ZXIudnVlanMub3JnL2d1aWRlL21pZ3JhdGlvbi8jcmVtb3ZhbC1vZi1ldmVudC1hbmQtdGFnLXByb3BzLWluLXJvdXRlci1saW5rLlwiXG4gICAgICAgICk7XG4gICAgICAgIHdhcm5lZFRhZ1Byb3AgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCdldmVudCcgaW4gdGhpcy4kb3B0aW9ucy5wcm9wc0RhdGEgJiYgIXdhcm5lZEV2ZW50UHJvcCkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFwiPHJvdXRlci1saW5rPidzIGV2ZW50IHByb3AgaXMgZGVwcmVjYXRlZCBhbmQgaGFzIGJlZW4gcmVtb3ZlZCBpbiBWdWUgUm91dGVyIDQuIFVzZSB0aGUgdi1zbG90IEFQSSB0byByZW1vdmUgdGhpcyB3YXJuaW5nOiBodHRwczovL25leHQucm91dGVyLnZ1ZWpzLm9yZy9ndWlkZS9taWdyYXRpb24vI3JlbW92YWwtb2YtZXZlbnQtYW5kLXRhZy1wcm9wcy1pbi1yb3V0ZXItbGluay5cIlxuICAgICAgICApO1xuICAgICAgICB3YXJuZWRFdmVudFByb3AgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnRhZyA9PT0gJ2EnKSB7XG4gICAgICBkYXRhLm9uID0gb247XG4gICAgICBkYXRhLmF0dHJzID0geyBocmVmOiBocmVmLCAnYXJpYS1jdXJyZW50JzogYXJpYUN1cnJlbnRWYWx1ZSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmaW5kIHRoZSBmaXJzdCA8YT4gY2hpbGQgYW5kIGFwcGx5IGxpc3RlbmVyIGFuZCBocmVmXG4gICAgICB2YXIgYSA9IGZpbmRBbmNob3IodGhpcy4kc2xvdHMuZGVmYXVsdCk7XG4gICAgICBpZiAoYSkge1xuICAgICAgICAvLyBpbiBjYXNlIHRoZSA8YT4gaXMgYSBzdGF0aWMgbm9kZVxuICAgICAgICBhLmlzU3RhdGljID0gZmFsc2U7XG4gICAgICAgIHZhciBhRGF0YSA9IChhLmRhdGEgPSBleHRlbmQoe30sIGEuZGF0YSkpO1xuICAgICAgICBhRGF0YS5vbiA9IGFEYXRhLm9uIHx8IHt9O1xuICAgICAgICAvLyB0cmFuc2Zvcm0gZXhpc3RpbmcgZXZlbnRzIGluIGJvdGggb2JqZWN0cyBpbnRvIGFycmF5cyBzbyB3ZSBjYW4gcHVzaCBsYXRlclxuICAgICAgICBmb3IgKHZhciBldmVudCBpbiBhRGF0YS5vbikge1xuICAgICAgICAgIHZhciBoYW5kbGVyJDEgPSBhRGF0YS5vbltldmVudF07XG4gICAgICAgICAgaWYgKGV2ZW50IGluIG9uKSB7XG4gICAgICAgICAgICBhRGF0YS5vbltldmVudF0gPSBBcnJheS5pc0FycmF5KGhhbmRsZXIkMSkgPyBoYW5kbGVyJDEgOiBbaGFuZGxlciQxXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXBwZW5kIG5ldyBsaXN0ZW5lcnMgZm9yIHJvdXRlci1saW5rXG4gICAgICAgIGZvciAodmFyIGV2ZW50JDEgaW4gb24pIHtcbiAgICAgICAgICBpZiAoZXZlbnQkMSBpbiBhRGF0YS5vbikge1xuICAgICAgICAgICAgLy8gb25bZXZlbnRdIGlzIGFsd2F5cyBhIGZ1bmN0aW9uXG4gICAgICAgICAgICBhRGF0YS5vbltldmVudCQxXS5wdXNoKG9uW2V2ZW50JDFdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYURhdGEub25bZXZlbnQkMV0gPSBoYW5kbGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhQXR0cnMgPSAoYS5kYXRhLmF0dHJzID0gZXh0ZW5kKHt9LCBhLmRhdGEuYXR0cnMpKTtcbiAgICAgICAgYUF0dHJzLmhyZWYgPSBocmVmO1xuICAgICAgICBhQXR0cnNbJ2FyaWEtY3VycmVudCddID0gYXJpYUN1cnJlbnRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRvZXNuJ3QgaGF2ZSA8YT4gY2hpbGQsIGFwcGx5IGxpc3RlbmVyIHRvIHNlbGZcbiAgICAgICAgZGF0YS5vbiA9IG9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoKHRoaXMudGFnLCBkYXRhLCB0aGlzLiRzbG90cy5kZWZhdWx0KVxuICB9XG59O1xuXG5mdW5jdGlvbiBndWFyZEV2ZW50IChlKSB7XG4gIC8vIGRvbid0IHJlZGlyZWN0IHdpdGggY29udHJvbCBrZXlzXG4gIGlmIChlLm1ldGFLZXkgfHwgZS5hbHRLZXkgfHwgZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkpIHsgcmV0dXJuIH1cbiAgLy8gZG9uJ3QgcmVkaXJlY3Qgd2hlbiBwcmV2ZW50RGVmYXVsdCBjYWxsZWRcbiAgaWYgKGUuZGVmYXVsdFByZXZlbnRlZCkgeyByZXR1cm4gfVxuICAvLyBkb24ndCByZWRpcmVjdCBvbiByaWdodCBjbGlja1xuICBpZiAoZS5idXR0b24gIT09IHVuZGVmaW5lZCAmJiBlLmJ1dHRvbiAhPT0gMCkgeyByZXR1cm4gfVxuICAvLyBkb24ndCByZWRpcmVjdCBpZiBgdGFyZ2V0PVwiX2JsYW5rXCJgXG4gIGlmIChlLmN1cnJlbnRUYXJnZXQgJiYgZS5jdXJyZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSkge1xuICAgIHZhciB0YXJnZXQgPSBlLmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKTtcbiAgICBpZiAoL1xcYl9ibGFua1xcYi9pLnRlc3QodGFyZ2V0KSkgeyByZXR1cm4gfVxuICB9XG4gIC8vIHRoaXMgbWF5IGJlIGEgV2VleCBldmVudCB3aGljaCBkb2Vzbid0IGhhdmUgdGhpcyBtZXRob2RcbiAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gZmluZEFuY2hvciAoY2hpbGRyZW4pIHtcbiAgaWYgKGNoaWxkcmVuKSB7XG4gICAgdmFyIGNoaWxkO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBpZiAoY2hpbGQudGFnID09PSAnYScpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkXG4gICAgICB9XG4gICAgICBpZiAoY2hpbGQuY2hpbGRyZW4gJiYgKGNoaWxkID0gZmluZEFuY2hvcihjaGlsZC5jaGlsZHJlbikpKSB7XG4gICAgICAgIHJldHVybiBjaGlsZFxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgX1Z1ZTtcblxuZnVuY3Rpb24gaW5zdGFsbCAoVnVlKSB7XG4gIGlmIChpbnN0YWxsLmluc3RhbGxlZCAmJiBfVnVlID09PSBWdWUpIHsgcmV0dXJuIH1cbiAgaW5zdGFsbC5pbnN0YWxsZWQgPSB0cnVlO1xuXG4gIF9WdWUgPSBWdWU7XG5cbiAgdmFyIGlzRGVmID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHYgIT09IHVuZGVmaW5lZDsgfTtcblxuICB2YXIgcmVnaXN0ZXJJbnN0YW5jZSA9IGZ1bmN0aW9uICh2bSwgY2FsbFZhbCkge1xuICAgIHZhciBpID0gdm0uJG9wdGlvbnMuX3BhcmVudFZub2RlO1xuICAgIGlmIChpc0RlZihpKSAmJiBpc0RlZihpID0gaS5kYXRhKSAmJiBpc0RlZihpID0gaS5yZWdpc3RlclJvdXRlSW5zdGFuY2UpKSB7XG4gICAgICBpKHZtLCBjYWxsVmFsKTtcbiAgICB9XG4gIH07XG5cbiAgVnVlLm1peGluKHtcbiAgICBiZWZvcmVDcmVhdGU6IGZ1bmN0aW9uIGJlZm9yZUNyZWF0ZSAoKSB7XG4gICAgICBpZiAoaXNEZWYodGhpcy4kb3B0aW9ucy5yb3V0ZXIpKSB7XG4gICAgICAgIHRoaXMuX3JvdXRlclJvb3QgPSB0aGlzO1xuICAgICAgICB0aGlzLl9yb3V0ZXIgPSB0aGlzLiRvcHRpb25zLnJvdXRlcjtcbiAgICAgICAgdGhpcy5fcm91dGVyLmluaXQodGhpcyk7XG4gICAgICAgIFZ1ZS51dGlsLmRlZmluZVJlYWN0aXZlKHRoaXMsICdfcm91dGUnLCB0aGlzLl9yb3V0ZXIuaGlzdG9yeS5jdXJyZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JvdXRlclJvb3QgPSAodGhpcy4kcGFyZW50ICYmIHRoaXMuJHBhcmVudC5fcm91dGVyUm9vdCkgfHwgdGhpcztcbiAgICAgIH1cbiAgICAgIHJlZ2lzdGVySW5zdGFuY2UodGhpcywgdGhpcyk7XG4gICAgfSxcbiAgICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCAoKSB7XG4gICAgICByZWdpc3Rlckluc3RhbmNlKHRoaXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckcm91dGVyJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0ICgpIHsgcmV0dXJuIHRoaXMuX3JvdXRlclJvb3QuX3JvdXRlciB9XG4gIH0pO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJHJvdXRlJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0ICgpIHsgcmV0dXJuIHRoaXMuX3JvdXRlclJvb3QuX3JvdXRlIH1cbiAgfSk7XG5cbiAgVnVlLmNvbXBvbmVudCgnUm91dGVyVmlldycsIFZpZXcpO1xuICBWdWUuY29tcG9uZW50KCdSb3V0ZXJMaW5rJywgTGluayk7XG5cbiAgdmFyIHN0cmF0cyA9IFZ1ZS5jb25maWcub3B0aW9uTWVyZ2VTdHJhdGVnaWVzO1xuICAvLyB1c2UgdGhlIHNhbWUgaG9vayBtZXJnaW5nIHN0cmF0ZWd5IGZvciByb3V0ZSBob29rc1xuICBzdHJhdHMuYmVmb3JlUm91dGVFbnRlciA9IHN0cmF0cy5iZWZvcmVSb3V0ZUxlYXZlID0gc3RyYXRzLmJlZm9yZVJvdXRlVXBkYXRlID0gc3RyYXRzLmNyZWF0ZWQ7XG59XG5cbi8qICAqL1xuXG52YXIgaW5Ccm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBjcmVhdGVSb3V0ZU1hcCAoXG4gIHJvdXRlcyxcbiAgb2xkUGF0aExpc3QsXG4gIG9sZFBhdGhNYXAsXG4gIG9sZE5hbWVNYXAsXG4gIHBhcmVudFJvdXRlXG4pIHtcbiAgLy8gdGhlIHBhdGggbGlzdCBpcyB1c2VkIHRvIGNvbnRyb2wgcGF0aCBtYXRjaGluZyBwcmlvcml0eVxuICB2YXIgcGF0aExpc3QgPSBvbGRQYXRoTGlzdCB8fCBbXTtcbiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gIHZhciBwYXRoTWFwID0gb2xkUGF0aE1hcCB8fCBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgdmFyIG5hbWVNYXAgPSBvbGROYW1lTWFwIHx8IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgcm91dGVzLmZvckVhY2goZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgYWRkUm91dGVSZWNvcmQocGF0aExpc3QsIHBhdGhNYXAsIG5hbWVNYXAsIHJvdXRlLCBwYXJlbnRSb3V0ZSk7XG4gIH0pO1xuXG4gIC8vIGVuc3VyZSB3aWxkY2FyZCByb3V0ZXMgYXJlIGFsd2F5cyBhdCB0aGUgZW5kXG4gIGZvciAodmFyIGkgPSAwLCBsID0gcGF0aExpc3QubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKHBhdGhMaXN0W2ldID09PSAnKicpIHtcbiAgICAgIHBhdGhMaXN0LnB1c2gocGF0aExpc3Quc3BsaWNlKGksIDEpWzBdKTtcbiAgICAgIGwtLTtcbiAgICAgIGktLTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAvLyB3YXJuIGlmIHJvdXRlcyBkbyBub3QgaW5jbHVkZSBsZWFkaW5nIHNsYXNoZXNcbiAgICB2YXIgZm91bmQgPSBwYXRoTGlzdFxuICAgIC8vIGNoZWNrIGZvciBtaXNzaW5nIGxlYWRpbmcgc2xhc2hcbiAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHBhdGgpIHsgcmV0dXJuIHBhdGggJiYgcGF0aC5jaGFyQXQoMCkgIT09ICcqJyAmJiBwYXRoLmNoYXJBdCgwKSAhPT0gJy8nOyB9KTtcblxuICAgIGlmIChmb3VuZC5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgcGF0aE5hbWVzID0gZm91bmQubWFwKGZ1bmN0aW9uIChwYXRoKSB7IHJldHVybiAoXCItIFwiICsgcGF0aCk7IH0pLmpvaW4oJ1xcbicpO1xuICAgICAgd2FybihmYWxzZSwgKFwiTm9uLW5lc3RlZCByb3V0ZXMgbXVzdCBpbmNsdWRlIGEgbGVhZGluZyBzbGFzaCBjaGFyYWN0ZXIuIEZpeCB0aGUgZm9sbG93aW5nIHJvdXRlczogXFxuXCIgKyBwYXRoTmFtZXMpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhdGhMaXN0OiBwYXRoTGlzdCxcbiAgICBwYXRoTWFwOiBwYXRoTWFwLFxuICAgIG5hbWVNYXA6IG5hbWVNYXBcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRSb3V0ZVJlY29yZCAoXG4gIHBhdGhMaXN0LFxuICBwYXRoTWFwLFxuICBuYW1lTWFwLFxuICByb3V0ZSxcbiAgcGFyZW50LFxuICBtYXRjaEFzXG4pIHtcbiAgdmFyIHBhdGggPSByb3V0ZS5wYXRoO1xuICB2YXIgbmFtZSA9IHJvdXRlLm5hbWU7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgYXNzZXJ0KHBhdGggIT0gbnVsbCwgXCJcXFwicGF0aFxcXCIgaXMgcmVxdWlyZWQgaW4gYSByb3V0ZSBjb25maWd1cmF0aW9uLlwiKTtcbiAgICBhc3NlcnQoXG4gICAgICB0eXBlb2Ygcm91dGUuY29tcG9uZW50ICE9PSAnc3RyaW5nJyxcbiAgICAgIFwicm91dGUgY29uZmlnIFxcXCJjb21wb25lbnRcXFwiIGZvciBwYXRoOiBcIiArIChTdHJpbmcoXG4gICAgICAgIHBhdGggfHwgbmFtZVxuICAgICAgKSkgKyBcIiBjYW5ub3QgYmUgYSBcIiArIFwic3RyaW5nIGlkLiBVc2UgYW4gYWN0dWFsIGNvbXBvbmVudCBpbnN0ZWFkLlwiXG4gICAgKTtcblxuICAgIHdhcm4oXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuICAgICAgIS9bXlxcdTAwMDAtXFx1MDA3Rl0rLy50ZXN0KHBhdGgpLFxuICAgICAgXCJSb3V0ZSB3aXRoIHBhdGggXFxcIlwiICsgcGF0aCArIFwiXFxcIiBjb250YWlucyB1bmVuY29kZWQgY2hhcmFjdGVycywgbWFrZSBzdXJlIFwiICtcbiAgICAgICAgXCJ5b3VyIHBhdGggaXMgY29ycmVjdGx5IGVuY29kZWQgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIHJvdXRlci4gVXNlIFwiICtcbiAgICAgICAgXCJlbmNvZGVVUkkgdG8gZW5jb2RlIHN0YXRpYyBzZWdtZW50cyBvZiB5b3VyIHBhdGguXCJcbiAgICApO1xuICB9XG5cbiAgdmFyIHBhdGhUb1JlZ2V4cE9wdGlvbnMgPVxuICAgIHJvdXRlLnBhdGhUb1JlZ2V4cE9wdGlvbnMgfHwge307XG4gIHZhciBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZVBhdGgocGF0aCwgcGFyZW50LCBwYXRoVG9SZWdleHBPcHRpb25zLnN0cmljdCk7XG5cbiAgaWYgKHR5cGVvZiByb3V0ZS5jYXNlU2Vuc2l0aXZlID09PSAnYm9vbGVhbicpIHtcbiAgICBwYXRoVG9SZWdleHBPcHRpb25zLnNlbnNpdGl2ZSA9IHJvdXRlLmNhc2VTZW5zaXRpdmU7XG4gIH1cblxuICB2YXIgcmVjb3JkID0ge1xuICAgIHBhdGg6IG5vcm1hbGl6ZWRQYXRoLFxuICAgIHJlZ2V4OiBjb21waWxlUm91dGVSZWdleChub3JtYWxpemVkUGF0aCwgcGF0aFRvUmVnZXhwT3B0aW9ucyksXG4gICAgY29tcG9uZW50czogcm91dGUuY29tcG9uZW50cyB8fCB7IGRlZmF1bHQ6IHJvdXRlLmNvbXBvbmVudCB9LFxuICAgIGFsaWFzOiByb3V0ZS5hbGlhc1xuICAgICAgPyB0eXBlb2Ygcm91dGUuYWxpYXMgPT09ICdzdHJpbmcnXG4gICAgICAgID8gW3JvdXRlLmFsaWFzXVxuICAgICAgICA6IHJvdXRlLmFsaWFzXG4gICAgICA6IFtdLFxuICAgIGluc3RhbmNlczoge30sXG4gICAgZW50ZXJlZENiczoge30sXG4gICAgbmFtZTogbmFtZSxcbiAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICBtYXRjaEFzOiBtYXRjaEFzLFxuICAgIHJlZGlyZWN0OiByb3V0ZS5yZWRpcmVjdCxcbiAgICBiZWZvcmVFbnRlcjogcm91dGUuYmVmb3JlRW50ZXIsXG4gICAgbWV0YTogcm91dGUubWV0YSB8fCB7fSxcbiAgICBwcm9wczpcbiAgICAgIHJvdXRlLnByb3BzID09IG51bGxcbiAgICAgICAgPyB7fVxuICAgICAgICA6IHJvdXRlLmNvbXBvbmVudHNcbiAgICAgICAgICA/IHJvdXRlLnByb3BzXG4gICAgICAgICAgOiB7IGRlZmF1bHQ6IHJvdXRlLnByb3BzIH1cbiAgfTtcblxuICBpZiAocm91dGUuY2hpbGRyZW4pIHtcbiAgICAvLyBXYXJuIGlmIHJvdXRlIGlzIG5hbWVkLCBkb2VzIG5vdCByZWRpcmVjdCBhbmQgaGFzIGEgZGVmYXVsdCBjaGlsZCByb3V0ZS5cbiAgICAvLyBJZiB1c2VycyBuYXZpZ2F0ZSB0byB0aGlzIHJvdXRlIGJ5IG5hbWUsIHRoZSBkZWZhdWx0IGNoaWxkIHdpbGxcbiAgICAvLyBub3QgYmUgcmVuZGVyZWQgKEdIIElzc3VlICM2MjkpXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcm91dGUubmFtZSAmJlxuICAgICAgICAhcm91dGUucmVkaXJlY3QgJiZcbiAgICAgICAgcm91dGUuY2hpbGRyZW4uc29tZShmdW5jdGlvbiAoY2hpbGQpIHsgcmV0dXJuIC9eXFwvPyQvLnRlc3QoY2hpbGQucGF0aCk7IH0pXG4gICAgICApIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBcIk5hbWVkIFJvdXRlICdcIiArIChyb3V0ZS5uYW1lKSArIFwiJyBoYXMgYSBkZWZhdWx0IGNoaWxkIHJvdXRlLiBcIiArXG4gICAgICAgICAgICBcIldoZW4gbmF2aWdhdGluZyB0byB0aGlzIG5hbWVkIHJvdXRlICg6dG89XFxcIntuYW1lOiAnXCIgKyAocm91dGUubmFtZSkgKyBcIidcXFwiKSwgXCIgK1xuICAgICAgICAgICAgXCJ0aGUgZGVmYXVsdCBjaGlsZCByb3V0ZSB3aWxsIG5vdCBiZSByZW5kZXJlZC4gUmVtb3ZlIHRoZSBuYW1lIGZyb20gXCIgK1xuICAgICAgICAgICAgXCJ0aGlzIHJvdXRlIGFuZCB1c2UgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgY2hpbGQgcm91dGUgZm9yIG5hbWVkIFwiICtcbiAgICAgICAgICAgIFwibGlua3MgaW5zdGVhZC5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByb3V0ZS5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgdmFyIGNoaWxkTWF0Y2hBcyA9IG1hdGNoQXNcbiAgICAgICAgPyBjbGVhblBhdGgoKG1hdGNoQXMgKyBcIi9cIiArIChjaGlsZC5wYXRoKSkpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgYWRkUm91dGVSZWNvcmQocGF0aExpc3QsIHBhdGhNYXAsIG5hbWVNYXAsIGNoaWxkLCByZWNvcmQsIGNoaWxkTWF0Y2hBcyk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoIXBhdGhNYXBbcmVjb3JkLnBhdGhdKSB7XG4gICAgcGF0aExpc3QucHVzaChyZWNvcmQucGF0aCk7XG4gICAgcGF0aE1hcFtyZWNvcmQucGF0aF0gPSByZWNvcmQ7XG4gIH1cblxuICBpZiAocm91dGUuYWxpYXMgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBhbGlhc2VzID0gQXJyYXkuaXNBcnJheShyb3V0ZS5hbGlhcykgPyByb3V0ZS5hbGlhcyA6IFtyb3V0ZS5hbGlhc107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGlhc2VzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgYWxpYXMgPSBhbGlhc2VzW2ldO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgYWxpYXMgPT09IHBhdGgpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAoXCJGb3VuZCBhbiBhbGlhcyB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBwYXRoOiBcXFwiXCIgKyBwYXRoICsgXCJcXFwiLiBZb3UgaGF2ZSB0byByZW1vdmUgdGhhdCBhbGlhcy4gSXQgd2lsbCBiZSBpZ25vcmVkIGluIGRldmVsb3BtZW50LlwiKVxuICAgICAgICApO1xuICAgICAgICAvLyBza2lwIGluIGRldiB0byBtYWtlIGl0IHdvcmtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdmFyIGFsaWFzUm91dGUgPSB7XG4gICAgICAgIHBhdGg6IGFsaWFzLFxuICAgICAgICBjaGlsZHJlbjogcm91dGUuY2hpbGRyZW5cbiAgICAgIH07XG4gICAgICBhZGRSb3V0ZVJlY29yZChcbiAgICAgICAgcGF0aExpc3QsXG4gICAgICAgIHBhdGhNYXAsXG4gICAgICAgIG5hbWVNYXAsXG4gICAgICAgIGFsaWFzUm91dGUsXG4gICAgICAgIHBhcmVudCxcbiAgICAgICAgcmVjb3JkLnBhdGggfHwgJy8nIC8vIG1hdGNoQXNcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG5hbWUpIHtcbiAgICBpZiAoIW5hbWVNYXBbbmFtZV0pIHtcbiAgICAgIG5hbWVNYXBbbmFtZV0gPSByZWNvcmQ7XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFtYXRjaEFzKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgXCJEdXBsaWNhdGUgbmFtZWQgcm91dGVzIGRlZmluaXRpb246IFwiICtcbiAgICAgICAgICBcInsgbmFtZTogXFxcIlwiICsgbmFtZSArIFwiXFxcIiwgcGF0aDogXFxcIlwiICsgKHJlY29yZC5wYXRoKSArIFwiXFxcIiB9XCJcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVSb3V0ZVJlZ2V4IChcbiAgcGF0aCxcbiAgcGF0aFRvUmVnZXhwT3B0aW9uc1xuKSB7XG4gIHZhciByZWdleCA9IHBhdGhUb1JlZ2V4cF8xKHBhdGgsIFtdLCBwYXRoVG9SZWdleHBPcHRpb25zKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgcmVnZXgua2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICFrZXlzW2tleS5uYW1lXSxcbiAgICAgICAgKFwiRHVwbGljYXRlIHBhcmFtIGtleXMgaW4gcm91dGUgd2l0aCBwYXRoOiBcXFwiXCIgKyBwYXRoICsgXCJcXFwiXCIpXG4gICAgICApO1xuICAgICAga2V5c1trZXkubmFtZV0gPSB0cnVlO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiByZWdleFxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoIChcbiAgcGF0aCxcbiAgcGFyZW50LFxuICBzdHJpY3Rcbikge1xuICBpZiAoIXN0cmljdCkgeyBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC8kLywgJycpOyB9XG4gIGlmIChwYXRoWzBdID09PSAnLycpIHsgcmV0dXJuIHBhdGggfVxuICBpZiAocGFyZW50ID09IG51bGwpIHsgcmV0dXJuIHBhdGggfVxuICByZXR1cm4gY2xlYW5QYXRoKCgocGFyZW50LnBhdGgpICsgXCIvXCIgKyBwYXRoKSlcbn1cblxuLyogICovXG5cblxuXG5mdW5jdGlvbiBjcmVhdGVNYXRjaGVyIChcbiAgcm91dGVzLFxuICByb3V0ZXJcbikge1xuICB2YXIgcmVmID0gY3JlYXRlUm91dGVNYXAocm91dGVzKTtcbiAgdmFyIHBhdGhMaXN0ID0gcmVmLnBhdGhMaXN0O1xuICB2YXIgcGF0aE1hcCA9IHJlZi5wYXRoTWFwO1xuICB2YXIgbmFtZU1hcCA9IHJlZi5uYW1lTWFwO1xuXG4gIGZ1bmN0aW9uIGFkZFJvdXRlcyAocm91dGVzKSB7XG4gICAgY3JlYXRlUm91dGVNYXAocm91dGVzLCBwYXRoTGlzdCwgcGF0aE1hcCwgbmFtZU1hcCk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRSb3V0ZSAocGFyZW50T3JSb3V0ZSwgcm91dGUpIHtcbiAgICB2YXIgcGFyZW50ID0gKHR5cGVvZiBwYXJlbnRPclJvdXRlICE9PSAnb2JqZWN0JykgPyBuYW1lTWFwW3BhcmVudE9yUm91dGVdIDogdW5kZWZpbmVkO1xuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIGNyZWF0ZVJvdXRlTWFwKFtyb3V0ZSB8fCBwYXJlbnRPclJvdXRlXSwgcGF0aExpc3QsIHBhdGhNYXAsIG5hbWVNYXAsIHBhcmVudCk7XG5cbiAgICAvLyBhZGQgYWxpYXNlcyBvZiBwYXJlbnRcbiAgICBpZiAocGFyZW50ICYmIHBhcmVudC5hbGlhcy5sZW5ndGgpIHtcbiAgICAgIGNyZWF0ZVJvdXRlTWFwKFxuICAgICAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmUgcm91dGUgaXMgZGVmaW5lZCBpZiBwYXJlbnQgaXNcbiAgICAgICAgcGFyZW50LmFsaWFzLm1hcChmdW5jdGlvbiAoYWxpYXMpIHsgcmV0dXJuICh7IHBhdGg6IGFsaWFzLCBjaGlsZHJlbjogW3JvdXRlXSB9KTsgfSksXG4gICAgICAgIHBhdGhMaXN0LFxuICAgICAgICBwYXRoTWFwLFxuICAgICAgICBuYW1lTWFwLFxuICAgICAgICBwYXJlbnRcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Um91dGVzICgpIHtcbiAgICByZXR1cm4gcGF0aExpc3QubWFwKGZ1bmN0aW9uIChwYXRoKSB7IHJldHVybiBwYXRoTWFwW3BhdGhdOyB9KVxuICB9XG5cbiAgZnVuY3Rpb24gbWF0Y2ggKFxuICAgIHJhdyxcbiAgICBjdXJyZW50Um91dGUsXG4gICAgcmVkaXJlY3RlZEZyb21cbiAgKSB7XG4gICAgdmFyIGxvY2F0aW9uID0gbm9ybWFsaXplTG9jYXRpb24ocmF3LCBjdXJyZW50Um91dGUsIGZhbHNlLCByb3V0ZXIpO1xuICAgIHZhciBuYW1lID0gbG9jYXRpb24ubmFtZTtcblxuICAgIGlmIChuYW1lKSB7XG4gICAgICB2YXIgcmVjb3JkID0gbmFtZU1hcFtuYW1lXTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHdhcm4ocmVjb3JkLCAoXCJSb3V0ZSB3aXRoIG5hbWUgJ1wiICsgbmFtZSArIFwiJyBkb2VzIG5vdCBleGlzdFwiKSk7XG4gICAgICB9XG4gICAgICBpZiAoIXJlY29yZCkgeyByZXR1cm4gX2NyZWF0ZVJvdXRlKG51bGwsIGxvY2F0aW9uKSB9XG4gICAgICB2YXIgcGFyYW1OYW1lcyA9IHJlY29yZC5yZWdleC5rZXlzXG4gICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gIWtleS5vcHRpb25hbDsgfSlcbiAgICAgICAgLm1hcChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiBrZXkubmFtZTsgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgbG9jYXRpb24ucGFyYW1zICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBsb2NhdGlvbi5wYXJhbXMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRSb3V0ZSAmJiB0eXBlb2YgY3VycmVudFJvdXRlLnBhcmFtcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGN1cnJlbnRSb3V0ZS5wYXJhbXMpIHtcbiAgICAgICAgICBpZiAoIShrZXkgaW4gbG9jYXRpb24ucGFyYW1zKSAmJiBwYXJhbU5hbWVzLmluZGV4T2Yoa2V5KSA+IC0xKSB7XG4gICAgICAgICAgICBsb2NhdGlvbi5wYXJhbXNba2V5XSA9IGN1cnJlbnRSb3V0ZS5wYXJhbXNba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9jYXRpb24ucGF0aCA9IGZpbGxQYXJhbXMocmVjb3JkLnBhdGgsIGxvY2F0aW9uLnBhcmFtcywgKFwibmFtZWQgcm91dGUgXFxcIlwiICsgbmFtZSArIFwiXFxcIlwiKSk7XG4gICAgICByZXR1cm4gX2NyZWF0ZVJvdXRlKHJlY29yZCwgbG9jYXRpb24sIHJlZGlyZWN0ZWRGcm9tKVxuICAgIH0gZWxzZSBpZiAobG9jYXRpb24ucGF0aCkge1xuICAgICAgbG9jYXRpb24ucGFyYW1zID0ge307XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXRoID0gcGF0aExpc3RbaV07XG4gICAgICAgIHZhciByZWNvcmQkMSA9IHBhdGhNYXBbcGF0aF07XG4gICAgICAgIGlmIChtYXRjaFJvdXRlKHJlY29yZCQxLnJlZ2V4LCBsb2NhdGlvbi5wYXRoLCBsb2NhdGlvbi5wYXJhbXMpKSB7XG4gICAgICAgICAgcmV0dXJuIF9jcmVhdGVSb3V0ZShyZWNvcmQkMSwgbG9jYXRpb24sIHJlZGlyZWN0ZWRGcm9tKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG5vIG1hdGNoXG4gICAgcmV0dXJuIF9jcmVhdGVSb3V0ZShudWxsLCBsb2NhdGlvbilcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZGlyZWN0IChcbiAgICByZWNvcmQsXG4gICAgbG9jYXRpb25cbiAgKSB7XG4gICAgdmFyIG9yaWdpbmFsUmVkaXJlY3QgPSByZWNvcmQucmVkaXJlY3Q7XG4gICAgdmFyIHJlZGlyZWN0ID0gdHlwZW9mIG9yaWdpbmFsUmVkaXJlY3QgPT09ICdmdW5jdGlvbidcbiAgICAgID8gb3JpZ2luYWxSZWRpcmVjdChjcmVhdGVSb3V0ZShyZWNvcmQsIGxvY2F0aW9uLCBudWxsLCByb3V0ZXIpKVxuICAgICAgOiBvcmlnaW5hbFJlZGlyZWN0O1xuXG4gICAgaWYgKHR5cGVvZiByZWRpcmVjdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJlZGlyZWN0ID0geyBwYXRoOiByZWRpcmVjdCB9O1xuICAgIH1cblxuICAgIGlmICghcmVkaXJlY3QgfHwgdHlwZW9mIHJlZGlyZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBmYWxzZSwgKFwiaW52YWxpZCByZWRpcmVjdCBvcHRpb246IFwiICsgKEpTT04uc3RyaW5naWZ5KHJlZGlyZWN0KSkpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX2NyZWF0ZVJvdXRlKG51bGwsIGxvY2F0aW9uKVxuICAgIH1cblxuICAgIHZhciByZSA9IHJlZGlyZWN0O1xuICAgIHZhciBuYW1lID0gcmUubmFtZTtcbiAgICB2YXIgcGF0aCA9IHJlLnBhdGg7XG4gICAgdmFyIHF1ZXJ5ID0gbG9jYXRpb24ucXVlcnk7XG4gICAgdmFyIGhhc2ggPSBsb2NhdGlvbi5oYXNoO1xuICAgIHZhciBwYXJhbXMgPSBsb2NhdGlvbi5wYXJhbXM7XG4gICAgcXVlcnkgPSByZS5oYXNPd25Qcm9wZXJ0eSgncXVlcnknKSA/IHJlLnF1ZXJ5IDogcXVlcnk7XG4gICAgaGFzaCA9IHJlLmhhc093blByb3BlcnR5KCdoYXNoJykgPyByZS5oYXNoIDogaGFzaDtcbiAgICBwYXJhbXMgPSByZS5oYXNPd25Qcm9wZXJ0eSgncGFyYW1zJykgPyByZS5wYXJhbXMgOiBwYXJhbXM7XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgLy8gcmVzb2x2ZWQgbmFtZWQgZGlyZWN0XG4gICAgICB2YXIgdGFyZ2V0UmVjb3JkID0gbmFtZU1hcFtuYW1lXTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGFzc2VydCh0YXJnZXRSZWNvcmQsIChcInJlZGlyZWN0IGZhaWxlZDogbmFtZWQgcm91dGUgXFxcIlwiICsgbmFtZSArIFwiXFxcIiBub3QgZm91bmQuXCIpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRjaCh7XG4gICAgICAgIF9ub3JtYWxpemVkOiB0cnVlLFxuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICBxdWVyeTogcXVlcnksXG4gICAgICAgIGhhc2g6IGhhc2gsXG4gICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgICB9LCB1bmRlZmluZWQsIGxvY2F0aW9uKVxuICAgIH0gZWxzZSBpZiAocGF0aCkge1xuICAgICAgLy8gMS4gcmVzb2x2ZSByZWxhdGl2ZSByZWRpcmVjdFxuICAgICAgdmFyIHJhd1BhdGggPSByZXNvbHZlUmVjb3JkUGF0aChwYXRoLCByZWNvcmQpO1xuICAgICAgLy8gMi4gcmVzb2x2ZSBwYXJhbXNcbiAgICAgIHZhciByZXNvbHZlZFBhdGggPSBmaWxsUGFyYW1zKHJhd1BhdGgsIHBhcmFtcywgKFwicmVkaXJlY3Qgcm91dGUgd2l0aCBwYXRoIFxcXCJcIiArIHJhd1BhdGggKyBcIlxcXCJcIikpO1xuICAgICAgLy8gMy4gcmVtYXRjaCB3aXRoIGV4aXN0aW5nIHF1ZXJ5IGFuZCBoYXNoXG4gICAgICByZXR1cm4gbWF0Y2goe1xuICAgICAgICBfbm9ybWFsaXplZDogdHJ1ZSxcbiAgICAgICAgcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICBxdWVyeTogcXVlcnksXG4gICAgICAgIGhhc2g6IGhhc2hcbiAgICAgIH0sIHVuZGVmaW5lZCwgbG9jYXRpb24pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHdhcm4oZmFsc2UsIChcImludmFsaWQgcmVkaXJlY3Qgb3B0aW9uOiBcIiArIChKU09OLnN0cmluZ2lmeShyZWRpcmVjdCkpKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gX2NyZWF0ZVJvdXRlKG51bGwsIGxvY2F0aW9uKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFsaWFzIChcbiAgICByZWNvcmQsXG4gICAgbG9jYXRpb24sXG4gICAgbWF0Y2hBc1xuICApIHtcbiAgICB2YXIgYWxpYXNlZFBhdGggPSBmaWxsUGFyYW1zKG1hdGNoQXMsIGxvY2F0aW9uLnBhcmFtcywgKFwiYWxpYXNlZCByb3V0ZSB3aXRoIHBhdGggXFxcIlwiICsgbWF0Y2hBcyArIFwiXFxcIlwiKSk7XG4gICAgdmFyIGFsaWFzZWRNYXRjaCA9IG1hdGNoKHtcbiAgICAgIF9ub3JtYWxpemVkOiB0cnVlLFxuICAgICAgcGF0aDogYWxpYXNlZFBhdGhcbiAgICB9KTtcbiAgICBpZiAoYWxpYXNlZE1hdGNoKSB7XG4gICAgICB2YXIgbWF0Y2hlZCA9IGFsaWFzZWRNYXRjaC5tYXRjaGVkO1xuICAgICAgdmFyIGFsaWFzZWRSZWNvcmQgPSBtYXRjaGVkW21hdGNoZWQubGVuZ3RoIC0gMV07XG4gICAgICBsb2NhdGlvbi5wYXJhbXMgPSBhbGlhc2VkTWF0Y2gucGFyYW1zO1xuICAgICAgcmV0dXJuIF9jcmVhdGVSb3V0ZShhbGlhc2VkUmVjb3JkLCBsb2NhdGlvbilcbiAgICB9XG4gICAgcmV0dXJuIF9jcmVhdGVSb3V0ZShudWxsLCBsb2NhdGlvbilcbiAgfVxuXG4gIGZ1bmN0aW9uIF9jcmVhdGVSb3V0ZSAoXG4gICAgcmVjb3JkLFxuICAgIGxvY2F0aW9uLFxuICAgIHJlZGlyZWN0ZWRGcm9tXG4gICkge1xuICAgIGlmIChyZWNvcmQgJiYgcmVjb3JkLnJlZGlyZWN0KSB7XG4gICAgICByZXR1cm4gcmVkaXJlY3QocmVjb3JkLCByZWRpcmVjdGVkRnJvbSB8fCBsb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKHJlY29yZCAmJiByZWNvcmQubWF0Y2hBcykge1xuICAgICAgcmV0dXJuIGFsaWFzKHJlY29yZCwgbG9jYXRpb24sIHJlY29yZC5tYXRjaEFzKVxuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlUm91dGUocmVjb3JkLCBsb2NhdGlvbiwgcmVkaXJlY3RlZEZyb20sIHJvdXRlcilcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWF0Y2g6IG1hdGNoLFxuICAgIGFkZFJvdXRlOiBhZGRSb3V0ZSxcbiAgICBnZXRSb3V0ZXM6IGdldFJvdXRlcyxcbiAgICBhZGRSb3V0ZXM6IGFkZFJvdXRlc1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hdGNoUm91dGUgKFxuICByZWdleCxcbiAgcGF0aCxcbiAgcGFyYW1zXG4pIHtcbiAgdmFyIG0gPSBwYXRoLm1hdGNoKHJlZ2V4KTtcblxuICBpZiAoIW0pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfSBlbHNlIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAxLCBsZW4gPSBtLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIGtleSA9IHJlZ2V4LmtleXNbaSAtIDFdO1xuICAgIGlmIChrZXkpIHtcbiAgICAgIC8vIEZpeCAjMTk5NDogdXNpbmcgKiB3aXRoIHByb3BzOiB0cnVlIGdlbmVyYXRlcyBhIHBhcmFtIG5hbWVkIDBcbiAgICAgIHBhcmFtc1trZXkubmFtZSB8fCAncGF0aE1hdGNoJ10gPSB0eXBlb2YgbVtpXSA9PT0gJ3N0cmluZycgPyBkZWNvZGUobVtpXSkgOiBtW2ldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVSZWNvcmRQYXRoIChwYXRoLCByZWNvcmQpIHtcbiAgcmV0dXJuIHJlc29sdmVQYXRoKHBhdGgsIHJlY29yZC5wYXJlbnQgPyByZWNvcmQucGFyZW50LnBhdGggOiAnLycsIHRydWUpXG59XG5cbi8qICAqL1xuXG4vLyB1c2UgVXNlciBUaW1pbmcgYXBpIChpZiBwcmVzZW50KSBmb3IgbW9yZSBhY2N1cmF0ZSBrZXkgcHJlY2lzaW9uXG52YXIgVGltZSA9XG4gIGluQnJvd3NlciAmJiB3aW5kb3cucGVyZm9ybWFuY2UgJiYgd2luZG93LnBlcmZvcm1hbmNlLm5vd1xuICAgID8gd2luZG93LnBlcmZvcm1hbmNlXG4gICAgOiBEYXRlO1xuXG5mdW5jdGlvbiBnZW5TdGF0ZUtleSAoKSB7XG4gIHJldHVybiBUaW1lLm5vdygpLnRvRml4ZWQoMylcbn1cblxudmFyIF9rZXkgPSBnZW5TdGF0ZUtleSgpO1xuXG5mdW5jdGlvbiBnZXRTdGF0ZUtleSAoKSB7XG4gIHJldHVybiBfa2V5XG59XG5cbmZ1bmN0aW9uIHNldFN0YXRlS2V5IChrZXkpIHtcbiAgcmV0dXJuIChfa2V5ID0ga2V5KVxufVxuXG4vKiAgKi9cblxudmFyIHBvc2l0aW9uU3RvcmUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5mdW5jdGlvbiBzZXR1cFNjcm9sbCAoKSB7XG4gIC8vIFByZXZlbnQgYnJvd3NlciBzY3JvbGwgYmVoYXZpb3Igb24gSGlzdG9yeSBwb3BzdGF0ZVxuICBpZiAoJ3Njcm9sbFJlc3RvcmF0aW9uJyBpbiB3aW5kb3cuaGlzdG9yeSkge1xuICAgIHdpbmRvdy5oaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gJ21hbnVhbCc7XG4gIH1cbiAgLy8gRml4IGZvciAjMTU4NSBmb3IgRmlyZWZveFxuICAvLyBGaXggZm9yICMyMTk1IEFkZCBvcHRpb25hbCB0aGlyZCBhdHRyaWJ1dGUgdG8gd29ya2Fyb3VuZCBhIGJ1ZyBpbiBzYWZhcmkgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE4MjY3OFxuICAvLyBGaXggZm9yICMyNzc0IFN1cHBvcnQgZm9yIGFwcHMgbG9hZGVkIGZyb20gV2luZG93cyBmaWxlIHNoYXJlcyBub3QgbWFwcGVkIHRvIG5ldHdvcmsgZHJpdmVzOiByZXBsYWNlZCBsb2NhdGlvbi5vcmlnaW4gd2l0aFxuICAvLyB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgd2luZG93LmxvY2F0aW9uLmhvc3RcbiAgLy8gbG9jYXRpb24uaG9zdCBjb250YWlucyB0aGUgcG9ydCBhbmQgbG9jYXRpb24uaG9zdG5hbWUgZG9lc24ndFxuICB2YXIgcHJvdG9jb2xBbmRQYXRoID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xuICB2YXIgYWJzb2x1dGVQYXRoID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZShwcm90b2NvbEFuZFBhdGgsICcnKTtcbiAgLy8gcHJlc2VydmUgZXhpc3RpbmcgaGlzdG9yeSBzdGF0ZSBhcyBpdCBjb3VsZCBiZSBvdmVycmlkZW4gYnkgdGhlIHVzZXJcbiAgdmFyIHN0YXRlQ29weSA9IGV4dGVuZCh7fSwgd2luZG93Lmhpc3Rvcnkuc3RhdGUpO1xuICBzdGF0ZUNvcHkua2V5ID0gZ2V0U3RhdGVLZXkoKTtcbiAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHN0YXRlQ29weSwgJycsIGFic29sdXRlUGF0aCk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIGhhbmRsZVBvcFN0YXRlKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBoYW5kbGVQb3BTdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlU2Nyb2xsIChcbiAgcm91dGVyLFxuICB0byxcbiAgZnJvbSxcbiAgaXNQb3Bcbikge1xuICBpZiAoIXJvdXRlci5hcHApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBiZWhhdmlvciA9IHJvdXRlci5vcHRpb25zLnNjcm9sbEJlaGF2aW9yO1xuICBpZiAoIWJlaGF2aW9yKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydCh0eXBlb2YgYmVoYXZpb3IgPT09ICdmdW5jdGlvbicsIFwic2Nyb2xsQmVoYXZpb3IgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgLy8gd2FpdCB1bnRpbCByZS1yZW5kZXIgZmluaXNoZXMgYmVmb3JlIHNjcm9sbGluZ1xuICByb3V0ZXIuYXBwLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gZ2V0U2Nyb2xsUG9zaXRpb24oKTtcbiAgICB2YXIgc2hvdWxkU2Nyb2xsID0gYmVoYXZpb3IuY2FsbChcbiAgICAgIHJvdXRlcixcbiAgICAgIHRvLFxuICAgICAgZnJvbSxcbiAgICAgIGlzUG9wID8gcG9zaXRpb24gOiBudWxsXG4gICAgKTtcblxuICAgIGlmICghc2hvdWxkU2Nyb2xsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNob3VsZFNjcm9sbC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzaG91bGRTY3JvbGxcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHNob3VsZFNjcm9sbCkge1xuICAgICAgICAgIHNjcm9sbFRvUG9zaXRpb24oKHNob3VsZFNjcm9sbCksIHBvc2l0aW9uKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgYXNzZXJ0KGZhbHNlLCBlcnIudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2Nyb2xsVG9Qb3NpdGlvbihzaG91bGRTY3JvbGwsIHBvc2l0aW9uKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzYXZlU2Nyb2xsUG9zaXRpb24gKCkge1xuICB2YXIga2V5ID0gZ2V0U3RhdGVLZXkoKTtcbiAgaWYgKGtleSkge1xuICAgIHBvc2l0aW9uU3RvcmVba2V5XSA9IHtcbiAgICAgIHg6IHdpbmRvdy5wYWdlWE9mZnNldCxcbiAgICAgIHk6IHdpbmRvdy5wYWdlWU9mZnNldFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlUG9wU3RhdGUgKGUpIHtcbiAgc2F2ZVNjcm9sbFBvc2l0aW9uKCk7XG4gIGlmIChlLnN0YXRlICYmIGUuc3RhdGUua2V5KSB7XG4gICAgc2V0U3RhdGVLZXkoZS5zdGF0ZS5rZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFNjcm9sbFBvc2l0aW9uICgpIHtcbiAgdmFyIGtleSA9IGdldFN0YXRlS2V5KCk7XG4gIGlmIChrZXkpIHtcbiAgICByZXR1cm4gcG9zaXRpb25TdG9yZVtrZXldXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RWxlbWVudFBvc2l0aW9uIChlbCwgb2Zmc2V0KSB7XG4gIHZhciBkb2NFbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgdmFyIGRvY1JlY3QgPSBkb2NFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIGVsUmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4ge1xuICAgIHg6IGVsUmVjdC5sZWZ0IC0gZG9jUmVjdC5sZWZ0IC0gb2Zmc2V0LngsXG4gICAgeTogZWxSZWN0LnRvcCAtIGRvY1JlY3QudG9wIC0gb2Zmc2V0LnlcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbGlkUG9zaXRpb24gKG9iaikge1xuICByZXR1cm4gaXNOdW1iZXIob2JqLngpIHx8IGlzTnVtYmVyKG9iai55KVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQb3NpdGlvbiAob2JqKSB7XG4gIHJldHVybiB7XG4gICAgeDogaXNOdW1iZXIob2JqLngpID8gb2JqLnggOiB3aW5kb3cucGFnZVhPZmZzZXQsXG4gICAgeTogaXNOdW1iZXIob2JqLnkpID8gb2JqLnkgOiB3aW5kb3cucGFnZVlPZmZzZXRcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPZmZzZXQgKG9iaikge1xuICByZXR1cm4ge1xuICAgIHg6IGlzTnVtYmVyKG9iai54KSA/IG9iai54IDogMCxcbiAgICB5OiBpc051bWJlcihvYmoueSkgPyBvYmoueSA6IDBcbiAgfVxufVxuXG5mdW5jdGlvbiBpc051bWJlciAodikge1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICdudW1iZXInXG59XG5cbnZhciBoYXNoU3RhcnRzV2l0aE51bWJlclJFID0gL14jXFxkLztcblxuZnVuY3Rpb24gc2Nyb2xsVG9Qb3NpdGlvbiAoc2hvdWxkU2Nyb2xsLCBwb3NpdGlvbikge1xuICB2YXIgaXNPYmplY3QgPSB0eXBlb2Ygc2hvdWxkU2Nyb2xsID09PSAnb2JqZWN0JztcbiAgaWYgKGlzT2JqZWN0ICYmIHR5cGVvZiBzaG91bGRTY3JvbGwuc2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZ2V0RWxlbWVudEJ5SWQgd291bGQgc3RpbGwgZmFpbCBpZiB0aGUgc2VsZWN0b3IgY29udGFpbnMgYSBtb3JlIGNvbXBsaWNhdGVkIHF1ZXJ5IGxpa2UgI21haW5bZGF0YS1hdHRyXVxuICAgIC8vIGJ1dCBhdCB0aGUgc2FtZSB0aW1lLCBpdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSB0byBzZWxlY3QgYW4gZWxlbWVudCB3aXRoIGFuIGlkIGFuZCBhbiBleHRyYSBzZWxlY3RvclxuICAgIHZhciBlbCA9IGhhc2hTdGFydHNXaXRoTnVtYmVyUkUudGVzdChzaG91bGRTY3JvbGwuc2VsZWN0b3IpIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgICAgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzaG91bGRTY3JvbGwuc2VsZWN0b3Iuc2xpY2UoMSkpIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgICAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNob3VsZFNjcm9sbC5zZWxlY3Rvcik7XG5cbiAgICBpZiAoZWwpIHtcbiAgICAgIHZhciBvZmZzZXQgPVxuICAgICAgICBzaG91bGRTY3JvbGwub2Zmc2V0ICYmIHR5cGVvZiBzaG91bGRTY3JvbGwub2Zmc2V0ID09PSAnb2JqZWN0J1xuICAgICAgICAgID8gc2hvdWxkU2Nyb2xsLm9mZnNldFxuICAgICAgICAgIDoge307XG4gICAgICBvZmZzZXQgPSBub3JtYWxpemVPZmZzZXQob2Zmc2V0KTtcbiAgICAgIHBvc2l0aW9uID0gZ2V0RWxlbWVudFBvc2l0aW9uKGVsLCBvZmZzZXQpO1xuICAgIH0gZWxzZSBpZiAoaXNWYWxpZFBvc2l0aW9uKHNob3VsZFNjcm9sbCkpIHtcbiAgICAgIHBvc2l0aW9uID0gbm9ybWFsaXplUG9zaXRpb24oc2hvdWxkU2Nyb2xsKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QgJiYgaXNWYWxpZFBvc2l0aW9uKHNob3VsZFNjcm9sbCkpIHtcbiAgICBwb3NpdGlvbiA9IG5vcm1hbGl6ZVBvc2l0aW9uKHNob3VsZFNjcm9sbCk7XG4gIH1cblxuICBpZiAocG9zaXRpb24pIHtcbiAgICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgICBpZiAoJ3Njcm9sbEJlaGF2aW9yJyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUpIHtcbiAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgIGxlZnQ6IHBvc2l0aW9uLngsXG4gICAgICAgIHRvcDogcG9zaXRpb24ueSxcbiAgICAgICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgICAgIGJlaGF2aW9yOiBzaG91bGRTY3JvbGwuYmVoYXZpb3JcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cuc2Nyb2xsVG8ocG9zaXRpb24ueCwgcG9zaXRpb24ueSk7XG4gICAgfVxuICB9XG59XG5cbi8qICAqL1xuXG52YXIgc3VwcG9ydHNQdXNoU3RhdGUgPVxuICBpbkJyb3dzZXIgJiZcbiAgKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDtcblxuICAgIGlmIChcbiAgICAgICh1YS5pbmRleE9mKCdBbmRyb2lkIDIuJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ0FuZHJvaWQgNC4wJykgIT09IC0xKSAmJlxuICAgICAgdWEuaW5kZXhPZignTW9iaWxlIFNhZmFyaScpICE9PSAtMSAmJlxuICAgICAgdWEuaW5kZXhPZignQ2hyb21lJykgPT09IC0xICYmXG4gICAgICB1YS5pbmRleE9mKCdXaW5kb3dzIFBob25lJykgPT09IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gd2luZG93Lmhpc3RvcnkgJiYgdHlwZW9mIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSA9PT0gJ2Z1bmN0aW9uJ1xuICB9KSgpO1xuXG5mdW5jdGlvbiBwdXNoU3RhdGUgKHVybCwgcmVwbGFjZSkge1xuICBzYXZlU2Nyb2xsUG9zaXRpb24oKTtcbiAgLy8gdHJ5Li4uY2F0Y2ggdGhlIHB1c2hTdGF0ZSBjYWxsIHRvIGdldCBhcm91bmQgU2FmYXJpXG4gIC8vIERPTSBFeGNlcHRpb24gMTggd2hlcmUgaXQgbGltaXRzIHRvIDEwMCBwdXNoU3RhdGUgY2FsbHNcbiAgdmFyIGhpc3RvcnkgPSB3aW5kb3cuaGlzdG9yeTtcbiAgdHJ5IHtcbiAgICBpZiAocmVwbGFjZSkge1xuICAgICAgLy8gcHJlc2VydmUgZXhpc3RpbmcgaGlzdG9yeSBzdGF0ZSBhcyBpdCBjb3VsZCBiZSBvdmVycmlkZW4gYnkgdGhlIHVzZXJcbiAgICAgIHZhciBzdGF0ZUNvcHkgPSBleHRlbmQoe30sIGhpc3Rvcnkuc3RhdGUpO1xuICAgICAgc3RhdGVDb3B5LmtleSA9IGdldFN0YXRlS2V5KCk7XG4gICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShzdGF0ZUNvcHksICcnLCB1cmwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGtleTogc2V0U3RhdGVLZXkoZ2VuU3RhdGVLZXkoKSkgfSwgJycsIHVybCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgd2luZG93LmxvY2F0aW9uW3JlcGxhY2UgPyAncmVwbGFjZScgOiAnYXNzaWduJ10odXJsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlU3RhdGUgKHVybCkge1xuICBwdXNoU3RhdGUodXJsLCB0cnVlKTtcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIHJ1blF1ZXVlIChxdWV1ZSwgZm4sIGNiKSB7XG4gIHZhciBzdGVwID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgaWYgKGluZGV4ID49IHF1ZXVlLmxlbmd0aCkge1xuICAgICAgY2IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHF1ZXVlW2luZGV4XSkge1xuICAgICAgICBmbihxdWV1ZVtpbmRleF0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzdGVwKGluZGV4ICsgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RlcChpbmRleCArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgc3RlcCgwKTtcbn1cblxuLy8gV2hlbiBjaGFuZ2luZyB0aGluZywgYWxzbyBlZGl0IHJvdXRlci5kLnRzXG52YXIgTmF2aWdhdGlvbkZhaWx1cmVUeXBlID0ge1xuICByZWRpcmVjdGVkOiAyLFxuICBhYm9ydGVkOiA0LFxuICBjYW5jZWxsZWQ6IDgsXG4gIGR1cGxpY2F0ZWQ6IDE2XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVOYXZpZ2F0aW9uUmVkaXJlY3RlZEVycm9yIChmcm9tLCB0bykge1xuICByZXR1cm4gY3JlYXRlUm91dGVyRXJyb3IoXG4gICAgZnJvbSxcbiAgICB0byxcbiAgICBOYXZpZ2F0aW9uRmFpbHVyZVR5cGUucmVkaXJlY3RlZCxcbiAgICAoXCJSZWRpcmVjdGVkIHdoZW4gZ29pbmcgZnJvbSBcXFwiXCIgKyAoZnJvbS5mdWxsUGF0aCkgKyBcIlxcXCIgdG8gXFxcIlwiICsgKHN0cmluZ2lmeVJvdXRlKFxuICAgICAgdG9cbiAgICApKSArIFwiXFxcIiB2aWEgYSBuYXZpZ2F0aW9uIGd1YXJkLlwiKVxuICApXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU5hdmlnYXRpb25EdXBsaWNhdGVkRXJyb3IgKGZyb20sIHRvKSB7XG4gIHZhciBlcnJvciA9IGNyZWF0ZVJvdXRlckVycm9yKFxuICAgIGZyb20sXG4gICAgdG8sXG4gICAgTmF2aWdhdGlvbkZhaWx1cmVUeXBlLmR1cGxpY2F0ZWQsXG4gICAgKFwiQXZvaWRlZCByZWR1bmRhbnQgbmF2aWdhdGlvbiB0byBjdXJyZW50IGxvY2F0aW9uOiBcXFwiXCIgKyAoZnJvbS5mdWxsUGF0aCkgKyBcIlxcXCIuXCIpXG4gICk7XG4gIC8vIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggdGhlIGZpcnN0IGludHJvZHVjdGlvbiBvZiBFcnJvcnNcbiAgZXJyb3IubmFtZSA9ICdOYXZpZ2F0aW9uRHVwbGljYXRlZCc7XG4gIHJldHVybiBlcnJvclxufVxuXG5mdW5jdGlvbiBjcmVhdGVOYXZpZ2F0aW9uQ2FuY2VsbGVkRXJyb3IgKGZyb20sIHRvKSB7XG4gIHJldHVybiBjcmVhdGVSb3V0ZXJFcnJvcihcbiAgICBmcm9tLFxuICAgIHRvLFxuICAgIE5hdmlnYXRpb25GYWlsdXJlVHlwZS5jYW5jZWxsZWQsXG4gICAgKFwiTmF2aWdhdGlvbiBjYW5jZWxsZWQgZnJvbSBcXFwiXCIgKyAoZnJvbS5mdWxsUGF0aCkgKyBcIlxcXCIgdG8gXFxcIlwiICsgKHRvLmZ1bGxQYXRoKSArIFwiXFxcIiB3aXRoIGEgbmV3IG5hdmlnYXRpb24uXCIpXG4gIClcbn1cblxuZnVuY3Rpb24gY3JlYXRlTmF2aWdhdGlvbkFib3J0ZWRFcnJvciAoZnJvbSwgdG8pIHtcbiAgcmV0dXJuIGNyZWF0ZVJvdXRlckVycm9yKFxuICAgIGZyb20sXG4gICAgdG8sXG4gICAgTmF2aWdhdGlvbkZhaWx1cmVUeXBlLmFib3J0ZWQsXG4gICAgKFwiTmF2aWdhdGlvbiBhYm9ydGVkIGZyb20gXFxcIlwiICsgKGZyb20uZnVsbFBhdGgpICsgXCJcXFwiIHRvIFxcXCJcIiArICh0by5mdWxsUGF0aCkgKyBcIlxcXCIgdmlhIGEgbmF2aWdhdGlvbiBndWFyZC5cIilcbiAgKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVSb3V0ZXJFcnJvciAoZnJvbSwgdG8sIHR5cGUsIG1lc3NhZ2UpIHtcbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBlcnJvci5faXNSb3V0ZXIgPSB0cnVlO1xuICBlcnJvci5mcm9tID0gZnJvbTtcbiAgZXJyb3IudG8gPSB0bztcbiAgZXJyb3IudHlwZSA9IHR5cGU7XG5cbiAgcmV0dXJuIGVycm9yXG59XG5cbnZhciBwcm9wZXJ0aWVzVG9Mb2cgPSBbJ3BhcmFtcycsICdxdWVyeScsICdoYXNoJ107XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeVJvdXRlICh0bykge1xuICBpZiAodHlwZW9mIHRvID09PSAnc3RyaW5nJykgeyByZXR1cm4gdG8gfVxuICBpZiAoJ3BhdGgnIGluIHRvKSB7IHJldHVybiB0by5wYXRoIH1cbiAgdmFyIGxvY2F0aW9uID0ge307XG4gIHByb3BlcnRpZXNUb0xvZy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoa2V5IGluIHRvKSB7IGxvY2F0aW9uW2tleV0gPSB0b1trZXldOyB9XG4gIH0pO1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobG9jYXRpb24sIG51bGwsIDIpXG59XG5cbmZ1bmN0aW9uIGlzRXJyb3IgKGVycikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGVycikuaW5kZXhPZignRXJyb3InKSA+IC0xXG59XG5cbmZ1bmN0aW9uIGlzTmF2aWdhdGlvbkZhaWx1cmUgKGVyciwgZXJyb3JUeXBlKSB7XG4gIHJldHVybiAoXG4gICAgaXNFcnJvcihlcnIpICYmXG4gICAgZXJyLl9pc1JvdXRlciAmJlxuICAgIChlcnJvclR5cGUgPT0gbnVsbCB8fCBlcnIudHlwZSA9PT0gZXJyb3JUeXBlKVxuICApXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiByZXNvbHZlQXN5bmNDb21wb25lbnRzIChtYXRjaGVkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodG8sIGZyb20sIG5leHQpIHtcbiAgICB2YXIgaGFzQXN5bmMgPSBmYWxzZTtcbiAgICB2YXIgcGVuZGluZyA9IDA7XG4gICAgdmFyIGVycm9yID0gbnVsbDtcblxuICAgIGZsYXRNYXBDb21wb25lbnRzKG1hdGNoZWQsIGZ1bmN0aW9uIChkZWYsIF8sIG1hdGNoLCBrZXkpIHtcbiAgICAgIC8vIGlmIGl0J3MgYSBmdW5jdGlvbiBhbmQgZG9lc24ndCBoYXZlIGNpZCBhdHRhY2hlZCxcbiAgICAgIC8vIGFzc3VtZSBpdCdzIGFuIGFzeW5jIGNvbXBvbmVudCByZXNvbHZlIGZ1bmN0aW9uLlxuICAgICAgLy8gd2UgYXJlIG5vdCB1c2luZyBWdWUncyBkZWZhdWx0IGFzeW5jIHJlc29sdmluZyBtZWNoYW5pc20gYmVjYXVzZVxuICAgICAgLy8gd2Ugd2FudCB0byBoYWx0IHRoZSBuYXZpZ2F0aW9uIHVudGlsIHRoZSBpbmNvbWluZyBjb21wb25lbnQgaGFzIGJlZW5cbiAgICAgIC8vIHJlc29sdmVkLlxuICAgICAgaWYgKHR5cGVvZiBkZWYgPT09ICdmdW5jdGlvbicgJiYgZGVmLmNpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGhhc0FzeW5jID0gdHJ1ZTtcbiAgICAgICAgcGVuZGluZysrO1xuXG4gICAgICAgIHZhciByZXNvbHZlID0gb25jZShmdW5jdGlvbiAocmVzb2x2ZWREZWYpIHtcbiAgICAgICAgICBpZiAoaXNFU01vZHVsZShyZXNvbHZlZERlZikpIHtcbiAgICAgICAgICAgIHJlc29sdmVkRGVmID0gcmVzb2x2ZWREZWYuZGVmYXVsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gc2F2ZSByZXNvbHZlZCBvbiBhc3luYyBmYWN0b3J5IGluIGNhc2UgaXQncyB1c2VkIGVsc2V3aGVyZVxuICAgICAgICAgIGRlZi5yZXNvbHZlZCA9IHR5cGVvZiByZXNvbHZlZERlZiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyByZXNvbHZlZERlZlxuICAgICAgICAgICAgOiBfVnVlLmV4dGVuZChyZXNvbHZlZERlZik7XG4gICAgICAgICAgbWF0Y2guY29tcG9uZW50c1trZXldID0gcmVzb2x2ZWREZWY7XG4gICAgICAgICAgcGVuZGluZy0tO1xuICAgICAgICAgIGlmIChwZW5kaW5nIDw9IDApIHtcbiAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciByZWplY3QgPSBvbmNlKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgICB2YXIgbXNnID0gXCJGYWlsZWQgdG8gcmVzb2x2ZSBhc3luYyBjb21wb25lbnQgXCIgKyBrZXkgKyBcIjogXCIgKyByZWFzb247XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKGZhbHNlLCBtc2cpO1xuICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9yID0gaXNFcnJvcihyZWFzb24pXG4gICAgICAgICAgICAgID8gcmVhc29uXG4gICAgICAgICAgICAgIDogbmV3IEVycm9yKG1zZyk7XG4gICAgICAgICAgICBuZXh0KGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzID0gZGVmKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJlcy50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5ldyBzeW50YXggaW4gVnVlIDIuM1xuICAgICAgICAgICAgdmFyIGNvbXAgPSByZXMuY29tcG9uZW50O1xuICAgICAgICAgICAgaWYgKGNvbXAgJiYgdHlwZW9mIGNvbXAudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBjb21wLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghaGFzQXN5bmMpIHsgbmV4dCgpOyB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmxhdE1hcENvbXBvbmVudHMgKFxuICBtYXRjaGVkLFxuICBmblxuKSB7XG4gIHJldHVybiBmbGF0dGVuKG1hdGNoZWQubWFwKGZ1bmN0aW9uIChtKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG0uY29tcG9uZW50cykubWFwKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGZuKFxuICAgICAgbS5jb21wb25lbnRzW2tleV0sXG4gICAgICBtLmluc3RhbmNlc1trZXldLFxuICAgICAgbSwga2V5XG4gICAgKTsgfSlcbiAgfSkpXG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW4gKGFycikge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgYXJyKVxufVxuXG52YXIgaGFzU3ltYm9sID1cbiAgdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICB0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJztcblxuZnVuY3Rpb24gaXNFU01vZHVsZSAob2JqKSB7XG4gIHJldHVybiBvYmouX19lc01vZHVsZSB8fCAoaGFzU3ltYm9sICYmIG9ialtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnTW9kdWxlJylcbn1cblxuLy8gaW4gV2VicGFjayAyLCByZXF1aXJlLmVuc3VyZSBub3cgYWxzbyByZXR1cm5zIGEgUHJvbWlzZVxuLy8gc28gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBtYXkgZ2V0IGNhbGxlZCBhbiBleHRyYSB0aW1lXG4vLyBpZiB0aGUgdXNlciB1c2VzIGFuIGFycm93IGZ1bmN0aW9uIHNob3J0aGFuZCB0aGF0IGhhcHBlbnMgdG9cbi8vIHJldHVybiB0aGF0IFByb21pc2UuXG5mdW5jdGlvbiBvbmNlIChmbikge1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgaWYgKGNhbGxlZCkgeyByZXR1cm4gfVxuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3MpXG4gIH1cbn1cblxuLyogICovXG5cbnZhciBIaXN0b3J5ID0gZnVuY3Rpb24gSGlzdG9yeSAocm91dGVyLCBiYXNlKSB7XG4gIHRoaXMucm91dGVyID0gcm91dGVyO1xuICB0aGlzLmJhc2UgPSBub3JtYWxpemVCYXNlKGJhc2UpO1xuICAvLyBzdGFydCB3aXRoIGEgcm91dGUgb2JqZWN0IHRoYXQgc3RhbmRzIGZvciBcIm5vd2hlcmVcIlxuICB0aGlzLmN1cnJlbnQgPSBTVEFSVDtcbiAgdGhpcy5wZW5kaW5nID0gbnVsbDtcbiAgdGhpcy5yZWFkeSA9IGZhbHNlO1xuICB0aGlzLnJlYWR5Q2JzID0gW107XG4gIHRoaXMucmVhZHlFcnJvckNicyA9IFtdO1xuICB0aGlzLmVycm9yQ2JzID0gW107XG4gIHRoaXMubGlzdGVuZXJzID0gW107XG59O1xuXG5IaXN0b3J5LnByb3RvdHlwZS5saXN0ZW4gPSBmdW5jdGlvbiBsaXN0ZW4gKGNiKSB7XG4gIHRoaXMuY2IgPSBjYjtcbn07XG5cbkhpc3RvcnkucHJvdG90eXBlLm9uUmVhZHkgPSBmdW5jdGlvbiBvblJlYWR5IChjYiwgZXJyb3JDYikge1xuICBpZiAodGhpcy5yZWFkeSkge1xuICAgIGNiKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5yZWFkeUNicy5wdXNoKGNiKTtcbiAgICBpZiAoZXJyb3JDYikge1xuICAgICAgdGhpcy5yZWFkeUVycm9yQ2JzLnB1c2goZXJyb3JDYik7XG4gICAgfVxuICB9XG59O1xuXG5IaXN0b3J5LnByb3RvdHlwZS5vbkVycm9yID0gZnVuY3Rpb24gb25FcnJvciAoZXJyb3JDYikge1xuICB0aGlzLmVycm9yQ2JzLnB1c2goZXJyb3JDYik7XG59O1xuXG5IaXN0b3J5LnByb3RvdHlwZS50cmFuc2l0aW9uVG8gPSBmdW5jdGlvbiB0cmFuc2l0aW9uVG8gKFxuICBsb2NhdGlvbixcbiAgb25Db21wbGV0ZSxcbiAgb25BYm9ydFxuKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIHJvdXRlO1xuICAvLyBjYXRjaCByZWRpcmVjdCBvcHRpb24gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1yb3V0ZXIvaXNzdWVzLzMyMDFcbiAgdHJ5IHtcbiAgICByb3V0ZSA9IHRoaXMucm91dGVyLm1hdGNoKGxvY2F0aW9uLCB0aGlzLmN1cnJlbnQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhpcy5lcnJvckNicy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgY2IoZSk7XG4gICAgfSk7XG4gICAgLy8gRXhjZXB0aW9uIHNob3VsZCBzdGlsbCBiZSB0aHJvd25cbiAgICB0aHJvdyBlXG4gIH1cbiAgdmFyIHByZXYgPSB0aGlzLmN1cnJlbnQ7XG4gIHRoaXMuY29uZmlybVRyYW5zaXRpb24oXG4gICAgcm91dGUsXG4gICAgZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcyQxLnVwZGF0ZVJvdXRlKHJvdXRlKTtcbiAgICAgIG9uQ29tcGxldGUgJiYgb25Db21wbGV0ZShyb3V0ZSk7XG4gICAgICB0aGlzJDEuZW5zdXJlVVJMKCk7XG4gICAgICB0aGlzJDEucm91dGVyLmFmdGVySG9va3MuZm9yRWFjaChmdW5jdGlvbiAoaG9vaykge1xuICAgICAgICBob29rICYmIGhvb2socm91dGUsIHByZXYpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGZpcmUgcmVhZHkgY2JzIG9uY2VcbiAgICAgIGlmICghdGhpcyQxLnJlYWR5KSB7XG4gICAgICAgIHRoaXMkMS5yZWFkeSA9IHRydWU7XG4gICAgICAgIHRoaXMkMS5yZWFkeUNicy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgIGNiKHJvdXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAob25BYm9ydCkge1xuICAgICAgICBvbkFib3J0KGVycik7XG4gICAgICB9XG4gICAgICBpZiAoZXJyICYmICF0aGlzJDEucmVhZHkpIHtcbiAgICAgICAgLy8gSW5pdGlhbCByZWRpcmVjdGlvbiBzaG91bGQgbm90IG1hcmsgdGhlIGhpc3RvcnkgYXMgcmVhZHkgeWV0XG4gICAgICAgIC8vIGJlY2F1c2UgaXQncyB0cmlnZ2VyZWQgYnkgdGhlIHJlZGlyZWN0aW9uIGluc3RlYWRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1yb3V0ZXIvaXNzdWVzLzMyMjVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS1yb3V0ZXIvaXNzdWVzLzMzMzFcbiAgICAgICAgaWYgKCFpc05hdmlnYXRpb25GYWlsdXJlKGVyciwgTmF2aWdhdGlvbkZhaWx1cmVUeXBlLnJlZGlyZWN0ZWQpIHx8IHByZXYgIT09IFNUQVJUKSB7XG4gICAgICAgICAgdGhpcyQxLnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzJDEucmVhZHlFcnJvckNicy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgKTtcbn07XG5cbkhpc3RvcnkucHJvdG90eXBlLmNvbmZpcm1UcmFuc2l0aW9uID0gZnVuY3Rpb24gY29uZmlybVRyYW5zaXRpb24gKHJvdXRlLCBvbkNvbXBsZXRlLCBvbkFib3J0KSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7XG4gIHRoaXMucGVuZGluZyA9IHJvdXRlO1xuICB2YXIgYWJvcnQgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgLy8gY2hhbmdlZCBhZnRlciBhZGRpbmcgZXJyb3JzIHdpdGhcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9wdWxsLzMwNDcgYmVmb3JlIHRoYXQgY2hhbmdlLFxuICAgIC8vIHJlZGlyZWN0IGFuZCBhYm9ydGVkIG5hdmlnYXRpb24gd291bGQgcHJvZHVjZSBhbiBlcnIgPT0gbnVsbFxuICAgIGlmICghaXNOYXZpZ2F0aW9uRmFpbHVyZShlcnIpICYmIGlzRXJyb3IoZXJyKSkge1xuICAgICAgaWYgKHRoaXMkMS5lcnJvckNicy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcyQxLmVycm9yQ2JzLmZvckVhY2goZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgY2IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKGZhbHNlLCAndW5jYXVnaHQgZXJyb3IgZHVyaW5nIHJvdXRlIG5hdmlnYXRpb246Jyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgb25BYm9ydCAmJiBvbkFib3J0KGVycik7XG4gIH07XG4gIHZhciBsYXN0Um91dGVJbmRleCA9IHJvdXRlLm1hdGNoZWQubGVuZ3RoIC0gMTtcbiAgdmFyIGxhc3RDdXJyZW50SW5kZXggPSBjdXJyZW50Lm1hdGNoZWQubGVuZ3RoIC0gMTtcbiAgaWYgKFxuICAgIGlzU2FtZVJvdXRlKHJvdXRlLCBjdXJyZW50KSAmJlxuICAgIC8vIGluIHRoZSBjYXNlIHRoZSByb3V0ZSBtYXAgaGFzIGJlZW4gZHluYW1pY2FsbHkgYXBwZW5kZWQgdG9cbiAgICBsYXN0Um91dGVJbmRleCA9PT0gbGFzdEN1cnJlbnRJbmRleCAmJlxuICAgIHJvdXRlLm1hdGNoZWRbbGFzdFJvdXRlSW5kZXhdID09PSBjdXJyZW50Lm1hdGNoZWRbbGFzdEN1cnJlbnRJbmRleF1cbiAgKSB7XG4gICAgdGhpcy5lbnN1cmVVUkwoKTtcbiAgICByZXR1cm4gYWJvcnQoY3JlYXRlTmF2aWdhdGlvbkR1cGxpY2F0ZWRFcnJvcihjdXJyZW50LCByb3V0ZSkpXG4gIH1cblxuICB2YXIgcmVmID0gcmVzb2x2ZVF1ZXVlKFxuICAgIHRoaXMuY3VycmVudC5tYXRjaGVkLFxuICAgIHJvdXRlLm1hdGNoZWRcbiAgKTtcbiAgICB2YXIgdXBkYXRlZCA9IHJlZi51cGRhdGVkO1xuICAgIHZhciBkZWFjdGl2YXRlZCA9IHJlZi5kZWFjdGl2YXRlZDtcbiAgICB2YXIgYWN0aXZhdGVkID0gcmVmLmFjdGl2YXRlZDtcblxuICB2YXIgcXVldWUgPSBbXS5jb25jYXQoXG4gICAgLy8gaW4tY29tcG9uZW50IGxlYXZlIGd1YXJkc1xuICAgIGV4dHJhY3RMZWF2ZUd1YXJkcyhkZWFjdGl2YXRlZCksXG4gICAgLy8gZ2xvYmFsIGJlZm9yZSBob29rc1xuICAgIHRoaXMucm91dGVyLmJlZm9yZUhvb2tzLFxuICAgIC8vIGluLWNvbXBvbmVudCB1cGRhdGUgaG9va3NcbiAgICBleHRyYWN0VXBkYXRlSG9va3ModXBkYXRlZCksXG4gICAgLy8gaW4tY29uZmlnIGVudGVyIGd1YXJkc1xuICAgIGFjdGl2YXRlZC5tYXAoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG0uYmVmb3JlRW50ZXI7IH0pLFxuICAgIC8vIGFzeW5jIGNvbXBvbmVudHNcbiAgICByZXNvbHZlQXN5bmNDb21wb25lbnRzKGFjdGl2YXRlZClcbiAgKTtcblxuICB2YXIgaXRlcmF0b3IgPSBmdW5jdGlvbiAoaG9vaywgbmV4dCkge1xuICAgIGlmICh0aGlzJDEucGVuZGluZyAhPT0gcm91dGUpIHtcbiAgICAgIHJldHVybiBhYm9ydChjcmVhdGVOYXZpZ2F0aW9uQ2FuY2VsbGVkRXJyb3IoY3VycmVudCwgcm91dGUpKVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgaG9vayhyb3V0ZSwgY3VycmVudCwgZnVuY3Rpb24gKHRvKSB7XG4gICAgICAgIGlmICh0byA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAvLyBuZXh0KGZhbHNlKSAtPiBhYm9ydCBuYXZpZ2F0aW9uLCBlbnN1cmUgY3VycmVudCBVUkxcbiAgICAgICAgICB0aGlzJDEuZW5zdXJlVVJMKHRydWUpO1xuICAgICAgICAgIGFib3J0KGNyZWF0ZU5hdmlnYXRpb25BYm9ydGVkRXJyb3IoY3VycmVudCwgcm91dGUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0Vycm9yKHRvKSkge1xuICAgICAgICAgIHRoaXMkMS5lbnN1cmVVUkwodHJ1ZSk7XG4gICAgICAgICAgYWJvcnQodG8pO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHR5cGVvZiB0byA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAodHlwZW9mIHRvID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgKHR5cGVvZiB0by5wYXRoID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdG8ubmFtZSA9PT0gJ3N0cmluZycpKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBuZXh0KCcvJykgb3IgbmV4dCh7IHBhdGg6ICcvJyB9KSAtPiByZWRpcmVjdFxuICAgICAgICAgIGFib3J0KGNyZWF0ZU5hdmlnYXRpb25SZWRpcmVjdGVkRXJyb3IoY3VycmVudCwgcm91dGUpKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHRvID09PSAnb2JqZWN0JyAmJiB0by5yZXBsYWNlKSB7XG4gICAgICAgICAgICB0aGlzJDEucmVwbGFjZSh0byk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMkMS5wdXNoKHRvKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY29uZmlybSB0cmFuc2l0aW9uIGFuZCBwYXNzIG9uIHRoZSB2YWx1ZVxuICAgICAgICAgIG5leHQodG8pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhYm9ydChlKTtcbiAgICB9XG4gIH07XG5cbiAgcnVuUXVldWUocXVldWUsIGl0ZXJhdG9yLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gd2FpdCB1bnRpbCBhc3luYyBjb21wb25lbnRzIGFyZSByZXNvbHZlZCBiZWZvcmVcbiAgICAvLyBleHRyYWN0aW5nIGluLWNvbXBvbmVudCBlbnRlciBndWFyZHNcbiAgICB2YXIgZW50ZXJHdWFyZHMgPSBleHRyYWN0RW50ZXJHdWFyZHMoYWN0aXZhdGVkKTtcbiAgICB2YXIgcXVldWUgPSBlbnRlckd1YXJkcy5jb25jYXQodGhpcyQxLnJvdXRlci5yZXNvbHZlSG9va3MpO1xuICAgIHJ1blF1ZXVlKHF1ZXVlLCBpdGVyYXRvciwgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHRoaXMkMS5wZW5kaW5nICE9PSByb3V0ZSkge1xuICAgICAgICByZXR1cm4gYWJvcnQoY3JlYXRlTmF2aWdhdGlvbkNhbmNlbGxlZEVycm9yKGN1cnJlbnQsIHJvdXRlKSlcbiAgICAgIH1cbiAgICAgIHRoaXMkMS5wZW5kaW5nID0gbnVsbDtcbiAgICAgIG9uQ29tcGxldGUocm91dGUpO1xuICAgICAgaWYgKHRoaXMkMS5yb3V0ZXIuYXBwKSB7XG4gICAgICAgIHRoaXMkMS5yb3V0ZXIuYXBwLiRuZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaGFuZGxlUm91dGVFbnRlcmVkKHJvdXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuSGlzdG9yeS5wcm90b3R5cGUudXBkYXRlUm91dGUgPSBmdW5jdGlvbiB1cGRhdGVSb3V0ZSAocm91dGUpIHtcbiAgdGhpcy5jdXJyZW50ID0gcm91dGU7XG4gIHRoaXMuY2IgJiYgdGhpcy5jYihyb3V0ZSk7XG59O1xuXG5IaXN0b3J5LnByb3RvdHlwZS5zZXR1cExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldHVwTGlzdGVuZXJzICgpIHtcbiAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eVxufTtcblxuSGlzdG9yeS5wcm90b3R5cGUudGVhcmRvd24gPSBmdW5jdGlvbiB0ZWFyZG93biAoKSB7XG4gIC8vIGNsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLXJvdXRlci9pc3N1ZXMvMjM0MVxuICB0aGlzLmxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChjbGVhbnVwTGlzdGVuZXIpIHtcbiAgICBjbGVhbnVwTGlzdGVuZXIoKTtcbiAgfSk7XG4gIHRoaXMubGlzdGVuZXJzID0gW107XG5cbiAgLy8gcmVzZXQgY3VycmVudCBoaXN0b3J5IHJvdXRlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtcm91dGVyL2lzc3Vlcy8zMjk0XG4gIHRoaXMuY3VycmVudCA9IFNUQVJUO1xuICB0aGlzLnBlbmRpbmcgPSBudWxsO1xufTtcblxuZnVuY3Rpb24gbm9ybWFsaXplQmFzZSAoYmFzZSkge1xuICBpZiAoIWJhc2UpIHtcbiAgICBpZiAoaW5Ccm93c2VyKSB7XG4gICAgICAvLyByZXNwZWN0IDxiYXNlPiB0YWdcbiAgICAgIHZhciBiYXNlRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdiYXNlJyk7XG4gICAgICBiYXNlID0gKGJhc2VFbCAmJiBiYXNlRWwuZ2V0QXR0cmlidXRlKCdocmVmJykpIHx8ICcvJztcbiAgICAgIC8vIHN0cmlwIGZ1bGwgVVJMIG9yaWdpblxuICAgICAgYmFzZSA9IGJhc2UucmVwbGFjZSgvXmh0dHBzPzpcXC9cXC9bXlxcL10rLywgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYXNlID0gJy8nO1xuICAgIH1cbiAgfVxuICAvLyBtYWtlIHN1cmUgdGhlcmUncyB0aGUgc3RhcnRpbmcgc2xhc2hcbiAgaWYgKGJhc2UuY2hhckF0KDApICE9PSAnLycpIHtcbiAgICBiYXNlID0gJy8nICsgYmFzZTtcbiAgfVxuICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2hcbiAgcmV0dXJuIGJhc2UucmVwbGFjZSgvXFwvJC8sICcnKVxufVxuXG5mdW5jdGlvbiByZXNvbHZlUXVldWUgKFxuICBjdXJyZW50LFxuICBuZXh0XG4pIHtcbiAgdmFyIGk7XG4gIHZhciBtYXggPSBNYXRoLm1heChjdXJyZW50Lmxlbmd0aCwgbmV4dC5sZW5ndGgpO1xuICBmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHtcbiAgICBpZiAoY3VycmVudFtpXSAhPT0gbmV4dFtpXSkge1xuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB1cGRhdGVkOiBuZXh0LnNsaWNlKDAsIGkpLFxuICAgIGFjdGl2YXRlZDogbmV4dC5zbGljZShpKSxcbiAgICBkZWFjdGl2YXRlZDogY3VycmVudC5zbGljZShpKVxuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RHdWFyZHMgKFxuICByZWNvcmRzLFxuICBuYW1lLFxuICBiaW5kLFxuICByZXZlcnNlXG4pIHtcbiAgdmFyIGd1YXJkcyA9IGZsYXRNYXBDb21wb25lbnRzKHJlY29yZHMsIGZ1bmN0aW9uIChkZWYsIGluc3RhbmNlLCBtYXRjaCwga2V5KSB7XG4gICAgdmFyIGd1YXJkID0gZXh0cmFjdEd1YXJkKGRlZiwgbmFtZSk7XG4gICAgaWYgKGd1YXJkKSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShndWFyZClcbiAgICAgICAgPyBndWFyZC5tYXAoZnVuY3Rpb24gKGd1YXJkKSB7IHJldHVybiBiaW5kKGd1YXJkLCBpbnN0YW5jZSwgbWF0Y2gsIGtleSk7IH0pXG4gICAgICAgIDogYmluZChndWFyZCwgaW5zdGFuY2UsIG1hdGNoLCBrZXkpXG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGZsYXR0ZW4ocmV2ZXJzZSA/IGd1YXJkcy5yZXZlcnNlKCkgOiBndWFyZHMpXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RHdWFyZCAoXG4gIGRlZixcbiAga2V5XG4pIHtcbiAgaWYgKHR5cGVvZiBkZWYgIT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBleHRlbmQgbm93IHNvIHRoYXQgZ2xvYmFsIG1peGlucyBhcmUgYXBwbGllZC5cbiAgICBkZWYgPSBfVnVlLmV4dGVuZChkZWYpO1xuICB9XG4gIHJldHVybiBkZWYub3B0aW9uc1trZXldXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RMZWF2ZUd1YXJkcyAoZGVhY3RpdmF0ZWQpIHtcbiAgcmV0dXJuIGV4dHJhY3RHdWFyZHMoZGVhY3RpdmF0ZWQsICdiZWZvcmVSb3V0ZUxlYXZlJywgYmluZEd1YXJkLCB0cnVlKVxufVxuXG5mdW5jdGlvbiBleHRyYWN0VXBkYXRlSG9va3MgKHVwZGF0ZWQpIHtcbiAgcmV0dXJuIGV4dHJhY3RHdWFyZHModXBkYXRlZCwgJ2JlZm9yZVJvdXRlVXBkYXRlJywgYmluZEd1YXJkKVxufVxuXG5mdW5jdGlvbiBiaW5kR3VhcmQgKGd1YXJkLCBpbnN0YW5jZSkge1xuICBpZiAoaW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gYm91bmRSb3V0ZUd1YXJkICgpIHtcbiAgICAgIHJldHVybiBndWFyZC5hcHBseShpbnN0YW5jZSwgYXJndW1lbnRzKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0RW50ZXJHdWFyZHMgKFxuICBhY3RpdmF0ZWRcbikge1xuICByZXR1cm4gZXh0cmFjdEd1YXJkcyhcbiAgICBhY3RpdmF0ZWQsXG4gICAgJ2JlZm9yZVJvdXRlRW50ZXInLFxuICAgIGZ1bmN0aW9uIChndWFyZCwgXywgbWF0Y2gsIGtleSkge1xuICAgICAgcmV0dXJuIGJpbmRFbnRlckd1YXJkKGd1YXJkLCBtYXRjaCwga2V5KVxuICAgIH1cbiAgKVxufVxuXG5mdW5jdGlvbiBiaW5kRW50ZXJHdWFyZCAoXG4gIGd1YXJkLFxuICBtYXRjaCxcbiAga2V5XG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHJvdXRlRW50ZXJHdWFyZCAodG8sIGZyb20sIG5leHQpIHtcbiAgICByZXR1cm4gZ3VhcmQodG8sIGZyb20sIGZ1bmN0aW9uIChjYikge1xuICAgICAgaWYgKHR5cGVvZiBjYiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoIW1hdGNoLmVudGVyZWRDYnNba2V5XSkge1xuICAgICAgICAgIG1hdGNoLmVudGVyZWRDYnNba2V5XSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoLmVudGVyZWRDYnNba2V5XS5wdXNoKGNiKTtcbiAgICAgIH1cbiAgICAgIG5leHQoY2IpO1xuICAgIH0pXG4gIH1cbn1cblxuLyogICovXG5cbnZhciBIVE1MNUhpc3RvcnkgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChIaXN0b3J5KSB7XG4gIGZ1bmN0aW9uIEhUTUw1SGlzdG9yeSAocm91dGVyLCBiYXNlKSB7XG4gICAgSGlzdG9yeS5jYWxsKHRoaXMsIHJvdXRlciwgYmFzZSk7XG5cbiAgICB0aGlzLl9zdGFydExvY2F0aW9uID0gZ2V0TG9jYXRpb24odGhpcy5iYXNlKTtcbiAgfVxuXG4gIGlmICggSGlzdG9yeSApIEhUTUw1SGlzdG9yeS5fX3Byb3RvX18gPSBIaXN0b3J5O1xuICBIVE1MNUhpc3RvcnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggSGlzdG9yeSAmJiBIaXN0b3J5LnByb3RvdHlwZSApO1xuICBIVE1MNUhpc3RvcnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSFRNTDVIaXN0b3J5O1xuXG4gIEhUTUw1SGlzdG9yeS5wcm90b3R5cGUuc2V0dXBMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXR1cExpc3RlbmVycyAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBpZiAodGhpcy5saXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIHJvdXRlciA9IHRoaXMucm91dGVyO1xuICAgIHZhciBleHBlY3RTY3JvbGwgPSByb3V0ZXIub3B0aW9ucy5zY3JvbGxCZWhhdmlvcjtcbiAgICB2YXIgc3VwcG9ydHNTY3JvbGwgPSBzdXBwb3J0c1B1c2hTdGF0ZSAmJiBleHBlY3RTY3JvbGw7XG5cbiAgICBpZiAoc3VwcG9ydHNTY3JvbGwpIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goc2V0dXBTY3JvbGwoKSk7XG4gICAgfVxuXG4gICAgdmFyIGhhbmRsZVJvdXRpbmdFdmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gdGhpcyQxLmN1cnJlbnQ7XG5cbiAgICAgIC8vIEF2b2lkaW5nIGZpcnN0IGBwb3BzdGF0ZWAgZXZlbnQgZGlzcGF0Y2hlZCBpbiBzb21lIGJyb3dzZXJzIGJ1dCBmaXJzdFxuICAgICAgLy8gaGlzdG9yeSByb3V0ZSBub3QgdXBkYXRlZCBzaW5jZSBhc3luYyBndWFyZCBhdCB0aGUgc2FtZSB0aW1lLlxuICAgICAgdmFyIGxvY2F0aW9uID0gZ2V0TG9jYXRpb24odGhpcyQxLmJhc2UpO1xuICAgICAgaWYgKHRoaXMkMS5jdXJyZW50ID09PSBTVEFSVCAmJiBsb2NhdGlvbiA9PT0gdGhpcyQxLl9zdGFydExvY2F0aW9uKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICB0aGlzJDEudHJhbnNpdGlvblRvKGxvY2F0aW9uLCBmdW5jdGlvbiAocm91dGUpIHtcbiAgICAgICAgaWYgKHN1cHBvcnRzU2Nyb2xsKSB7XG4gICAgICAgICAgaGFuZGxlU2Nyb2xsKHJvdXRlciwgcm91dGUsIGN1cnJlbnQsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIGhhbmRsZVJvdXRpbmdFdmVudCk7XG4gICAgdGhpcy5saXN0ZW5lcnMucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBoYW5kbGVSb3V0aW5nRXZlbnQpO1xuICAgIH0pO1xuICB9O1xuXG4gIEhUTUw1SGlzdG9yeS5wcm90b3R5cGUuZ28gPSBmdW5jdGlvbiBnbyAobikge1xuICAgIHdpbmRvdy5oaXN0b3J5LmdvKG4pO1xuICB9O1xuXG4gIEhUTUw1SGlzdG9yeS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIHB1c2ggKGxvY2F0aW9uLCBvbkNvbXBsZXRlLCBvbkFib3J0KSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgcmVmID0gdGhpcztcbiAgICB2YXIgZnJvbVJvdXRlID0gcmVmLmN1cnJlbnQ7XG4gICAgdGhpcy50cmFuc2l0aW9uVG8obG9jYXRpb24sIGZ1bmN0aW9uIChyb3V0ZSkge1xuICAgICAgcHVzaFN0YXRlKGNsZWFuUGF0aCh0aGlzJDEuYmFzZSArIHJvdXRlLmZ1bGxQYXRoKSk7XG4gICAgICBoYW5kbGVTY3JvbGwodGhpcyQxLnJvdXRlciwgcm91dGUsIGZyb21Sb3V0ZSwgZmFsc2UpO1xuICAgICAgb25Db21wbGV0ZSAmJiBvbkNvbXBsZXRlKHJvdXRlKTtcbiAgICB9LCBvbkFib3J0KTtcbiAgfTtcblxuICBIVE1MNUhpc3RvcnkucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbiByZXBsYWNlIChsb2NhdGlvbiwgb25Db21wbGV0ZSwgb25BYm9ydCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdmFyIHJlZiA9IHRoaXM7XG4gICAgdmFyIGZyb21Sb3V0ZSA9IHJlZi5jdXJyZW50O1xuICAgIHRoaXMudHJhbnNpdGlvblRvKGxvY2F0aW9uLCBmdW5jdGlvbiAocm91dGUpIHtcbiAgICAgIHJlcGxhY2VTdGF0ZShjbGVhblBhdGgodGhpcyQxLmJhc2UgKyByb3V0ZS5mdWxsUGF0aCkpO1xuICAgICAgaGFuZGxlU2Nyb2xsKHRoaXMkMS5yb3V0ZXIsIHJvdXRlLCBmcm9tUm91dGUsIGZhbHNlKTtcbiAgICAgIG9uQ29tcGxldGUgJiYgb25Db21wbGV0ZShyb3V0ZSk7XG4gICAgfSwgb25BYm9ydCk7XG4gIH07XG5cbiAgSFRNTDVIaXN0b3J5LnByb3RvdHlwZS5lbnN1cmVVUkwgPSBmdW5jdGlvbiBlbnN1cmVVUkwgKHB1c2gpIHtcbiAgICBpZiAoZ2V0TG9jYXRpb24odGhpcy5iYXNlKSAhPT0gdGhpcy5jdXJyZW50LmZ1bGxQYXRoKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGNsZWFuUGF0aCh0aGlzLmJhc2UgKyB0aGlzLmN1cnJlbnQuZnVsbFBhdGgpO1xuICAgICAgcHVzaCA/IHB1c2hTdGF0ZShjdXJyZW50KSA6IHJlcGxhY2VTdGF0ZShjdXJyZW50KTtcbiAgICB9XG4gIH07XG5cbiAgSFRNTDVIaXN0b3J5LnByb3RvdHlwZS5nZXRDdXJyZW50TG9jYXRpb24gPSBmdW5jdGlvbiBnZXRDdXJyZW50TG9jYXRpb24gKCkge1xuICAgIHJldHVybiBnZXRMb2NhdGlvbih0aGlzLmJhc2UpXG4gIH07XG5cbiAgcmV0dXJuIEhUTUw1SGlzdG9yeTtcbn0oSGlzdG9yeSkpO1xuXG5mdW5jdGlvbiBnZXRMb2NhdGlvbiAoYmFzZSkge1xuICB2YXIgcGF0aCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcbiAgdmFyIHBhdGhMb3dlckNhc2UgPSBwYXRoLnRvTG93ZXJDYXNlKCk7XG4gIHZhciBiYXNlTG93ZXJDYXNlID0gYmFzZS50b0xvd2VyQ2FzZSgpO1xuICAvLyBiYXNlPVwiL2FcIiBzaG91bGRuJ3QgdHVybiBwYXRoPVwiL2FwcFwiIGludG8gXCIvYS9wcFwiXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtcm91dGVyL2lzc3Vlcy8zNTU1XG4gIC8vIHNvIHdlIGVuc3VyZSB0aGUgdHJhaWxpbmcgc2xhc2ggaW4gdGhlIGJhc2VcbiAgaWYgKGJhc2UgJiYgKChwYXRoTG93ZXJDYXNlID09PSBiYXNlTG93ZXJDYXNlKSB8fFxuICAgIChwYXRoTG93ZXJDYXNlLmluZGV4T2YoY2xlYW5QYXRoKGJhc2VMb3dlckNhc2UgKyAnLycpKSA9PT0gMCkpKSB7XG4gICAgcGF0aCA9IHBhdGguc2xpY2UoYmFzZS5sZW5ndGgpO1xuICB9XG4gIHJldHVybiAocGF0aCB8fCAnLycpICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCArIHdpbmRvdy5sb2NhdGlvbi5oYXNoXG59XG5cbi8qICAqL1xuXG52YXIgSGFzaEhpc3RvcnkgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uIChIaXN0b3J5KSB7XG4gIGZ1bmN0aW9uIEhhc2hIaXN0b3J5IChyb3V0ZXIsIGJhc2UsIGZhbGxiYWNrKSB7XG4gICAgSGlzdG9yeS5jYWxsKHRoaXMsIHJvdXRlciwgYmFzZSk7XG4gICAgLy8gY2hlY2sgaGlzdG9yeSBmYWxsYmFjayBkZWVwbGlua2luZ1xuICAgIGlmIChmYWxsYmFjayAmJiBjaGVja0ZhbGxiYWNrKHRoaXMuYmFzZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBlbnN1cmVTbGFzaCgpO1xuICB9XG5cbiAgaWYgKCBIaXN0b3J5ICkgSGFzaEhpc3RvcnkuX19wcm90b19fID0gSGlzdG9yeTtcbiAgSGFzaEhpc3RvcnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggSGlzdG9yeSAmJiBIaXN0b3J5LnByb3RvdHlwZSApO1xuICBIYXNoSGlzdG9yeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBIYXNoSGlzdG9yeTtcblxuICAvLyB0aGlzIGlzIGRlbGF5ZWQgdW50aWwgdGhlIGFwcCBtb3VudHNcbiAgLy8gdG8gYXZvaWQgdGhlIGhhc2hjaGFuZ2UgbGlzdGVuZXIgYmVpbmcgZmlyZWQgdG9vIGVhcmx5XG4gIEhhc2hIaXN0b3J5LnByb3RvdHlwZS5zZXR1cExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldHVwTGlzdGVuZXJzICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIGlmICh0aGlzLmxpc3RlbmVycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgcm91dGVyID0gdGhpcy5yb3V0ZXI7XG4gICAgdmFyIGV4cGVjdFNjcm9sbCA9IHJvdXRlci5vcHRpb25zLnNjcm9sbEJlaGF2aW9yO1xuICAgIHZhciBzdXBwb3J0c1Njcm9sbCA9IHN1cHBvcnRzUHVzaFN0YXRlICYmIGV4cGVjdFNjcm9sbDtcblxuICAgIGlmIChzdXBwb3J0c1Njcm9sbCkge1xuICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChzZXR1cFNjcm9sbCgpKTtcbiAgICB9XG5cbiAgICB2YXIgaGFuZGxlUm91dGluZ0V2ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzJDEuY3VycmVudDtcbiAgICAgIGlmICghZW5zdXJlU2xhc2goKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHRoaXMkMS50cmFuc2l0aW9uVG8oZ2V0SGFzaCgpLCBmdW5jdGlvbiAocm91dGUpIHtcbiAgICAgICAgaWYgKHN1cHBvcnRzU2Nyb2xsKSB7XG4gICAgICAgICAgaGFuZGxlU2Nyb2xsKHRoaXMkMS5yb3V0ZXIsIHJvdXRlLCBjdXJyZW50LCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN1cHBvcnRzUHVzaFN0YXRlKSB7XG4gICAgICAgICAgcmVwbGFjZUhhc2gocm91dGUuZnVsbFBhdGgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHZhciBldmVudFR5cGUgPSBzdXBwb3J0c1B1c2hTdGF0ZSA/ICdwb3BzdGF0ZScgOiAnaGFzaGNoYW5nZSc7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBldmVudFR5cGUsXG4gICAgICBoYW5kbGVSb3V0aW5nRXZlbnRcbiAgICApO1xuICAgIHRoaXMubGlzdGVuZXJzLnB1c2goZnVuY3Rpb24gKCkge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVSb3V0aW5nRXZlbnQpO1xuICAgIH0pO1xuICB9O1xuXG4gIEhhc2hIaXN0b3J5LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gcHVzaCAobG9jYXRpb24sIG9uQ29tcGxldGUsIG9uQWJvcnQpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciByZWYgPSB0aGlzO1xuICAgIHZhciBmcm9tUm91dGUgPSByZWYuY3VycmVudDtcbiAgICB0aGlzLnRyYW5zaXRpb25UbyhcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgICAgIHB1c2hIYXNoKHJvdXRlLmZ1bGxQYXRoKTtcbiAgICAgICAgaGFuZGxlU2Nyb2xsKHRoaXMkMS5yb3V0ZXIsIHJvdXRlLCBmcm9tUm91dGUsIGZhbHNlKTtcbiAgICAgICAgb25Db21wbGV0ZSAmJiBvbkNvbXBsZXRlKHJvdXRlKTtcbiAgICAgIH0sXG4gICAgICBvbkFib3J0XG4gICAgKTtcbiAgfTtcblxuICBIYXNoSGlzdG9yeS5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2UgKGxvY2F0aW9uLCBvbkNvbXBsZXRlLCBvbkFib3J0KSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgcmVmID0gdGhpcztcbiAgICB2YXIgZnJvbVJvdXRlID0gcmVmLmN1cnJlbnQ7XG4gICAgdGhpcy50cmFuc2l0aW9uVG8oXG4gICAgICBsb2NhdGlvbixcbiAgICAgIGZ1bmN0aW9uIChyb3V0ZSkge1xuICAgICAgICByZXBsYWNlSGFzaChyb3V0ZS5mdWxsUGF0aCk7XG4gICAgICAgIGhhbmRsZVNjcm9sbCh0aGlzJDEucm91dGVyLCByb3V0ZSwgZnJvbVJvdXRlLCBmYWxzZSk7XG4gICAgICAgIG9uQ29tcGxldGUgJiYgb25Db21wbGV0ZShyb3V0ZSk7XG4gICAgICB9LFxuICAgICAgb25BYm9ydFxuICAgICk7XG4gIH07XG5cbiAgSGFzaEhpc3RvcnkucHJvdG90eXBlLmdvID0gZnVuY3Rpb24gZ28gKG4pIHtcbiAgICB3aW5kb3cuaGlzdG9yeS5nbyhuKTtcbiAgfTtcblxuICBIYXNoSGlzdG9yeS5wcm90b3R5cGUuZW5zdXJlVVJMID0gZnVuY3Rpb24gZW5zdXJlVVJMIChwdXNoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQuZnVsbFBhdGg7XG4gICAgaWYgKGdldEhhc2goKSAhPT0gY3VycmVudCkge1xuICAgICAgcHVzaCA/IHB1c2hIYXNoKGN1cnJlbnQpIDogcmVwbGFjZUhhc2goY3VycmVudCk7XG4gICAgfVxuICB9O1xuXG4gIEhhc2hIaXN0b3J5LnByb3RvdHlwZS5nZXRDdXJyZW50TG9jYXRpb24gPSBmdW5jdGlvbiBnZXRDdXJyZW50TG9jYXRpb24gKCkge1xuICAgIHJldHVybiBnZXRIYXNoKClcbiAgfTtcblxuICByZXR1cm4gSGFzaEhpc3Rvcnk7XG59KEhpc3RvcnkpKTtcblxuZnVuY3Rpb24gY2hlY2tGYWxsYmFjayAoYmFzZSkge1xuICB2YXIgbG9jYXRpb24gPSBnZXRMb2NhdGlvbihiYXNlKTtcbiAgaWYgKCEvXlxcLyMvLnRlc3QobG9jYXRpb24pKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlcGxhY2UoY2xlYW5QYXRoKGJhc2UgKyAnLyMnICsgbG9jYXRpb24pKTtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG5cbmZ1bmN0aW9uIGVuc3VyZVNsYXNoICgpIHtcbiAgdmFyIHBhdGggPSBnZXRIYXNoKCk7XG4gIGlmIChwYXRoLmNoYXJBdCgwKSA9PT0gJy8nKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICByZXBsYWNlSGFzaCgnLycgKyBwYXRoKTtcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIGdldEhhc2ggKCkge1xuICAvLyBXZSBjYW4ndCB1c2Ugd2luZG93LmxvY2F0aW9uLmhhc2ggaGVyZSBiZWNhdXNlIGl0J3Mgbm90XG4gIC8vIGNvbnNpc3RlbnQgYWNyb3NzIGJyb3dzZXJzIC0gRmlyZWZveCB3aWxsIHByZS1kZWNvZGUgaXQhXG4gIHZhciBocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHZhciBpbmRleCA9IGhyZWYuaW5kZXhPZignIycpO1xuICAvLyBlbXB0eSBwYXRoXG4gIGlmIChpbmRleCA8IDApIHsgcmV0dXJuICcnIH1cblxuICBocmVmID0gaHJlZi5zbGljZShpbmRleCArIDEpO1xuXG4gIHJldHVybiBocmVmXG59XG5cbmZ1bmN0aW9uIGdldFVybCAocGF0aCkge1xuICB2YXIgaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICB2YXIgaSA9IGhyZWYuaW5kZXhPZignIycpO1xuICB2YXIgYmFzZSA9IGkgPj0gMCA/IGhyZWYuc2xpY2UoMCwgaSkgOiBocmVmO1xuICByZXR1cm4gKGJhc2UgKyBcIiNcIiArIHBhdGgpXG59XG5cbmZ1bmN0aW9uIHB1c2hIYXNoIChwYXRoKSB7XG4gIGlmIChzdXBwb3J0c1B1c2hTdGF0ZSkge1xuICAgIHB1c2hTdGF0ZShnZXRVcmwocGF0aCkpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gcGF0aDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlSGFzaCAocGF0aCkge1xuICBpZiAoc3VwcG9ydHNQdXNoU3RhdGUpIHtcbiAgICByZXBsYWNlU3RhdGUoZ2V0VXJsKHBhdGgpKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShnZXRVcmwocGF0aCkpO1xuICB9XG59XG5cbi8qICAqL1xuXG52YXIgQWJzdHJhY3RIaXN0b3J5ID0gLypAX19QVVJFX18qLyhmdW5jdGlvbiAoSGlzdG9yeSkge1xuICBmdW5jdGlvbiBBYnN0cmFjdEhpc3RvcnkgKHJvdXRlciwgYmFzZSkge1xuICAgIEhpc3RvcnkuY2FsbCh0aGlzLCByb3V0ZXIsIGJhc2UpO1xuICAgIHRoaXMuc3RhY2sgPSBbXTtcbiAgICB0aGlzLmluZGV4ID0gLTE7XG4gIH1cblxuICBpZiAoIEhpc3RvcnkgKSBBYnN0cmFjdEhpc3RvcnkuX19wcm90b19fID0gSGlzdG9yeTtcbiAgQWJzdHJhY3RIaXN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEhpc3RvcnkgJiYgSGlzdG9yeS5wcm90b3R5cGUgKTtcbiAgQWJzdHJhY3RIaXN0b3J5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFic3RyYWN0SGlzdG9yeTtcblxuICBBYnN0cmFjdEhpc3RvcnkucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoIChsb2NhdGlvbiwgb25Db21wbGV0ZSwgb25BYm9ydCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gICAgdGhpcy50cmFuc2l0aW9uVG8oXG4gICAgICBsb2NhdGlvbixcbiAgICAgIGZ1bmN0aW9uIChyb3V0ZSkge1xuICAgICAgICB0aGlzJDEuc3RhY2sgPSB0aGlzJDEuc3RhY2suc2xpY2UoMCwgdGhpcyQxLmluZGV4ICsgMSkuY29uY2F0KHJvdXRlKTtcbiAgICAgICAgdGhpcyQxLmluZGV4Kys7XG4gICAgICAgIG9uQ29tcGxldGUgJiYgb25Db21wbGV0ZShyb3V0ZSk7XG4gICAgICB9LFxuICAgICAgb25BYm9ydFxuICAgICk7XG4gIH07XG5cbiAgQWJzdHJhY3RIaXN0b3J5LnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZSAobG9jYXRpb24sIG9uQ29tcGxldGUsIG9uQWJvcnQpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHRoaXMudHJhbnNpdGlvblRvKFxuICAgICAgbG9jYXRpb24sXG4gICAgICBmdW5jdGlvbiAocm91dGUpIHtcbiAgICAgICAgdGhpcyQxLnN0YWNrID0gdGhpcyQxLnN0YWNrLnNsaWNlKDAsIHRoaXMkMS5pbmRleCkuY29uY2F0KHJvdXRlKTtcbiAgICAgICAgb25Db21wbGV0ZSAmJiBvbkNvbXBsZXRlKHJvdXRlKTtcbiAgICAgIH0sXG4gICAgICBvbkFib3J0XG4gICAgKTtcbiAgfTtcblxuICBBYnN0cmFjdEhpc3RvcnkucHJvdG90eXBlLmdvID0gZnVuY3Rpb24gZ28gKG4pIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHZhciB0YXJnZXRJbmRleCA9IHRoaXMuaW5kZXggKyBuO1xuICAgIGlmICh0YXJnZXRJbmRleCA8IDAgfHwgdGFyZ2V0SW5kZXggPj0gdGhpcy5zdGFjay5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YXIgcm91dGUgPSB0aGlzLnN0YWNrW3RhcmdldEluZGV4XTtcbiAgICB0aGlzLmNvbmZpcm1UcmFuc2l0aW9uKFxuICAgICAgcm91dGUsXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcmV2ID0gdGhpcyQxLmN1cnJlbnQ7XG4gICAgICAgIHRoaXMkMS5pbmRleCA9IHRhcmdldEluZGV4O1xuICAgICAgICB0aGlzJDEudXBkYXRlUm91dGUocm91dGUpO1xuICAgICAgICB0aGlzJDEucm91dGVyLmFmdGVySG9va3MuZm9yRWFjaChmdW5jdGlvbiAoaG9vaykge1xuICAgICAgICAgIGhvb2sgJiYgaG9vayhyb3V0ZSwgcHJldik7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgaWYgKGlzTmF2aWdhdGlvbkZhaWx1cmUoZXJyLCBOYXZpZ2F0aW9uRmFpbHVyZVR5cGUuZHVwbGljYXRlZCkpIHtcbiAgICAgICAgICB0aGlzJDEuaW5kZXggPSB0YXJnZXRJbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgQWJzdHJhY3RIaXN0b3J5LnByb3RvdHlwZS5nZXRDdXJyZW50TG9jYXRpb24gPSBmdW5jdGlvbiBnZXRDdXJyZW50TG9jYXRpb24gKCkge1xuICAgIHZhciBjdXJyZW50ID0gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBjdXJyZW50ID8gY3VycmVudC5mdWxsUGF0aCA6ICcvJ1xuICB9O1xuXG4gIEFic3RyYWN0SGlzdG9yeS5wcm90b3R5cGUuZW5zdXJlVVJMID0gZnVuY3Rpb24gZW5zdXJlVVJMICgpIHtcbiAgICAvLyBub29wXG4gIH07XG5cbiAgcmV0dXJuIEFic3RyYWN0SGlzdG9yeTtcbn0oSGlzdG9yeSkpO1xuXG4vKiAgKi9cblxudmFyIFZ1ZVJvdXRlciA9IGZ1bmN0aW9uIFZ1ZVJvdXRlciAob3B0aW9ucykge1xuICBpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuICB0aGlzLmFwcCA9IG51bGw7XG4gIHRoaXMuYXBwcyA9IFtdO1xuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB0aGlzLmJlZm9yZUhvb2tzID0gW107XG4gIHRoaXMucmVzb2x2ZUhvb2tzID0gW107XG4gIHRoaXMuYWZ0ZXJIb29rcyA9IFtdO1xuICB0aGlzLm1hdGNoZXIgPSBjcmVhdGVNYXRjaGVyKG9wdGlvbnMucm91dGVzIHx8IFtdLCB0aGlzKTtcblxuICB2YXIgbW9kZSA9IG9wdGlvbnMubW9kZSB8fCAnaGFzaCc7XG4gIHRoaXMuZmFsbGJhY2sgPVxuICAgIG1vZGUgPT09ICdoaXN0b3J5JyAmJiAhc3VwcG9ydHNQdXNoU3RhdGUgJiYgb3B0aW9ucy5mYWxsYmFjayAhPT0gZmFsc2U7XG4gIGlmICh0aGlzLmZhbGxiYWNrKSB7XG4gICAgbW9kZSA9ICdoYXNoJztcbiAgfVxuICBpZiAoIWluQnJvd3Nlcikge1xuICAgIG1vZGUgPSAnYWJzdHJhY3QnO1xuICB9XG4gIHRoaXMubW9kZSA9IG1vZGU7XG5cbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSAnaGlzdG9yeSc6XG4gICAgICB0aGlzLmhpc3RvcnkgPSBuZXcgSFRNTDVIaXN0b3J5KHRoaXMsIG9wdGlvbnMuYmFzZSk7XG4gICAgICBicmVha1xuICAgIGNhc2UgJ2hhc2gnOlxuICAgICAgdGhpcy5oaXN0b3J5ID0gbmV3IEhhc2hIaXN0b3J5KHRoaXMsIG9wdGlvbnMuYmFzZSwgdGhpcy5mYWxsYmFjayk7XG4gICAgICBicmVha1xuICAgIGNhc2UgJ2Fic3RyYWN0JzpcbiAgICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBBYnN0cmFjdEhpc3RvcnkodGhpcywgb3B0aW9ucy5iYXNlKTtcbiAgICAgIGJyZWFrXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGFzc2VydChmYWxzZSwgKFwiaW52YWxpZCBtb2RlOiBcIiArIG1vZGUpKTtcbiAgICAgIH1cbiAgfVxufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgY3VycmVudFJvdXRlOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cblZ1ZVJvdXRlci5wcm90b3R5cGUubWF0Y2ggPSBmdW5jdGlvbiBtYXRjaCAocmF3LCBjdXJyZW50LCByZWRpcmVjdGVkRnJvbSkge1xuICByZXR1cm4gdGhpcy5tYXRjaGVyLm1hdGNoKHJhdywgY3VycmVudCwgcmVkaXJlY3RlZEZyb20pXG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMuY3VycmVudFJvdXRlLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuaGlzdG9yeSAmJiB0aGlzLmhpc3RvcnkuY3VycmVudFxufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gaW5pdCAoYXBwIC8qIFZ1ZSBjb21wb25lbnQgaW5zdGFuY2UgKi8pIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgYXNzZXJ0KFxuICAgICAgaW5zdGFsbC5pbnN0YWxsZWQsXG4gICAgICBcIm5vdCBpbnN0YWxsZWQuIE1ha2Ugc3VyZSB0byBjYWxsIGBWdWUudXNlKFZ1ZVJvdXRlcilgIFwiICtcbiAgICAgICAgXCJiZWZvcmUgY3JlYXRpbmcgcm9vdCBpbnN0YW5jZS5cIlxuICAgICk7XG5cbiAgdGhpcy5hcHBzLnB1c2goYXBwKTtcblxuICAvLyBzZXQgdXAgYXBwIGRlc3Ryb3llZCBoYW5kbGVyXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy92dWUtcm91dGVyL2lzc3Vlcy8yNjM5XG4gIGFwcC4kb25jZSgnaG9vazpkZXN0cm95ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gY2xlYW4gb3V0IGFwcCBmcm9tIHRoaXMuYXBwcyBhcnJheSBvbmNlIGRlc3Ryb3llZFxuICAgIHZhciBpbmRleCA9IHRoaXMkMS5hcHBzLmluZGV4T2YoYXBwKTtcbiAgICBpZiAoaW5kZXggPiAtMSkgeyB0aGlzJDEuYXBwcy5zcGxpY2UoaW5kZXgsIDEpOyB9XG4gICAgLy8gZW5zdXJlIHdlIHN0aWxsIGhhdmUgYSBtYWluIGFwcCBvciBudWxsIGlmIG5vIGFwcHNcbiAgICAvLyB3ZSBkbyBub3QgcmVsZWFzZSB0aGUgcm91dGVyIHNvIGl0IGNhbiBiZSByZXVzZWRcbiAgICBpZiAodGhpcyQxLmFwcCA9PT0gYXBwKSB7IHRoaXMkMS5hcHAgPSB0aGlzJDEuYXBwc1swXSB8fCBudWxsOyB9XG5cbiAgICBpZiAoIXRoaXMkMS5hcHApIHsgdGhpcyQxLmhpc3RvcnkudGVhcmRvd24oKTsgfVxuICB9KTtcblxuICAvLyBtYWluIGFwcCBwcmV2aW91c2x5IGluaXRpYWxpemVkXG4gIC8vIHJldHVybiBhcyB3ZSBkb24ndCBuZWVkIHRvIHNldCB1cCBuZXcgaGlzdG9yeSBsaXN0ZW5lclxuICBpZiAodGhpcy5hcHApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRoaXMuYXBwID0gYXBwO1xuXG4gIHZhciBoaXN0b3J5ID0gdGhpcy5oaXN0b3J5O1xuXG4gIGlmIChoaXN0b3J5IGluc3RhbmNlb2YgSFRNTDVIaXN0b3J5IHx8IGhpc3RvcnkgaW5zdGFuY2VvZiBIYXNoSGlzdG9yeSkge1xuICAgIHZhciBoYW5kbGVJbml0aWFsU2Nyb2xsID0gZnVuY3Rpb24gKHJvdXRlT3JFcnJvcikge1xuICAgICAgdmFyIGZyb20gPSBoaXN0b3J5LmN1cnJlbnQ7XG4gICAgICB2YXIgZXhwZWN0U2Nyb2xsID0gdGhpcyQxLm9wdGlvbnMuc2Nyb2xsQmVoYXZpb3I7XG4gICAgICB2YXIgc3VwcG9ydHNTY3JvbGwgPSBzdXBwb3J0c1B1c2hTdGF0ZSAmJiBleHBlY3RTY3JvbGw7XG5cbiAgICAgIGlmIChzdXBwb3J0c1Njcm9sbCAmJiAnZnVsbFBhdGgnIGluIHJvdXRlT3JFcnJvcikge1xuICAgICAgICBoYW5kbGVTY3JvbGwodGhpcyQxLCByb3V0ZU9yRXJyb3IsIGZyb20sIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBzZXR1cExpc3RlbmVycyA9IGZ1bmN0aW9uIChyb3V0ZU9yRXJyb3IpIHtcbiAgICAgIGhpc3Rvcnkuc2V0dXBMaXN0ZW5lcnMoKTtcbiAgICAgIGhhbmRsZUluaXRpYWxTY3JvbGwocm91dGVPckVycm9yKTtcbiAgICB9O1xuICAgIGhpc3RvcnkudHJhbnNpdGlvblRvKFxuICAgICAgaGlzdG9yeS5nZXRDdXJyZW50TG9jYXRpb24oKSxcbiAgICAgIHNldHVwTGlzdGVuZXJzLFxuICAgICAgc2V0dXBMaXN0ZW5lcnNcbiAgICApO1xuICB9XG5cbiAgaGlzdG9yeS5saXN0ZW4oZnVuY3Rpb24gKHJvdXRlKSB7XG4gICAgdGhpcyQxLmFwcHMuZm9yRWFjaChmdW5jdGlvbiAoYXBwKSB7XG4gICAgICBhcHAuX3JvdXRlID0gcm91dGU7XG4gICAgfSk7XG4gIH0pO1xufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5iZWZvcmVFYWNoID0gZnVuY3Rpb24gYmVmb3JlRWFjaCAoZm4pIHtcbiAgcmV0dXJuIHJlZ2lzdGVySG9vayh0aGlzLmJlZm9yZUhvb2tzLCBmbilcbn07XG5cblZ1ZVJvdXRlci5wcm90b3R5cGUuYmVmb3JlUmVzb2x2ZSA9IGZ1bmN0aW9uIGJlZm9yZVJlc29sdmUgKGZuKSB7XG4gIHJldHVybiByZWdpc3Rlckhvb2sodGhpcy5yZXNvbHZlSG9va3MsIGZuKVxufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5hZnRlckVhY2ggPSBmdW5jdGlvbiBhZnRlckVhY2ggKGZuKSB7XG4gIHJldHVybiByZWdpc3Rlckhvb2sodGhpcy5hZnRlckhvb2tzLCBmbilcbn07XG5cblZ1ZVJvdXRlci5wcm90b3R5cGUub25SZWFkeSA9IGZ1bmN0aW9uIG9uUmVhZHkgKGNiLCBlcnJvckNiKSB7XG4gIHRoaXMuaGlzdG9yeS5vblJlYWR5KGNiLCBlcnJvckNiKTtcbn07XG5cblZ1ZVJvdXRlci5wcm90b3R5cGUub25FcnJvciA9IGZ1bmN0aW9uIG9uRXJyb3IgKGVycm9yQ2IpIHtcbiAgdGhpcy5oaXN0b3J5Lm9uRXJyb3IoZXJyb3JDYik7XG59O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoIChsb2NhdGlvbiwgb25Db21wbGV0ZSwgb25BYm9ydCkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIC8vICRmbG93LWRpc2FibGUtbGluZVxuICBpZiAoIW9uQ29tcGxldGUgJiYgIW9uQWJvcnQgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHRoaXMkMS5oaXN0b3J5LnB1c2gobG9jYXRpb24sIHJlc29sdmUsIHJlamVjdCk7XG4gICAgfSlcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmhpc3RvcnkucHVzaChsb2NhdGlvbiwgb25Db21wbGV0ZSwgb25BYm9ydCk7XG4gIH1cbn07XG5cblZ1ZVJvdXRlci5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uIHJlcGxhY2UgKGxvY2F0aW9uLCBvbkNvbXBsZXRlLCBvbkFib3J0KSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gIGlmICghb25Db21wbGV0ZSAmJiAhb25BYm9ydCAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdGhpcyQxLmhpc3RvcnkucmVwbGFjZShsb2NhdGlvbiwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHRoaXMuaGlzdG9yeS5yZXBsYWNlKGxvY2F0aW9uLCBvbkNvbXBsZXRlLCBvbkFib3J0KTtcbiAgfVxufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5nbyA9IGZ1bmN0aW9uIGdvIChuKSB7XG4gIHRoaXMuaGlzdG9yeS5nbyhuKTtcbn07XG5cblZ1ZVJvdXRlci5wcm90b3R5cGUuYmFjayA9IGZ1bmN0aW9uIGJhY2sgKCkge1xuICB0aGlzLmdvKC0xKTtcbn07XG5cblZ1ZVJvdXRlci5wcm90b3R5cGUuZm9yd2FyZCA9IGZ1bmN0aW9uIGZvcndhcmQgKCkge1xuICB0aGlzLmdvKDEpO1xufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5nZXRNYXRjaGVkQ29tcG9uZW50cyA9IGZ1bmN0aW9uIGdldE1hdGNoZWRDb21wb25lbnRzICh0bykge1xuICB2YXIgcm91dGUgPSB0b1xuICAgID8gdG8ubWF0Y2hlZFxuICAgICAgPyB0b1xuICAgICAgOiB0aGlzLnJlc29sdmUodG8pLnJvdXRlXG4gICAgOiB0aGlzLmN1cnJlbnRSb3V0ZTtcbiAgaWYgKCFyb3V0ZSkge1xuICAgIHJldHVybiBbXVxuICB9XG4gIHJldHVybiBbXS5jb25jYXQuYXBwbHkoXG4gICAgW10sXG4gICAgcm91dGUubWF0Y2hlZC5tYXAoZnVuY3Rpb24gKG0pIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhtLmNvbXBvbmVudHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBtLmNvbXBvbmVudHNba2V5XVxuICAgICAgfSlcbiAgICB9KVxuICApXG59O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbiByZXNvbHZlIChcbiAgdG8sXG4gIGN1cnJlbnQsXG4gIGFwcGVuZFxuKSB7XG4gIGN1cnJlbnQgPSBjdXJyZW50IHx8IHRoaXMuaGlzdG9yeS5jdXJyZW50O1xuICB2YXIgbG9jYXRpb24gPSBub3JtYWxpemVMb2NhdGlvbih0bywgY3VycmVudCwgYXBwZW5kLCB0aGlzKTtcbiAgdmFyIHJvdXRlID0gdGhpcy5tYXRjaChsb2NhdGlvbiwgY3VycmVudCk7XG4gIHZhciBmdWxsUGF0aCA9IHJvdXRlLnJlZGlyZWN0ZWRGcm9tIHx8IHJvdXRlLmZ1bGxQYXRoO1xuICB2YXIgYmFzZSA9IHRoaXMuaGlzdG9yeS5iYXNlO1xuICB2YXIgaHJlZiA9IGNyZWF0ZUhyZWYoYmFzZSwgZnVsbFBhdGgsIHRoaXMubW9kZSk7XG4gIHJldHVybiB7XG4gICAgbG9jYXRpb246IGxvY2F0aW9uLFxuICAgIHJvdXRlOiByb3V0ZSxcbiAgICBocmVmOiBocmVmLFxuICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0XG4gICAgbm9ybWFsaXplZFRvOiBsb2NhdGlvbixcbiAgICByZXNvbHZlZDogcm91dGVcbiAgfVxufTtcblxuVnVlUm91dGVyLnByb3RvdHlwZS5nZXRSb3V0ZXMgPSBmdW5jdGlvbiBnZXRSb3V0ZXMgKCkge1xuICByZXR1cm4gdGhpcy5tYXRjaGVyLmdldFJvdXRlcygpXG59O1xuXG5WdWVSb3V0ZXIucHJvdG90eXBlLmFkZFJvdXRlID0gZnVuY3Rpb24gYWRkUm91dGUgKHBhcmVudE9yUm91dGUsIHJvdXRlKSB7XG4gIHRoaXMubWF0Y2hlci5hZGRSb3V0ZShwYXJlbnRPclJvdXRlLCByb3V0ZSk7XG4gIGlmICh0aGlzLmhpc3RvcnkuY3VycmVudCAhPT0gU1RBUlQpIHtcbiAgICB0aGlzLmhpc3RvcnkudHJhbnNpdGlvblRvKHRoaXMuaGlzdG9yeS5nZXRDdXJyZW50TG9jYXRpb24oKSk7XG4gIH1cbn07XG5cblZ1ZVJvdXRlci5wcm90b3R5cGUuYWRkUm91dGVzID0gZnVuY3Rpb24gYWRkUm91dGVzIChyb3V0ZXMpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuKGZhbHNlLCAncm91dGVyLmFkZFJvdXRlcygpIGlzIGRlcHJlY2F0ZWQgYW5kIGhhcyBiZWVuIHJlbW92ZWQgaW4gVnVlIFJvdXRlciA0LiBVc2Ugcm91dGVyLmFkZFJvdXRlKCkgaW5zdGVhZC4nKTtcbiAgfVxuICB0aGlzLm1hdGNoZXIuYWRkUm91dGVzKHJvdXRlcyk7XG4gIGlmICh0aGlzLmhpc3RvcnkuY3VycmVudCAhPT0gU1RBUlQpIHtcbiAgICB0aGlzLmhpc3RvcnkudHJhbnNpdGlvblRvKHRoaXMuaGlzdG9yeS5nZXRDdXJyZW50TG9jYXRpb24oKSk7XG4gIH1cbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBWdWVSb3V0ZXIucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxuZnVuY3Rpb24gcmVnaXN0ZXJIb29rIChsaXN0LCBmbikge1xuICBsaXN0LnB1c2goZm4pO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBpID0gbGlzdC5pbmRleE9mKGZuKTtcbiAgICBpZiAoaSA+IC0xKSB7IGxpc3Quc3BsaWNlKGksIDEpOyB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlSHJlZiAoYmFzZSwgZnVsbFBhdGgsIG1vZGUpIHtcbiAgdmFyIHBhdGggPSBtb2RlID09PSAnaGFzaCcgPyAnIycgKyBmdWxsUGF0aCA6IGZ1bGxQYXRoO1xuICByZXR1cm4gYmFzZSA/IGNsZWFuUGF0aChiYXNlICsgJy8nICsgcGF0aCkgOiBwYXRoXG59XG5cblZ1ZVJvdXRlci5pbnN0YWxsID0gaW5zdGFsbDtcblZ1ZVJvdXRlci52ZXJzaW9uID0gJzMuNS4yJztcblZ1ZVJvdXRlci5pc05hdmlnYXRpb25GYWlsdXJlID0gaXNOYXZpZ2F0aW9uRmFpbHVyZTtcblZ1ZVJvdXRlci5OYXZpZ2F0aW9uRmFpbHVyZVR5cGUgPSBOYXZpZ2F0aW9uRmFpbHVyZVR5cGU7XG5WdWVSb3V0ZXIuU1RBUlRfTE9DQVRJT04gPSBTVEFSVDtcblxuaWYgKGluQnJvd3NlciAmJiB3aW5kb3cuVnVlKSB7XG4gIHdpbmRvdy5WdWUudXNlKFZ1ZVJvdXRlcik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZ1ZVJvdXRlcjtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3Z1ZS1yb3V0ZXIvZGlzdC92dWUtcm91dGVyLmVzbS5qc1xuLy8gbW9kdWxlIGlkID0gL29jcVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:////ocq\n")},"02w1":function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nexports.removeResizeListener = exports.addResizeListener = undefined;\n\nvar _resizeObserverPolyfill = __webpack_require__(\"z+gd\");\n\nvar _resizeObserverPolyfill2 = _interopRequireDefault(_resizeObserverPolyfill);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isServer = typeof window === 'undefined';\n\n/* istanbul ignore next */\nvar resizeHandler = function resizeHandler(entries) {\n for (var _iterator = entries, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n var _ref;\n\n if (_isArray) {\n if (_i >= _iterator.length) break;\n _ref = _iterator[_i++];\n } else {\n _i = _iterator.next();\n if (_i.done) break;\n _ref = _i.value;\n }\n\n var entry = _ref;\n\n var listeners = entry.target.__resizeListeners__ || [];\n if (listeners.length) {\n listeners.forEach(function (fn) {\n fn();\n });\n }\n }\n};\n\n/* istanbul ignore next */\nvar addResizeListener = exports.addResizeListener = function addResizeListener(element, fn) {\n if (isServer) return;\n if (!element.__resizeListeners__) {\n element.__resizeListeners__ = [];\n element.__ro__ = new _resizeObserverPolyfill2.default(resizeHandler);\n element.__ro__.observe(element);\n }\n element.__resizeListeners__.push(fn);\n};\n\n/* istanbul ignore next */\nvar removeResizeListener = exports.removeResizeListener = function removeResizeListener(element, fn) {\n if (!element || !element.__resizeListeners__) return;\n element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);\n if (!element.__resizeListeners__.length) {\n element.__ro__.disconnect();\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDJ3MS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lbGVtZW50LXVpL2xpYi91dGlscy9yZXNpemUtZXZlbnQuanM/ZDM2YyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLnJlbW92ZVJlc2l6ZUxpc3RlbmVyID0gZXhwb3J0cy5hZGRSZXNpemVMaXN0ZW5lciA9IHVuZGVmaW5lZDtcblxudmFyIF9yZXNpemVPYnNlcnZlclBvbHlmaWxsID0gcmVxdWlyZSgncmVzaXplLW9ic2VydmVyLXBvbHlmaWxsJyk7XG5cbnZhciBfcmVzaXplT2JzZXJ2ZXJQb2x5ZmlsbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZXNpemVPYnNlcnZlclBvbHlmaWxsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIGlzU2VydmVyID0gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCc7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG52YXIgcmVzaXplSGFuZGxlciA9IGZ1bmN0aW9uIHJlc2l6ZUhhbmRsZXIoZW50cmllcykge1xuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBlbnRyaWVzLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kgPSAwLCBfaXRlcmF0b3IgPSBfaXNBcnJheSA/IF9pdGVyYXRvciA6IF9pdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgIHZhciBfcmVmO1xuXG4gICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICBpZiAoX2kgPj0gX2l0ZXJhdG9yLmxlbmd0aCkgYnJlYWs7XG4gICAgICBfcmVmID0gX2l0ZXJhdG9yW19pKytdO1xuICAgIH0gZWxzZSB7XG4gICAgICBfaSA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAoX2kuZG9uZSkgYnJlYWs7XG4gICAgICBfcmVmID0gX2kudmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIGVudHJ5ID0gX3JlZjtcblxuICAgIHZhciBsaXN0ZW5lcnMgPSBlbnRyeS50YXJnZXQuX19yZXNpemVMaXN0ZW5lcnNfXyB8fCBbXTtcbiAgICBpZiAobGlzdGVuZXJzLmxlbmd0aCkge1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG52YXIgYWRkUmVzaXplTGlzdGVuZXIgPSBleHBvcnRzLmFkZFJlc2l6ZUxpc3RlbmVyID0gZnVuY3Rpb24gYWRkUmVzaXplTGlzdGVuZXIoZWxlbWVudCwgZm4pIHtcbiAgaWYgKGlzU2VydmVyKSByZXR1cm47XG4gIGlmICghZWxlbWVudC5fX3Jlc2l6ZUxpc3RlbmVyc19fKSB7XG4gICAgZWxlbWVudC5fX3Jlc2l6ZUxpc3RlbmVyc19fID0gW107XG4gICAgZWxlbWVudC5fX3JvX18gPSBuZXcgX3Jlc2l6ZU9ic2VydmVyUG9seWZpbGwyLmRlZmF1bHQocmVzaXplSGFuZGxlcik7XG4gICAgZWxlbWVudC5fX3JvX18ub2JzZXJ2ZShlbGVtZW50KTtcbiAgfVxuICBlbGVtZW50Ll9fcmVzaXplTGlzdGVuZXJzX18ucHVzaChmbik7XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIHJlbW92ZVJlc2l6ZUxpc3RlbmVyID0gZXhwb3J0cy5yZW1vdmVSZXNpemVMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZVJlc2l6ZUxpc3RlbmVyKGVsZW1lbnQsIGZuKSB7XG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5fX3Jlc2l6ZUxpc3RlbmVyc19fKSByZXR1cm47XG4gIGVsZW1lbnQuX19yZXNpemVMaXN0ZW5lcnNfXy5zcGxpY2UoZWxlbWVudC5fX3Jlc2l6ZUxpc3RlbmVyc19fLmluZGV4T2YoZm4pLCAxKTtcbiAgaWYgKCFlbGVtZW50Ll9fcmVzaXplTGlzdGVuZXJzX18ubGVuZ3RoKSB7XG4gICAgZWxlbWVudC5fX3JvX18uZGlzY29ubmVjdCgpO1xuICB9XG59O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2VsZW1lbnQtdWkvbGliL3V0aWxzL3Jlc2l6ZS1ldmVudC5qc1xuLy8gbW9kdWxlIGlkID0gMDJ3MVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///02w1\n")},"06OY":function(module,exports,__webpack_require__){eval("var META = __webpack_require__(\"3Eo+\")('meta');\nvar isObject = __webpack_require__(\"EqjI\");\nvar has = __webpack_require__(\"D2L2\");\nvar setDesc = __webpack_require__(\"evD5\").f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !__webpack_require__(\"S82l\")(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDZPWS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWV0YS5qcz9kM2EzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBNRVRBID0gcmVxdWlyZSgnLi9fdWlkJykoJ21ldGEnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHNldERlc2MgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGlkID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIEZSRUVaRSA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKTtcbn0pO1xudmFyIHNldE1ldGEgPSBmdW5jdGlvbiAoaXQpIHtcbiAgc2V0RGVzYyhpdCwgTUVUQSwgeyB2YWx1ZToge1xuICAgIGk6ICdPJyArICsraWQsIC8vIG9iamVjdCBJRFxuICAgIHc6IHt9ICAgICAgICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gfSk7XG59O1xudmFyIGZhc3RLZXkgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICAvLyByZXR1cm4gcHJpbWl0aXZlIHdpdGggcHJlZml4XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIWhhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQV0udztcbn07XG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKSBzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogTUVUQSxcbiAgTkVFRDogZmFsc2UsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWs6IGdldFdlYWssXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19tZXRhLmpzXG4vLyBtb2R1bGUgaWQgPSAwNk9ZXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///06OY\n")},"0hxZ":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\nvar GainAnalysis = __webpack_require__("Y2/2");\n\nfunction ReplayGain() {\n this.linprebuf = new_float(GainAnalysis.MAX_ORDER * 2);\n /**\n * left input samples, with pre-buffer\n */\n this.linpre = 0;\n this.lstepbuf = new_float(GainAnalysis.MAX_SAMPLES_PER_WINDOW + GainAnalysis.MAX_ORDER);\n /**\n * left "first step" (i.e. post first filter) samples\n */\n this.lstep = 0;\n this.loutbuf = new_float(GainAnalysis.MAX_SAMPLES_PER_WINDOW + GainAnalysis.MAX_ORDER);\n /**\n * left "out" (i.e. post second filter) samples\n */\n this.lout = 0;\n this.rinprebuf = new_float(GainAnalysis.MAX_ORDER * 2);\n /**\n * right input samples ...\n */\n this.rinpre = 0;\n this.rstepbuf = new_float(GainAnalysis.MAX_SAMPLES_PER_WINDOW + GainAnalysis.MAX_ORDER);\n this.rstep = 0;\n this.routbuf = new_float(GainAnalysis.MAX_SAMPLES_PER_WINDOW + GainAnalysis.MAX_ORDER);\n this.rout = 0;\n /**\n * number of samples required to reach number of milliseconds required\n * for RMS window\n */\n this.sampleWindow = 0;\n this.totsamp = 0;\n this.lsum = 0.;\n this.rsum = 0.;\n this.freqindex = 0;\n this.first = 0;\n this.A = new_int(0 | (GainAnalysis.STEPS_per_dB * GainAnalysis.MAX_dB));\n this.B = new_int(0 | (GainAnalysis.STEPS_per_dB * GainAnalysis.MAX_dB));\n\n}\n\nmodule.exports = ReplayGain;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMGh4Wi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sYW1lanMvc3JjL2pzL1JlcGxheUdhaW4uanM/ZDIxYyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24uanMnKTtcbnZhciBTeXN0ZW0gPSBjb21tb24uU3lzdGVtO1xudmFyIFZick1vZGUgPSBjb21tb24uVmJyTW9kZTtcbnZhciBGbG9hdCA9IGNvbW1vbi5GbG9hdDtcbnZhciBTaG9ydEJsb2NrID0gY29tbW9uLlNob3J0QmxvY2s7XG52YXIgVXRpbCA9IGNvbW1vbi5VdGlsO1xudmFyIEFycmF5cyA9IGNvbW1vbi5BcnJheXM7XG52YXIgbmV3X2FycmF5X24gPSBjb21tb24ubmV3X2FycmF5X247XG52YXIgbmV3X2J5dGUgPSBjb21tb24ubmV3X2J5dGU7XG52YXIgbmV3X2RvdWJsZSA9IGNvbW1vbi5uZXdfZG91YmxlO1xudmFyIG5ld19mbG9hdCA9IGNvbW1vbi5uZXdfZmxvYXQ7XG52YXIgbmV3X2Zsb2F0X24gPSBjb21tb24ubmV3X2Zsb2F0X247XG52YXIgbmV3X2ludCA9IGNvbW1vbi5uZXdfaW50O1xudmFyIG5ld19pbnRfbiA9IGNvbW1vbi5uZXdfaW50X247XG52YXIgYXNzZXJ0ID0gY29tbW9uLmFzc2VydDtcblxudmFyIEdhaW5BbmFseXNpcyA9IHJlcXVpcmUoJy4vR2FpbkFuYWx5c2lzLmpzJyk7XG5cbmZ1bmN0aW9uIFJlcGxheUdhaW4oKSB7XG4gICAgdGhpcy5saW5wcmVidWYgPSBuZXdfZmxvYXQoR2FpbkFuYWx5c2lzLk1BWF9PUkRFUiAqIDIpO1xuICAgIC8qKlxuICAgICAqIGxlZnQgaW5wdXQgc2FtcGxlcywgd2l0aCBwcmUtYnVmZmVyXG4gICAgICovXG4gICAgdGhpcy5saW5wcmUgPSAwO1xuICAgIHRoaXMubHN0ZXBidWYgPSBuZXdfZmxvYXQoR2FpbkFuYWx5c2lzLk1BWF9TQU1QTEVTX1BFUl9XSU5ET1cgKyBHYWluQW5hbHlzaXMuTUFYX09SREVSKTtcbiAgICAvKipcbiAgICAgKiBsZWZ0IFwiZmlyc3Qgc3RlcFwiIChpLmUuIHBvc3QgZmlyc3QgZmlsdGVyKSBzYW1wbGVzXG4gICAgICovXG4gICAgdGhpcy5sc3RlcCA9IDA7XG4gICAgdGhpcy5sb3V0YnVmID0gbmV3X2Zsb2F0KEdhaW5BbmFseXNpcy5NQVhfU0FNUExFU19QRVJfV0lORE9XICsgR2FpbkFuYWx5c2lzLk1BWF9PUkRFUik7XG4gICAgLyoqXG4gICAgICogbGVmdCBcIm91dFwiIChpLmUuIHBvc3Qgc2Vjb25kIGZpbHRlcikgc2FtcGxlc1xuICAgICAqL1xuICAgIHRoaXMubG91dCA9IDA7XG4gICAgdGhpcy5yaW5wcmVidWYgPSBuZXdfZmxvYXQoR2FpbkFuYWx5c2lzLk1BWF9PUkRFUiAqIDIpO1xuICAgIC8qKlxuICAgICAqIHJpZ2h0IGlucHV0IHNhbXBsZXMgLi4uXG4gICAgICovXG4gICAgdGhpcy5yaW5wcmUgPSAwO1xuICAgIHRoaXMucnN0ZXBidWYgPSBuZXdfZmxvYXQoR2FpbkFuYWx5c2lzLk1BWF9TQU1QTEVTX1BFUl9XSU5ET1cgKyBHYWluQW5hbHlzaXMuTUFYX09SREVSKTtcbiAgICB0aGlzLnJzdGVwID0gMDtcbiAgICB0aGlzLnJvdXRidWYgPSBuZXdfZmxvYXQoR2FpbkFuYWx5c2lzLk1BWF9TQU1QTEVTX1BFUl9XSU5ET1cgKyBHYWluQW5hbHlzaXMuTUFYX09SREVSKTtcbiAgICB0aGlzLnJvdXQgPSAwO1xuICAgIC8qKlxuICAgICAqIG51bWJlciBvZiBzYW1wbGVzIHJlcXVpcmVkIHRvIHJlYWNoIG51bWJlciBvZiBtaWxsaXNlY29uZHMgcmVxdWlyZWRcbiAgICAgKiBmb3IgUk1TIHdpbmRvd1xuICAgICAqL1xuICAgIHRoaXMuc2FtcGxlV2luZG93ID0gMDtcbiAgICB0aGlzLnRvdHNhbXAgPSAwO1xuICAgIHRoaXMubHN1bSA9IDAuO1xuICAgIHRoaXMucnN1bSA9IDAuO1xuICAgIHRoaXMuZnJlcWluZGV4ID0gMDtcbiAgICB0aGlzLmZpcnN0ID0gMDtcbiAgICB0aGlzLkEgPSBuZXdfaW50KDAgfCAoR2FpbkFuYWx5c2lzLlNURVBTX3Blcl9kQiAqIEdhaW5BbmFseXNpcy5NQVhfZEIpKTtcbiAgICB0aGlzLkIgPSBuZXdfaW50KDAgfCAoR2FpbkFuYWx5c2lzLlNURVBTX3Blcl9kQiAqIEdhaW5BbmFseXNpcy5NQVhfZEIpKTtcblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlcGxheUdhaW47XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9sYW1lanMvc3JjL2pzL1JlcGxheUdhaW4uanNcbi8vIG1vZHVsZSBpZCA9IDBoeFpcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///0hxZ\n')},"0kY3":function(module,exports,__webpack_require__){eval('module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== \'undefined\' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: \'Module\' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, \'__esModule\', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === \'object\' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, \'default\', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != \'string\') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module[\'default\']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, \'a\', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = "/dist/";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 104);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return normalizeComponent; });\n/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nfunction normalizeComponent (\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier, /* server only */\n shadowMode /* vue-cli only */\n) {\n // Vue.extend constructor export interop\n var options = typeof scriptExports === \'function\'\n ? scriptExports.options\n : scriptExports\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = \'data-v-\' + scopeId\n }\n\n var hook\n if (moduleIdentifier) { // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== \'undefined\') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () { injectStyles.call(this, this.$root.$options.shadowRoot) }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn\'t\n // go through the normalizer\n options._injectStyles = hook\n // register for functioal component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection (h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing\n ? [].concat(existing, hook)\n : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n\n\n/***/ }),\n\n/***/ 10:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("HJMx");\n\n/***/ }),\n\n/***/ 104:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n__webpack_require__.r(__webpack_exports__);\n\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/input-number/src/input-number.vue?vue&type=template&id=42f8cf66&\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n "div",\n {\n class: [\n "el-input-number",\n _vm.inputNumberSize ? "el-input-number--" + _vm.inputNumberSize : "",\n { "is-disabled": _vm.inputNumberDisabled },\n { "is-without-controls": !_vm.controls },\n { "is-controls-right": _vm.controlsAtRight }\n ],\n on: {\n dragstart: function($event) {\n $event.preventDefault()\n }\n }\n },\n [\n _vm.controls\n ? _c(\n "span",\n {\n directives: [\n {\n name: "repeat-click",\n rawName: "v-repeat-click",\n value: _vm.decrease,\n expression: "decrease"\n }\n ],\n staticClass: "el-input-number__decrease",\n class: { "is-disabled": _vm.minDisabled },\n attrs: { role: "button" },\n on: {\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")\n ) {\n return null\n }\n return _vm.decrease($event)\n }\n }\n },\n [\n _c("i", {\n class:\n "el-icon-" + (_vm.controlsAtRight ? "arrow-down" : "minus")\n })\n ]\n )\n : _vm._e(),\n _vm.controls\n ? _c(\n "span",\n {\n directives: [\n {\n name: "repeat-click",\n rawName: "v-repeat-click",\n value: _vm.increase,\n expression: "increase"\n }\n ],\n staticClass: "el-input-number__increase",\n class: { "is-disabled": _vm.maxDisabled },\n attrs: { role: "button" },\n on: {\n keydown: function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "enter", 13, $event.key, "Enter")\n ) {\n return null\n }\n return _vm.increase($event)\n }\n }\n },\n [\n _c("i", {\n class: "el-icon-" + (_vm.controlsAtRight ? "arrow-up" : "plus")\n })\n ]\n )\n : _vm._e(),\n _c("el-input", {\n ref: "input",\n attrs: {\n value: _vm.displayValue,\n placeholder: _vm.placeholder,\n disabled: _vm.inputNumberDisabled,\n size: _vm.inputNumberSize,\n max: _vm.max,\n min: _vm.min,\n name: _vm.name,\n label: _vm.label\n },\n on: {\n blur: _vm.handleBlur,\n focus: _vm.handleFocus,\n input: _vm.handleInput,\n change: _vm.handleInputChange\n },\n nativeOn: {\n keydown: [\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "up", 38, $event.key, ["Up", "ArrowUp"])\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.increase($event)\n },\n function($event) {\n if (\n !("button" in $event) &&\n _vm._k($event.keyCode, "down", 40, $event.key, [\n "Down",\n "ArrowDown"\n ])\n ) {\n return null\n }\n $event.preventDefault()\n return _vm.decrease($event)\n }\n ]\n }\n })\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n// CONCATENATED MODULE: ./packages/input-number/src/input-number.vue?vue&type=template&id=42f8cf66&\n\n// EXTERNAL MODULE: external "element-ui/lib/input"\nvar input_ = __webpack_require__(10);\nvar input_default = /*#__PURE__*/__webpack_require__.n(input_);\n\n// EXTERNAL MODULE: external "element-ui/lib/mixins/focus"\nvar focus_ = __webpack_require__(22);\nvar focus_default = /*#__PURE__*/__webpack_require__.n(focus_);\n\n// EXTERNAL MODULE: ./src/directives/repeat-click.js\nvar repeat_click = __webpack_require__(30);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib!./node_modules/vue-loader/lib??vue-loader-options!./packages/input-number/src/input-number.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n\n\n\n\n\n/* harmony default export */ var input_numbervue_type_script_lang_js_ = ({\n name: \'ElInputNumber\',\n mixins: [focus_default()(\'input\')],\n inject: {\n elForm: {\n default: \'\'\n },\n elFormItem: {\n default: \'\'\n }\n },\n directives: {\n repeatClick: repeat_click["a" /* default */]\n },\n components: {\n ElInput: input_default.a\n },\n props: {\n step: {\n type: Number,\n default: 1\n },\n stepStrictly: {\n type: Boolean,\n default: false\n },\n max: {\n type: Number,\n default: Infinity\n },\n min: {\n type: Number,\n default: -Infinity\n },\n value: {},\n disabled: Boolean,\n size: String,\n controls: {\n type: Boolean,\n default: true\n },\n controlsPosition: {\n type: String,\n default: \'\'\n },\n name: String,\n label: String,\n placeholder: String,\n precision: {\n type: Number,\n validator: function validator(val) {\n return val >= 0 && val === parseInt(val, 10);\n }\n }\n },\n data: function data() {\n return {\n currentValue: 0,\n userInput: null\n };\n },\n\n watch: {\n value: {\n immediate: true,\n handler: function handler(value) {\n var newVal = value === undefined ? value : Number(value);\n if (newVal !== undefined) {\n if (isNaN(newVal)) {\n return;\n }\n\n if (this.stepStrictly) {\n var stepPrecision = this.getPrecision(this.step);\n var precisionFactor = Math.pow(10, stepPrecision);\n newVal = Math.round(newVal / this.step) * precisionFactor * this.step / precisionFactor;\n }\n\n if (this.precision !== undefined) {\n newVal = this.toPrecision(newVal, this.precision);\n }\n }\n if (newVal >= this.max) newVal = this.max;\n if (newVal <= this.min) newVal = this.min;\n this.currentValue = newVal;\n this.userInput = null;\n this.$emit(\'input\', newVal);\n }\n }\n },\n computed: {\n minDisabled: function minDisabled() {\n return this._decrease(this.value, this.step) < this.min;\n },\n maxDisabled: function maxDisabled() {\n return this._increase(this.value, this.step) > this.max;\n },\n numPrecision: function numPrecision() {\n var value = this.value,\n step = this.step,\n getPrecision = this.getPrecision,\n precision = this.precision;\n\n var stepPrecision = getPrecision(step);\n if (precision !== undefined) {\n if (stepPrecision > precision) {\n console.warn(\'[Element Warn][InputNumber]precision should not be less than the decimal places of step\');\n }\n return precision;\n } else {\n return Math.max(getPrecision(value), stepPrecision);\n }\n },\n controlsAtRight: function controlsAtRight() {\n return this.controls && this.controlsPosition === \'right\';\n },\n _elFormItemSize: function _elFormItemSize() {\n return (this.elFormItem || {}).elFormItemSize;\n },\n inputNumberSize: function inputNumberSize() {\n return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;\n },\n inputNumberDisabled: function inputNumberDisabled() {\n return this.disabled || !!(this.elForm || {}).disabled;\n },\n displayValue: function displayValue() {\n if (this.userInput !== null) {\n return this.userInput;\n }\n\n var currentValue = this.currentValue;\n\n if (typeof currentValue === \'number\') {\n if (this.stepStrictly) {\n var stepPrecision = this.getPrecision(this.step);\n var precisionFactor = Math.pow(10, stepPrecision);\n currentValue = Math.round(currentValue / this.step) * precisionFactor * this.step / precisionFactor;\n }\n\n if (this.precision !== undefined) {\n currentValue = currentValue.toFixed(this.precision);\n }\n }\n\n return currentValue;\n }\n },\n methods: {\n toPrecision: function toPrecision(num, precision) {\n if (precision === undefined) precision = this.numPrecision;\n return parseFloat(Math.round(num * Math.pow(10, precision)) / Math.pow(10, precision));\n },\n getPrecision: function getPrecision(value) {\n if (value === undefined) return 0;\n var valueString = value.toString();\n var dotPosition = valueString.indexOf(\'.\');\n var precision = 0;\n if (dotPosition !== -1) {\n precision = valueString.length - dotPosition - 1;\n }\n return precision;\n },\n _increase: function _increase(val, step) {\n if (typeof val !== \'number\' && val !== undefined) return this.currentValue;\n\n var precisionFactor = Math.pow(10, this.numPrecision);\n // Solve the accuracy problem of JS decimal calculation by converting the value to integer.\n return this.toPrecision((precisionFactor * val + precisionFactor * step) / precisionFactor);\n },\n _decrease: function _decrease(val, step) {\n if (typeof val !== \'number\' && val !== undefined) return this.currentValue;\n\n var precisionFactor = Math.pow(10, this.numPrecision);\n\n return this.toPrecision((precisionFactor * val - precisionFactor * step) / precisionFactor);\n },\n increase: function increase() {\n if (this.inputNumberDisabled || this.maxDisabled) return;\n var value = this.value || 0;\n var newVal = this._increase(value, this.step);\n this.setCurrentValue(newVal);\n },\n decrease: function decrease() {\n if (this.inputNumberDisabled || this.minDisabled) return;\n var value = this.value || 0;\n var newVal = this._decrease(value, this.step);\n this.setCurrentValue(newVal);\n },\n handleBlur: function handleBlur(event) {\n this.$emit(\'blur\', event);\n },\n handleFocus: function handleFocus(event) {\n this.$emit(\'focus\', event);\n },\n setCurrentValue: function setCurrentValue(newVal) {\n var oldVal = this.currentValue;\n if (typeof newVal === \'number\' && this.precision !== undefined) {\n newVal = this.toPrecision(newVal, this.precision);\n }\n if (newVal >= this.max) newVal = this.max;\n if (newVal <= this.min) newVal = this.min;\n if (oldVal === newVal) return;\n this.userInput = null;\n this.$emit(\'input\', newVal);\n this.$emit(\'change\', newVal, oldVal);\n this.currentValue = newVal;\n },\n handleInput: function handleInput(value) {\n this.userInput = value;\n },\n handleInputChange: function handleInputChange(value) {\n var newVal = value === \'\' ? undefined : Number(value);\n if (!isNaN(newVal) || value === \'\') {\n this.setCurrentValue(newVal);\n }\n this.userInput = null;\n },\n select: function select() {\n this.$refs.input.select();\n }\n },\n mounted: function mounted() {\n var innerInput = this.$refs.input.$refs.input;\n innerInput.setAttribute(\'role\', \'spinbutton\');\n innerInput.setAttribute(\'aria-valuemax\', this.max);\n innerInput.setAttribute(\'aria-valuemin\', this.min);\n innerInput.setAttribute(\'aria-valuenow\', this.currentValue);\n innerInput.setAttribute(\'aria-disabled\', this.inputNumberDisabled);\n },\n updated: function updated() {\n if (!this.$refs || !this.$refs.input) return;\n var innerInput = this.$refs.input.$refs.input;\n innerInput.setAttribute(\'aria-valuenow\', this.currentValue);\n }\n});\n// CONCATENATED MODULE: ./packages/input-number/src/input-number.vue?vue&type=script&lang=js&\n /* harmony default export */ var src_input_numbervue_type_script_lang_js_ = (input_numbervue_type_script_lang_js_); \n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./packages/input-number/src/input-number.vue\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer["a" /* default */])(\n src_input_numbervue_type_script_lang_js_,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = "packages/input-number/src/input-number.vue"\n/* harmony default export */ var input_number = (component.exports);\n// CONCATENATED MODULE: ./packages/input-number/index.js\n\n\n/* istanbul ignore next */\ninput_number.install = function (Vue) {\n Vue.component(input_number.name, input_number);\n};\n\n/* harmony default export */ var packages_input_number = __webpack_exports__["default"] = (input_number);\n\n/***/ }),\n\n/***/ 2:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("2kvA");\n\n/***/ }),\n\n/***/ 22:\n/***/ (function(module, exports) {\n\nmodule.exports = __webpack_require__("1oZe");\n\n/***/ }),\n\n/***/ 30:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n"use strict";\n/* harmony import */ var element_ui_src_utils_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);\n/* harmony import */ var element_ui_src_utils_dom__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(element_ui_src_utils_dom__WEBPACK_IMPORTED_MODULE_0__);\n\n\n/* harmony default export */ __webpack_exports__["a"] = ({\n bind: function bind(el, binding, vnode) {\n var interval = null;\n var startTime = void 0;\n var handler = function handler() {\n return vnode.context[binding.expression].apply();\n };\n var clear = function clear() {\n if (Date.now() - startTime < 100) {\n handler();\n }\n clearInterval(interval);\n interval = null;\n };\n\n Object(element_ui_src_utils_dom__WEBPACK_IMPORTED_MODULE_0__["on"])(el, \'mousedown\', function (e) {\n if (e.button !== 0) return;\n startTime = Date.now();\n Object(element_ui_src_utils_dom__WEBPACK_IMPORTED_MODULE_0__["once"])(document, \'mouseup\', clear);\n clearInterval(interval);\n interval = setInterval(handler, 100);\n });\n }\n});\n\n/***/ })\n\n/******/ });//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMGtZMy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lbGVtZW50LXVpL2xpYi9pbnB1dC1udW1iZXIuanM/ZDI0NiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuLyoqKioqKi8gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuLyoqKioqKi8gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3Rcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbi8qKioqKiovIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4vKioqKioqLyBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuLyoqKioqKi8gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gbnM7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2Rpc3QvXCI7XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDEwNCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovICh7XG5cbi8qKiovIDA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBleHBvcnQgKGJpbmRpbmcpICovIF9fd2VicGFja19yZXF1aXJlX18uZChfX3dlYnBhY2tfZXhwb3J0c19fLCBcImFcIiwgZnVuY3Rpb24oKSB7IHJldHVybiBub3JtYWxpemVDb21wb25lbnQ7IH0pO1xuLyogZ2xvYmFscyBfX1ZVRV9TU1JfQ09OVEVYVF9fICovXG5cbi8vIElNUE9SVEFOVDogRG8gTk9UIHVzZSBFUzIwMTUgZmVhdHVyZXMgaW4gdGhpcyBmaWxlIChleGNlcHQgZm9yIG1vZHVsZXMpLlxuLy8gVGhpcyBtb2R1bGUgaXMgYSBydW50aW1lIHV0aWxpdHkgZm9yIGNsZWFuZXIgY29tcG9uZW50IG1vZHVsZSBvdXRwdXQgYW5kIHdpbGxcbi8vIGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCB3ZWJwYWNrIHVzZXIgYnVuZGxlLlxuXG5mdW5jdGlvbiBub3JtYWxpemVDb21wb25lbnQgKFxuICBzY3JpcHRFeHBvcnRzLFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZnVuY3Rpb25hbFRlbXBsYXRlLFxuICBpbmplY3RTdHlsZXMsXG4gIHNjb3BlSWQsXG4gIG1vZHVsZUlkZW50aWZpZXIsIC8qIHNlcnZlciBvbmx5ICovXG4gIHNoYWRvd01vZGUgLyogdnVlLWNsaSBvbmx5ICovXG4pIHtcbiAgLy8gVnVlLmV4dGVuZCBjb25zdHJ1Y3RvciBleHBvcnQgaW50ZXJvcFxuICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzY3JpcHRFeHBvcnRzID09PSAnZnVuY3Rpb24nXG4gICAgPyBzY3JpcHRFeHBvcnRzLm9wdGlvbnNcbiAgICA6IHNjcmlwdEV4cG9ydHNcblxuICAvLyByZW5kZXIgZnVuY3Rpb25zXG4gIGlmIChyZW5kZXIpIHtcbiAgICBvcHRpb25zLnJlbmRlciA9IHJlbmRlclxuICAgIG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gc3RhdGljUmVuZGVyRm5zXG4gICAgb3B0aW9ucy5fY29tcGlsZWQgPSB0cnVlXG4gIH1cblxuICAvLyBmdW5jdGlvbmFsIHRlbXBsYXRlXG4gIGlmIChmdW5jdGlvbmFsVGVtcGxhdGUpIHtcbiAgICBvcHRpb25zLmZ1bmN0aW9uYWwgPSB0cnVlXG4gIH1cblxuICAvLyBzY29wZWRJZFxuICBpZiAoc2NvcGVJZCkge1xuICAgIG9wdGlvbnMuX3Njb3BlSWQgPSAnZGF0YS12LScgKyBzY29wZUlkXG4gIH1cblxuICB2YXIgaG9va1xuICBpZiAobW9kdWxlSWRlbnRpZmllcikgeyAvLyBzZXJ2ZXIgYnVpbGRcbiAgICBob29rID0gZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgIC8vIDIuMyBpbmplY3Rpb25cbiAgICAgIGNvbnRleHQgPVxuICAgICAgICBjb250ZXh0IHx8IC8vIGNhY2hlZCBjYWxsXG4gICAgICAgICh0aGlzLiR2bm9kZSAmJiB0aGlzLiR2bm9kZS5zc3JDb250ZXh0KSB8fCAvLyBzdGF0ZWZ1bFxuICAgICAgICAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuJHZub2RlICYmIHRoaXMucGFyZW50LiR2bm9kZS5zc3JDb250ZXh0KSAvLyBmdW5jdGlvbmFsXG4gICAgICAvLyAyLjIgd2l0aCBydW5Jbk5ld0NvbnRleHQ6IHRydWVcbiAgICAgIGlmICghY29udGV4dCAmJiB0eXBlb2YgX19WVUVfU1NSX0NPTlRFWFRfXyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29udGV4dCA9IF9fVlVFX1NTUl9DT05URVhUX19cbiAgICAgIH1cbiAgICAgIC8vIGluamVjdCBjb21wb25lbnQgc3R5bGVzXG4gICAgICBpZiAoaW5qZWN0U3R5bGVzKSB7XG4gICAgICAgIGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIGNvbnRleHQpXG4gICAgICB9XG4gICAgICAvLyByZWdpc3RlciBjb21wb25lbnQgbW9kdWxlIGlkZW50aWZpZXIgZm9yIGFzeW5jIGNodW5rIGluZmVycmVuY2VcbiAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuX3JlZ2lzdGVyZWRDb21wb25lbnRzKSB7XG4gICAgICAgIGNvbnRleHQuX3JlZ2lzdGVyZWRDb21wb25lbnRzLmFkZChtb2R1bGVJZGVudGlmaWVyKVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB1c2VkIGJ5IHNzciBpbiBjYXNlIGNvbXBvbmVudCBpcyBjYWNoZWQgYW5kIGJlZm9yZUNyZWF0ZVxuICAgIC8vIG5ldmVyIGdldHMgY2FsbGVkXG4gICAgb3B0aW9ucy5fc3NyUmVnaXN0ZXIgPSBob29rXG4gIH0gZWxzZSBpZiAoaW5qZWN0U3R5bGVzKSB7XG4gICAgaG9vayA9IHNoYWRvd01vZGVcbiAgICAgID8gZnVuY3Rpb24gKCkgeyBpbmplY3RTdHlsZXMuY2FsbCh0aGlzLCB0aGlzLiRyb290LiRvcHRpb25zLnNoYWRvd1Jvb3QpIH1cbiAgICAgIDogaW5qZWN0U3R5bGVzXG4gIH1cblxuICBpZiAoaG9vaykge1xuICAgIGlmIChvcHRpb25zLmZ1bmN0aW9uYWwpIHtcbiAgICAgIC8vIGZvciB0ZW1wbGF0ZS1vbmx5IGhvdC1yZWxvYWQgYmVjYXVzZSBpbiB0aGF0IGNhc2UgdGhlIHJlbmRlciBmbiBkb2Vzbid0XG4gICAgICAvLyBnbyB0aHJvdWdoIHRoZSBub3JtYWxpemVyXG4gICAgICBvcHRpb25zLl9pbmplY3RTdHlsZXMgPSBob29rXG4gICAgICAvLyByZWdpc3RlciBmb3IgZnVuY3Rpb2FsIGNvbXBvbmVudCBpbiB2dWUgZmlsZVxuICAgICAgdmFyIG9yaWdpbmFsUmVuZGVyID0gb3B0aW9ucy5yZW5kZXJcbiAgICAgIG9wdGlvbnMucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyV2l0aFN0eWxlSW5qZWN0aW9uIChoLCBjb250ZXh0KSB7XG4gICAgICAgIGhvb2suY2FsbChjb250ZXh0KVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxSZW5kZXIoaCwgY29udGV4dClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCByZWdpc3RyYXRpb24gYXMgYmVmb3JlQ3JlYXRlIGhvb2tcbiAgICAgIHZhciBleGlzdGluZyA9IG9wdGlvbnMuYmVmb3JlQ3JlYXRlXG4gICAgICBvcHRpb25zLmJlZm9yZUNyZWF0ZSA9IGV4aXN0aW5nXG4gICAgICAgID8gW10uY29uY2F0KGV4aXN0aW5nLCBob29rKVxuICAgICAgICA6IFtob29rXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXhwb3J0czogc2NyaXB0RXhwb3J0cyxcbiAgICBvcHRpb25zOiBvcHRpb25zXG4gIH1cbn1cblxuXG4vKioqLyB9KSxcblxuLyoqKi8gMTA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL2lucHV0XCIpO1xuXG4vKioqLyB9KSxcblxuLyoqKi8gMTA0OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbl9fd2VicGFja19yZXF1aXJlX18ucihfX3dlYnBhY2tfZXhwb3J0c19fKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy90ZW1wbGF0ZUxvYWRlci5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9wYWNrYWdlcy9pbnB1dC1udW1iZXIvc3JjL2lucHV0LW51bWJlci52dWU/dnVlJnR5cGU9dGVtcGxhdGUmaWQ9NDJmOGNmNjYmXG52YXIgcmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBfdm0gPSB0aGlzXG4gIHZhciBfaCA9IF92bS4kY3JlYXRlRWxlbWVudFxuICB2YXIgX2MgPSBfdm0uX3NlbGYuX2MgfHwgX2hcbiAgcmV0dXJuIF9jKFxuICAgIFwiZGl2XCIsXG4gICAge1xuICAgICAgY2xhc3M6IFtcbiAgICAgICAgXCJlbC1pbnB1dC1udW1iZXJcIixcbiAgICAgICAgX3ZtLmlucHV0TnVtYmVyU2l6ZSA/IFwiZWwtaW5wdXQtbnVtYmVyLS1cIiArIF92bS5pbnB1dE51bWJlclNpemUgOiBcIlwiLFxuICAgICAgICB7IFwiaXMtZGlzYWJsZWRcIjogX3ZtLmlucHV0TnVtYmVyRGlzYWJsZWQgfSxcbiAgICAgICAgeyBcImlzLXdpdGhvdXQtY29udHJvbHNcIjogIV92bS5jb250cm9scyB9LFxuICAgICAgICB7IFwiaXMtY29udHJvbHMtcmlnaHRcIjogX3ZtLmNvbnRyb2xzQXRSaWdodCB9XG4gICAgICBdLFxuICAgICAgb246IHtcbiAgICAgICAgZHJhZ3N0YXJ0OiBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBfdm0uY29udHJvbHNcbiAgICAgICAgPyBfYyhcbiAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogXCJyZXBlYXQtY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1yZXBlYXQtY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uZGVjcmVhc2UsXG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImRlY3JlYXNlXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWlucHV0LW51bWJlcl9fZGVjcmVhc2VcIixcbiAgICAgICAgICAgICAgY2xhc3M6IHsgXCJpcy1kaXNhYmxlZFwiOiBfdm0ubWluRGlzYWJsZWQgfSxcbiAgICAgICAgICAgICAgYXR0cnM6IHsgcm9sZTogXCJidXR0b25cIiB9LFxuICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgIGtleWRvd246IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMsICRldmVudC5rZXksIFwiRW50ZXJcIilcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5kZWNyZWFzZSgkZXZlbnQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgIGNsYXNzOlxuICAgICAgICAgICAgICAgICAgXCJlbC1pY29uLVwiICsgKF92bS5jb250cm9sc0F0UmlnaHQgPyBcImFycm93LWRvd25cIiA6IFwibWludXNcIilcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICApXG4gICAgICAgIDogX3ZtLl9lKCksXG4gICAgICBfdm0uY29udHJvbHNcbiAgICAgICAgPyBfYyhcbiAgICAgICAgICAgIFwic3BhblwiLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkaXJlY3RpdmVzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogXCJyZXBlYXQtY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgIHJhd05hbWU6IFwidi1yZXBlYXQtY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiBfdm0uaW5jcmVhc2UsXG4gICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiBcImluY3JlYXNlXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHN0YXRpY0NsYXNzOiBcImVsLWlucHV0LW51bWJlcl9faW5jcmVhc2VcIixcbiAgICAgICAgICAgICAgY2xhc3M6IHsgXCJpcy1kaXNhYmxlZFwiOiBfdm0ubWF4RGlzYWJsZWQgfSxcbiAgICAgICAgICAgICAgYXR0cnM6IHsgcm9sZTogXCJidXR0b25cIiB9LFxuICAgICAgICAgICAgICBvbjoge1xuICAgICAgICAgICAgICAgIGtleWRvd246IGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhKFwiYnV0dG9uXCIgaW4gJGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwiZW50ZXJcIiwgMTMsICRldmVudC5rZXksIFwiRW50ZXJcIilcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIF92bS5pbmNyZWFzZSgkZXZlbnQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBfYyhcImlcIiwge1xuICAgICAgICAgICAgICAgIGNsYXNzOiBcImVsLWljb24tXCIgKyAoX3ZtLmNvbnRyb2xzQXRSaWdodCA/IFwiYXJyb3ctdXBcIiA6IFwicGx1c1wiKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXVxuICAgICAgICAgIClcbiAgICAgICAgOiBfdm0uX2UoKSxcbiAgICAgIF9jKFwiZWwtaW5wdXRcIiwge1xuICAgICAgICByZWY6IFwiaW5wdXRcIixcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB2YWx1ZTogX3ZtLmRpc3BsYXlWYWx1ZSxcbiAgICAgICAgICBwbGFjZWhvbGRlcjogX3ZtLnBsYWNlaG9sZGVyLFxuICAgICAgICAgIGRpc2FibGVkOiBfdm0uaW5wdXROdW1iZXJEaXNhYmxlZCxcbiAgICAgICAgICBzaXplOiBfdm0uaW5wdXROdW1iZXJTaXplLFxuICAgICAgICAgIG1heDogX3ZtLm1heCxcbiAgICAgICAgICBtaW46IF92bS5taW4sXG4gICAgICAgICAgbmFtZTogX3ZtLm5hbWUsXG4gICAgICAgICAgbGFiZWw6IF92bS5sYWJlbFxuICAgICAgICB9LFxuICAgICAgICBvbjoge1xuICAgICAgICAgIGJsdXI6IF92bS5oYW5kbGVCbHVyLFxuICAgICAgICAgIGZvY3VzOiBfdm0uaGFuZGxlRm9jdXMsXG4gICAgICAgICAgaW5wdXQ6IF92bS5oYW5kbGVJbnB1dCxcbiAgICAgICAgICBjaGFuZ2U6IF92bS5oYW5kbGVJbnB1dENoYW5nZVxuICAgICAgICB9LFxuICAgICAgICBuYXRpdmVPbjoge1xuICAgICAgICAgIGtleWRvd246IFtcbiAgICAgICAgICAgIGZ1bmN0aW9uKCRldmVudCkge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIShcImJ1dHRvblwiIGluICRldmVudCkgJiZcbiAgICAgICAgICAgICAgICBfdm0uX2soJGV2ZW50LmtleUNvZGUsIFwidXBcIiwgMzgsICRldmVudC5rZXksIFtcIlVwXCIsIFwiQXJyb3dVcFwiXSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICByZXR1cm4gX3ZtLmluY3JlYXNlKCRldmVudClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmdW5jdGlvbigkZXZlbnQpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICEoXCJidXR0b25cIiBpbiAkZXZlbnQpICYmXG4gICAgICAgICAgICAgICAgX3ZtLl9rKCRldmVudC5rZXlDb2RlLCBcImRvd25cIiwgNDAsICRldmVudC5rZXksIFtcbiAgICAgICAgICAgICAgICAgIFwiRG93blwiLFxuICAgICAgICAgICAgICAgICAgXCJBcnJvd0Rvd25cIlxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgcmV0dXJuIF92bS5kZWNyZWFzZSgkZXZlbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIF0sXG4gICAgMVxuICApXG59XG52YXIgc3RhdGljUmVuZGVyRm5zID0gW11cbnJlbmRlci5fd2l0aFN0cmlwcGVkID0gdHJ1ZVxuXG5cbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW5wdXQtbnVtYmVyL3NyYy9pbnB1dC1udW1iZXIudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTQyZjhjZjY2JlxuXG4vLyBFWFRFUk5BTCBNT0RVTEU6IGV4dGVybmFsIFwiZWxlbWVudC11aS9saWIvaW5wdXRcIlxudmFyIGlucHV0XyA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xudmFyIGlucHV0X2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGlucHV0Xyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogZXh0ZXJuYWwgXCJlbGVtZW50LXVpL2xpYi9taXhpbnMvZm9jdXNcIlxudmFyIGZvY3VzXyA9IF9fd2VicGFja19yZXF1aXJlX18oMjIpO1xudmFyIGZvY3VzX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGZvY3VzXyk7XG5cbi8vIEVYVEVSTkFMIE1PRFVMRTogLi9zcmMvZGlyZWN0aXZlcy9yZXBlYXQtY2xpY2suanNcbnZhciByZXBlYXRfY2xpY2sgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMwKTtcblxuLy8gQ09OQ0FURU5BVEVEIE1PRFVMRTogLi9ub2RlX21vZHVsZXMvYmFiZWwtbG9hZGVyL2xpYiEuL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYj8/dnVlLWxvYWRlci1vcHRpb25zIS4vcGFja2FnZXMvaW5wdXQtbnVtYmVyL3NyYy9pbnB1dC1udW1iZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cblxuXG5cblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgaW5wdXRfbnVtYmVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfID0gKHtcbiAgbmFtZTogJ0VsSW5wdXROdW1iZXInLFxuICBtaXhpbnM6IFtmb2N1c19kZWZhdWx0KCkoJ2lucHV0JyldLFxuICBpbmplY3Q6IHtcbiAgICBlbEZvcm06IHtcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICBlbEZvcm1JdGVtOiB7XG4gICAgICBkZWZhdWx0OiAnJ1xuICAgIH1cbiAgfSxcbiAgZGlyZWN0aXZlczoge1xuICAgIHJlcGVhdENsaWNrOiByZXBlYXRfY2xpY2tbXCJhXCIgLyogZGVmYXVsdCAqL11cbiAgfSxcbiAgY29tcG9uZW50czoge1xuICAgIEVsSW5wdXQ6IGlucHV0X2RlZmF1bHQuYVxuICB9LFxuICBwcm9wczoge1xuICAgIHN0ZXA6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IDFcbiAgICB9LFxuICAgIHN0ZXBTdHJpY3RseToge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfSxcbiAgICBtYXg6IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IEluZmluaXR5XG4gICAgfSxcbiAgICBtaW46IHtcbiAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgIGRlZmF1bHQ6IC1JbmZpbml0eVxuICAgIH0sXG4gICAgdmFsdWU6IHt9LFxuICAgIGRpc2FibGVkOiBCb29sZWFuLFxuICAgIHNpemU6IFN0cmluZyxcbiAgICBjb250cm9sczoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuICAgIGNvbnRyb2xzUG9zaXRpb246IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICBuYW1lOiBTdHJpbmcsXG4gICAgbGFiZWw6IFN0cmluZyxcbiAgICBwbGFjZWhvbGRlcjogU3RyaW5nLFxuICAgIHByZWNpc2lvbjoge1xuICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiB2YWxpZGF0b3IodmFsKSB7XG4gICAgICAgIHJldHVybiB2YWwgPj0gMCAmJiB2YWwgPT09IHBhcnNlSW50KHZhbCwgMTApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZGF0YTogZnVuY3Rpb24gZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiAwLFxuICAgICAgdXNlcklucHV0OiBudWxsXG4gICAgfTtcbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHZhbHVlOiB7XG4gICAgICBpbW1lZGlhdGU6IHRydWUsXG4gICAgICBoYW5kbGVyOiBmdW5jdGlvbiBoYW5kbGVyKHZhbHVlKSB7XG4gICAgICAgIHZhciBuZXdWYWwgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBOdW1iZXIodmFsdWUpO1xuICAgICAgICBpZiAobmV3VmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoaXNOYU4obmV3VmFsKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0aGlzLnN0ZXBTdHJpY3RseSkge1xuICAgICAgICAgICAgdmFyIHN0ZXBQcmVjaXNpb24gPSB0aGlzLmdldFByZWNpc2lvbih0aGlzLnN0ZXApO1xuICAgICAgICAgICAgdmFyIHByZWNpc2lvbkZhY3RvciA9IE1hdGgucG93KDEwLCBzdGVwUHJlY2lzaW9uKTtcbiAgICAgICAgICAgIG5ld1ZhbCA9IE1hdGgucm91bmQobmV3VmFsIC8gdGhpcy5zdGVwKSAqIHByZWNpc2lvbkZhY3RvciAqIHRoaXMuc3RlcCAvIHByZWNpc2lvbkZhY3RvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3VmFsID0gdGhpcy50b1ByZWNpc2lvbihuZXdWYWwsIHRoaXMucHJlY2lzaW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld1ZhbCA+PSB0aGlzLm1heCkgbmV3VmFsID0gdGhpcy5tYXg7XG4gICAgICAgIGlmIChuZXdWYWwgPD0gdGhpcy5taW4pIG5ld1ZhbCA9IHRoaXMubWluO1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IG5ld1ZhbDtcbiAgICAgICAgdGhpcy51c2VySW5wdXQgPSBudWxsO1xuICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIG5ld1ZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBjb21wdXRlZDoge1xuICAgIG1pbkRpc2FibGVkOiBmdW5jdGlvbiBtaW5EaXNhYmxlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWNyZWFzZSh0aGlzLnZhbHVlLCB0aGlzLnN0ZXApIDwgdGhpcy5taW47XG4gICAgfSxcbiAgICBtYXhEaXNhYmxlZDogZnVuY3Rpb24gbWF4RGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5faW5jcmVhc2UodGhpcy52YWx1ZSwgdGhpcy5zdGVwKSA+IHRoaXMubWF4O1xuICAgIH0sXG4gICAgbnVtUHJlY2lzaW9uOiBmdW5jdGlvbiBudW1QcmVjaXNpb24oKSB7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlLFxuICAgICAgICAgIHN0ZXAgPSB0aGlzLnN0ZXAsXG4gICAgICAgICAgZ2V0UHJlY2lzaW9uID0gdGhpcy5nZXRQcmVjaXNpb24sXG4gICAgICAgICAgcHJlY2lzaW9uID0gdGhpcy5wcmVjaXNpb247XG5cbiAgICAgIHZhciBzdGVwUHJlY2lzaW9uID0gZ2V0UHJlY2lzaW9uKHN0ZXApO1xuICAgICAgaWYgKHByZWNpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChzdGVwUHJlY2lzaW9uID4gcHJlY2lzaW9uKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbRWxlbWVudCBXYXJuXVtJbnB1dE51bWJlcl1wcmVjaXNpb24gc2hvdWxkIG5vdCBiZSBsZXNzIHRoYW4gdGhlIGRlY2ltYWwgcGxhY2VzIG9mIHN0ZXAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJlY2lzaW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KGdldFByZWNpc2lvbih2YWx1ZSksIHN0ZXBQcmVjaXNpb24pO1xuICAgICAgfVxuICAgIH0sXG4gICAgY29udHJvbHNBdFJpZ2h0OiBmdW5jdGlvbiBjb250cm9sc0F0UmlnaHQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb250cm9scyAmJiB0aGlzLmNvbnRyb2xzUG9zaXRpb24gPT09ICdyaWdodCc7XG4gICAgfSxcbiAgICBfZWxGb3JtSXRlbVNpemU6IGZ1bmN0aW9uIF9lbEZvcm1JdGVtU2l6ZSgpIHtcbiAgICAgIHJldHVybiAodGhpcy5lbEZvcm1JdGVtIHx8IHt9KS5lbEZvcm1JdGVtU2l6ZTtcbiAgICB9LFxuICAgIGlucHV0TnVtYmVyU2l6ZTogZnVuY3Rpb24gaW5wdXROdW1iZXJTaXplKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2l6ZSB8fCB0aGlzLl9lbEZvcm1JdGVtU2l6ZSB8fCAodGhpcy4kRUxFTUVOVCB8fCB7fSkuc2l6ZTtcbiAgICB9LFxuICAgIGlucHV0TnVtYmVyRGlzYWJsZWQ6IGZ1bmN0aW9uIGlucHV0TnVtYmVyRGlzYWJsZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCAhISh0aGlzLmVsRm9ybSB8fCB7fSkuZGlzYWJsZWQ7XG4gICAgfSxcbiAgICBkaXNwbGF5VmFsdWU6IGZ1bmN0aW9uIGRpc3BsYXlWYWx1ZSgpIHtcbiAgICAgIGlmICh0aGlzLnVzZXJJbnB1dCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhpcy51c2VySW5wdXQ7XG4gICAgICB9XG5cbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSB0aGlzLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgaWYgKHR5cGVvZiBjdXJyZW50VmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmICh0aGlzLnN0ZXBTdHJpY3RseSkge1xuICAgICAgICAgIHZhciBzdGVwUHJlY2lzaW9uID0gdGhpcy5nZXRQcmVjaXNpb24odGhpcy5zdGVwKTtcbiAgICAgICAgICB2YXIgcHJlY2lzaW9uRmFjdG9yID0gTWF0aC5wb3coMTAsIHN0ZXBQcmVjaXNpb24pO1xuICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IE1hdGgucm91bmQoY3VycmVudFZhbHVlIC8gdGhpcy5zdGVwKSAqIHByZWNpc2lvbkZhY3RvciAqIHRoaXMuc3RlcCAvIHByZWNpc2lvbkZhY3RvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlLnRvRml4ZWQodGhpcy5wcmVjaXNpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgfVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgdG9QcmVjaXNpb246IGZ1bmN0aW9uIHRvUHJlY2lzaW9uKG51bSwgcHJlY2lzaW9uKSB7XG4gICAgICBpZiAocHJlY2lzaW9uID09PSB1bmRlZmluZWQpIHByZWNpc2lvbiA9IHRoaXMubnVtUHJlY2lzaW9uO1xuICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoTWF0aC5yb3VuZChudW0gKiBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKSkgLyBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKSk7XG4gICAgfSxcbiAgICBnZXRQcmVjaXNpb246IGZ1bmN0aW9uIGdldFByZWNpc2lvbih2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICAgICAgdmFyIHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgIHZhciBkb3RQb3NpdGlvbiA9IHZhbHVlU3RyaW5nLmluZGV4T2YoJy4nKTtcbiAgICAgIHZhciBwcmVjaXNpb24gPSAwO1xuICAgICAgaWYgKGRvdFBvc2l0aW9uICE9PSAtMSkge1xuICAgICAgICBwcmVjaXNpb24gPSB2YWx1ZVN0cmluZy5sZW5ndGggLSBkb3RQb3NpdGlvbiAtIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJlY2lzaW9uO1xuICAgIH0sXG4gICAgX2luY3JlYXNlOiBmdW5jdGlvbiBfaW5jcmVhc2UodmFsLCBzdGVwKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ251bWJlcicgJiYgdmFsICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgdmFyIHByZWNpc2lvbkZhY3RvciA9IE1hdGgucG93KDEwLCB0aGlzLm51bVByZWNpc2lvbik7XG4gICAgICAvLyBTb2x2ZSB0aGUgYWNjdXJhY3kgcHJvYmxlbSBvZiBKUyBkZWNpbWFsIGNhbGN1bGF0aW9uIGJ5IGNvbnZlcnRpbmcgdGhlIHZhbHVlIHRvIGludGVnZXIuXG4gICAgICByZXR1cm4gdGhpcy50b1ByZWNpc2lvbigocHJlY2lzaW9uRmFjdG9yICogdmFsICsgcHJlY2lzaW9uRmFjdG9yICogc3RlcCkgLyBwcmVjaXNpb25GYWN0b3IpO1xuICAgIH0sXG4gICAgX2RlY3JlYXNlOiBmdW5jdGlvbiBfZGVjcmVhc2UodmFsLCBzdGVwKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ251bWJlcicgJiYgdmFsICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgdmFyIHByZWNpc2lvbkZhY3RvciA9IE1hdGgucG93KDEwLCB0aGlzLm51bVByZWNpc2lvbik7XG5cbiAgICAgIHJldHVybiB0aGlzLnRvUHJlY2lzaW9uKChwcmVjaXNpb25GYWN0b3IgKiB2YWwgLSBwcmVjaXNpb25GYWN0b3IgKiBzdGVwKSAvIHByZWNpc2lvbkZhY3Rvcik7XG4gICAgfSxcbiAgICBpbmNyZWFzZTogZnVuY3Rpb24gaW5jcmVhc2UoKSB7XG4gICAgICBpZiAodGhpcy5pbnB1dE51bWJlckRpc2FibGVkIHx8IHRoaXMubWF4RGlzYWJsZWQpIHJldHVybjtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUgfHwgMDtcbiAgICAgIHZhciBuZXdWYWwgPSB0aGlzLl9pbmNyZWFzZSh2YWx1ZSwgdGhpcy5zdGVwKTtcbiAgICAgIHRoaXMuc2V0Q3VycmVudFZhbHVlKG5ld1ZhbCk7XG4gICAgfSxcbiAgICBkZWNyZWFzZTogZnVuY3Rpb24gZGVjcmVhc2UoKSB7XG4gICAgICBpZiAodGhpcy5pbnB1dE51bWJlckRpc2FibGVkIHx8IHRoaXMubWluRGlzYWJsZWQpIHJldHVybjtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUgfHwgMDtcbiAgICAgIHZhciBuZXdWYWwgPSB0aGlzLl9kZWNyZWFzZSh2YWx1ZSwgdGhpcy5zdGVwKTtcbiAgICAgIHRoaXMuc2V0Q3VycmVudFZhbHVlKG5ld1ZhbCk7XG4gICAgfSxcbiAgICBoYW5kbGVCbHVyOiBmdW5jdGlvbiBoYW5kbGVCbHVyKGV2ZW50KSB7XG4gICAgICB0aGlzLiRlbWl0KCdibHVyJywgZXZlbnQpO1xuICAgIH0sXG4gICAgaGFuZGxlRm9jdXM6IGZ1bmN0aW9uIGhhbmRsZUZvY3VzKGV2ZW50KSB7XG4gICAgICB0aGlzLiRlbWl0KCdmb2N1cycsIGV2ZW50KTtcbiAgICB9LFxuICAgIHNldEN1cnJlbnRWYWx1ZTogZnVuY3Rpb24gc2V0Q3VycmVudFZhbHVlKG5ld1ZhbCkge1xuICAgICAgdmFyIG9sZFZhbCA9IHRoaXMuY3VycmVudFZhbHVlO1xuICAgICAgaWYgKHR5cGVvZiBuZXdWYWwgPT09ICdudW1iZXInICYmIHRoaXMucHJlY2lzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3VmFsID0gdGhpcy50b1ByZWNpc2lvbihuZXdWYWwsIHRoaXMucHJlY2lzaW9uKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdWYWwgPj0gdGhpcy5tYXgpIG5ld1ZhbCA9IHRoaXMubWF4O1xuICAgICAgaWYgKG5ld1ZhbCA8PSB0aGlzLm1pbikgbmV3VmFsID0gdGhpcy5taW47XG4gICAgICBpZiAob2xkVmFsID09PSBuZXdWYWwpIHJldHVybjtcbiAgICAgIHRoaXMudXNlcklucHV0ID0gbnVsbDtcbiAgICAgIHRoaXMuJGVtaXQoJ2lucHV0JywgbmV3VmFsKTtcbiAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIG5ld1ZhbCwgb2xkVmFsKTtcbiAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gbmV3VmFsO1xuICAgIH0sXG4gICAgaGFuZGxlSW5wdXQ6IGZ1bmN0aW9uIGhhbmRsZUlucHV0KHZhbHVlKSB7XG4gICAgICB0aGlzLnVzZXJJbnB1dCA9IHZhbHVlO1xuICAgIH0sXG4gICAgaGFuZGxlSW5wdXRDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZUlucHV0Q2hhbmdlKHZhbHVlKSB7XG4gICAgICB2YXIgbmV3VmFsID0gdmFsdWUgPT09ICcnID8gdW5kZWZpbmVkIDogTnVtYmVyKHZhbHVlKTtcbiAgICAgIGlmICghaXNOYU4obmV3VmFsKSB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgdGhpcy5zZXRDdXJyZW50VmFsdWUobmV3VmFsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXNlcklucHV0ID0gbnVsbDtcbiAgICB9LFxuICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KCkge1xuICAgICAgdGhpcy4kcmVmcy5pbnB1dC5zZWxlY3QoKTtcbiAgICB9XG4gIH0sXG4gIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7XG4gICAgdmFyIGlubmVySW5wdXQgPSB0aGlzLiRyZWZzLmlucHV0LiRyZWZzLmlucHV0O1xuICAgIGlubmVySW5wdXQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3NwaW5idXR0b24nKTtcbiAgICBpbm5lcklucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW1heCcsIHRoaXMubWF4KTtcbiAgICBpbm5lcklucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW1pbicsIHRoaXMubWluKTtcbiAgICBpbm5lcklucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIHRoaXMuY3VycmVudFZhbHVlKTtcbiAgICBpbm5lcklucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsIHRoaXMuaW5wdXROdW1iZXJEaXNhYmxlZCk7XG4gIH0sXG4gIHVwZGF0ZWQ6IGZ1bmN0aW9uIHVwZGF0ZWQoKSB7XG4gICAgaWYgKCF0aGlzLiRyZWZzIHx8ICF0aGlzLiRyZWZzLmlucHV0KSByZXR1cm47XG4gICAgdmFyIGlubmVySW5wdXQgPSB0aGlzLiRyZWZzLmlucHV0LiRyZWZzLmlucHV0O1xuICAgIGlubmVySW5wdXQuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgdGhpcy5jdXJyZW50VmFsdWUpO1xuICB9XG59KTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW5wdXQtbnVtYmVyL3NyYy9pbnB1dC1udW1iZXIudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlxuIC8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gdmFyIHNyY19pbnB1dF9udW1iZXJ2dWVfdHlwZV9zY3JpcHRfbGFuZ19qc18gPSAoaW5wdXRfbnVtYmVydnVlX3R5cGVfc2NyaXB0X2xhbmdfanNfKTsgXG4vLyBFWFRFUk5BTCBNT0RVTEU6IC4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1xudmFyIGNvbXBvbmVudE5vcm1hbGl6ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG4vLyBDT05DQVRFTkFURUQgTU9EVUxFOiAuL3BhY2thZ2VzL2lucHV0LW51bWJlci9zcmMvaW5wdXQtbnVtYmVyLnZ1ZVxuXG5cblxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cblxudmFyIGNvbXBvbmVudCA9IE9iamVjdChjb21wb25lbnROb3JtYWxpemVyW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShcbiAgc3JjX2lucHV0X251bWJlcnZ1ZV90eXBlX3NjcmlwdF9sYW5nX2pzXyxcbiAgcmVuZGVyLFxuICBzdGF0aWNSZW5kZXJGbnMsXG4gIGZhbHNlLFxuICBudWxsLFxuICBudWxsLFxuICBudWxsXG4gIFxuKVxuXG4vKiBob3QgcmVsb2FkICovXG5pZiAoZmFsc2UpIHsgdmFyIGFwaTsgfVxuY29tcG9uZW50Lm9wdGlvbnMuX19maWxlID0gXCJwYWNrYWdlcy9pbnB1dC1udW1iZXIvc3JjL2lucHV0LW51bWJlci52dWVcIlxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgaW5wdXRfbnVtYmVyID0gKGNvbXBvbmVudC5leHBvcnRzKTtcbi8vIENPTkNBVEVOQVRFRCBNT0RVTEU6IC4vcGFja2FnZXMvaW5wdXQtbnVtYmVyL2luZGV4LmpzXG5cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlucHV0X251bWJlci5pbnN0YWxsID0gZnVuY3Rpb24gKFZ1ZSkge1xuICBWdWUuY29tcG9uZW50KGlucHV0X251bWJlci5uYW1lLCBpbnB1dF9udW1iZXIpO1xufTtcblxuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyB2YXIgcGFja2FnZXNfaW5wdXRfbnVtYmVyID0gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSAoaW5wdXRfbnVtYmVyKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDI6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZW1lbnQtdWkvbGliL3V0aWxzL2RvbVwiKTtcblxuLyoqKi8gfSksXG5cbi8qKiovIDIyOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVtZW50LXVpL2xpYi9taXhpbnMvZm9jdXNcIik7XG5cbi8qKiovIH0pLFxuXG4vKioqLyAzMDpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgZWxlbWVudF91aV9zcmNfdXRpbHNfZG9tX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIGVsZW1lbnRfdWlfc3JjX3V0aWxzX2RvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fX2RlZmF1bHQgPSAvKiNfX1BVUkVfXyovX193ZWJwYWNrX3JlcXVpcmVfXy5uKGVsZW1lbnRfdWlfc3JjX3V0aWxzX2RvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fKTtcblxuXG4vKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gKHtcbiAgYmluZDogZnVuY3Rpb24gYmluZChlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICB2YXIgaW50ZXJ2YWwgPSBudWxsO1xuICAgIHZhciBzdGFydFRpbWUgPSB2b2lkIDA7XG4gICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgICAgcmV0dXJuIHZub2RlLmNvbnRleHRbYmluZGluZy5leHByZXNzaW9uXS5hcHBseSgpO1xuICAgIH07XG4gICAgdmFyIGNsZWFyID0gZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IDEwMCkge1xuICAgICAgICBoYW5kbGVyKCk7XG4gICAgICB9XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgIGludGVydmFsID0gbnVsbDtcbiAgICB9O1xuXG4gICAgT2JqZWN0KGVsZW1lbnRfdWlfc3JjX3V0aWxzX2RvbV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9fW1wib25cIl0pKGVsLCAnbW91c2Vkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIE9iamVjdChlbGVtZW50X3VpX3NyY191dGlsc19kb21fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfX1tcIm9uY2VcIl0pKGRvY3VtZW50LCAnbW91c2V1cCcsIGNsZWFyKTtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChoYW5kbGVyLCAxMDApO1xuICAgIH0pO1xuICB9XG59KTtcblxuLyoqKi8gfSlcblxuLyoqKioqKi8gfSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvZWxlbWVudC11aS9saWIvaW5wdXQtbnVtYmVyLmpzXG4vLyBtb2R1bGUgaWQgPSAwa1kzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///0kY3\n')},"0mjX":function(module,exports,__webpack_require__){eval('//package mp3;\nvar 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\nvar L3Side = __webpack_require__("jhNZ");\n\nfunction GrInfo() {\n //float xr[] = new float[576];\n this.xr = new_float(576);\n //int l3_enc[] = new int[576];\n this.l3_enc = new_int(576);\n //int scalefac[] = new int[L3Side.SFBMAX];\n this.scalefac = new_int(L3Side.SFBMAX);\n this.xrpow_max = 0.;\n\n this.part2_3_length = 0;\n this.big_values = 0;\n this.count1 = 0;\n this.global_gain = 0;\n this.scalefac_compress = 0;\n this.block_type = 0;\n this.mixed_block_flag = 0;\n this.table_select = new_int(3);\n this.subblock_gain = new_int(3 + 1);\n this.region0_count = 0;\n this.region1_count = 0;\n this.preflag = 0;\n this.scalefac_scale = 0;\n this.count1table_select = 0;\n\n this.part2_length = 0;\n this.sfb_lmax = 0;\n this.sfb_smin = 0;\n this.psy_lmax = 0;\n this.sfbmax = 0;\n this.psymax = 0;\n this.sfbdivide = 0;\n this.width = new_int(L3Side.SFBMAX);\n this.window = new_int(L3Side.SFBMAX);\n this.count1bits = 0;\n /**\n * added for LSF\n */\n this.sfb_partition_table = null;\n this.slen = new_int(4);\n\n this.max_nonzero_coeff = 0;\n\n var self = this;\n function clone_int(array) {\n return new Int32Array(array);\n }\n function clone_float(array) {\n return new Float32Array(array);\n }\n this.assign = function (other) {\n self.xr = clone_float(other.xr); //.slice(0); //clone();\n self.l3_enc = clone_int(other.l3_enc); //.slice(0); //clone();\n self.scalefac = clone_int(other.scalefac);//.slice(0); //clone();\n self.xrpow_max = other.xrpow_max;\n\n self.part2_3_length = other.part2_3_length;\n self.big_values = other.big_values;\n self.count1 = other.count1;\n self.global_gain = other.global_gain;\n self.scalefac_compress = other.scalefac_compress;\n self.block_type = other.block_type;\n self.mixed_block_flag = other.mixed_block_flag;\n self.table_select = clone_int(other.table_select);//.slice(0); //clone();\n self.subblock_gain = clone_int(other.subblock_gain); //.slice(0); //.clone();\n self.region0_count = other.region0_count;\n self.region1_count = other.region1_count;\n self.preflag = other.preflag;\n self.scalefac_scale = other.scalefac_scale;\n self.count1table_select = other.count1table_select;\n\n self.part2_length = other.part2_length;\n self.sfb_lmax = other.sfb_lmax;\n self.sfb_smin = other.sfb_smin;\n self.psy_lmax = other.psy_lmax;\n self.sfbmax = other.sfbmax;\n self.psymax = other.psymax;\n self.sfbdivide = other.sfbdivide;\n self.width = clone_int(other.width); //.slice(0); //.clone();\n self.window = clone_int(other.window); //.slice(0); //.clone();\n self.count1bits = other.count1bits;\n\n self.sfb_partition_table = other.sfb_partition_table.slice(0); //.clone();\n self.slen = clone_int(other.slen); //.slice(0); //.clone();\n self.max_nonzero_coeff = other.max_nonzero_coeff;\n }\n}\n\nmodule.exports = GrInfo;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMG1qWC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sYW1lanMvc3JjL2pzL0dySW5mby5qcz9kMjY4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vcGFja2FnZSBtcDM7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24uanMnKTtcbnZhciBTeXN0ZW0gPSBjb21tb24uU3lzdGVtO1xudmFyIFZick1vZGUgPSBjb21tb24uVmJyTW9kZTtcbnZhciBGbG9hdCA9IGNvbW1vbi5GbG9hdDtcbnZhciBTaG9ydEJsb2NrID0gY29tbW9uLlNob3J0QmxvY2s7XG52YXIgVXRpbCA9IGNvbW1vbi5VdGlsO1xudmFyIEFycmF5cyA9IGNvbW1vbi5BcnJheXM7XG52YXIgbmV3X2FycmF5X24gPSBjb21tb24ubmV3X2FycmF5X247XG52YXIgbmV3X2J5dGUgPSBjb21tb24ubmV3X2J5dGU7XG52YXIgbmV3X2RvdWJsZSA9IGNvbW1vbi5uZXdfZG91YmxlO1xudmFyIG5ld19mbG9hdCA9IGNvbW1vbi5uZXdfZmxvYXQ7XG52YXIgbmV3X2Zsb2F0X24gPSBjb21tb24ubmV3X2Zsb2F0X247XG52YXIgbmV3X2ludCA9IGNvbW1vbi5uZXdfaW50O1xudmFyIG5ld19pbnRfbiA9IGNvbW1vbi5uZXdfaW50X247XG52YXIgYXNzZXJ0ID0gY29tbW9uLmFzc2VydDtcblxudmFyIEwzU2lkZSA9IHJlcXVpcmUoJy4vTDNTaWRlLmpzJyk7XG5cbmZ1bmN0aW9uIEdySW5mbygpIHtcbiAgICAvL2Zsb2F0IHhyW10gPSBuZXcgZmxvYXRbNTc2XTtcbiAgICB0aGlzLnhyID0gbmV3X2Zsb2F0KDU3Nik7XG4gICAgLy9pbnQgbDNfZW5jW10gPSBuZXcgaW50WzU3Nl07XG4gICAgdGhpcy5sM19lbmMgPSBuZXdfaW50KDU3Nik7XG4gICAgLy9pbnQgc2NhbGVmYWNbXSA9IG5ldyBpbnRbTDNTaWRlLlNGQk1BWF07XG4gICAgdGhpcy5zY2FsZWZhYyA9IG5ld19pbnQoTDNTaWRlLlNGQk1BWCk7XG4gICAgdGhpcy54cnBvd19tYXggPSAwLjtcblxuICAgIHRoaXMucGFydDJfM19sZW5ndGggPSAwO1xuICAgIHRoaXMuYmlnX3ZhbHVlcyA9IDA7XG4gICAgdGhpcy5jb3VudDEgPSAwO1xuICAgIHRoaXMuZ2xvYmFsX2dhaW4gPSAwO1xuICAgIHRoaXMuc2NhbGVmYWNfY29tcHJlc3MgPSAwO1xuICAgIHRoaXMuYmxvY2tfdHlwZSA9IDA7XG4gICAgdGhpcy5taXhlZF9ibG9ja19mbGFnID0gMDtcbiAgICB0aGlzLnRhYmxlX3NlbGVjdCA9IG5ld19pbnQoMyk7XG4gICAgdGhpcy5zdWJibG9ja19nYWluID0gbmV3X2ludCgzICsgMSk7XG4gICAgdGhpcy5yZWdpb24wX2NvdW50ID0gMDtcbiAgICB0aGlzLnJlZ2lvbjFfY291bnQgPSAwO1xuICAgIHRoaXMucHJlZmxhZyA9IDA7XG4gICAgdGhpcy5zY2FsZWZhY19zY2FsZSA9IDA7XG4gICAgdGhpcy5jb3VudDF0YWJsZV9zZWxlY3QgPSAwO1xuXG4gICAgdGhpcy5wYXJ0Ml9sZW5ndGggPSAwO1xuICAgIHRoaXMuc2ZiX2xtYXggPSAwO1xuICAgIHRoaXMuc2ZiX3NtaW4gPSAwO1xuICAgIHRoaXMucHN5X2xtYXggPSAwO1xuICAgIHRoaXMuc2ZibWF4ID0gMDtcbiAgICB0aGlzLnBzeW1heCA9IDA7XG4gICAgdGhpcy5zZmJkaXZpZGUgPSAwO1xuICAgIHRoaXMud2lkdGggPSBuZXdfaW50KEwzU2lkZS5TRkJNQVgpO1xuICAgIHRoaXMud2luZG93ID0gbmV3X2ludChMM1NpZGUuU0ZCTUFYKTtcbiAgICB0aGlzLmNvdW50MWJpdHMgPSAwO1xuICAgIC8qKlxuICAgICAqIGFkZGVkIGZvciBMU0ZcbiAgICAgKi9cbiAgICB0aGlzLnNmYl9wYXJ0aXRpb25fdGFibGUgPSBudWxsO1xuICAgIHRoaXMuc2xlbiA9IG5ld19pbnQoNCk7XG5cbiAgICB0aGlzLm1heF9ub256ZXJvX2NvZWZmID0gMDtcblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBmdW5jdGlvbiBjbG9uZV9pbnQoYXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KGFycmF5KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvbmVfZmxvYXQoYXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoYXJyYXkpO1xuICAgIH1cbiAgICB0aGlzLmFzc2lnbiA9IGZ1bmN0aW9uIChvdGhlcikge1xuICAgICAgICBzZWxmLnhyID0gY2xvbmVfZmxvYXQob3RoZXIueHIpOyAvLy5zbGljZSgwKTsgLy9jbG9uZSgpO1xuICAgICAgICBzZWxmLmwzX2VuYyA9IGNsb25lX2ludChvdGhlci5sM19lbmMpOyAvLy5zbGljZSgwKTsgLy9jbG9uZSgpO1xuICAgICAgICBzZWxmLnNjYWxlZmFjID0gY2xvbmVfaW50KG90aGVyLnNjYWxlZmFjKTsvLy5zbGljZSgwKTsgLy9jbG9uZSgpO1xuICAgICAgICBzZWxmLnhycG93X21heCA9IG90aGVyLnhycG93X21heDtcblxuICAgICAgICBzZWxmLnBhcnQyXzNfbGVuZ3RoID0gb3RoZXIucGFydDJfM19sZW5ndGg7XG4gICAgICAgIHNlbGYuYmlnX3ZhbHVlcyA9IG90aGVyLmJpZ192YWx1ZXM7XG4gICAgICAgIHNlbGYuY291bnQxID0gb3RoZXIuY291bnQxO1xuICAgICAgICBzZWxmLmdsb2JhbF9nYWluID0gb3RoZXIuZ2xvYmFsX2dhaW47XG4gICAgICAgIHNlbGYuc2NhbGVmYWNfY29tcHJlc3MgPSBvdGhlci5zY2FsZWZhY19jb21wcmVzcztcbiAgICAgICAgc2VsZi5ibG9ja190eXBlID0gb3RoZXIuYmxvY2tfdHlwZTtcbiAgICAgICAgc2VsZi5taXhlZF9ibG9ja19mbGFnID0gb3RoZXIubWl4ZWRfYmxvY2tfZmxhZztcbiAgICAgICAgc2VsZi50YWJsZV9zZWxlY3QgPSBjbG9uZV9pbnQob3RoZXIudGFibGVfc2VsZWN0KTsvLy5zbGljZSgwKTsgLy9jbG9uZSgpO1xuICAgICAgICBzZWxmLnN1YmJsb2NrX2dhaW4gPSBjbG9uZV9pbnQob3RoZXIuc3ViYmxvY2tfZ2Fpbik7IC8vLnNsaWNlKDApOyAvLy5jbG9uZSgpO1xuICAgICAgICBzZWxmLnJlZ2lvbjBfY291bnQgPSBvdGhlci5yZWdpb24wX2NvdW50O1xuICAgICAgICBzZWxmLnJlZ2lvbjFfY291bnQgPSBvdGhlci5yZWdpb24xX2NvdW50O1xuICAgICAgICBzZWxmLnByZWZsYWcgPSBvdGhlci5wcmVmbGFnO1xuICAgICAgICBzZWxmLnNjYWxlZmFjX3NjYWxlID0gb3RoZXIuc2NhbGVmYWNfc2NhbGU7XG4gICAgICAgIHNlbGYuY291bnQxdGFibGVfc2VsZWN0ID0gb3RoZXIuY291bnQxdGFibGVfc2VsZWN0O1xuXG4gICAgICAgIHNlbGYucGFydDJfbGVuZ3RoID0gb3RoZXIucGFydDJfbGVuZ3RoO1xuICAgICAgICBzZWxmLnNmYl9sbWF4ID0gb3RoZXIuc2ZiX2xtYXg7XG4gICAgICAgIHNlbGYuc2ZiX3NtaW4gPSBvdGhlci5zZmJfc21pbjtcbiAgICAgICAgc2VsZi5wc3lfbG1heCA9IG90aGVyLnBzeV9sbWF4O1xuICAgICAgICBzZWxmLnNmYm1heCA9IG90aGVyLnNmYm1heDtcbiAgICAgICAgc2VsZi5wc3ltYXggPSBvdGhlci5wc3ltYXg7XG4gICAgICAgIHNlbGYuc2ZiZGl2aWRlID0gb3RoZXIuc2ZiZGl2aWRlO1xuICAgICAgICBzZWxmLndpZHRoID0gY2xvbmVfaW50KG90aGVyLndpZHRoKTsgLy8uc2xpY2UoMCk7IC8vLmNsb25lKCk7XG4gICAgICAgIHNlbGYud2luZG93ID0gY2xvbmVfaW50KG90aGVyLndpbmRvdyk7IC8vLnNsaWNlKDApOyAvLy5jbG9uZSgpO1xuICAgICAgICBzZWxmLmNvdW50MWJpdHMgPSBvdGhlci5jb3VudDFiaXRzO1xuXG4gICAgICAgIHNlbGYuc2ZiX3BhcnRpdGlvbl90YWJsZSA9IG90aGVyLnNmYl9wYXJ0aXRpb25fdGFibGUuc2xpY2UoMCk7IC8vLmNsb25lKCk7XG4gICAgICAgIHNlbGYuc2xlbiA9IGNsb25lX2ludChvdGhlci5zbGVuKTsgLy8uc2xpY2UoMCk7IC8vLmNsb25lKCk7XG4gICAgICAgIHNlbGYubWF4X25vbnplcm9fY29lZmYgPSBvdGhlci5tYXhfbm9uemVyb19jb2VmZjtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gR3JJbmZvO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvbGFtZWpzL3NyYy9qcy9HckluZm8uanNcbi8vIG1vZHVsZSBpZCA9IDBtalhcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///0mjX\n')},"1P5u":function(module,exports,__webpack_require__){eval('/**\n * @licstart The following is the entire license notice for the\n * Javascript code in this page\n *\n * Copyright 2020 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the "License");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an "AS IS" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * @licend The above is the entire license notice for the\n * Javascript code in this page\n */\n\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(true)\n\t\tmodule.exports = factory();\n\telse if(typeof define === \'function\' && define.amd)\n\t\tdefine("pdfjs-dist/web/pdf_viewer", [], factory);\n\telse if(typeof exports === \'object\')\n\t\texports["pdfjs-dist/web/pdf_viewer"] = factory();\n\telse\n\t\troot["pdfjs-dist/web/pdf_viewer"] = root.pdfjsViewer = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __w_pdfjs_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __w_pdfjs_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__w_pdfjs_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__w_pdfjs_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__w_pdfjs_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__w_pdfjs_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__w_pdfjs_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== \'undefined\' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: \'Module\' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, \'__esModule\', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__w_pdfjs_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __w_pdfjs_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === \'object\' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__w_pdfjs_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, \'default\', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != \'string\') for(var key in value) __w_pdfjs_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__w_pdfjs_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module[\'default\']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__w_pdfjs_require__.d(getter, \'a\', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__w_pdfjs_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__w_pdfjs_require__.p = "";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __w_pdfjs_require__(__w_pdfjs_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nObject.defineProperty(exports, "AnnotationLayerBuilder", {\n enumerable: true,\n get: function get() {\n return _annotation_layer_builder.AnnotationLayerBuilder;\n }\n});\nObject.defineProperty(exports, "DefaultAnnotationLayerFactory", {\n enumerable: true,\n get: function get() {\n return _annotation_layer_builder.DefaultAnnotationLayerFactory;\n }\n});\nObject.defineProperty(exports, "DefaultTextLayerFactory", {\n enumerable: true,\n get: function get() {\n return _text_layer_builder.DefaultTextLayerFactory;\n }\n});\nObject.defineProperty(exports, "TextLayerBuilder", {\n enumerable: true,\n get: function get() {\n return _text_layer_builder.TextLayerBuilder;\n }\n});\nObject.defineProperty(exports, "EventBus", {\n enumerable: true,\n get: function get() {\n return _ui_utils.EventBus;\n }\n});\nObject.defineProperty(exports, "NullL10n", {\n enumerable: true,\n get: function get() {\n return _ui_utils.NullL10n;\n }\n});\nObject.defineProperty(exports, "ProgressBar", {\n enumerable: true,\n get: function get() {\n return _ui_utils.ProgressBar;\n }\n});\nObject.defineProperty(exports, "PDFLinkService", {\n enumerable: true,\n get: function get() {\n return _pdf_link_service.PDFLinkService;\n }\n});\nObject.defineProperty(exports, "SimpleLinkService", {\n enumerable: true,\n get: function get() {\n return _pdf_link_service.SimpleLinkService;\n }\n});\nObject.defineProperty(exports, "DownloadManager", {\n enumerable: true,\n get: function get() {\n return _download_manager.DownloadManager;\n }\n});\nObject.defineProperty(exports, "GenericL10n", {\n enumerable: true,\n get: function get() {\n return _genericl10n.GenericL10n;\n }\n});\nObject.defineProperty(exports, "PDFFindController", {\n enumerable: true,\n get: function get() {\n return _pdf_find_controller.PDFFindController;\n }\n});\nObject.defineProperty(exports, "PDFHistory", {\n enumerable: true,\n get: function get() {\n return _pdf_history.PDFHistory;\n }\n});\nObject.defineProperty(exports, "PDFPageView", {\n enumerable: true,\n get: function get() {\n return _pdf_page_view.PDFPageView;\n }\n});\nObject.defineProperty(exports, "PDFSinglePageViewer", {\n enumerable: true,\n get: function get() {\n return _pdf_single_page_viewer.PDFSinglePageViewer;\n }\n});\nObject.defineProperty(exports, "PDFViewer", {\n enumerable: true,\n get: function get() {\n return _pdf_viewer.PDFViewer;\n }\n});\n\nvar _annotation_layer_builder = __w_pdfjs_require__(1);\n\nvar _text_layer_builder = __w_pdfjs_require__(8);\n\nvar _ui_utils = __w_pdfjs_require__(3);\n\nvar _pdf_link_service = __w_pdfjs_require__(7);\n\nvar _download_manager = __w_pdfjs_require__(9);\n\nvar _genericl10n = __w_pdfjs_require__(11);\n\nvar _pdf_find_controller = __w_pdfjs_require__(13);\n\nvar _pdf_history = __w_pdfjs_require__(15);\n\nvar _pdf_page_view = __w_pdfjs_require__(16);\n\nvar _pdf_single_page_viewer = __w_pdfjs_require__(18);\n\nvar _pdf_viewer = __w_pdfjs_require__(20);\n\nvar pdfjsVersion = \'2.6.347\';\nvar pdfjsBuild = \'3be9c65f\';\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.DefaultAnnotationLayerFactory = exports.AnnotationLayerBuilder = void 0;\n\nvar _pdfjsLib = __w_pdfjs_require__(2);\n\nvar _ui_utils = __w_pdfjs_require__(3);\n\nvar _pdf_link_service = __w_pdfjs_require__(7);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar AnnotationLayerBuilder = /*#__PURE__*/function () {\n function AnnotationLayerBuilder(_ref) {\n var pageDiv = _ref.pageDiv,\n pdfPage = _ref.pdfPage,\n linkService = _ref.linkService,\n downloadManager = _ref.downloadManager,\n _ref$annotationStorag = _ref.annotationStorage,\n annotationStorage = _ref$annotationStorag === void 0 ? null : _ref$annotationStorag,\n _ref$imageResourcesPa = _ref.imageResourcesPath,\n imageResourcesPath = _ref$imageResourcesPa === void 0 ? "" : _ref$imageResourcesPa,\n _ref$renderInteractiv = _ref.renderInteractiveForms,\n renderInteractiveForms = _ref$renderInteractiv === void 0 ? true : _ref$renderInteractiv,\n _ref$l10n = _ref.l10n,\n l10n = _ref$l10n === void 0 ? _ui_utils.NullL10n : _ref$l10n;\n\n _classCallCheck(this, AnnotationLayerBuilder);\n\n this.pageDiv = pageDiv;\n this.pdfPage = pdfPage;\n this.linkService = linkService;\n this.downloadManager = downloadManager;\n this.imageResourcesPath = imageResourcesPath;\n this.renderInteractiveForms = renderInteractiveForms;\n this.l10n = l10n;\n this.annotationStorage = annotationStorage;\n this.div = null;\n this._cancelled = false;\n }\n\n _createClass(AnnotationLayerBuilder, [{\n key: "render",\n value: function render(viewport) {\n var _this = this;\n\n var intent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "display";\n return this.pdfPage.getAnnotations({\n intent: intent\n }).then(function (annotations) {\n if (_this._cancelled) {\n return;\n }\n\n if (annotations.length === 0) {\n return;\n }\n\n var parameters = {\n viewport: viewport.clone({\n dontFlip: true\n }),\n div: _this.div,\n annotations: annotations,\n page: _this.pdfPage,\n imageResourcesPath: _this.imageResourcesPath,\n renderInteractiveForms: _this.renderInteractiveForms,\n linkService: _this.linkService,\n downloadManager: _this.downloadManager,\n annotationStorage: _this.annotationStorage\n };\n\n if (_this.div) {\n _pdfjsLib.AnnotationLayer.update(parameters);\n } else {\n _this.div = document.createElement("div");\n _this.div.className = "annotationLayer";\n\n _this.pageDiv.appendChild(_this.div);\n\n parameters.div = _this.div;\n\n _pdfjsLib.AnnotationLayer.render(parameters);\n\n _this.l10n.translate(_this.div);\n }\n });\n }\n }, {\n key: "cancel",\n value: function cancel() {\n this._cancelled = true;\n }\n }, {\n key: "hide",\n value: function hide() {\n if (!this.div) {\n return;\n }\n\n this.div.setAttribute("hidden", "true");\n }\n }]);\n\n return AnnotationLayerBuilder;\n}();\n\nexports.AnnotationLayerBuilder = AnnotationLayerBuilder;\n\nvar DefaultAnnotationLayerFactory = /*#__PURE__*/function () {\n function DefaultAnnotationLayerFactory() {\n _classCallCheck(this, DefaultAnnotationLayerFactory);\n }\n\n _createClass(DefaultAnnotationLayerFactory, [{\n key: "createAnnotationLayerBuilder",\n value: function createAnnotationLayerBuilder(pageDiv, pdfPage) {\n var annotationStorage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var imageResourcesPath = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";\n var renderInteractiveForms = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var l10n = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : _ui_utils.NullL10n;\n return new AnnotationLayerBuilder({\n pageDiv: pageDiv,\n pdfPage: pdfPage,\n imageResourcesPath: imageResourcesPath,\n renderInteractiveForms: renderInteractiveForms,\n linkService: new _pdf_link_service.SimpleLinkService(),\n l10n: l10n,\n annotationStorage: annotationStorage\n });\n }\n }]);\n\n return DefaultAnnotationLayerFactory;\n}();\n\nexports.DefaultAnnotationLayerFactory = DefaultAnnotationLayerFactory;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nvar pdfjsLib;\n\nif (typeof window !== "undefined" && window["pdfjs-dist/build/pdf"]) {\n pdfjsLib = window["pdfjs-dist/build/pdf"];\n} else {\n pdfjsLib = __webpack_require__("DupL");\n}\n\nmodule.exports = pdfjsLib;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.isValidRotation = isValidRotation;\nexports.isValidScrollMode = isValidScrollMode;\nexports.isValidSpreadMode = isValidSpreadMode;\nexports.isPortraitOrientation = isPortraitOrientation;\nexports.clamp = clamp;\nexports.getPDFFileNameFromURL = getPDFFileNameFromURL;\nexports.noContextMenuHandler = noContextMenuHandler;\nexports.parseQueryString = parseQueryString;\nexports.backtrackBeforeAllVisibleElements = backtrackBeforeAllVisibleElements;\nexports.getVisibleElements = getVisibleElements;\nexports.roundToDivide = roundToDivide;\nexports.getPageSizeInches = getPageSizeInches;\nexports.approximateFraction = approximateFraction;\nexports.getOutputScale = getOutputScale;\nexports.scrollIntoView = scrollIntoView;\nexports.watchScroll = watchScroll;\nexports.binarySearchFirstItem = binarySearchFirstItem;\nexports.normalizeWheelEventDirection = normalizeWheelEventDirection;\nexports.normalizeWheelEventDelta = normalizeWheelEventDelta;\nexports.waitOnEventOrTimeout = waitOnEventOrTimeout;\nexports.moveToEndOfArray = moveToEndOfArray;\nexports.WaitOnType = exports.animationStarted = exports.ProgressBar = exports.EventBus = exports.NullL10n = exports.SpreadMode = exports.ScrollMode = exports.TextLayerMode = exports.RendererType = exports.PresentationModeState = exports.VERTICAL_PADDING = exports.SCROLLBAR_PADDING = exports.MAX_AUTO_SCALE = exports.UNKNOWN_SCALE = exports.MAX_SCALE = exports.MIN_SCALE = exports.DEFAULT_SCALE = exports.DEFAULT_SCALE_VALUE = exports.CSS_UNITS = exports.AutoPrintRegExp = void 0;\n\nvar _regenerator = _interopRequireDefault(__w_pdfjs_require__(4));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\n\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }\n\nvar CSS_UNITS = 96.0 / 72.0;\nexports.CSS_UNITS = CSS_UNITS;\nvar DEFAULT_SCALE_VALUE = "auto";\nexports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE;\nvar DEFAULT_SCALE = 1.0;\nexports.DEFAULT_SCALE = DEFAULT_SCALE;\nvar MIN_SCALE = 0.1;\nexports.MIN_SCALE = MIN_SCALE;\nvar MAX_SCALE = 10.0;\nexports.MAX_SCALE = MAX_SCALE;\nvar UNKNOWN_SCALE = 0;\nexports.UNKNOWN_SCALE = UNKNOWN_SCALE;\nvar MAX_AUTO_SCALE = 1.25;\nexports.MAX_AUTO_SCALE = MAX_AUTO_SCALE;\nvar SCROLLBAR_PADDING = 40;\nexports.SCROLLBAR_PADDING = SCROLLBAR_PADDING;\nvar VERTICAL_PADDING = 5;\nexports.VERTICAL_PADDING = VERTICAL_PADDING;\nvar PresentationModeState = {\n UNKNOWN: 0,\n NORMAL: 1,\n CHANGING: 2,\n FULLSCREEN: 3\n};\nexports.PresentationModeState = PresentationModeState;\nvar RendererType = {\n CANVAS: "canvas",\n SVG: "svg"\n};\nexports.RendererType = RendererType;\nvar TextLayerMode = {\n DISABLE: 0,\n ENABLE: 1,\n ENABLE_ENHANCE: 2\n};\nexports.TextLayerMode = TextLayerMode;\nvar ScrollMode = {\n UNKNOWN: -1,\n VERTICAL: 0,\n HORIZONTAL: 1,\n WRAPPED: 2\n};\nexports.ScrollMode = ScrollMode;\nvar SpreadMode = {\n UNKNOWN: -1,\n NONE: 0,\n ODD: 1,\n EVEN: 2\n};\nexports.SpreadMode = SpreadMode;\nvar AutoPrintRegExp = /\\bprint\\s*\\(/;\nexports.AutoPrintRegExp = AutoPrintRegExp;\n\nfunction formatL10nValue(text, args) {\n if (!args) {\n return text;\n }\n\n return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, function (all, name) {\n return name in args ? args[name] : "{{" + name + "}}";\n });\n}\n\nvar NullL10n = {\n getLanguage: function getLanguage() {\n return _asyncToGenerator( /*#__PURE__*/_regenerator["default"].mark(function _callee() {\n return _regenerator["default"].wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n return _context.abrupt("return", "en-us");\n\n case 1:\n case "end":\n return _context.stop();\n }\n }\n }, _callee);\n }))();\n },\n getDirection: function getDirection() {\n return _asyncToGenerator( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {\n return _regenerator["default"].wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n return _context2.abrupt("return", "ltr");\n\n case 1:\n case "end":\n return _context2.stop();\n }\n }\n }, _callee2);\n }))();\n },\n get: function get(property, args, fallback) {\n return _asyncToGenerator( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {\n return _regenerator["default"].wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n return _context3.abrupt("return", formatL10nValue(fallback, args));\n\n case 1:\n case "end":\n return _context3.stop();\n }\n }\n }, _callee3);\n }))();\n },\n translate: function translate(element) {\n return _asyncToGenerator( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {\n return _regenerator["default"].wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n case "end":\n return _context4.stop();\n }\n }\n }, _callee4);\n }))();\n }\n};\nexports.NullL10n = NullL10n;\n\nfunction getOutputScale(ctx) {\n var devicePixelRatio = window.devicePixelRatio || 1;\n var backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;\n var pixelRatio = devicePixelRatio / backingStoreRatio;\n return {\n sx: pixelRatio,\n sy: pixelRatio,\n scaled: pixelRatio !== 1\n };\n}\n\nfunction scrollIntoView(element, spot) {\n var skipOverflowHiddenElements = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var parent = element.offsetParent;\n\n if (!parent) {\n console.error("offsetParent is not set -- cannot scroll");\n return;\n }\n\n var offsetY = element.offsetTop + element.clientTop;\n var offsetX = element.offsetLeft + element.clientLeft;\n\n while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || skipOverflowHiddenElements && getComputedStyle(parent).overflow === "hidden") {\n if (parent.dataset._scaleY) {\n offsetY /= parent.dataset._scaleY;\n offsetX /= parent.dataset._scaleX;\n }\n\n offsetY += parent.offsetTop;\n offsetX += parent.offsetLeft;\n parent = parent.offsetParent;\n\n if (!parent) {\n return;\n }\n }\n\n if (spot) {\n if (spot.top !== undefined) {\n offsetY += spot.top;\n }\n\n if (spot.left !== undefined) {\n offsetX += spot.left;\n parent.scrollLeft = offsetX;\n }\n }\n\n parent.scrollTop = offsetY;\n}\n\nfunction watchScroll(viewAreaElement, callback) {\n var debounceScroll = function debounceScroll(evt) {\n if (rAF) {\n return;\n }\n\n rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\n rAF = null;\n var currentX = viewAreaElement.scrollLeft;\n var lastX = state.lastX;\n\n if (currentX !== lastX) {\n state.right = currentX > lastX;\n }\n\n state.lastX = currentX;\n var currentY = viewAreaElement.scrollTop;\n var lastY = state.lastY;\n\n if (currentY !== lastY) {\n state.down = currentY > lastY;\n }\n\n state.lastY = currentY;\n callback(state);\n });\n };\n\n var state = {\n right: true,\n down: true,\n lastX: viewAreaElement.scrollLeft,\n lastY: viewAreaElement.scrollTop,\n _eventHandler: debounceScroll\n };\n var rAF = null;\n viewAreaElement.addEventListener("scroll", debounceScroll, true);\n return state;\n}\n\nfunction parseQueryString(query) {\n var parts = query.split("&");\n var params = Object.create(null);\n\n for (var i = 0, ii = parts.length; i < ii; ++i) {\n var param = parts[i].split("=");\n var key = param[0].toLowerCase();\n var value = param.length > 1 ? param[1] : null;\n params[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n\n return params;\n}\n\nfunction binarySearchFirstItem(items, condition) {\n var minIndex = 0;\n var maxIndex = items.length - 1;\n\n if (maxIndex < 0 || !condition(items[maxIndex])) {\n return items.length;\n }\n\n if (condition(items[minIndex])) {\n return minIndex;\n }\n\n while (minIndex < maxIndex) {\n var currentIndex = minIndex + maxIndex >> 1;\n var currentItem = items[currentIndex];\n\n if (condition(currentItem)) {\n maxIndex = currentIndex;\n } else {\n minIndex = currentIndex + 1;\n }\n }\n\n return minIndex;\n}\n\nfunction approximateFraction(x) {\n if (Math.floor(x) === x) {\n return [x, 1];\n }\n\n var xinv = 1 / x;\n var limit = 8;\n\n if (xinv > limit) {\n return [1, limit];\n } else if (Math.floor(xinv) === xinv) {\n return [1, xinv];\n }\n\n var x_ = x > 1 ? xinv : x;\n var a = 0,\n b = 1,\n c = 1,\n d = 1;\n\n while (true) {\n var p = a + c,\n q = b + d;\n\n if (q > limit) {\n break;\n }\n\n if (x_ <= p / q) {\n c = p;\n d = q;\n } else {\n a = p;\n b = q;\n }\n }\n\n var result;\n\n if (x_ - a / b < c / d - x_) {\n result = x_ === x ? [a, b] : [b, a];\n } else {\n result = x_ === x ? [c, d] : [d, c];\n }\n\n return result;\n}\n\nfunction roundToDivide(x, div) {\n var r = x % div;\n return r === 0 ? x : Math.round(x - r + div);\n}\n\nfunction getPageSizeInches(_ref) {\n var view = _ref.view,\n userUnit = _ref.userUnit,\n rotate = _ref.rotate;\n\n var _view = _slicedToArray(view, 4),\n x1 = _view[0],\n y1 = _view[1],\n x2 = _view[2],\n y2 = _view[3];\n\n var changeOrientation = rotate % 180 !== 0;\n var width = (x2 - x1) / 72 * userUnit;\n var height = (y2 - y1) / 72 * userUnit;\n return {\n width: changeOrientation ? height : width,\n height: changeOrientation ? width : height\n };\n}\n\nfunction backtrackBeforeAllVisibleElements(index, views, top) {\n if (index < 2) {\n return index;\n }\n\n var elt = views[index].div;\n var pageTop = elt.offsetTop + elt.clientTop;\n\n if (pageTop >= top) {\n elt = views[index - 1].div;\n pageTop = elt.offsetTop + elt.clientTop;\n }\n\n for (var i = index - 2; i >= 0; --i) {\n elt = views[i].div;\n\n if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {\n break;\n }\n\n index = i;\n }\n\n return index;\n}\n\nfunction getVisibleElements(scrollEl, views) {\n var sortByVisibility = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var horizontal = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var top = scrollEl.scrollTop,\n bottom = top + scrollEl.clientHeight;\n var left = scrollEl.scrollLeft,\n right = left + scrollEl.clientWidth;\n\n function isElementBottomAfterViewTop(view) {\n var element = view.div;\n var elementBottom = element.offsetTop + element.clientTop + element.clientHeight;\n return elementBottom > top;\n }\n\n function isElementRightAfterViewLeft(view) {\n var element = view.div;\n var elementRight = element.offsetLeft + element.clientLeft + element.clientWidth;\n return elementRight > left;\n }\n\n var visible = [],\n numViews = views.length;\n var firstVisibleElementInd = numViews === 0 ? 0 : binarySearchFirstItem(views, horizontal ? isElementRightAfterViewLeft : isElementBottomAfterViewTop);\n\n if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) {\n firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top);\n }\n\n var lastEdge = horizontal ? right : -1;\n\n for (var i = firstVisibleElementInd; i < numViews; i++) {\n var view = views[i],\n element = view.div;\n var currentWidth = element.offsetLeft + element.clientLeft;\n var currentHeight = element.offsetTop + element.clientTop;\n var viewWidth = element.clientWidth,\n viewHeight = element.clientHeight;\n var viewRight = currentWidth + viewWidth;\n var viewBottom = currentHeight + viewHeight;\n\n if (lastEdge === -1) {\n if (viewBottom >= bottom) {\n lastEdge = viewBottom;\n }\n } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {\n break;\n }\n\n if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) {\n continue;\n }\n\n var hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom);\n var hiddenWidth = Math.max(0, left - currentWidth) + Math.max(0, viewRight - right);\n var percent = (viewHeight - hiddenHeight) * (viewWidth - hiddenWidth) * 100 / viewHeight / viewWidth | 0;\n visible.push({\n id: view.id,\n x: currentWidth,\n y: currentHeight,\n view: view,\n percent: percent\n });\n }\n\n var first = visible[0],\n last = visible[visible.length - 1];\n\n if (sortByVisibility) {\n visible.sort(function (a, b) {\n var pc = a.percent - b.percent;\n\n if (Math.abs(pc) > 0.001) {\n return -pc;\n }\n\n return a.id - b.id;\n });\n }\n\n return {\n first: first,\n last: last,\n views: visible\n };\n}\n\nfunction noContextMenuHandler(evt) {\n evt.preventDefault();\n}\n\nfunction isDataSchema(url) {\n var i = 0;\n var ii = url.length;\n\n while (i < ii && url[i].trim() === "") {\n i++;\n }\n\n return url.substring(i, i + 5).toLowerCase() === "data:";\n}\n\nfunction getPDFFileNameFromURL(url) {\n var defaultFilename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "document.pdf";\n\n if (typeof url !== "string") {\n return defaultFilename;\n }\n\n if (isDataSchema(url)) {\n console.warn("getPDFFileNameFromURL: " + \'ignoring "data:" URL for performance reasons.\');\n return defaultFilename;\n }\n\n var reURI = /^(?:(?:[^:]+:)?\\/\\/[^\\/]+)?([^?#]*)(\\?[^#]*)?(#.*)?$/;\n var reFilename = /[^\\/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n var splitURI = reURI.exec(url);\n var suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]);\n\n if (suggestedFilename) {\n suggestedFilename = suggestedFilename[0];\n\n if (suggestedFilename.includes("%")) {\n try {\n suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0];\n } catch (ex) {}\n }\n }\n\n return suggestedFilename || defaultFilename;\n}\n\nfunction normalizeWheelEventDirection(evt) {\n var delta = Math.sqrt(evt.deltaX * evt.deltaX + evt.deltaY * evt.deltaY);\n var angle = Math.atan2(evt.deltaY, evt.deltaX);\n\n if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n delta = -delta;\n }\n\n return delta;\n}\n\nfunction normalizeWheelEventDelta(evt) {\n var delta = normalizeWheelEventDirection(evt);\n var MOUSE_DOM_DELTA_PIXEL_MODE = 0;\n var MOUSE_DOM_DELTA_LINE_MODE = 1;\n var MOUSE_PIXELS_PER_LINE = 30;\n var MOUSE_LINES_PER_PAGE = 30;\n\n if (evt.deltaMode === MOUSE_DOM_DELTA_PIXEL_MODE) {\n delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;\n } else if (evt.deltaMode === MOUSE_DOM_DELTA_LINE_MODE) {\n delta /= MOUSE_LINES_PER_PAGE;\n }\n\n return delta;\n}\n\nfunction isValidRotation(angle) {\n return Number.isInteger(angle) && angle % 90 === 0;\n}\n\nfunction isValidScrollMode(mode) {\n return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN;\n}\n\nfunction isValidSpreadMode(mode) {\n return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN;\n}\n\nfunction isPortraitOrientation(size) {\n return size.width <= size.height;\n}\n\nvar WaitOnType = {\n EVENT: "event",\n TIMEOUT: "timeout"\n};\nexports.WaitOnType = WaitOnType;\n\nfunction waitOnEventOrTimeout(_ref2) {\n var target = _ref2.target,\n name = _ref2.name,\n _ref2$delay = _ref2.delay,\n delay = _ref2$delay === void 0 ? 0 : _ref2$delay;\n return new Promise(function (resolve, reject) {\n if (_typeof(target) !== "object" || !(name && typeof name === "string") || !(Number.isInteger(delay) && delay >= 0)) {\n throw new Error("waitOnEventOrTimeout - invalid parameters.");\n }\n\n function handler(type) {\n if (target instanceof EventBus) {\n target._off(name, eventHandler);\n } else {\n target.removeEventListener(name, eventHandler);\n }\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n resolve(type);\n }\n\n var eventHandler = handler.bind(null, WaitOnType.EVENT);\n\n if (target instanceof EventBus) {\n target._on(name, eventHandler);\n } else {\n target.addEventListener(name, eventHandler);\n }\n\n var timeoutHandler = handler.bind(null, WaitOnType.TIMEOUT);\n var timeout = setTimeout(timeoutHandler, delay);\n });\n}\n\nvar animationStarted = new Promise(function (resolve) {\n window.requestAnimationFrame(resolve);\n});\nexports.animationStarted = animationStarted;\n\nfunction dispatchDOMEvent(eventName) {\n var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n throw new Error("Not implemented: dispatchDOMEvent");\n}\n\nvar EventBus = /*#__PURE__*/function () {\n function EventBus(options) {\n _classCallCheck(this, EventBus);\n\n this._listeners = Object.create(null);\n }\n\n _createClass(EventBus, [{\n key: "on",\n value: function on(eventName, listener) {\n this._on(eventName, listener, {\n external: true\n });\n }\n }, {\n key: "off",\n value: function off(eventName, listener) {\n this._off(eventName, listener, {\n external: true\n });\n }\n }, {\n key: "dispatch",\n value: function dispatch(eventName) {\n var eventListeners = this._listeners[eventName];\n\n if (!eventListeners || eventListeners.length === 0) {\n return;\n }\n\n var args = Array.prototype.slice.call(arguments, 1);\n var externalListeners;\n eventListeners.slice(0).forEach(function (_ref3) {\n var listener = _ref3.listener,\n external = _ref3.external;\n\n if (external) {\n if (!externalListeners) {\n externalListeners = [];\n }\n\n externalListeners.push(listener);\n return;\n }\n\n listener.apply(null, args);\n });\n\n if (externalListeners) {\n externalListeners.forEach(function (listener) {\n listener.apply(null, args);\n });\n externalListeners = null;\n }\n }\n }, {\n key: "_on",\n value: function _on(eventName, listener) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var eventListeners = this._listeners[eventName];\n\n if (!eventListeners) {\n this._listeners[eventName] = eventListeners = [];\n }\n\n eventListeners.push({\n listener: listener,\n external: (options && options.external) === true\n });\n }\n }, {\n key: "_off",\n value: function _off(eventName, listener) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var eventListeners = this._listeners[eventName];\n\n if (!eventListeners) {\n return;\n }\n\n for (var i = 0, ii = eventListeners.length; i < ii; i++) {\n if (eventListeners[i].listener === listener) {\n eventListeners.splice(i, 1);\n return;\n }\n }\n }\n }]);\n\n return EventBus;\n}();\n\nexports.EventBus = EventBus;\n\nfunction clamp(v, min, max) {\n return Math.min(Math.max(v, min), max);\n}\n\nvar ProgressBar = /*#__PURE__*/function () {\n function ProgressBar(id) {\n var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n height = _ref4.height,\n width = _ref4.width,\n units = _ref4.units;\n\n _classCallCheck(this, ProgressBar);\n\n this.visible = true;\n this.div = document.querySelector(id + " .progress");\n this.bar = this.div.parentNode;\n this.height = height || 100;\n this.width = width || 100;\n this.units = units || "%";\n this.div.style.height = this.height + this.units;\n this.percent = 0;\n }\n\n _createClass(ProgressBar, [{\n key: "_updateBar",\n value: function _updateBar() {\n if (this._indeterminate) {\n this.div.classList.add("indeterminate");\n this.div.style.width = this.width + this.units;\n return;\n }\n\n this.div.classList.remove("indeterminate");\n var progressSize = this.width * this._percent / 100;\n this.div.style.width = progressSize + this.units;\n }\n }, {\n key: "setWidth",\n value: function setWidth(viewer) {\n if (!viewer) {\n return;\n }\n\n var container = viewer.parentNode;\n var scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n\n if (scrollbarWidth > 0) {\n this.bar.style.width = "calc(100% - ".concat(scrollbarWidth, "px)");\n }\n }\n }, {\n key: "hide",\n value: function hide() {\n if (!this.visible) {\n return;\n }\n\n this.visible = false;\n this.bar.classList.add("hidden");\n document.body.classList.remove("loadingInProgress");\n }\n }, {\n key: "show",\n value: function show() {\n if (this.visible) {\n return;\n }\n\n this.visible = true;\n document.body.classList.add("loadingInProgress");\n this.bar.classList.remove("hidden");\n }\n }, {\n key: "percent",\n get: function get() {\n return this._percent;\n },\n set: function set(val) {\n this._indeterminate = isNaN(val);\n this._percent = clamp(val, 0, 100);\n\n this._updateBar();\n }\n }]);\n\n return ProgressBar;\n}();\n\nexports.ProgressBar = ProgressBar;\n\nfunction moveToEndOfArray(arr, condition) {\n var moved = [],\n len = arr.length;\n var write = 0;\n\n for (var read = 0; read < len; ++read) {\n if (condition(arr[read])) {\n moved.push(arr[read]);\n } else {\n arr[write] = arr[read];\n ++write;\n }\n }\n\n for (var _read = 0; write < len; ++_read, ++write) {\n arr[write] = moved[_read];\n }\n}\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nmodule.exports = __w_pdfjs_require__(5);\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n/* WEBPACK VAR INJECTION */(function(module) {\n\nfunction _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nvar runtime = function (exports) {\n "use strict";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined;\n var $Symbol = typeof Symbol === "function" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || "@@iterator";\n var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";\n var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n\n try {\n define({}, "");\n } catch (err) {\n define = function define(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n return generator;\n }\n\n exports.wrap = wrap;\n\n function tryCatch(fn, obj, arg) {\n try {\n return {\n type: "normal",\n arg: fn.call(obj, arg)\n };\n } catch (err) {\n return {\n type: "throw",\n arg: err\n };\n }\n }\n\n var GenStateSuspendedStart = "suspendedStart";\n var GenStateSuspendedYield = "suspendedYield";\n var GenStateExecuting = "executing";\n var GenStateCompleted = "completed";\n var ContinueSentinel = {};\n\n function Generator() {}\n\n function GeneratorFunction() {}\n\n function GeneratorFunctionPrototype() {}\n\n var IteratorPrototype = {};\n\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n\n if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction");\n\n function defineIteratorMethods(prototype) {\n ["next", "throw", "return"].forEach(function (method) {\n define(prototype, method, function (arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function (genFun) {\n var ctor = typeof genFun === "function" && genFun.constructor;\n return ctor ? ctor === GeneratorFunction || (ctor.displayName || ctor.name) === "GeneratorFunction" : false;\n };\n\n exports.mark = function (genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, "GeneratorFunction");\n }\n\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n exports.awrap = function (arg) {\n return {\n __await: arg\n };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n\n if (record.type === "throw") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n\n if (value && _typeof(value) === "object" && hasOwn.call(value, "__await")) {\n return PromiseImpl.resolve(value.__await).then(function (value) {\n invoke("next", value, resolve, reject);\n }, function (err) {\n invoke("throw", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function (unwrapped) {\n result.value = unwrapped;\n resolve(result);\n }, function (error) {\n return invoke("throw", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function (resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n }\n\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n\n exports.AsyncIterator = AsyncIterator;\n\n exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error("Generator is already running");\n }\n\n if (state === GenStateCompleted) {\n if (method === "throw") {\n throw arg;\n }\n\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === "next") {\n context.sent = context._sent = context.arg;\n } else if (context.method === "throw") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n } else if (context.method === "return") {\n context.abrupt("return", context.arg);\n }\n\n state = GenStateExecuting;\n var record = tryCatch(innerFn, self, context);\n\n if (record.type === "normal") {\n state = context.done ? GenStateCompleted : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n } else if (record.type === "throw") {\n state = GenStateCompleted;\n context.method = "throw";\n context.arg = record.arg;\n }\n }\n };\n }\n\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n\n if (method === undefined) {\n context.delegate = null;\n\n if (context.method === "throw") {\n if (delegate.iterator["return"]) {\n context.method = "return";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === "throw") {\n return ContinueSentinel;\n }\n }\n\n context.method = "throw";\n context.arg = new TypeError("The iterator does not provide a \'throw\' method");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === "throw") {\n context.method = "throw";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (!info) {\n context.method = "throw";\n context.arg = new TypeError("iterator result is not an object");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n context[delegate.resultName] = info.value;\n context.next = delegate.nextLoc;\n\n if (context.method !== "return") {\n context.method = "next";\n context.arg = undefined;\n }\n } else {\n return info;\n }\n\n context.delegate = null;\n return ContinueSentinel;\n }\n\n defineIteratorMethods(Gp);\n define(Gp, toStringTagSymbol, "Generator");\n\n Gp[iteratorSymbol] = function () {\n return this;\n };\n\n Gp.toString = function () {\n return "[object Generator]";\n };\n\n function pushTryEntry(locs) {\n var entry = {\n tryLoc: locs[0]\n };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = "normal";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n this.tryEntries = [{\n tryLoc: "root"\n }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function (object) {\n var keys = [];\n\n for (var key in object) {\n keys.push(key);\n }\n\n keys.reverse();\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === "function") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1,\n next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n return next;\n };\n\n return next.next = next;\n }\n }\n\n return {\n next: doneResult\n };\n }\n\n exports.values = values;\n\n function doneResult() {\n return {\n value: undefined,\n done: true\n };\n }\n\n Context.prototype = {\n constructor: Context,\n reset: function reset(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n this.method = "next";\n this.arg = undefined;\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n stop: function stop() {\n this.done = true;\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n\n if (rootRecord.type === "throw") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n dispatchException: function dispatchException(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n\n function handle(loc, caught) {\n record.type = "throw";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n context.method = "next";\n context.arg = undefined;\n }\n\n return !!caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === "root") {\n return handle("end");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, "catchLoc");\n var hasFinally = hasOwn.call(entry, "finallyLoc");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n } else {\n throw new Error("try statement without catch or finally");\n }\n }\n }\n },\n abrupt: function abrupt(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n\n if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = "next";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n complete: function complete(record, afterLoc) {\n if (record.type === "throw") {\n throw record.arg;\n }\n\n if (record.type === "break" || record.type === "continue") {\n this.next = record.arg;\n } else if (record.type === "return") {\n this.rval = this.arg = record.arg;\n this.method = "return";\n this.next = "end";\n } else if (record.type === "normal" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n finish: function finish(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n "catch": function _catch(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n\n if (record.type === "throw") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n\n return thrown;\n }\n }\n\n throw new Error("illegal catch attempt");\n },\n delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === "next") {\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n return exports;\n}(( false ? undefined : _typeof(module)) === "object" ? module.exports : {});\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n Function("r", "regeneratorRuntime = r")(runtime);\n}\n/* WEBPACK VAR INJECTION */}.call(this, __w_pdfjs_require__(6)(module)))\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nmodule.exports = function (module) {\n if (!module.webpackPolyfill) {\n module.deprecate = function () {};\n\n module.paths = [];\n if (!module.children) module.children = [];\n Object.defineProperty(module, "loaded", {\n enumerable: true,\n get: function get() {\n return module.l;\n }\n });\n Object.defineProperty(module, "id", {\n enumerable: true,\n get: function get() {\n return module.i;\n }\n });\n module.webpackPolyfill = 1;\n }\n\n return module;\n};\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.SimpleLinkService = exports.PDFLinkService = void 0;\n\nvar _ui_utils = __w_pdfjs_require__(3);\n\nfunction _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar PDFLinkService = /*#__PURE__*/function () {\n function PDFLinkService() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n eventBus = _ref.eventBus,\n _ref$externalLinkTarg = _ref.externalLinkTarget,\n externalLinkTarget = _ref$externalLinkTarg === void 0 ? null : _ref$externalLinkTarg,\n _ref$externalLinkRel = _ref.externalLinkRel,\n externalLinkRel = _ref$externalLinkRel === void 0 ? null : _ref$externalLinkRel,\n _ref$externalLinkEnab = _ref.externalLinkEnabled,\n externalLinkEnabled = _ref$externalLinkEnab === void 0 ? true : _ref$externalLinkEnab,\n _ref$ignoreDestinatio = _ref.ignoreDestinationZoom,\n ignoreDestinationZoom = _ref$ignoreDestinatio === void 0 ? false : _ref$ignoreDestinatio;\n\n _classCallCheck(this, PDFLinkService);\n\n this.eventBus = eventBus;\n this.externalLinkTarget = externalLinkTarget;\n this.externalLinkRel = externalLinkRel;\n this.externalLinkEnabled = externalLinkEnabled;\n this._ignoreDestinationZoom = ignoreDestinationZoom;\n this.baseUrl = null;\n this.pdfDocument = null;\n this.pdfViewer = null;\n this.pdfHistory = null;\n this._pagesRefCache = null;\n }\n\n _createClass(PDFLinkService, [{\n key: "setDocument",\n value: function setDocument(pdfDocument) {\n var baseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n this.baseUrl = baseUrl;\n this.pdfDocument = pdfDocument;\n this._pagesRefCache = Object.create(null);\n }\n }, {\n key: "setViewer",\n value: function setViewer(pdfViewer) {\n this.pdfViewer = pdfViewer;\n }\n }, {\n key: "setHistory",\n value: function setHistory(pdfHistory) {\n this.pdfHistory = pdfHistory;\n }\n }, {\n key: "navigateTo",\n value: function navigateTo(dest) {\n var _this = this;\n\n var goToDestination = function goToDestination(_ref2) {\n var namedDest = _ref2.namedDest,\n explicitDest = _ref2.explicitDest;\n var destRef = explicitDest[0];\n var pageNumber;\n\n if (destRef instanceof Object) {\n pageNumber = _this._cachedPageNumber(destRef);\n\n if (pageNumber === null) {\n _this.pdfDocument.getPageIndex(destRef).then(function (pageIndex) {\n _this.cachePageRef(pageIndex + 1, destRef);\n\n goToDestination({\n namedDest: namedDest,\n explicitDest: explicitDest\n });\n })["catch"](function () {\n console.error("PDFLinkService.navigateTo: \\"".concat(destRef, "\\" is not ") + "a valid page reference, for dest=\\"".concat(dest, "\\"."));\n });\n\n return;\n }\n } else if (Number.isInteger(destRef)) {\n pageNumber = destRef + 1;\n } else {\n console.error("PDFLinkService.navigateTo: \\"".concat(destRef, "\\" is not ") + "a valid destination reference, for dest=\\"".concat(dest, "\\"."));\n return;\n }\n\n if (!pageNumber || pageNumber < 1 || pageNumber > _this.pagesCount) {\n console.error("PDFLinkService.navigateTo: \\"".concat(pageNumber, "\\" is not ") + "a valid page number, for dest=\\"".concat(dest, "\\"."));\n return;\n }\n\n if (_this.pdfHistory) {\n _this.pdfHistory.pushCurrentPosition();\n\n _this.pdfHistory.push({\n namedDest: namedDest,\n explicitDest: explicitDest,\n pageNumber: pageNumber\n });\n }\n\n _this.pdfViewer.scrollPageIntoView({\n pageNumber: pageNumber,\n destArray: explicitDest,\n ignoreDestinationZoom: _this._ignoreDestinationZoom\n });\n };\n\n new Promise(function (resolve, reject) {\n if (typeof dest === "string") {\n _this.pdfDocument.getDestination(dest).then(function (destArray) {\n resolve({\n namedDest: dest,\n explicitDest: destArray\n });\n });\n\n return;\n }\n\n resolve({\n namedDest: "",\n explicitDest: dest\n });\n }).then(function (data) {\n if (!Array.isArray(data.explicitDest)) {\n console.error("PDFLinkService.navigateTo: \\"".concat(data.explicitDest, "\\" is") + " not a valid destination array, for dest=\\"".concat(dest, "\\"."));\n return;\n }\n\n goToDestination(data);\n });\n }\n }, {\n key: "getDestinationHash",\n value: function getDestinationHash(dest) {\n if (typeof dest === "string") {\n return this.getAnchorUrl("#" + escape(dest));\n }\n\n if (Array.isArray(dest)) {\n var str = JSON.stringify(dest);\n return this.getAnchorUrl("#" + escape(str));\n }\n\n return this.getAnchorUrl("");\n }\n }, {\n key: "getAnchorUrl",\n value: function getAnchorUrl(anchor) {\n return (this.baseUrl || "") + anchor;\n }\n }, {\n key: "setHash",\n value: function setHash(hash) {\n var pageNumber, dest;\n\n if (hash.includes("=")) {\n var params = (0, _ui_utils.parseQueryString)(hash);\n\n if ("search" in params) {\n this.eventBus.dispatch("findfromurlhash", {\n source: this,\n query: params.search.replace(/"/g, ""),\n phraseSearch: params.phrase === "true"\n });\n }\n\n if ("page" in params) {\n pageNumber = params.page | 0 || 1;\n }\n\n if ("zoom" in params) {\n var zoomArgs = params.zoom.split(",");\n var zoomArg = zoomArgs[0];\n var zoomArgNumber = parseFloat(zoomArg);\n\n if (!zoomArg.includes("Fit")) {\n dest = [null, {\n name: "XYZ"\n }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg];\n } else {\n if (zoomArg === "Fit" || zoomArg === "FitB") {\n dest = [null, {\n name: zoomArg\n }];\n } else if (zoomArg === "FitH" || zoomArg === "FitBH" || zoomArg === "FitV" || zoomArg === "FitBV") {\n dest = [null, {\n name: zoomArg\n }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null];\n } else if (zoomArg === "FitR") {\n if (zoomArgs.length !== 5) {\n console.error(\'PDFLinkService.setHash: Not enough parameters for "FitR".\');\n } else {\n dest = [null, {\n name: zoomArg\n }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0];\n }\n } else {\n console.error("PDFLinkService.setHash: \\"".concat(zoomArg, "\\" is not ") + "a valid zoom value.");\n }\n }\n }\n\n if (dest) {\n this.pdfViewer.scrollPageIntoView({\n pageNumber: pageNumber || this.page,\n destArray: dest,\n allowNegativeOffset: true\n });\n } else if (pageNumber) {\n this.page = pageNumber;\n }\n\n if ("pagemode" in params) {\n this.eventBus.dispatch("pagemode", {\n source: this,\n mode: params.pagemode\n });\n }\n\n if ("nameddest" in params) {\n this.navigateTo(params.nameddest);\n }\n } else {\n dest = unescape(hash);\n\n try {\n dest = JSON.parse(dest);\n\n if (!Array.isArray(dest)) {\n dest = dest.toString();\n }\n } catch (ex) {}\n\n if (typeof dest === "string" || isValidExplicitDestination(dest)) {\n this.navigateTo(dest);\n return;\n }\n\n console.error("PDFLinkService.setHash: \\"".concat(unescape(hash), "\\" is not ") + "a valid destination.");\n }\n }\n }, {\n key: "executeNamedAction",\n value: function executeNamedAction(action) {\n switch (action) {\n case "GoBack":\n if (this.pdfHistory) {\n this.pdfHistory.back();\n }\n\n break;\n\n case "GoForward":\n if (this.pdfHistory) {\n this.pdfHistory.forward();\n }\n\n break;\n\n case "NextPage":\n if (this.page < this.pagesCount) {\n this.page++;\n }\n\n break;\n\n case "PrevPage":\n if (this.page > 1) {\n this.page--;\n }\n\n break;\n\n case "LastPage":\n this.page = this.pagesCount;\n break;\n\n case "FirstPage":\n this.page = 1;\n break;\n\n default:\n break;\n }\n\n this.eventBus.dispatch("namedaction", {\n source: this,\n action: action\n });\n }\n }, {\n key: "cachePageRef",\n value: function cachePageRef(pageNum, pageRef) {\n if (!pageRef) {\n return;\n }\n\n var refStr = pageRef.gen === 0 ? "".concat(pageRef.num, "R") : "".concat(pageRef.num, "R").concat(pageRef.gen);\n this._pagesRefCache[refStr] = pageNum;\n }\n }, {\n key: "_cachedPageNumber",\n value: function _cachedPageNumber(pageRef) {\n var refStr = pageRef.gen === 0 ? "".concat(pageRef.num, "R") : "".concat(pageRef.num, "R").concat(pageRef.gen);\n return this._pagesRefCache && this._pagesRefCache[refStr] || null;\n }\n }, {\n key: "isPageVisible",\n value: function isPageVisible(pageNumber) {\n return this.pdfViewer.isPageVisible(pageNumber);\n }\n }, {\n key: "pagesCount",\n get: function get() {\n return this.pdfDocument ? this.pdfDocument.numPages : 0;\n }\n }, {\n key: "page",\n get: function get() {\n return this.pdfViewer.currentPageNumber;\n },\n set: function set(value) {\n this.pdfViewer.currentPageNumber = value;\n }\n }, {\n key: "rotation",\n get: function get() {\n return this.pdfViewer.pagesRotation;\n },\n set: function set(value) {\n this.pdfViewer.pagesRotation = value;\n }\n }]);\n\n return PDFLinkService;\n}();\n\nexports.PDFLinkService = PDFLinkService;\n\nfunction isValidExplicitDestination(dest) {\n if (!Array.isArray(dest)) {\n return false;\n }\n\n var destLength = dest.length;\n\n if (destLength < 2) {\n return false;\n }\n\n var page = dest[0];\n\n if (!(_typeof(page) === "object" && Number.isInteger(page.num) && Number.isInteger(page.gen)) && !(Number.isInteger(page) && page >= 0)) {\n return false;\n }\n\n var zoom = dest[1];\n\n if (!(_typeof(zoom) === "object" && typeof zoom.name === "string")) {\n return false;\n }\n\n var allowNull = true;\n\n switch (zoom.name) {\n case "XYZ":\n if (destLength !== 5) {\n return false;\n }\n\n break;\n\n case "Fit":\n case "FitB":\n return destLength === 2;\n\n case "FitH":\n case "FitBH":\n case "FitV":\n case "FitBV":\n if (destLength !== 3) {\n return false;\n }\n\n break;\n\n case "FitR":\n if (destLength !== 6) {\n return false;\n }\n\n allowNull = false;\n break;\n\n default:\n return false;\n }\n\n for (var i = 2; i < destLength; i++) {\n var param = dest[i];\n\n if (!(typeof param === "number" || allowNull && param === null)) {\n return false;\n }\n }\n\n return true;\n}\n\nvar SimpleLinkService = /*#__PURE__*/function () {\n function SimpleLinkService() {\n _classCallCheck(this, SimpleLinkService);\n\n this.externalLinkTarget = null;\n this.externalLinkRel = null;\n this.externalLinkEnabled = true;\n this._ignoreDestinationZoom = false;\n }\n\n _createClass(SimpleLinkService, [{\n key: "navigateTo",\n value: function navigateTo(dest) {}\n }, {\n key: "getDestinationHash",\n value: function getDestinationHash(dest) {\n return "#";\n }\n }, {\n key: "getAnchorUrl",\n value: function getAnchorUrl(hash) {\n return "#";\n }\n }, {\n key: "setHash",\n value: function setHash(hash) {}\n }, {\n key: "executeNamedAction",\n value: function executeNamedAction(action) {}\n }, {\n key: "cachePageRef",\n value: function cachePageRef(pageNum, pageRef) {}\n }, {\n key: "isPageVisible",\n value: function isPageVisible(pageNumber) {\n return true;\n }\n }, {\n key: "pagesCount",\n get: function get() {\n return 0;\n }\n }, {\n key: "page",\n get: function get() {\n return 0;\n },\n set: function set(value) {}\n }, {\n key: "rotation",\n get: function get() {\n return 0;\n },\n set: function set(value) {}\n }]);\n\n return SimpleLinkService;\n}();\n\nexports.SimpleLinkService = SimpleLinkService;\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.DefaultTextLayerFactory = exports.TextLayerBuilder = void 0;\n\nvar _pdfjsLib = __w_pdfjs_require__(2);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar EXPAND_DIVS_TIMEOUT = 300;\n\nvar TextLayerBuilder = /*#__PURE__*/function () {\n function TextLayerBuilder(_ref) {\n var textLayerDiv = _ref.textLayerDiv,\n eventBus = _ref.eventBus,\n pageIndex = _ref.pageIndex,\n viewport = _ref.viewport,\n _ref$findController = _ref.findController,\n findController = _ref$findController === void 0 ? null : _ref$findController,\n _ref$enhanceTextSelec = _ref.enhanceTextSelection,\n enhanceTextSelection = _ref$enhanceTextSelec === void 0 ? false : _ref$enhanceTextSelec;\n\n _classCallCheck(this, TextLayerBuilder);\n\n this.textLayerDiv = textLayerDiv;\n this.eventBus = eventBus;\n this.textContent = null;\n this.textContentItemsStr = [];\n this.textContentStream = null;\n this.renderingDone = false;\n this.pageIdx = pageIndex;\n this.pageNumber = this.pageIdx + 1;\n this.matches = [];\n this.viewport = viewport;\n this.textDivs = [];\n this.findController = findController;\n this.textLayerRenderTask = null;\n this.enhanceTextSelection = enhanceTextSelection;\n this._onUpdateTextLayerMatches = null;\n\n this._bindMouse();\n }\n\n _createClass(TextLayerBuilder, [{\n key: "_finishRendering",\n value: function _finishRendering() {\n this.renderingDone = true;\n\n if (!this.enhanceTextSelection) {\n var endOfContent = document.createElement("div");\n endOfContent.className = "endOfContent";\n this.textLayerDiv.appendChild(endOfContent);\n }\n\n this.eventBus.dispatch("textlayerrendered", {\n source: this,\n pageNumber: this.pageNumber,\n numTextDivs: this.textDivs.length\n });\n }\n }, {\n key: "render",\n value: function render() {\n var _this = this;\n\n var timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n if (!(this.textContent || this.textContentStream) || this.renderingDone) {\n return;\n }\n\n this.cancel();\n this.textDivs = [];\n var textLayerFrag = document.createDocumentFragment();\n this.textLayerRenderTask = (0, _pdfjsLib.renderTextLayer)({\n textContent: this.textContent,\n textContentStream: this.textContentStream,\n container: textLayerFrag,\n viewport: this.viewport,\n textDivs: this.textDivs,\n textContentItemsStr: this.textContentItemsStr,\n timeout: timeout,\n enhanceTextSelection: this.enhanceTextSelection\n });\n this.textLayerRenderTask.promise.then(function () {\n _this.textLayerDiv.appendChild(textLayerFrag);\n\n _this._finishRendering();\n\n _this._updateMatches();\n }, function (reason) {});\n\n if (!this._onUpdateTextLayerMatches) {\n this._onUpdateTextLayerMatches = function (evt) {\n if (evt.pageIndex === _this.pageIdx || evt.pageIndex === -1) {\n _this._updateMatches();\n }\n };\n\n this.eventBus._on("updatetextlayermatches", this._onUpdateTextLayerMatches);\n }\n }\n }, {\n key: "cancel",\n value: function cancel() {\n if (this.textLayerRenderTask) {\n this.textLayerRenderTask.cancel();\n this.textLayerRenderTask = null;\n }\n\n if (this._onUpdateTextLayerMatches) {\n this.eventBus._off("updatetextlayermatches", this._onUpdateTextLayerMatches);\n\n this._onUpdateTextLayerMatches = null;\n }\n }\n }, {\n key: "setTextContentStream",\n value: function setTextContentStream(readableStream) {\n this.cancel();\n this.textContentStream = readableStream;\n }\n }, {\n key: "setTextContent",\n value: function setTextContent(textContent) {\n this.cancel();\n this.textContent = textContent;\n }\n }, {\n key: "_convertMatches",\n value: function _convertMatches(matches, matchesLength) {\n if (!matches) {\n return [];\n }\n\n var findController = this.findController,\n textContentItemsStr = this.textContentItemsStr;\n var i = 0,\n iIndex = 0;\n var end = textContentItemsStr.length - 1;\n var queryLen = findController.state.query.length;\n var result = [];\n\n for (var m = 0, mm = matches.length; m < mm; m++) {\n var matchIdx = matches[m];\n\n while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) {\n iIndex += textContentItemsStr[i].length;\n i++;\n }\n\n if (i === textContentItemsStr.length) {\n console.error("Could not find a matching mapping");\n }\n\n var match = {\n begin: {\n divIdx: i,\n offset: matchIdx - iIndex\n }\n };\n\n if (matchesLength) {\n matchIdx += matchesLength[m];\n } else {\n matchIdx += queryLen;\n }\n\n while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) {\n iIndex += textContentItemsStr[i].length;\n i++;\n }\n\n match.end = {\n divIdx: i,\n offset: matchIdx - iIndex\n };\n result.push(match);\n }\n\n return result;\n }\n }, {\n key: "_renderMatches",\n value: function _renderMatches(matches) {\n if (matches.length === 0) {\n return;\n }\n\n var findController = this.findController,\n pageIdx = this.pageIdx,\n textContentItemsStr = this.textContentItemsStr,\n textDivs = this.textDivs;\n var isSelectedPage = pageIdx === findController.selected.pageIdx;\n var selectedMatchIdx = findController.selected.matchIdx;\n var highlightAll = findController.state.highlightAll;\n var prevEnd = null;\n var infinity = {\n divIdx: -1,\n offset: undefined\n };\n\n function beginText(begin, className) {\n var divIdx = begin.divIdx;\n textDivs[divIdx].textContent = "";\n appendTextToDiv(divIdx, 0, begin.offset, className);\n }\n\n function appendTextToDiv(divIdx, fromOffset, toOffset, className) {\n var div = textDivs[divIdx];\n var content = textContentItemsStr[divIdx].substring(fromOffset, toOffset);\n var node = document.createTextNode(content);\n\n if (className) {\n var span = document.createElement("span");\n span.className = className;\n span.appendChild(node);\n div.appendChild(span);\n return;\n }\n\n div.appendChild(node);\n }\n\n var i0 = selectedMatchIdx,\n i1 = i0 + 1;\n\n if (highlightAll) {\n i0 = 0;\n i1 = matches.length;\n } else if (!isSelectedPage) {\n return;\n }\n\n for (var i = i0; i < i1; i++) {\n var match = matches[i];\n var begin = match.begin;\n var end = match.end;\n var isSelected = isSelectedPage && i === selectedMatchIdx;\n var highlightSuffix = isSelected ? " selected" : "";\n\n if (isSelected) {\n findController.scrollMatchIntoView({\n element: textDivs[begin.divIdx],\n pageIndex: pageIdx,\n matchIndex: selectedMatchIdx\n });\n }\n\n if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {\n if (prevEnd !== null) {\n appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n }\n\n beginText(begin);\n } else {\n appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);\n }\n\n if (begin.divIdx === end.divIdx) {\n appendTextToDiv(begin.divIdx, begin.offset, end.offset, "highlight" + highlightSuffix);\n } else {\n appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, "highlight begin" + highlightSuffix);\n\n for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {\n textDivs[n0].className = "highlight middle" + highlightSuffix;\n }\n\n beginText(end, "highlight end" + highlightSuffix);\n }\n\n prevEnd = end;\n }\n\n if (prevEnd) {\n appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);\n }\n }\n }, {\n key: "_updateMatches",\n value: function _updateMatches() {\n if (!this.renderingDone) {\n return;\n }\n\n var findController = this.findController,\n matches = this.matches,\n pageIdx = this.pageIdx,\n textContentItemsStr = this.textContentItemsStr,\n textDivs = this.textDivs;\n var clearedUntilDivIdx = -1;\n\n for (var i = 0, ii = matches.length; i < ii; i++) {\n var match = matches[i];\n var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);\n\n for (var n = begin, end = match.end.divIdx; n <= end; n++) {\n var div = textDivs[n];\n div.textContent = textContentItemsStr[n];\n div.className = "";\n }\n\n clearedUntilDivIdx = match.end.divIdx + 1;\n }\n\n if (!findController || !findController.highlightMatches) {\n return;\n }\n\n var pageMatches = findController.pageMatches[pageIdx] || null;\n var pageMatchesLength = findController.pageMatchesLength[pageIdx] || null;\n this.matches = this._convertMatches(pageMatches, pageMatchesLength);\n\n this._renderMatches(this.matches);\n }\n }, {\n key: "_bindMouse",\n value: function _bindMouse() {\n var _this2 = this;\n\n var div = this.textLayerDiv;\n var expandDivsTimer = null;\n div.addEventListener("mousedown", function (evt) {\n if (_this2.enhanceTextSelection && _this2.textLayerRenderTask) {\n _this2.textLayerRenderTask.expandTextDivs(true);\n\n if (expandDivsTimer) {\n clearTimeout(expandDivsTimer);\n expandDivsTimer = null;\n }\n\n return;\n }\n\n var end = div.querySelector(".endOfContent");\n\n if (!end) {\n return;\n }\n\n var adjustTop = evt.target !== div;\n adjustTop = adjustTop && window.getComputedStyle(end).getPropertyValue("-moz-user-select") !== "none";\n\n if (adjustTop) {\n var divBounds = div.getBoundingClientRect();\n var r = Math.max(0, (evt.pageY - divBounds.top) / divBounds.height);\n end.style.top = (r * 100).toFixed(2) + "%";\n }\n\n end.classList.add("active");\n });\n div.addEventListener("mouseup", function () {\n if (_this2.enhanceTextSelection && _this2.textLayerRenderTask) {\n expandDivsTimer = setTimeout(function () {\n if (_this2.textLayerRenderTask) {\n _this2.textLayerRenderTask.expandTextDivs(false);\n }\n\n expandDivsTimer = null;\n }, EXPAND_DIVS_TIMEOUT);\n return;\n }\n\n var end = div.querySelector(".endOfContent");\n\n if (!end) {\n return;\n }\n\n end.style.top = "";\n end.classList.remove("active");\n });\n }\n }]);\n\n return TextLayerBuilder;\n}();\n\nexports.TextLayerBuilder = TextLayerBuilder;\n\nvar DefaultTextLayerFactory = /*#__PURE__*/function () {\n function DefaultTextLayerFactory() {\n _classCallCheck(this, DefaultTextLayerFactory);\n }\n\n _createClass(DefaultTextLayerFactory, [{\n key: "createTextLayerBuilder",\n value: function createTextLayerBuilder(textLayerDiv, pageIndex, viewport) {\n var enhanceTextSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var eventBus = arguments.length > 4 ? arguments[4] : undefined;\n return new TextLayerBuilder({\n textLayerDiv: textLayerDiv,\n pageIndex: pageIndex,\n viewport: viewport,\n enhanceTextSelection: enhanceTextSelection,\n eventBus: eventBus\n });\n }\n }]);\n\n return DefaultTextLayerFactory;\n}();\n\nexports.DefaultTextLayerFactory = DefaultTextLayerFactory;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.DownloadManager = void 0;\n\nvar _pdfjsLib = __w_pdfjs_require__(2);\n\nvar _viewer_compatibility = __w_pdfjs_require__(10);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n;\n\nfunction _download(blobUrl, filename) {\n var a = document.createElement("a");\n\n if (!a.click) {\n throw new Error(\'DownloadManager: "a.click()" is not supported.\');\n }\n\n a.href = blobUrl;\n a.target = "_parent";\n\n if ("download" in a) {\n a.download = filename;\n }\n\n (document.body || document.documentElement).appendChild(a);\n a.click();\n a.remove();\n}\n\nvar DownloadManager = /*#__PURE__*/function () {\n function DownloadManager() {\n _classCallCheck(this, DownloadManager);\n }\n\n _createClass(DownloadManager, [{\n key: "downloadUrl",\n value: function downloadUrl(url, filename) {\n if (!(0, _pdfjsLib.createValidAbsoluteUrl)(url, "http://example.com")) {\n return;\n }\n\n _download(url + "#pdfjs.action=download", filename);\n }\n }, {\n key: "downloadData",\n value: function downloadData(data, filename, contentType) {\n if (navigator.msSaveBlob) {\n navigator.msSaveBlob(new Blob([data], {\n type: contentType\n }), filename);\n return;\n }\n\n var blobUrl = (0, _pdfjsLib.createObjectURL)(data, contentType, _viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL);\n\n _download(blobUrl, filename);\n }\n }, {\n key: "download",\n value: function download(blob, url, filename) {\n var sourceEventType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "download";\n\n if (navigator.msSaveBlob) {\n if (!navigator.msSaveBlob(blob, filename)) {\n this.downloadUrl(url, filename);\n }\n\n return;\n }\n\n if (_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) {\n this.downloadUrl(url, filename);\n return;\n }\n\n var blobUrl = URL.createObjectURL(blob);\n\n _download(blobUrl, filename);\n }\n }]);\n\n return DownloadManager;\n}();\n\nexports.DownloadManager = DownloadManager;\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.viewerCompatibilityParams = void 0;\nvar compatibilityParams = Object.create(null);\n{\n var userAgent = typeof navigator !== "undefined" && navigator.userAgent || "";\n var platform = typeof navigator !== "undefined" && navigator.platform || "";\n var maxTouchPoints = typeof navigator !== "undefined" && navigator.maxTouchPoints || 1;\n var isAndroid = /Android/.test(userAgent);\n var isIE = /Trident/.test(userAgent);\n var isIOS = /\\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === "MacIntel" && maxTouchPoints > 1;\n var isIOSChrome = /CriOS/.test(userAgent);\n\n (function checkOnBlobSupport() {\n if (isIE || isIOSChrome) {\n compatibilityParams.disableCreateObjectURL = true;\n }\n })();\n\n (function checkCanvasSizeLimitation() {\n if (isIOS || isAndroid) {\n compatibilityParams.maxCanvasPixels = 5242880;\n }\n })();\n}\nvar viewerCompatibilityParams = Object.freeze(compatibilityParams);\nexports.viewerCompatibilityParams = viewerCompatibilityParams;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.GenericL10n = void 0;\n\nvar _regenerator = _interopRequireDefault(__w_pdfjs_require__(4));\n\n__w_pdfjs_require__(12);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }\n\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\n\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar webL10n = document.webL10n;\n\nvar GenericL10n = /*#__PURE__*/function () {\n function GenericL10n(lang) {\n _classCallCheck(this, GenericL10n);\n\n this._lang = lang;\n this._ready = new Promise(function (resolve, reject) {\n webL10n.setLanguage(lang, function () {\n resolve(webL10n);\n });\n });\n }\n\n _createClass(GenericL10n, [{\n key: "getLanguage",\n value: function () {\n var _getLanguage = _asyncToGenerator( /*#__PURE__*/_regenerator["default"].mark(function _callee() {\n var l10n;\n return _regenerator["default"].wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return this._ready;\n\n case 2:\n l10n = _context.sent;\n return _context.abrupt("return", l10n.getLanguage());\n\n case 4:\n case "end":\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n function getLanguage() {\n return _getLanguage.apply(this, arguments);\n }\n\n return getLanguage;\n }()\n }, {\n key: "getDirection",\n value: function () {\n var _getDirection = _asyncToGenerator( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {\n var l10n;\n return _regenerator["default"].wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return this._ready;\n\n case 2:\n l10n = _context2.sent;\n return _context2.abrupt("return", l10n.getDirection());\n\n case 4:\n case "end":\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n function getDirection() {\n return _getDirection.apply(this, arguments);\n }\n\n return getDirection;\n }()\n }, {\n key: "get",\n value: function () {\n var _get = _asyncToGenerator( /*#__PURE__*/_regenerator["default"].mark(function _callee3(property, args, fallback) {\n var l10n;\n return _regenerator["default"].wrap(function _callee3$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return this._ready;\n\n case 2:\n l10n = _context3.sent;\n return _context3.abrupt("return", l10n.get(property, args, fallback));\n\n case 4:\n case "end":\n return _context3.stop();\n }\n }\n }, _callee3, this);\n }));\n\n function get(_x, _x2, _x3) {\n return _get.apply(this, arguments);\n }\n\n return get;\n }()\n }, {\n key: "translate",\n value: function () {\n var _translate = _asyncToGenerator( /*#__PURE__*/_regenerator["default"].mark(function _callee4(element) {\n var l10n;\n return _regenerator["default"].wrap(function _callee4$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n _context4.next = 2;\n return this._ready;\n\n case 2:\n l10n = _context4.sent;\n return _context4.abrupt("return", l10n.translate(element));\n\n case 4:\n case "end":\n return _context4.stop();\n }\n }\n }, _callee4, this);\n }));\n\n function translate(_x4) {\n return _translate.apply(this, arguments);\n }\n\n return translate;\n }()\n }]);\n\n return GenericL10n;\n}();\n\nexports.GenericL10n = GenericL10n;\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\ndocument.webL10n = function (window, document, undefined) {\n var gL10nData = {};\n var gTextData = \'\';\n var gTextProp = \'textContent\';\n var gLanguage = \'\';\n var gMacros = {};\n var gReadyState = \'loading\';\n var gAsyncResourceLoading = true;\n\n function getL10nResourceLinks() {\n return document.querySelectorAll(\'link[type="application/l10n"]\');\n }\n\n function getL10nDictionary() {\n var script = document.querySelector(\'script[type="application/l10n"]\');\n return script ? JSON.parse(script.innerHTML) : null;\n }\n\n function getTranslatableChildren(element) {\n return element ? element.querySelectorAll(\'*[data-l10n-id]\') : [];\n }\n\n function getL10nAttributes(element) {\n if (!element) return {};\n var l10nId = element.getAttribute(\'data-l10n-id\');\n var l10nArgs = element.getAttribute(\'data-l10n-args\');\n var args = {};\n\n if (l10nArgs) {\n try {\n args = JSON.parse(l10nArgs);\n } catch (e) {\n console.warn(\'could not parse arguments for #\' + l10nId);\n }\n }\n\n return {\n id: l10nId,\n args: args\n };\n }\n\n function xhrLoadText(url, onSuccess, onFailure) {\n onSuccess = onSuccess || function _onSuccess(data) {};\n\n onFailure = onFailure || function _onFailure() {};\n\n var xhr = new XMLHttpRequest();\n xhr.open(\'GET\', url, gAsyncResourceLoading);\n\n if (xhr.overrideMimeType) {\n xhr.overrideMimeType(\'text/plain; charset=utf-8\');\n }\n\n xhr.onreadystatechange = function () {\n if (xhr.readyState == 4) {\n if (xhr.status == 200 || xhr.status === 0) {\n onSuccess(xhr.responseText);\n } else {\n onFailure();\n }\n }\n };\n\n xhr.onerror = onFailure;\n xhr.ontimeout = onFailure;\n\n try {\n xhr.send(null);\n } catch (e) {\n onFailure();\n }\n }\n\n function parseResource(href, lang, successCallback, failureCallback) {\n var baseURL = href.replace(/[^\\/]*$/, \'\') || \'./\';\n\n function evalString(text) {\n if (text.lastIndexOf(\'\\\\\') < 0) return text;\n return text.replace(/\\\\\\\\/g, \'\\\\\').replace(/\\\\n/g, \'\\n\').replace(/\\\\r/g, \'\\r\').replace(/\\\\t/g, \'\\t\').replace(/\\\\b/g, \'\\b\').replace(/\\\\f/g, \'\\f\').replace(/\\\\{/g, \'{\').replace(/\\\\}/g, \'}\').replace(/\\\\"/g, \'"\').replace(/\\\\\'/g, "\'");\n }\n\n function parseProperties(text, parsedPropertiesCallback) {\n var dictionary = {};\n var reBlank = /^\\s*|\\s*$/;\n var reComment = /^\\s*#|^\\s*$/;\n var reSection = /^\\s*\\[(.*)\\]\\s*$/;\n var reImport = /^\\s*@import\\s+url\\((.*)\\)\\s*$/i;\n var reSplit = /^([^=\\s]*)\\s*=\\s*(.+)$/;\n\n function parseRawLines(rawText, extendedSyntax, parsedRawLinesCallback) {\n var entries = rawText.replace(reBlank, \'\').split(/[\\r\\n]+/);\n var currentLang = \'*\';\n var genericLang = lang.split(\'-\', 1)[0];\n var skipLang = false;\n var match = \'\';\n\n function nextEntry() {\n while (true) {\n if (!entries.length) {\n parsedRawLinesCallback();\n return;\n }\n\n var line = entries.shift();\n if (reComment.test(line)) continue;\n\n if (extendedSyntax) {\n match = reSection.exec(line);\n\n if (match) {\n currentLang = match[1].toLowerCase();\n skipLang = currentLang !== \'*\' && currentLang !== lang && currentLang !== genericLang;\n continue;\n } else if (skipLang) {\n continue;\n }\n\n match = reImport.exec(line);\n\n if (match) {\n loadImport(baseURL + match[1], nextEntry);\n return;\n }\n }\n\n var tmp = line.match(reSplit);\n\n if (tmp && tmp.length == 3) {\n dictionary[tmp[1]] = evalString(tmp[2]);\n }\n }\n }\n\n nextEntry();\n }\n\n function loadImport(url, callback) {\n xhrLoadText(url, function (content) {\n parseRawLines(content, false, callback);\n }, function () {\n console.warn(url + \' not found.\');\n callback();\n });\n }\n\n parseRawLines(text, true, function () {\n parsedPropertiesCallback(dictionary);\n });\n }\n\n xhrLoadText(href, function (response) {\n gTextData += response;\n parseProperties(response, function (data) {\n for (var key in data) {\n var id,\n prop,\n index = key.lastIndexOf(\'.\');\n\n if (index > 0) {\n id = key.substring(0, index);\n prop = key.substring(index + 1);\n } else {\n id = key;\n prop = gTextProp;\n }\n\n if (!gL10nData[id]) {\n gL10nData[id] = {};\n }\n\n gL10nData[id][prop] = data[key];\n }\n\n if (successCallback) {\n successCallback();\n }\n });\n }, failureCallback);\n }\n\n function loadLocale(lang, callback) {\n if (lang) {\n lang = lang.toLowerCase();\n }\n\n callback = callback || function _callback() {};\n\n clear();\n gLanguage = lang;\n var langLinks = getL10nResourceLinks();\n var langCount = langLinks.length;\n\n if (langCount === 0) {\n var dict = getL10nDictionary();\n\n if (dict && dict.locales && dict.default_locale) {\n console.log(\'using the embedded JSON directory, early way out\');\n gL10nData = dict.locales[lang];\n\n if (!gL10nData) {\n var defaultLocale = dict.default_locale.toLowerCase();\n\n for (var anyCaseLang in dict.locales) {\n anyCaseLang = anyCaseLang.toLowerCase();\n\n if (anyCaseLang === lang) {\n gL10nData = dict.locales[lang];\n break;\n } else if (anyCaseLang === defaultLocale) {\n gL10nData = dict.locales[defaultLocale];\n }\n }\n }\n\n callback();\n } else {\n console.log(\'no resource to load, early way out\');\n }\n\n gReadyState = \'complete\';\n return;\n }\n\n var onResourceLoaded = null;\n var gResourceCount = 0;\n\n onResourceLoaded = function onResourceLoaded() {\n gResourceCount++;\n\n if (gResourceCount >= langCount) {\n callback();\n gReadyState = \'complete\';\n }\n };\n\n function L10nResourceLink(link) {\n var href = link.href;\n\n this.load = function (lang, callback) {\n parseResource(href, lang, callback, function () {\n console.warn(href + \' not found.\');\n console.warn(\'"\' + lang + \'" resource not found\');\n gLanguage = \'\';\n callback();\n });\n };\n }\n\n for (var i = 0; i < langCount; i++) {\n var resource = new L10nResourceLink(langLinks[i]);\n resource.load(lang, onResourceLoaded);\n }\n }\n\n function clear() {\n gL10nData = {};\n gTextData = \'\';\n gLanguage = \'\';\n }\n\n function getPluralRules(lang) {\n var locales2rules = {\n \'af\': 3,\n \'ak\': 4,\n \'am\': 4,\n \'ar\': 1,\n \'asa\': 3,\n \'az\': 0,\n \'be\': 11,\n \'bem\': 3,\n \'bez\': 3,\n \'bg\': 3,\n \'bh\': 4,\n \'bm\': 0,\n \'bn\': 3,\n \'bo\': 0,\n \'br\': 20,\n \'brx\': 3,\n \'bs\': 11,\n \'ca\': 3,\n \'cgg\': 3,\n \'chr\': 3,\n \'cs\': 12,\n \'cy\': 17,\n \'da\': 3,\n \'de\': 3,\n \'dv\': 3,\n \'dz\': 0,\n \'ee\': 3,\n \'el\': 3,\n \'en\': 3,\n \'eo\': 3,\n \'es\': 3,\n \'et\': 3,\n \'eu\': 3,\n \'fa\': 0,\n \'ff\': 5,\n \'fi\': 3,\n \'fil\': 4,\n \'fo\': 3,\n \'fr\': 5,\n \'fur\': 3,\n \'fy\': 3,\n \'ga\': 8,\n \'gd\': 24,\n \'gl\': 3,\n \'gsw\': 3,\n \'gu\': 3,\n \'guw\': 4,\n \'gv\': 23,\n \'ha\': 3,\n \'haw\': 3,\n \'he\': 2,\n \'hi\': 4,\n \'hr\': 11,\n \'hu\': 0,\n \'id\': 0,\n \'ig\': 0,\n \'ii\': 0,\n \'is\': 3,\n \'it\': 3,\n \'iu\': 7,\n \'ja\': 0,\n \'jmc\': 3,\n \'jv\': 0,\n \'ka\': 0,\n \'kab\': 5,\n \'kaj\': 3,\n \'kcg\': 3,\n \'kde\': 0,\n \'kea\': 0,\n \'kk\': 3,\n \'kl\': 3,\n \'km\': 0,\n \'kn\': 0,\n \'ko\': 0,\n \'ksb\': 3,\n \'ksh\': 21,\n \'ku\': 3,\n \'kw\': 7,\n \'lag\': 18,\n \'lb\': 3,\n \'lg\': 3,\n \'ln\': 4,\n \'lo\': 0,\n \'lt\': 10,\n \'lv\': 6,\n \'mas\': 3,\n \'mg\': 4,\n \'mk\': 16,\n \'ml\': 3,\n \'mn\': 3,\n \'mo\': 9,\n \'mr\': 3,\n \'ms\': 0,\n \'mt\': 15,\n \'my\': 0,\n \'nah\': 3,\n \'naq\': 7,\n \'nb\': 3,\n \'nd\': 3,\n \'ne\': 3,\n \'nl\': 3,\n \'nn\': 3,\n \'no\': 3,\n \'nr\': 3,\n \'nso\': 4,\n \'ny\': 3,\n \'nyn\': 3,\n \'om\': 3,\n \'or\': 3,\n \'pa\': 3,\n \'pap\': 3,\n \'pl\': 13,\n \'ps\': 3,\n \'pt\': 3,\n \'rm\': 3,\n \'ro\': 9,\n \'rof\': 3,\n \'ru\': 11,\n \'rwk\': 3,\n \'sah\': 0,\n \'saq\': 3,\n \'se\': 7,\n \'seh\': 3,\n \'ses\': 0,\n \'sg\': 0,\n \'sh\': 11,\n \'shi\': 19,\n \'sk\': 12,\n \'sl\': 14,\n \'sma\': 7,\n \'smi\': 7,\n \'smj\': 7,\n \'smn\': 7,\n \'sms\': 7,\n \'sn\': 3,\n \'so\': 3,\n \'sq\': 3,\n \'sr\': 11,\n \'ss\': 3,\n \'ssy\': 3,\n \'st\': 3,\n \'sv\': 3,\n \'sw\': 3,\n \'syr\': 3,\n \'ta\': 3,\n \'te\': 3,\n \'teo\': 3,\n \'th\': 0,\n \'ti\': 4,\n \'tig\': 3,\n \'tk\': 3,\n \'tl\': 4,\n \'tn\': 3,\n \'to\': 0,\n \'tr\': 0,\n \'ts\': 3,\n \'tzm\': 22,\n \'uk\': 11,\n \'ur\': 3,\n \'ve\': 3,\n \'vi\': 0,\n \'vun\': 3,\n \'wa\': 4,\n \'wae\': 3,\n \'wo\': 0,\n \'xh\': 3,\n \'xog\': 3,\n \'yo\': 0,\n \'zh\': 0,\n \'zu\': 3\n };\n\n function isIn(n, list) {\n return list.indexOf(n) !== -1;\n }\n\n function isBetween(n, start, end) {\n return start <= n && n <= end;\n }\n\n var pluralRules = {\n \'0\': function _(n) {\n return \'other\';\n },\n \'1\': function _(n) {\n if (isBetween(n % 100, 3, 10)) return \'few\';\n if (n === 0) return \'zero\';\n if (isBetween(n % 100, 11, 99)) return \'many\';\n if (n == 2) return \'two\';\n if (n == 1) return \'one\';\n return \'other\';\n },\n \'2\': function _(n) {\n if (n !== 0 && n % 10 === 0) return \'many\';\n if (n == 2) return \'two\';\n if (n == 1) return \'one\';\n return \'other\';\n },\n \'3\': function _(n) {\n if (n == 1) return \'one\';\n return \'other\';\n },\n \'4\': function _(n) {\n if (isBetween(n, 0, 1)) return \'one\';\n return \'other\';\n },\n \'5\': function _(n) {\n if (isBetween(n, 0, 2) && n != 2) return \'one\';\n return \'other\';\n },\n \'6\': function _(n) {\n if (n === 0) return \'zero\';\n if (n % 10 == 1 && n % 100 != 11) return \'one\';\n return \'other\';\n },\n \'7\': function _(n) {\n if (n == 2) return \'two\';\n if (n == 1) return \'one\';\n return \'other\';\n },\n \'8\': function _(n) {\n if (isBetween(n, 3, 6)) return \'few\';\n if (isBetween(n, 7, 10)) return \'many\';\n if (n == 2) return \'two\';\n if (n == 1) return \'one\';\n return \'other\';\n },\n \'9\': function _(n) {\n if (n === 0 || n != 1 && isBetween(n % 100, 1, 19)) return \'few\';\n if (n == 1) return \'one\';\n return \'other\';\n },\n \'10\': function _(n) {\n if (isBetween(n % 10, 2, 9) && !isBetween(n % 100, 11, 19)) return \'few\';\n if (n % 10 == 1 && !isBetween(n % 100, 11, 19)) return \'one\';\n return \'other\';\n },\n \'11\': function _(n) {\n if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return \'few\';\n if (n % 10 === 0 || isBetween(n % 10, 5, 9) || isBetween(n % 100, 11, 14)) return \'many\';\n if (n % 10 == 1 && n % 100 != 11) return \'one\';\n return \'other\';\n },\n \'12\': function _(n) {\n if (isBetween(n, 2, 4)) return \'few\';\n if (n == 1) return \'one\';\n return \'other\';\n },\n \'13\': function _(n) {\n if (isBetween(n % 10, 2, 4) && !isBetween(n % 100, 12, 14)) return \'few\';\n if (n != 1 && isBetween(n % 10, 0, 1) || isBetween(n % 10, 5, 9) || isBetween(n % 100, 12, 14)) return \'many\';\n if (n == 1) return \'one\';\n return \'other\';\n },\n \'14\': function _(n) {\n if (isBetween(n % 100, 3, 4)) return \'few\';\n if (n % 100 == 2) return \'two\';\n if (n % 100 == 1) return \'one\';\n return \'other\';\n },\n \'15\': function _(n) {\n if (n === 0 || isBetween(n % 100, 2, 10)) return \'few\';\n if (isBetween(n % 100, 11, 19)) return \'many\';\n if (n == 1) return \'one\';\n return \'other\';\n },\n \'16\': function _(n) {\n if (n % 10 == 1 && n != 11) return \'one\';\n return \'other\';\n },\n \'17\': function _(n) {\n if (n == 3) return \'few\';\n if (n === 0) return \'zero\';\n if (n == 6) return \'many\';\n if (n == 2) return \'two\';\n if (n == 1) return \'one\';\n return \'other\';\n },\n \'18\': function _(n) {\n if (n === 0) return \'zero\';\n if (isBetween(n, 0, 2) && n !== 0 && n != 2) return \'one\';\n return \'other\';\n },\n \'19\': function _(n) {\n if (isBetween(n, 2, 10)) return \'few\';\n if (isBetween(n, 0, 1)) return \'one\';\n return \'other\';\n },\n \'20\': function _(n) {\n if ((isBetween(n % 10, 3, 4) || n % 10 == 9) && !(isBetween(n % 100, 10, 19) || isBetween(n % 100, 70, 79) || isBetween(n % 100, 90, 99))) return \'few\';\n if (n % 1000000 === 0 && n !== 0) return \'many\';\n if (n % 10 == 2 && !isIn(n % 100, [12, 72, 92])) return \'two\';\n if (n % 10 == 1 && !isIn(n % 100, [11, 71, 91])) return \'one\';\n return \'other\';\n },\n \'21\': function _(n) {\n if (n === 0) return \'zero\';\n if (n == 1) return \'one\';\n return \'other\';\n },\n \'22\': function _(n) {\n if (isBetween(n, 0, 1) || isBetween(n, 11, 99)) return \'one\';\n return \'other\';\n },\n \'23\': function _(n) {\n if (isBetween(n % 10, 1, 2) || n % 20 === 0) return \'one\';\n return \'other\';\n },\n \'24\': function _(n) {\n if (isBetween(n, 3, 10) || isBetween(n, 13, 19)) return \'few\';\n if (isIn(n, [2, 12])) return \'two\';\n if (isIn(n, [1, 11])) return \'one\';\n return \'other\';\n }\n };\n var index = locales2rules[lang.replace(/-.*$/, \'\')];\n\n if (!(index in pluralRules)) {\n console.warn(\'plural form unknown for [\' + lang + \']\');\n return function () {\n return \'other\';\n };\n }\n\n return pluralRules[index];\n }\n\n gMacros.plural = function (str, param, key, prop) {\n var n = parseFloat(param);\n if (isNaN(n)) return str;\n if (prop != gTextProp) return str;\n\n if (!gMacros._pluralRules) {\n gMacros._pluralRules = getPluralRules(gLanguage);\n }\n\n var index = \'[\' + gMacros._pluralRules(n) + \']\';\n\n if (n === 0 && key + \'[zero]\' in gL10nData) {\n str = gL10nData[key + \'[zero]\'][prop];\n } else if (n == 1 && key + \'[one]\' in gL10nData) {\n str = gL10nData[key + \'[one]\'][prop];\n } else if (n == 2 && key + \'[two]\' in gL10nData) {\n str = gL10nData[key + \'[two]\'][prop];\n } else if (key + index in gL10nData) {\n str = gL10nData[key + index][prop];\n } else if (key + \'[other]\' in gL10nData) {\n str = gL10nData[key + \'[other]\'][prop];\n }\n\n return str;\n };\n\n function getL10nData(key, args, fallback) {\n var data = gL10nData[key];\n\n if (!data) {\n console.warn(\'#\' + key + \' is undefined.\');\n\n if (!fallback) {\n return null;\n }\n\n data = fallback;\n }\n\n var rv = {};\n\n for (var prop in data) {\n var str = data[prop];\n str = substIndexes(str, args, key, prop);\n str = substArguments(str, args, key);\n rv[prop] = str;\n }\n\n return rv;\n }\n\n function substIndexes(str, args, key, prop) {\n var reIndex = /\\{\\[\\s*([a-zA-Z]+)\\(([a-zA-Z]+)\\)\\s*\\]\\}/;\n var reMatch = reIndex.exec(str);\n if (!reMatch || !reMatch.length) return str;\n var macroName = reMatch[1];\n var paramName = reMatch[2];\n var param;\n\n if (args && paramName in args) {\n param = args[paramName];\n } else if (paramName in gL10nData) {\n param = gL10nData[paramName];\n }\n\n if (macroName in gMacros) {\n var macro = gMacros[macroName];\n str = macro(str, param, key, prop);\n }\n\n return str;\n }\n\n function substArguments(str, args, key) {\n var reArgs = /\\{\\{\\s*(.+?)\\s*\\}\\}/g;\n return str.replace(reArgs, function (matched_text, arg) {\n if (args && arg in args) {\n return args[arg];\n }\n\n if (arg in gL10nData) {\n return gL10nData[arg];\n }\n\n console.log(\'argument {{\' + arg + \'}} for #\' + key + \' is undefined.\');\n return matched_text;\n });\n }\n\n function translateElement(element) {\n var l10n = getL10nAttributes(element);\n if (!l10n.id) return;\n var data = getL10nData(l10n.id, l10n.args);\n\n if (!data) {\n console.warn(\'#\' + l10n.id + \' is undefined.\');\n return;\n }\n\n if (data[gTextProp]) {\n if (getChildElementCount(element) === 0) {\n element[gTextProp] = data[gTextProp];\n } else {\n var children = element.childNodes;\n var found = false;\n\n for (var i = 0, l = children.length; i < l; i++) {\n if (children[i].nodeType === 3 && /\\S/.test(children[i].nodeValue)) {\n if (found) {\n children[i].nodeValue = \'\';\n } else {\n children[i].nodeValue = data[gTextProp];\n found = true;\n }\n }\n }\n\n if (!found) {\n var textNode = document.createTextNode(data[gTextProp]);\n element.insertBefore(textNode, element.firstChild);\n }\n }\n\n delete data[gTextProp];\n }\n\n for (var k in data) {\n element[k] = data[k];\n }\n }\n\n function getChildElementCount(element) {\n if (element.children) {\n return element.children.length;\n }\n\n if (typeof element.childElementCount !== \'undefined\') {\n return element.childElementCount;\n }\n\n var count = 0;\n\n for (var i = 0; i < element.childNodes.length; i++) {\n count += element.nodeType === 1 ? 1 : 0;\n }\n\n return count;\n }\n\n function translateFragment(element) {\n element = element || document.documentElement;\n var children = getTranslatableChildren(element);\n var elementCount = children.length;\n\n for (var i = 0; i < elementCount; i++) {\n translateElement(children[i]);\n }\n\n translateElement(element);\n }\n\n return {\n get: function get(key, args, fallbackString) {\n var index = key.lastIndexOf(\'.\');\n var prop = gTextProp;\n\n if (index > 0) {\n prop = key.substring(index + 1);\n key = key.substring(0, index);\n }\n\n var fallback;\n\n if (fallbackString) {\n fallback = {};\n fallback[prop] = fallbackString;\n }\n\n var data = getL10nData(key, args, fallback);\n\n if (data && prop in data) {\n return data[prop];\n }\n\n return \'{{\' + key + \'}}\';\n },\n getData: function getData() {\n return gL10nData;\n },\n getText: function getText() {\n return gTextData;\n },\n getLanguage: function getLanguage() {\n return gLanguage;\n },\n setLanguage: function setLanguage(lang, callback) {\n loadLocale(lang, function () {\n if (callback) callback();\n });\n },\n getDirection: function getDirection() {\n var rtlList = [\'ar\', \'he\', \'fa\', \'ps\', \'ur\'];\n var shortCode = gLanguage.split(\'-\', 1)[0];\n return rtlList.indexOf(shortCode) >= 0 ? \'rtl\' : \'ltr\';\n },\n translate: translateFragment,\n getReadyState: function getReadyState() {\n return gReadyState;\n },\n ready: function ready(callback) {\n if (!callback) {\n return;\n } else if (gReadyState == \'complete\' || gReadyState == \'interactive\') {\n window.setTimeout(function () {\n callback();\n });\n } else if (document.addEventListener) {\n document.addEventListener(\'localized\', function once() {\n document.removeEventListener(\'localized\', once);\n callback();\n });\n }\n }\n };\n}(window, document);\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.PDFFindController = exports.FindState = void 0;\n\nvar _pdfjsLib = __w_pdfjs_require__(2);\n\nvar _pdf_find_utils = __w_pdfjs_require__(14);\n\nvar _ui_utils = __w_pdfjs_require__(3);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar FindState = {\n FOUND: 0,\n NOT_FOUND: 1,\n WRAPPED: 2,\n PENDING: 3\n};\nexports.FindState = FindState;\nvar FIND_TIMEOUT = 250;\nvar MATCH_SCROLL_OFFSET_TOP = -50;\nvar MATCH_SCROLL_OFFSET_LEFT = -400;\nvar CHARACTERS_TO_NORMALIZE = {\n "\\u2018": "\'",\n "\\u2019": "\'",\n "\\u201A": "\'",\n "\\u201B": "\'",\n "\\u201C": \'"\',\n "\\u201D": \'"\',\n "\\u201E": \'"\',\n "\\u201F": \'"\',\n "\\xBC": "1/4",\n "\\xBD": "1/2",\n "\\xBE": "3/4"\n};\nvar normalizationRegex = null;\n\nfunction normalize(text) {\n if (!normalizationRegex) {\n var replace = Object.keys(CHARACTERS_TO_NORMALIZE).join("");\n normalizationRegex = new RegExp("[".concat(replace, "]"), "g");\n }\n\n return text.replace(normalizationRegex, function (ch) {\n return CHARACTERS_TO_NORMALIZE[ch];\n });\n}\n\nvar PDFFindController = /*#__PURE__*/function () {\n function PDFFindController(_ref) {\n var linkService = _ref.linkService,\n eventBus = _ref.eventBus;\n\n _classCallCheck(this, PDFFindController);\n\n this._linkService = linkService;\n this._eventBus = eventBus;\n\n this._reset();\n\n eventBus._on("findbarclose", this._onFindBarClose.bind(this));\n }\n\n _createClass(PDFFindController, [{\n key: "setDocument",\n value: function setDocument(pdfDocument) {\n if (this._pdfDocument) {\n this._reset();\n }\n\n if (!pdfDocument) {\n return;\n }\n\n this._pdfDocument = pdfDocument;\n\n this._firstPageCapability.resolve();\n }\n }, {\n key: "executeCommand",\n value: function executeCommand(cmd, state) {\n var _this = this;\n\n if (!state) {\n return;\n }\n\n var pdfDocument = this._pdfDocument;\n\n if (this._state === null || this._shouldDirtyMatch(cmd, state)) {\n this._dirtyMatch = true;\n }\n\n this._state = state;\n\n if (cmd !== "findhighlightallchange") {\n this._updateUIState(FindState.PENDING);\n }\n\n this._firstPageCapability.promise.then(function () {\n if (!_this._pdfDocument || pdfDocument && _this._pdfDocument !== pdfDocument) {\n return;\n }\n\n _this._extractText();\n\n var findbarClosed = !_this._highlightMatches;\n var pendingTimeout = !!_this._findTimeout;\n\n if (_this._findTimeout) {\n clearTimeout(_this._findTimeout);\n _this._findTimeout = null;\n }\n\n if (cmd === "find") {\n _this._findTimeout = setTimeout(function () {\n _this._nextMatch();\n\n _this._findTimeout = null;\n }, FIND_TIMEOUT);\n } else if (_this._dirtyMatch) {\n _this._nextMatch();\n } else if (cmd === "findagain") {\n _this._nextMatch();\n\n if (findbarClosed && _this._state.highlightAll) {\n _this._updateAllPages();\n }\n } else if (cmd === "findhighlightallchange") {\n if (pendingTimeout) {\n _this._nextMatch();\n } else {\n _this._highlightMatches = true;\n }\n\n _this._updateAllPages();\n } else {\n _this._nextMatch();\n }\n });\n }\n }, {\n key: "scrollMatchIntoView",\n value: function scrollMatchIntoView(_ref2) {\n var _ref2$element = _ref2.element,\n element = _ref2$element === void 0 ? null : _ref2$element,\n _ref2$pageIndex = _ref2.pageIndex,\n pageIndex = _ref2$pageIndex === void 0 ? -1 : _ref2$pageIndex,\n _ref2$matchIndex = _ref2.matchIndex,\n matchIndex = _ref2$matchIndex === void 0 ? -1 : _ref2$matchIndex;\n\n if (!this._scrollMatches || !element) {\n return;\n } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) {\n return;\n } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) {\n return;\n }\n\n this._scrollMatches = false;\n var spot = {\n top: MATCH_SCROLL_OFFSET_TOP,\n left: MATCH_SCROLL_OFFSET_LEFT\n };\n (0, _ui_utils.scrollIntoView)(element, spot, true);\n }\n }, {\n key: "_reset",\n value: function _reset() {\n this._highlightMatches = false;\n this._scrollMatches = false;\n this._pdfDocument = null;\n this._pageMatches = [];\n this._pageMatchesLength = [];\n this._state = null;\n this._selected = {\n pageIdx: -1,\n matchIdx: -1\n };\n this._offset = {\n pageIdx: null,\n matchIdx: null,\n wrapped: false\n };\n this._extractTextPromises = [];\n this._pageContents = [];\n this._matchesCountTotal = 0;\n this._pagesToSearch = null;\n this._pendingFindMatches = Object.create(null);\n this._resumePageIdx = null;\n this._dirtyMatch = false;\n clearTimeout(this._findTimeout);\n this._findTimeout = null;\n this._firstPageCapability = (0, _pdfjsLib.createPromiseCapability)();\n }\n }, {\n key: "_shouldDirtyMatch",\n value: function _shouldDirtyMatch(cmd, state) {\n if (state.query !== this._state.query) {\n return true;\n }\n\n switch (cmd) {\n case "findagain":\n var pageNumber = this._selected.pageIdx + 1;\n var linkService = this._linkService;\n\n if (pageNumber >= 1 && pageNumber <= linkService.pagesCount && pageNumber !== linkService.page && !linkService.isPageVisible(pageNumber)) {\n return true;\n }\n\n return false;\n\n case "findhighlightallchange":\n return false;\n }\n\n return true;\n }\n }, {\n key: "_prepareMatches",\n value: function _prepareMatches(matchesWithLength, matches, matchesLength) {\n function isSubTerm(currentIndex) {\n var currentElem = matchesWithLength[currentIndex];\n var nextElem = matchesWithLength[currentIndex + 1];\n\n if (currentIndex < matchesWithLength.length - 1 && currentElem.match === nextElem.match) {\n currentElem.skipped = true;\n return true;\n }\n\n for (var i = currentIndex - 1; i >= 0; i--) {\n var prevElem = matchesWithLength[i];\n\n if (prevElem.skipped) {\n continue;\n }\n\n if (prevElem.match + prevElem.matchLength < currentElem.match) {\n break;\n }\n\n if (prevElem.match + prevElem.matchLength >= currentElem.match + currentElem.matchLength) {\n currentElem.skipped = true;\n return true;\n }\n }\n\n return false;\n }\n\n matchesWithLength.sort(function (a, b) {\n return a.match === b.match ? a.matchLength - b.matchLength : a.match - b.match;\n });\n\n for (var i = 0, len = matchesWithLength.length; i < len; i++) {\n if (isSubTerm(i)) {\n continue;\n }\n\n matches.push(matchesWithLength[i].match);\n matchesLength.push(matchesWithLength[i].matchLength);\n }\n }\n }, {\n key: "_isEntireWord",\n value: function _isEntireWord(content, startIdx, length) {\n if (startIdx > 0) {\n var first = content.charCodeAt(startIdx);\n var limit = content.charCodeAt(startIdx - 1);\n\n if ((0, _pdf_find_utils.getCharacterType)(first) === (0, _pdf_find_utils.getCharacterType)(limit)) {\n return false;\n }\n }\n\n var endIdx = startIdx + length - 1;\n\n if (endIdx < content.length - 1) {\n var last = content.charCodeAt(endIdx);\n\n var _limit = content.charCodeAt(endIdx + 1);\n\n if ((0, _pdf_find_utils.getCharacterType)(last) === (0, _pdf_find_utils.getCharacterType)(_limit)) {\n return false;\n }\n }\n\n return true;\n }\n }, {\n key: "_calculatePhraseMatch",\n value: function _calculatePhraseMatch(query, pageIndex, pageContent, entireWord) {\n var matches = [];\n var queryLen = query.length;\n var matchIdx = -queryLen;\n\n while (true) {\n matchIdx = pageContent.indexOf(query, matchIdx + queryLen);\n\n if (matchIdx === -1) {\n break;\n }\n\n if (entireWord && !this._isEntireWord(pageContent, matchIdx, queryLen)) {\n continue;\n }\n\n matches.push(matchIdx);\n }\n\n this._pageMatches[pageIndex] = matches;\n }\n }, {\n key: "_calculateWordMatch",\n value: function _calculateWordMatch(query, pageIndex, pageContent, entireWord) {\n var matchesWithLength = [];\n var queryArray = query.match(/\\S+/g);\n\n for (var i = 0, len = queryArray.length; i < len; i++) {\n var subquery = queryArray[i];\n var subqueryLen = subquery.length;\n var matchIdx = -subqueryLen;\n\n while (true) {\n matchIdx = pageContent.indexOf(subquery, matchIdx + subqueryLen);\n\n if (matchIdx === -1) {\n break;\n }\n\n if (entireWord && !this._isEntireWord(pageContent, matchIdx, subqueryLen)) {\n continue;\n }\n\n matchesWithLength.push({\n match: matchIdx,\n matchLength: subqueryLen,\n skipped: false\n });\n }\n }\n\n this._pageMatchesLength[pageIndex] = [];\n this._pageMatches[pageIndex] = [];\n\n this._prepareMatches(matchesWithLength, this._pageMatches[pageIndex], this._pageMatchesLength[pageIndex]);\n }\n }, {\n key: "_calculateMatch",\n value: function _calculateMatch(pageIndex) {\n var pageContent = this._pageContents[pageIndex];\n var query = this._query;\n var _this$_state = this._state,\n caseSensitive = _this$_state.caseSensitive,\n entireWord = _this$_state.entireWord,\n phraseSearch = _this$_state.phraseSearch;\n\n if (query.length === 0) {\n return;\n }\n\n if (!caseSensitive) {\n pageContent = pageContent.toLowerCase();\n query = query.toLowerCase();\n }\n\n if (phraseSearch) {\n this._calculatePhraseMatch(query, pageIndex, pageContent, entireWord);\n } else {\n this._calculateWordMatch(query, pageIndex, pageContent, entireWord);\n }\n\n if (this._state.highlightAll) {\n this._updatePage(pageIndex);\n }\n\n if (this._resumePageIdx === pageIndex) {\n this._resumePageIdx = null;\n\n this._nextPageMatch();\n }\n\n var pageMatchesCount = this._pageMatches[pageIndex].length;\n\n if (pageMatchesCount > 0) {\n this._matchesCountTotal += pageMatchesCount;\n\n this._updateUIResultsCount();\n }\n }\n }, {\n key: "_extractText",\n value: function _extractText() {\n var _this2 = this;\n\n if (this._extractTextPromises.length > 0) {\n return;\n }\n\n var promise = Promise.resolve();\n\n var _loop = function _loop(i, ii) {\n var extractTextCapability = (0, _pdfjsLib.createPromiseCapability)();\n _this2._extractTextPromises[i] = extractTextCapability.promise;\n promise = promise.then(function () {\n return _this2._pdfDocument.getPage(i + 1).then(function (pdfPage) {\n return pdfPage.getTextContent({\n normalizeWhitespace: true\n });\n }).then(function (textContent) {\n var textItems = textContent.items;\n var strBuf = [];\n\n for (var j = 0, jj = textItems.length; j < jj; j++) {\n strBuf.push(textItems[j].str);\n }\n\n _this2._pageContents[i] = normalize(strBuf.join(""));\n extractTextCapability.resolve(i);\n }, function (reason) {\n console.error("Unable to get text content for page ".concat(i + 1), reason);\n _this2._pageContents[i] = "";\n extractTextCapability.resolve(i);\n });\n });\n };\n\n for (var i = 0, ii = this._linkService.pagesCount; i < ii; i++) {\n _loop(i, ii);\n }\n }\n }, {\n key: "_updatePage",\n value: function _updatePage(index) {\n if (this._scrollMatches && this._selected.pageIdx === index) {\n this._linkService.page = index + 1;\n }\n\n this._eventBus.dispatch("updatetextlayermatches", {\n source: this,\n pageIndex: index\n });\n }\n }, {\n key: "_updateAllPages",\n value: function _updateAllPages() {\n this._eventBus.dispatch("updatetextlayermatches", {\n source: this,\n pageIndex: -1\n });\n }\n }, {\n key: "_nextMatch",\n value: function _nextMatch() {\n var _this3 = this;\n\n var previous = this._state.findPrevious;\n var currentPageIndex = this._linkService.page - 1;\n var numPages = this._linkService.pagesCount;\n this._highlightMatches = true;\n\n if (this._dirtyMatch) {\n this._dirtyMatch = false;\n this._selected.pageIdx = this._selected.matchIdx = -1;\n this._offset.pageIdx = currentPageIndex;\n this._offset.matchIdx = null;\n this._offset.wrapped = false;\n this._resumePageIdx = null;\n this._pageMatches.length = 0;\n this._pageMatchesLength.length = 0;\n this._matchesCountTotal = 0;\n\n this._updateAllPages();\n\n for (var i = 0; i < numPages; i++) {\n if (this._pendingFindMatches[i] === true) {\n continue;\n }\n\n this._pendingFindMatches[i] = true;\n\n this._extractTextPromises[i].then(function (pageIdx) {\n delete _this3._pendingFindMatches[pageIdx];\n\n _this3._calculateMatch(pageIdx);\n });\n }\n }\n\n if (this._query === "") {\n this._updateUIState(FindState.FOUND);\n\n return;\n }\n\n if (this._resumePageIdx) {\n return;\n }\n\n var offset = this._offset;\n this._pagesToSearch = numPages;\n\n if (offset.matchIdx !== null) {\n var numPageMatches = this._pageMatches[offset.pageIdx].length;\n\n if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) {\n offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1;\n\n this._updateMatch(true);\n\n return;\n }\n\n this._advanceOffsetPage(previous);\n }\n\n this._nextPageMatch();\n }\n }, {\n key: "_matchesReady",\n value: function _matchesReady(matches) {\n var offset = this._offset;\n var numMatches = matches.length;\n var previous = this._state.findPrevious;\n\n if (numMatches) {\n offset.matchIdx = previous ? numMatches - 1 : 0;\n\n this._updateMatch(true);\n\n return true;\n }\n\n this._advanceOffsetPage(previous);\n\n if (offset.wrapped) {\n offset.matchIdx = null;\n\n if (this._pagesToSearch < 0) {\n this._updateMatch(false);\n\n return true;\n }\n }\n\n return false;\n }\n }, {\n key: "_nextPageMatch",\n value: function _nextPageMatch() {\n if (this._resumePageIdx !== null) {\n console.error("There can only be one pending page.");\n }\n\n var matches = null;\n\n do {\n var pageIdx = this._offset.pageIdx;\n matches = this._pageMatches[pageIdx];\n\n if (!matches) {\n this._resumePageIdx = pageIdx;\n break;\n }\n } while (!this._matchesReady(matches));\n }\n }, {\n key: "_advanceOffsetPage",\n value: function _advanceOffsetPage(previous) {\n var offset = this._offset;\n var numPages = this._linkService.pagesCount;\n offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1;\n offset.matchIdx = null;\n this._pagesToSearch--;\n\n if (offset.pageIdx >= numPages || offset.pageIdx < 0) {\n offset.pageIdx = previous ? numPages - 1 : 0;\n offset.wrapped = true;\n }\n }\n }, {\n key: "_updateMatch",\n value: function _updateMatch() {\n var found = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var state = FindState.NOT_FOUND;\n var wrapped = this._offset.wrapped;\n this._offset.wrapped = false;\n\n if (found) {\n var previousPage = this._selected.pageIdx;\n this._selected.pageIdx = this._offset.pageIdx;\n this._selected.matchIdx = this._offset.matchIdx;\n state = wrapped ? FindState.WRAPPED : FindState.FOUND;\n\n if (previousPage !== -1 && previousPage !== this._selected.pageIdx) {\n this._updatePage(previousPage);\n }\n }\n\n this._updateUIState(state, this._state.findPrevious);\n\n if (this._selected.pageIdx !== -1) {\n this._scrollMatches = true;\n\n this._updatePage(this._selected.pageIdx);\n }\n }\n }, {\n key: "_onFindBarClose",\n value: function _onFindBarClose(evt) {\n var _this4 = this;\n\n var pdfDocument = this._pdfDocument;\n\n this._firstPageCapability.promise.then(function () {\n if (!_this4._pdfDocument || pdfDocument && _this4._pdfDocument !== pdfDocument) {\n return;\n }\n\n if (_this4._findTimeout) {\n clearTimeout(_this4._findTimeout);\n _this4._findTimeout = null;\n }\n\n if (_this4._resumePageIdx) {\n _this4._resumePageIdx = null;\n _this4._dirtyMatch = true;\n }\n\n _this4._updateUIState(FindState.FOUND);\n\n _this4._highlightMatches = false;\n\n _this4._updateAllPages();\n });\n }\n }, {\n key: "_requestMatchesCount",\n value: function _requestMatchesCount() {\n var _this$_selected = this._selected,\n pageIdx = _this$_selected.pageIdx,\n matchIdx = _this$_selected.matchIdx;\n var current = 0,\n total = this._matchesCountTotal;\n\n if (matchIdx !== -1) {\n for (var i = 0; i < pageIdx; i++) {\n current += this._pageMatches[i] && this._pageMatches[i].length || 0;\n }\n\n current += matchIdx + 1;\n }\n\n if (current < 1 || current > total) {\n current = total = 0;\n }\n\n return {\n current: current,\n total: total\n };\n }\n }, {\n key: "_updateUIResultsCount",\n value: function _updateUIResultsCount() {\n this._eventBus.dispatch("updatefindmatchescount", {\n source: this,\n matchesCount: this._requestMatchesCount()\n });\n }\n }, {\n key: "_updateUIState",\n value: function _updateUIState(state, previous) {\n this._eventBus.dispatch("updatefindcontrolstate", {\n source: this,\n state: state,\n previous: previous,\n matchesCount: this._requestMatchesCount(),\n rawQuery: this._state ? this._state.query : null\n });\n }\n }, {\n key: "highlightMatches",\n get: function get() {\n return this._highlightMatches;\n }\n }, {\n key: "pageMatches",\n get: function get() {\n return this._pageMatches;\n }\n }, {\n key: "pageMatchesLength",\n get: function get() {\n return this._pageMatchesLength;\n }\n }, {\n key: "selected",\n get: function get() {\n return this._selected;\n }\n }, {\n key: "state",\n get: function get() {\n return this._state;\n }\n }, {\n key: "_query",\n get: function get() {\n if (this._state.query !== this._rawQuery) {\n this._rawQuery = this._state.query;\n this._normalizedQuery = normalize(this._state.query);\n }\n\n return this._normalizedQuery;\n }\n }]);\n\n return PDFFindController;\n}();\n\nexports.PDFFindController = PDFFindController;\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.getCharacterType = getCharacterType;\nexports.CharacterType = void 0;\nvar CharacterType = {\n SPACE: 0,\n ALPHA_LETTER: 1,\n PUNCT: 2,\n HAN_LETTER: 3,\n KATAKANA_LETTER: 4,\n HIRAGANA_LETTER: 5,\n HALFWIDTH_KATAKANA_LETTER: 6,\n THAI_LETTER: 7\n};\nexports.CharacterType = CharacterType;\n\nfunction isAlphabeticalScript(charCode) {\n return charCode < 0x2e80;\n}\n\nfunction isAscii(charCode) {\n return (charCode & 0xff80) === 0;\n}\n\nfunction isAsciiAlpha(charCode) {\n return charCode >= 0x61 && charCode <= 0x7a || charCode >= 0x41 && charCode <= 0x5a;\n}\n\nfunction isAsciiDigit(charCode) {\n return charCode >= 0x30 && charCode <= 0x39;\n}\n\nfunction isAsciiSpace(charCode) {\n return charCode === 0x20 || charCode === 0x09 || charCode === 0x0d || charCode === 0x0a;\n}\n\nfunction isHan(charCode) {\n return charCode >= 0x3400 && charCode <= 0x9fff || charCode >= 0xf900 && charCode <= 0xfaff;\n}\n\nfunction isKatakana(charCode) {\n return charCode >= 0x30a0 && charCode <= 0x30ff;\n}\n\nfunction isHiragana(charCode) {\n return charCode >= 0x3040 && charCode <= 0x309f;\n}\n\nfunction isHalfwidthKatakana(charCode) {\n return charCode >= 0xff60 && charCode <= 0xff9f;\n}\n\nfunction isThai(charCode) {\n return (charCode & 0xff80) === 0x0e00;\n}\n\nfunction getCharacterType(charCode) {\n if (isAlphabeticalScript(charCode)) {\n if (isAscii(charCode)) {\n if (isAsciiSpace(charCode)) {\n return CharacterType.SPACE;\n } else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) || charCode === 0x5f) {\n return CharacterType.ALPHA_LETTER;\n }\n\n return CharacterType.PUNCT;\n } else if (isThai(charCode)) {\n return CharacterType.THAI_LETTER;\n } else if (charCode === 0xa0) {\n return CharacterType.SPACE;\n }\n\n return CharacterType.ALPHA_LETTER;\n }\n\n if (isHan(charCode)) {\n return CharacterType.HAN_LETTER;\n } else if (isKatakana(charCode)) {\n return CharacterType.KATAKANA_LETTER;\n } else if (isHiragana(charCode)) {\n return CharacterType.HIRAGANA_LETTER;\n } else if (isHalfwidthKatakana(charCode)) {\n return CharacterType.HALFWIDTH_KATAKANA_LETTER;\n }\n\n return CharacterType.ALPHA_LETTER;\n}\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.isDestHashesEqual = isDestHashesEqual;\nexports.isDestArraysEqual = isDestArraysEqual;\nexports.PDFHistory = void 0;\n\nvar _ui_utils = __w_pdfjs_require__(3);\n\nfunction _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar HASH_CHANGE_TIMEOUT = 1000;\nvar POSITION_UPDATED_THRESHOLD = 50;\nvar UPDATE_VIEWAREA_TIMEOUT = 1000;\n\nfunction getCurrentHash() {\n return document.location.hash;\n}\n\nvar PDFHistory = /*#__PURE__*/function () {\n function PDFHistory(_ref) {\n var _this = this;\n\n var linkService = _ref.linkService,\n eventBus = _ref.eventBus;\n\n _classCallCheck(this, PDFHistory);\n\n this.linkService = linkService;\n this.eventBus = eventBus;\n this._initialized = false;\n this._fingerprint = "";\n this.reset();\n this._boundEvents = null;\n this._isViewerInPresentationMode = false;\n\n this.eventBus._on("presentationmodechanged", function (evt) {\n _this._isViewerInPresentationMode = evt.active || evt.switchInProgress;\n });\n\n this.eventBus._on("pagesinit", function () {\n _this._isPagesLoaded = false;\n\n var onPagesLoaded = function onPagesLoaded(evt) {\n _this.eventBus._off("pagesloaded", onPagesLoaded);\n\n _this._isPagesLoaded = !!evt.pagesCount;\n };\n\n _this.eventBus._on("pagesloaded", onPagesLoaded);\n });\n }\n\n _createClass(PDFHistory, [{\n key: "initialize",\n value: function initialize(_ref2) {\n var fingerprint = _ref2.fingerprint,\n _ref2$resetHistory = _ref2.resetHistory,\n resetHistory = _ref2$resetHistory === void 0 ? false : _ref2$resetHistory,\n _ref2$updateUrl = _ref2.updateUrl,\n updateUrl = _ref2$updateUrl === void 0 ? false : _ref2$updateUrl;\n\n if (!fingerprint || typeof fingerprint !== "string") {\n console.error(\'PDFHistory.initialize: The "fingerprint" must be a non-empty string.\');\n return;\n }\n\n if (this._initialized) {\n this.reset();\n }\n\n var reInitialized = this._fingerprint !== "" && this._fingerprint !== fingerprint;\n this._fingerprint = fingerprint;\n this._updateUrl = updateUrl === true;\n this._initialized = true;\n\n this._bindEvents();\n\n var state = window.history.state;\n this._popStateInProgress = false;\n this._blockHashChange = 0;\n this._currentHash = getCurrentHash();\n this._numPositionUpdates = 0;\n this._uid = this._maxUid = 0;\n this._destination = null;\n this._position = null;\n\n if (!this._isValidState(state, true) || resetHistory) {\n var _this$_parseCurrentHa = this._parseCurrentHash(true),\n hash = _this$_parseCurrentHa.hash,\n page = _this$_parseCurrentHa.page,\n rotation = _this$_parseCurrentHa.rotation;\n\n if (!hash || reInitialized || resetHistory) {\n this._pushOrReplaceState(null, true);\n\n return;\n }\n\n this._pushOrReplaceState({\n hash: hash,\n page: page,\n rotation: rotation\n }, true);\n\n return;\n }\n\n var destination = state.destination;\n\n this._updateInternalState(destination, state.uid, true);\n\n if (this._uid > this._maxUid) {\n this._maxUid = this._uid;\n }\n\n if (destination.rotation !== undefined) {\n this._initialRotation = destination.rotation;\n }\n\n if (destination.dest) {\n this._initialBookmark = JSON.stringify(destination.dest);\n this._destination.page = null;\n } else if (destination.hash) {\n this._initialBookmark = destination.hash;\n } else if (destination.page) {\n this._initialBookmark = "page=".concat(destination.page);\n }\n }\n }, {\n key: "reset",\n value: function reset() {\n if (this._initialized) {\n this._pageHide();\n\n this._initialized = false;\n\n this._unbindEvents();\n }\n\n if (this._updateViewareaTimeout) {\n clearTimeout(this._updateViewareaTimeout);\n this._updateViewareaTimeout = null;\n }\n\n this._initialBookmark = null;\n this._initialRotation = null;\n }\n }, {\n key: "push",\n value: function push(_ref3) {\n var _this2 = this;\n\n var _ref3$namedDest = _ref3.namedDest,\n namedDest = _ref3$namedDest === void 0 ? null : _ref3$namedDest,\n explicitDest = _ref3.explicitDest,\n pageNumber = _ref3.pageNumber;\n\n if (!this._initialized) {\n return;\n }\n\n if (namedDest && typeof namedDest !== "string") {\n console.error("PDFHistory.push: " + "\\"".concat(namedDest, "\\" is not a valid namedDest parameter."));\n return;\n } else if (!Array.isArray(explicitDest)) {\n console.error("PDFHistory.push: " + "\\"".concat(explicitDest, "\\" is not a valid explicitDest parameter."));\n return;\n } else if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.linkService.pagesCount)) {\n if (pageNumber !== null || this._destination) {\n console.error("PDFHistory.push: " + "\\"".concat(pageNumber, "\\" is not a valid pageNumber parameter."));\n return;\n }\n }\n\n var hash = namedDest || JSON.stringify(explicitDest);\n\n if (!hash) {\n return;\n }\n\n var forceReplace = false;\n\n if (this._destination && (isDestHashesEqual(this._destination.hash, hash) || isDestArraysEqual(this._destination.dest, explicitDest))) {\n if (this._destination.page) {\n return;\n }\n\n forceReplace = true;\n }\n\n if (this._popStateInProgress && !forceReplace) {\n return;\n }\n\n this._pushOrReplaceState({\n dest: explicitDest,\n hash: hash,\n page: pageNumber,\n rotation: this.linkService.rotation\n }, forceReplace);\n\n if (!this._popStateInProgress) {\n this._popStateInProgress = true;\n Promise.resolve().then(function () {\n _this2._popStateInProgress = false;\n });\n }\n }\n }, {\n key: "pushCurrentPosition",\n value: function pushCurrentPosition() {\n if (!this._initialized || this._popStateInProgress) {\n return;\n }\n\n this._tryPushCurrentPosition();\n }\n }, {\n key: "back",\n value: function back() {\n if (!this._initialized || this._popStateInProgress) {\n return;\n }\n\n var state = window.history.state;\n\n if (this._isValidState(state) && state.uid > 0) {\n window.history.back();\n }\n }\n }, {\n key: "forward",\n value: function forward() {\n if (!this._initialized || this._popStateInProgress) {\n return;\n }\n\n var state = window.history.state;\n\n if (this._isValidState(state) && state.uid < this._maxUid) {\n window.history.forward();\n }\n }\n }, {\n key: "_pushOrReplaceState",\n value: function _pushOrReplaceState(destination) {\n var forceReplace = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var shouldReplace = forceReplace || !this._destination;\n var newState = {\n fingerprint: this._fingerprint,\n uid: shouldReplace ? this._uid : this._uid + 1,\n destination: destination\n };\n\n this._updateInternalState(destination, newState.uid);\n\n var newUrl;\n\n if (this._updateUrl && destination && destination.hash) {\n var baseUrl = document.location.href.split("#")[0];\n\n if (!baseUrl.startsWith("file://")) {\n newUrl = "".concat(baseUrl, "#").concat(destination.hash);\n }\n }\n\n if (shouldReplace) {\n window.history.replaceState(newState, "", newUrl);\n } else {\n this._maxUid = this._uid;\n window.history.pushState(newState, "", newUrl);\n }\n }\n }, {\n key: "_tryPushCurrentPosition",\n value: function _tryPushCurrentPosition() {\n var temporary = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (!this._position) {\n return;\n }\n\n var position = this._position;\n\n if (temporary) {\n position = Object.assign(Object.create(null), this._position);\n position.temporary = true;\n }\n\n if (!this._destination) {\n this._pushOrReplaceState(position);\n\n return;\n }\n\n if (this._destination.temporary) {\n this._pushOrReplaceState(position, true);\n\n return;\n }\n\n if (this._destination.hash === position.hash) {\n return;\n }\n\n if (!this._destination.page && (POSITION_UPDATED_THRESHOLD <= 0 || this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)) {\n return;\n }\n\n var forceReplace = false;\n\n if (this._destination.page >= position.first && this._destination.page <= position.page) {\n if (this._destination.dest || !this._destination.first) {\n return;\n }\n\n forceReplace = true;\n }\n\n this._pushOrReplaceState(position, forceReplace);\n }\n }, {\n key: "_isValidState",\n value: function _isValidState(state) {\n var checkReload = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!state) {\n return false;\n }\n\n if (state.fingerprint !== this._fingerprint) {\n if (checkReload) {\n if (typeof state.fingerprint !== "string" || state.fingerprint.length !== this._fingerprint.length) {\n return false;\n }\n\n var _performance$getEntri = performance.getEntriesByType("navigation"),\n _performance$getEntri2 = _slicedToArray(_performance$getEntri, 1),\n perfEntry = _performance$getEntri2[0];\n\n if (!perfEntry || perfEntry.type !== "reload") {\n return false;\n }\n } else {\n return false;\n }\n }\n\n if (!Number.isInteger(state.uid) || state.uid < 0) {\n return false;\n }\n\n if (state.destination === null || _typeof(state.destination) !== "object") {\n return false;\n }\n\n return true;\n }\n }, {\n key: "_updateInternalState",\n value: function _updateInternalState(destination, uid) {\n var removeTemporary = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (this._updateViewareaTimeout) {\n clearTimeout(this._updateViewareaTimeout);\n this._updateViewareaTimeout = null;\n }\n\n if (removeTemporary && destination && destination.temporary) {\n delete destination.temporary;\n }\n\n this._destination = destination;\n this._uid = uid;\n this._numPositionUpdates = 0;\n }\n }, {\n key: "_parseCurrentHash",\n value: function _parseCurrentHash() {\n var checkNameddest = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var hash = unescape(getCurrentHash()).substring(1);\n var params = (0, _ui_utils.parseQueryString)(hash);\n var nameddest = params.nameddest || "";\n var page = params.page | 0;\n\n if (!(Number.isInteger(page) && page > 0 && page <= this.linkService.pagesCount) || checkNameddest && nameddest.length > 0) {\n page = null;\n }\n\n return {\n hash: hash,\n page: page,\n rotation: this.linkService.rotation\n };\n }\n }, {\n key: "_updateViewarea",\n value: function _updateViewarea(_ref4) {\n var _this3 = this;\n\n var location = _ref4.location;\n\n if (this._updateViewareaTimeout) {\n clearTimeout(this._updateViewareaTimeout);\n this._updateViewareaTimeout = null;\n }\n\n this._position = {\n hash: this._isViewerInPresentationMode ? "page=".concat(location.pageNumber) : location.pdfOpenParams.substring(1),\n page: this.linkService.page,\n first: location.pageNumber,\n rotation: location.rotation\n };\n\n if (this._popStateInProgress) {\n return;\n }\n\n if (POSITION_UPDATED_THRESHOLD > 0 && this._isPagesLoaded && this._destination && !this._destination.page) {\n this._numPositionUpdates++;\n }\n\n if (UPDATE_VIEWAREA_TIMEOUT > 0) {\n this._updateViewareaTimeout = setTimeout(function () {\n if (!_this3._popStateInProgress) {\n _this3._tryPushCurrentPosition(true);\n }\n\n _this3._updateViewareaTimeout = null;\n }, UPDATE_VIEWAREA_TIMEOUT);\n }\n }\n }, {\n key: "_popState",\n value: function _popState(_ref5) {\n var _this4 = this;\n\n var state = _ref5.state;\n var newHash = getCurrentHash(),\n hashChanged = this._currentHash !== newHash;\n this._currentHash = newHash;\n\n if (!state) {\n this._uid++;\n\n var _this$_parseCurrentHa2 = this._parseCurrentHash(),\n hash = _this$_parseCurrentHa2.hash,\n page = _this$_parseCurrentHa2.page,\n rotation = _this$_parseCurrentHa2.rotation;\n\n this._pushOrReplaceState({\n hash: hash,\n page: page,\n rotation: rotation\n }, true);\n\n return;\n }\n\n if (!this._isValidState(state)) {\n return;\n }\n\n this._popStateInProgress = true;\n\n if (hashChanged) {\n this._blockHashChange++;\n (0, _ui_utils.waitOnEventOrTimeout)({\n target: window,\n name: "hashchange",\n delay: HASH_CHANGE_TIMEOUT\n }).then(function () {\n _this4._blockHashChange--;\n });\n }\n\n var destination = state.destination;\n\n this._updateInternalState(destination, state.uid, true);\n\n if (this._uid > this._maxUid) {\n this._maxUid = this._uid;\n }\n\n if ((0, _ui_utils.isValidRotation)(destination.rotation)) {\n this.linkService.rotation = destination.rotation;\n }\n\n if (destination.dest) {\n this.linkService.navigateTo(destination.dest);\n } else if (destination.hash) {\n this.linkService.setHash(destination.hash);\n } else if (destination.page) {\n this.linkService.page = destination.page;\n }\n\n Promise.resolve().then(function () {\n _this4._popStateInProgress = false;\n });\n }\n }, {\n key: "_pageHide",\n value: function _pageHide() {\n if (!this._destination || this._destination.temporary) {\n this._tryPushCurrentPosition();\n }\n }\n }, {\n key: "_bindEvents",\n value: function _bindEvents() {\n if (this._boundEvents) {\n return;\n }\n\n this._boundEvents = {\n updateViewarea: this._updateViewarea.bind(this),\n popState: this._popState.bind(this),\n pageHide: this._pageHide.bind(this)\n };\n\n this.eventBus._on("updateviewarea", this._boundEvents.updateViewarea);\n\n window.addEventListener("popstate", this._boundEvents.popState);\n window.addEventListener("pagehide", this._boundEvents.pageHide);\n }\n }, {\n key: "_unbindEvents",\n value: function _unbindEvents() {\n if (!this._boundEvents) {\n return;\n }\n\n this.eventBus._off("updateviewarea", this._boundEvents.updateViewarea);\n\n window.removeEventListener("popstate", this._boundEvents.popState);\n window.removeEventListener("pagehide", this._boundEvents.pageHide);\n this._boundEvents = null;\n }\n }, {\n key: "popStateInProgress",\n get: function get() {\n return this._initialized && (this._popStateInProgress || this._blockHashChange > 0);\n }\n }, {\n key: "initialBookmark",\n get: function get() {\n return this._initialized ? this._initialBookmark : null;\n }\n }, {\n key: "initialRotation",\n get: function get() {\n return this._initialized ? this._initialRotation : null;\n }\n }]);\n\n return PDFHistory;\n}();\n\nexports.PDFHistory = PDFHistory;\n\nfunction isDestHashesEqual(destHash, pushHash) {\n if (typeof destHash !== "string" || typeof pushHash !== "string") {\n return false;\n }\n\n if (destHash === pushHash) {\n return true;\n }\n\n var _parseQueryString = (0, _ui_utils.parseQueryString)(destHash),\n nameddest = _parseQueryString.nameddest;\n\n if (nameddest === pushHash) {\n return true;\n }\n\n return false;\n}\n\nfunction isDestArraysEqual(firstDest, secondDest) {\n function isEntryEqual(first, second) {\n if (_typeof(first) !== _typeof(second)) {\n return false;\n }\n\n if (Array.isArray(first) || Array.isArray(second)) {\n return false;\n }\n\n if (first !== null && _typeof(first) === "object" && second !== null) {\n if (Object.keys(first).length !== Object.keys(second).length) {\n return false;\n }\n\n for (var key in first) {\n if (!isEntryEqual(first[key], second[key])) {\n return false;\n }\n }\n\n return true;\n }\n\n return first === second || Number.isNaN(first) && Number.isNaN(second);\n }\n\n if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) {\n return false;\n }\n\n if (firstDest.length !== secondDest.length) {\n return false;\n }\n\n for (var i = 0, ii = firstDest.length; i < ii; i++) {\n if (!isEntryEqual(firstDest[i], secondDest[i])) {\n return false;\n }\n }\n\n return true;\n}\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.PDFPageView = void 0;\n\nvar _regenerator = _interopRequireDefault(__w_pdfjs_require__(4));\n\nvar _ui_utils = __w_pdfjs_require__(3);\n\nvar _pdfjsLib = __w_pdfjs_require__(2);\n\nvar _pdf_rendering_queue = __w_pdfjs_require__(17);\n\nvar _viewer_compatibility = __w_pdfjs_require__(10);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }\n\nfunction asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }\n\nfunction _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar MAX_CANVAS_PIXELS = _viewer_compatibility.viewerCompatibilityParams.maxCanvasPixels || 16777216;\n\nvar PDFPageView = /*#__PURE__*/function () {\n function PDFPageView(options) {\n _classCallCheck(this, PDFPageView);\n\n var container = options.container;\n var defaultViewport = options.defaultViewport;\n this.id = options.id;\n this.renderingId = "page" + this.id;\n this.pdfPage = null;\n this.pageLabel = null;\n this.rotation = 0;\n this.scale = options.scale || _ui_utils.DEFAULT_SCALE;\n this.viewport = defaultViewport;\n this.pdfPageRotate = defaultViewport.rotation;\n this._annotationStorage = options.annotationStorage || null;\n this._optionalContentConfigPromise = options.optionalContentConfigPromise || null;\n this.hasRestrictedScaling = false;\n this.textLayerMode = Number.isInteger(options.textLayerMode) ? options.textLayerMode : _ui_utils.TextLayerMode.ENABLE;\n this.imageResourcesPath = options.imageResourcesPath || "";\n this.renderInteractiveForms = typeof options.renderInteractiveForms === "boolean" ? options.renderInteractiveForms : true;\n this.useOnlyCssZoom = options.useOnlyCssZoom || false;\n this.maxCanvasPixels = options.maxCanvasPixels || MAX_CANVAS_PIXELS;\n this.eventBus = options.eventBus;\n this.renderingQueue = options.renderingQueue;\n this.textLayerFactory = options.textLayerFactory;\n this.annotationLayerFactory = options.annotationLayerFactory;\n this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;\n this.enableWebGL = options.enableWebGL || false;\n this.l10n = options.l10n || _ui_utils.NullL10n;\n this.paintTask = null;\n this.paintedViewportMap = new WeakMap();\n this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\n this.resume = null;\n this.error = null;\n this.annotationLayer = null;\n this.textLayer = null;\n this.zoomLayer = null;\n var div = document.createElement("div");\n div.className = "page";\n div.style.width = Math.floor(this.viewport.width) + "px";\n div.style.height = Math.floor(this.viewport.height) + "px";\n div.setAttribute("data-page-number", this.id);\n this.div = div;\n container.appendChild(div);\n }\n\n _createClass(PDFPageView, [{\n key: "setPdfPage",\n value: function setPdfPage(pdfPage) {\n this.pdfPage = pdfPage;\n this.pdfPageRotate = pdfPage.rotate;\n var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n this.viewport = pdfPage.getViewport({\n scale: this.scale * _ui_utils.CSS_UNITS,\n rotation: totalRotation\n });\n this.stats = pdfPage.stats;\n this.reset();\n }\n }, {\n key: "destroy",\n value: function destroy() {\n this.reset();\n\n if (this.pdfPage) {\n this.pdfPage.cleanup();\n }\n }\n }, {\n key: "_renderAnnotationLayer",\n value: function () {\n var _renderAnnotationLayer2 = _asyncToGenerator( /*#__PURE__*/_regenerator["default"].mark(function _callee() {\n var error;\n return _regenerator["default"].wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n error = null;\n _context.prev = 1;\n _context.next = 4;\n return this.annotationLayer.render(this.viewport, "display");\n\n case 4:\n _context.next = 9;\n break;\n\n case 6:\n _context.prev = 6;\n _context.t0 = _context["catch"](1);\n error = _context.t0;\n\n case 9:\n _context.prev = 9;\n this.eventBus.dispatch("annotationlayerrendered", {\n source: this,\n pageNumber: this.id,\n error: error\n });\n return _context.finish(9);\n\n case 12:\n case "end":\n return _context.stop();\n }\n }\n }, _callee, this, [[1, 6, 9, 12]]);\n }));\n\n function _renderAnnotationLayer() {\n return _renderAnnotationLayer2.apply(this, arguments);\n }\n\n return _renderAnnotationLayer;\n }()\n }, {\n key: "_resetZoomLayer",\n value: function _resetZoomLayer() {\n var removeFromDOM = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (!this.zoomLayer) {\n return;\n }\n\n var zoomLayerCanvas = this.zoomLayer.firstChild;\n this.paintedViewportMap["delete"](zoomLayerCanvas);\n zoomLayerCanvas.width = 0;\n zoomLayerCanvas.height = 0;\n\n if (removeFromDOM) {\n this.zoomLayer.remove();\n }\n\n this.zoomLayer = null;\n }\n }, {\n key: "reset",\n value: function reset() {\n var keepZoomLayer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var keepAnnotations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n this.cancelRendering(keepAnnotations);\n this.renderingState = _pdf_rendering_queue.RenderingStates.INITIAL;\n var div = this.div;\n div.style.width = Math.floor(this.viewport.width) + "px";\n div.style.height = Math.floor(this.viewport.height) + "px";\n var childNodes = div.childNodes;\n var currentZoomLayerNode = keepZoomLayer && this.zoomLayer || null;\n var currentAnnotationNode = keepAnnotations && this.annotationLayer && this.annotationLayer.div || null;\n\n for (var i = childNodes.length - 1; i >= 0; i--) {\n var node = childNodes[i];\n\n if (currentZoomLayerNode === node || currentAnnotationNode === node) {\n continue;\n }\n\n div.removeChild(node);\n }\n\n div.removeAttribute("data-loaded");\n\n if (currentAnnotationNode) {\n this.annotationLayer.hide();\n } else if (this.annotationLayer) {\n this.annotationLayer.cancel();\n this.annotationLayer = null;\n }\n\n if (!currentZoomLayerNode) {\n if (this.canvas) {\n this.paintedViewportMap["delete"](this.canvas);\n this.canvas.width = 0;\n this.canvas.height = 0;\n delete this.canvas;\n }\n\n this._resetZoomLayer();\n }\n\n if (this.svg) {\n this.paintedViewportMap["delete"](this.svg);\n delete this.svg;\n }\n\n this.loadingIconDiv = document.createElement("div");\n this.loadingIconDiv.className = "loadingIcon";\n div.appendChild(this.loadingIconDiv);\n }\n }, {\n key: "update",\n value: function update(scale, rotation) {\n var optionalContentConfigPromise = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n this.scale = scale || this.scale;\n\n if (typeof rotation !== "undefined") {\n this.rotation = rotation;\n }\n\n if (optionalContentConfigPromise instanceof Promise) {\n this._optionalContentConfigPromise = optionalContentConfigPromise;\n }\n\n var totalRotation = (this.rotation + this.pdfPageRotate) % 360;\n this.viewport = this.viewport.clone({\n scale: this.scale * _ui_utils.CSS_UNITS,\n rotation: totalRotation\n });\n\n if (this.svg) {\n this.cssTransform(this.svg, true);\n this.eventBus.dispatch("pagerendered", {\n source: this,\n pageNumber: this.id,\n cssTransform: true,\n timestamp: performance.now()\n });\n return;\n }\n\n var isScalingRestricted = false;\n\n if (this.canvas && this.maxCanvasPixels > 0) {\n var outputScale = this.outputScale;\n\n if ((Math.floor(this.viewport.width) * outputScale.sx | 0) * (Math.floor(this.viewport.height) * outputScale.sy | 0) > this.maxCanvasPixels) {\n isScalingRestricted = true;\n }\n }\n\n if (this.canvas) {\n if (this.useOnlyCssZoom || this.hasRestrictedScaling && isScalingRestricted) {\n this.cssTransform(this.canvas, true);\n this.eventBus.dispatch("pagerendered", {\n source: this,\n pageNumber: this.id,\n cssTransform: true,\n timestamp: performance.now()\n });\n return;\n }\n\n if (!this.zoomLayer && !this.canvas.hasAttribute("hidden")) {\n this.zoomLayer = this.canvas.parentNode;\n this.zoomLayer.style.position = "absolute";\n }\n }\n\n if (this.zoomLayer) {\n this.cssTransform(this.zoomLayer.firstChild);\n }\n\n this.reset(true, true);\n }\n }, {\n key: "cancelRendering",\n value: function cancelRendering() {\n var keepAnnotations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (this.paintTask) {\n this.paintTask.cancel();\n this.paintTask = null;\n }\n\n this.resume = null;\n\n if (this.textLayer) {\n this.textLayer.cancel();\n this.textLayer = null;\n }\n\n if (!keepAnnotations && this.annotationLayer) {\n this.annotationLayer.cancel();\n this.annotationLayer = null;\n }\n }\n }, {\n key: "cssTransform",\n value: function cssTransform(target) {\n var redrawAnnotations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var width = this.viewport.width;\n var height = this.viewport.height;\n var div = this.div;\n target.style.width = target.parentNode.style.width = div.style.width = Math.floor(width) + "px";\n target.style.height = target.parentNode.style.height = div.style.height = Math.floor(height) + "px";\n var relativeRotation = this.viewport.rotation - this.paintedViewportMap.get(target).rotation;\n var absRotation = Math.abs(relativeRotation);\n var scaleX = 1,\n scaleY = 1;\n\n if (absRotation === 90 || absRotation === 270) {\n scaleX = height / width;\n scaleY = width / height;\n }\n\n var cssTransform = "rotate(" + relativeRotation + "deg) " + "scale(" + scaleX + "," + scaleY + ")";\n target.style.transform = cssTransform;\n\n if (this.textLayer) {\n var textLayerViewport = this.textLayer.viewport;\n var textRelativeRotation = this.viewport.rotation - textLayerViewport.rotation;\n var textAbsRotation = Math.abs(textRelativeRotation);\n var scale = width / textLayerViewport.width;\n\n if (textAbsRotation === 90 || textAbsRotation === 270) {\n scale = width / textLayerViewport.height;\n }\n\n var textLayerDiv = this.textLayer.textLayerDiv;\n var transX, transY;\n\n switch (textAbsRotation) {\n case 0:\n transX = transY = 0;\n break;\n\n case 90:\n transX = 0;\n transY = "-" + textLayerDiv.style.height;\n break;\n\n case 180:\n transX = "-" + textLayerDiv.style.width;\n transY = "-" + textLayerDiv.style.height;\n break;\n\n case 270:\n transX = "-" + textLayerDiv.style.width;\n transY = 0;\n break;\n\n default:\n console.error("Bad rotation value.");\n break;\n }\n\n textLayerDiv.style.transform = "rotate(" + textAbsRotation + "deg) " + "scale(" + scale + ", " + scale + ") " + "translate(" + transX + ", " + transY + ")";\n textLayerDiv.style.transformOrigin = "0% 0%";\n }\n\n if (redrawAnnotations && this.annotationLayer) {\n this._renderAnnotationLayer();\n }\n }\n }, {\n key: "getPagePoint",\n value: function getPagePoint(x, y) {\n return this.viewport.convertToPdfPoint(x, y);\n }\n }, {\n key: "draw",\n value: function draw() {\n var _this = this;\n\n if (this.renderingState !== _pdf_rendering_queue.RenderingStates.INITIAL) {\n console.error("Must be in new state before drawing");\n this.reset();\n }\n\n var div = this.div,\n pdfPage = this.pdfPage;\n\n if (!pdfPage) {\n this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n\n if (this.loadingIconDiv) {\n div.removeChild(this.loadingIconDiv);\n delete this.loadingIconDiv;\n }\n\n return Promise.reject(new Error("pdfPage is not loaded"));\n }\n\n this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\n var canvasWrapper = document.createElement("div");\n canvasWrapper.style.width = div.style.width;\n canvasWrapper.style.height = div.style.height;\n canvasWrapper.classList.add("canvasWrapper");\n\n if (this.annotationLayer && this.annotationLayer.div) {\n div.insertBefore(canvasWrapper, this.annotationLayer.div);\n } else {\n div.appendChild(canvasWrapper);\n }\n\n var textLayer = null;\n\n if (this.textLayerMode !== _ui_utils.TextLayerMode.DISABLE && this.textLayerFactory) {\n var textLayerDiv = document.createElement("div");\n textLayerDiv.className = "textLayer";\n textLayerDiv.style.width = canvasWrapper.style.width;\n textLayerDiv.style.height = canvasWrapper.style.height;\n\n if (this.annotationLayer && this.annotationLayer.div) {\n div.insertBefore(textLayerDiv, this.annotationLayer.div);\n } else {\n div.appendChild(textLayerDiv);\n }\n\n textLayer = this.textLayerFactory.createTextLayerBuilder(textLayerDiv, this.id - 1, this.viewport, this.textLayerMode === _ui_utils.TextLayerMode.ENABLE_ENHANCE, this.eventBus);\n }\n\n this.textLayer = textLayer;\n var renderContinueCallback = null;\n\n if (this.renderingQueue) {\n renderContinueCallback = function renderContinueCallback(cont) {\n if (!_this.renderingQueue.isHighestPriority(_this)) {\n _this.renderingState = _pdf_rendering_queue.RenderingStates.PAUSED;\n\n _this.resume = function () {\n _this.renderingState = _pdf_rendering_queue.RenderingStates.RUNNING;\n cont();\n };\n\n return;\n }\n\n cont();\n };\n }\n\n var finishPaintTask = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator["default"].mark(function _callee2(error) {\n return _regenerator["default"].wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (paintTask === _this.paintTask) {\n _this.paintTask = null;\n }\n\n if (!(error instanceof _pdfjsLib.RenderingCancelledException)) {\n _context2.next = 4;\n break;\n }\n\n _this.error = null;\n return _context2.abrupt("return");\n\n case 4:\n _this.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n\n if (_this.loadingIconDiv) {\n div.removeChild(_this.loadingIconDiv);\n delete _this.loadingIconDiv;\n }\n\n _this._resetZoomLayer(true);\n\n _this.error = error;\n _this.stats = pdfPage.stats;\n\n _this.eventBus.dispatch("pagerendered", {\n source: _this,\n pageNumber: _this.id,\n cssTransform: false,\n timestamp: performance.now()\n });\n\n if (!error) {\n _context2.next = 12;\n break;\n }\n\n throw error;\n\n case 12:\n case "end":\n return _context2.stop();\n }\n }\n }, _callee2);\n }));\n\n return function finishPaintTask(_x) {\n return _ref.apply(this, arguments);\n };\n }();\n\n var paintTask = this.renderer === _ui_utils.RendererType.SVG ? this.paintOnSvg(canvasWrapper) : this.paintOnCanvas(canvasWrapper);\n paintTask.onRenderContinue = renderContinueCallback;\n this.paintTask = paintTask;\n var resultPromise = paintTask.promise.then(function () {\n return finishPaintTask(null).then(function () {\n if (textLayer) {\n var readableStream = pdfPage.streamTextContent({\n normalizeWhitespace: true\n });\n textLayer.setTextContentStream(readableStream);\n textLayer.render();\n }\n });\n }, function (reason) {\n return finishPaintTask(reason);\n });\n\n if (this.annotationLayerFactory) {\n if (!this.annotationLayer) {\n this.annotationLayer = this.annotationLayerFactory.createAnnotationLayerBuilder(div, pdfPage, this._annotationStorage, this.imageResourcesPath, this.renderInteractiveForms, this.l10n);\n }\n\n this._renderAnnotationLayer();\n }\n\n div.setAttribute("data-loaded", true);\n this.eventBus.dispatch("pagerender", {\n source: this,\n pageNumber: this.id\n });\n return resultPromise;\n }\n }, {\n key: "paintOnCanvas",\n value: function paintOnCanvas(canvasWrapper) {\n var renderCapability = (0, _pdfjsLib.createPromiseCapability)();\n var result = {\n promise: renderCapability.promise,\n onRenderContinue: function onRenderContinue(cont) {\n cont();\n },\n cancel: function cancel() {\n renderTask.cancel();\n }\n };\n var viewport = this.viewport;\n var canvas = document.createElement("canvas");\n this.l10n.get("page_canvas", {\n page: this.id\n }, "Page {{page}}").then(function (msg) {\n canvas.setAttribute("aria-label", msg);\n });\n canvas.setAttribute("hidden", "hidden");\n var isCanvasHidden = true;\n\n var showCanvas = function showCanvas() {\n if (isCanvasHidden) {\n canvas.removeAttribute("hidden");\n isCanvasHidden = false;\n }\n };\n\n canvasWrapper.appendChild(canvas);\n this.canvas = canvas;\n canvas.mozOpaque = true;\n var ctx = canvas.getContext("2d", {\n alpha: false\n });\n var outputScale = (0, _ui_utils.getOutputScale)(ctx);\n this.outputScale = outputScale;\n\n if (this.useOnlyCssZoom) {\n var actualSizeViewport = viewport.clone({\n scale: _ui_utils.CSS_UNITS\n });\n outputScale.sx *= actualSizeViewport.width / viewport.width;\n outputScale.sy *= actualSizeViewport.height / viewport.height;\n outputScale.scaled = true;\n }\n\n if (this.maxCanvasPixels > 0) {\n var pixelsInViewport = viewport.width * viewport.height;\n var maxScale = Math.sqrt(this.maxCanvasPixels / pixelsInViewport);\n\n if (outputScale.sx > maxScale || outputScale.sy > maxScale) {\n outputScale.sx = maxScale;\n outputScale.sy = maxScale;\n outputScale.scaled = true;\n this.hasRestrictedScaling = true;\n } else {\n this.hasRestrictedScaling = false;\n }\n }\n\n var sfx = (0, _ui_utils.approximateFraction)(outputScale.sx);\n var sfy = (0, _ui_utils.approximateFraction)(outputScale.sy);\n canvas.width = (0, _ui_utils.roundToDivide)(viewport.width * outputScale.sx, sfx[0]);\n canvas.height = (0, _ui_utils.roundToDivide)(viewport.height * outputScale.sy, sfy[0]);\n canvas.style.width = (0, _ui_utils.roundToDivide)(viewport.width, sfx[1]) + "px";\n canvas.style.height = (0, _ui_utils.roundToDivide)(viewport.height, sfy[1]) + "px";\n this.paintedViewportMap.set(canvas, viewport);\n var transform = !outputScale.scaled ? null : [outputScale.sx, 0, 0, outputScale.sy, 0, 0];\n var renderContext = {\n canvasContext: ctx,\n transform: transform,\n viewport: this.viewport,\n enableWebGL: this.enableWebGL,\n renderInteractiveForms: this.renderInteractiveForms,\n optionalContentConfigPromise: this._optionalContentConfigPromise\n };\n var renderTask = this.pdfPage.render(renderContext);\n\n renderTask.onContinue = function (cont) {\n showCanvas();\n\n if (result.onRenderContinue) {\n result.onRenderContinue(cont);\n } else {\n cont();\n }\n };\n\n renderTask.promise.then(function () {\n showCanvas();\n renderCapability.resolve(undefined);\n }, function (error) {\n showCanvas();\n renderCapability.reject(error);\n });\n return result;\n }\n }, {\n key: "paintOnSvg",\n value: function paintOnSvg(wrapper) {\n var _this2 = this;\n\n var cancelled = false;\n\n var ensureNotCancelled = function ensureNotCancelled() {\n if (cancelled) {\n throw new _pdfjsLib.RenderingCancelledException("Rendering cancelled, page ".concat(_this2.id), "svg");\n }\n };\n\n var pdfPage = this.pdfPage;\n var actualSizeViewport = this.viewport.clone({\n scale: _ui_utils.CSS_UNITS\n });\n var promise = pdfPage.getOperatorList().then(function (opList) {\n ensureNotCancelled();\n var svgGfx = new _pdfjsLib.SVGGraphics(pdfPage.commonObjs, pdfPage.objs);\n return svgGfx.getSVG(opList, actualSizeViewport).then(function (svg) {\n ensureNotCancelled();\n _this2.svg = svg;\n\n _this2.paintedViewportMap.set(svg, actualSizeViewport);\n\n svg.style.width = wrapper.style.width;\n svg.style.height = wrapper.style.height;\n _this2.renderingState = _pdf_rendering_queue.RenderingStates.FINISHED;\n wrapper.appendChild(svg);\n });\n });\n return {\n promise: promise,\n onRenderContinue: function onRenderContinue(cont) {\n cont();\n },\n cancel: function cancel() {\n cancelled = true;\n }\n };\n }\n }, {\n key: "setPageLabel",\n value: function setPageLabel(label) {\n this.pageLabel = typeof label === "string" ? label : null;\n\n if (this.pageLabel !== null) {\n this.div.setAttribute("data-page-label", this.pageLabel);\n } else {\n this.div.removeAttribute("data-page-label");\n }\n }\n }, {\n key: "width",\n get: function get() {\n return this.viewport.width;\n }\n }, {\n key: "height",\n get: function get() {\n return this.viewport.height;\n }\n }]);\n\n return PDFPageView;\n}();\n\nexports.PDFPageView = PDFPageView;\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.PDFRenderingQueue = exports.RenderingStates = void 0;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar CLEANUP_TIMEOUT = 30000;\nvar RenderingStates = {\n INITIAL: 0,\n RUNNING: 1,\n PAUSED: 2,\n FINISHED: 3\n};\nexports.RenderingStates = RenderingStates;\n\nvar PDFRenderingQueue = /*#__PURE__*/function () {\n function PDFRenderingQueue() {\n _classCallCheck(this, PDFRenderingQueue);\n\n this.pdfViewer = null;\n this.pdfThumbnailViewer = null;\n this.onIdle = null;\n this.highestPriorityPage = null;\n this.idleTimeout = null;\n this.printing = false;\n this.isThumbnailViewEnabled = false;\n }\n\n _createClass(PDFRenderingQueue, [{\n key: "setViewer",\n value: function setViewer(pdfViewer) {\n this.pdfViewer = pdfViewer;\n }\n }, {\n key: "setThumbnailViewer",\n value: function setThumbnailViewer(pdfThumbnailViewer) {\n this.pdfThumbnailViewer = pdfThumbnailViewer;\n }\n }, {\n key: "isHighestPriority",\n value: function isHighestPriority(view) {\n return this.highestPriorityPage === view.renderingId;\n }\n }, {\n key: "renderHighestPriority",\n value: function renderHighestPriority(currentlyVisiblePages) {\n if (this.idleTimeout) {\n clearTimeout(this.idleTimeout);\n this.idleTimeout = null;\n }\n\n if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {\n return;\n }\n\n if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) {\n if (this.pdfThumbnailViewer.forceRendering()) {\n return;\n }\n }\n\n if (this.printing) {\n return;\n }\n\n if (this.onIdle) {\n this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);\n }\n }\n }, {\n key: "getHighestPriority",\n value: function getHighestPriority(visible, views, scrolledDown) {\n var visibleViews = visible.views;\n var numVisible = visibleViews.length;\n\n if (numVisible === 0) {\n return null;\n }\n\n for (var i = 0; i < numVisible; ++i) {\n var view = visibleViews[i].view;\n\n if (!this.isViewFinished(view)) {\n return view;\n }\n }\n\n if (scrolledDown) {\n var nextPageIndex = visible.last.id;\n\n if (views[nextPageIndex] && !this.isViewFinished(views[nextPageIndex])) {\n return views[nextPageIndex];\n }\n } else {\n var previousPageIndex = visible.first.id - 2;\n\n if (views[previousPageIndex] && !this.isViewFinished(views[previousPageIndex])) {\n return views[previousPageIndex];\n }\n }\n\n return null;\n }\n }, {\n key: "isViewFinished",\n value: function isViewFinished(view) {\n return view.renderingState === RenderingStates.FINISHED;\n }\n }, {\n key: "renderView",\n value: function renderView(view) {\n var _this = this;\n\n switch (view.renderingState) {\n case RenderingStates.FINISHED:\n return false;\n\n case RenderingStates.PAUSED:\n this.highestPriorityPage = view.renderingId;\n view.resume();\n break;\n\n case RenderingStates.RUNNING:\n this.highestPriorityPage = view.renderingId;\n break;\n\n case RenderingStates.INITIAL:\n this.highestPriorityPage = view.renderingId;\n view.draw()["finally"](function () {\n _this.renderHighestPriority();\n })["catch"](function (reason) {\n console.error("renderView: \\"".concat(reason, "\\""));\n });\n break;\n }\n\n return true;\n }\n }]);\n\n return PDFRenderingQueue;\n}();\n\nexports.PDFRenderingQueue = PDFRenderingQueue;\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.PDFSinglePageViewer = void 0;\n\nvar _base_viewer = __w_pdfjs_require__(19);\n\nvar _pdfjsLib = __w_pdfjs_require__(2);\n\nfunction _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }\n\nfunction _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nvar PDFSinglePageViewer = /*#__PURE__*/function (_BaseViewer) {\n _inherits(PDFSinglePageViewer, _BaseViewer);\n\n var _super = _createSuper(PDFSinglePageViewer);\n\n function PDFSinglePageViewer(options) {\n var _this;\n\n _classCallCheck(this, PDFSinglePageViewer);\n\n _this = _super.call(this, options);\n\n _this.eventBus._on("pagesinit", function (evt) {\n _this._ensurePageViewVisible();\n });\n\n return _this;\n }\n\n _createClass(PDFSinglePageViewer, [{\n key: "_resetView",\n value: function _resetView() {\n _get(_getPrototypeOf(PDFSinglePageViewer.prototype), "_resetView", this).call(this);\n\n this._previousPageNumber = 1;\n this._shadowViewer = document.createDocumentFragment();\n this._updateScrollDown = null;\n }\n }, {\n key: "_ensurePageViewVisible",\n value: function _ensurePageViewVisible() {\n var pageView = this._pages[this._currentPageNumber - 1];\n var previousPageView = this._pages[this._previousPageNumber - 1];\n var viewerNodes = this.viewer.childNodes;\n\n switch (viewerNodes.length) {\n case 0:\n this.viewer.appendChild(pageView.div);\n break;\n\n case 1:\n if (viewerNodes[0] !== previousPageView.div) {\n throw new Error("_ensurePageViewVisible: Unexpected previously visible page.");\n }\n\n if (pageView === previousPageView) {\n break;\n }\n\n this._shadowViewer.appendChild(previousPageView.div);\n\n this.viewer.appendChild(pageView.div);\n this.container.scrollTop = 0;\n break;\n\n default:\n throw new Error("_ensurePageViewVisible: Only one page should be visible at a time.");\n }\n\n this._previousPageNumber = this._currentPageNumber;\n }\n }, {\n key: "_scrollUpdate",\n value: function _scrollUpdate() {\n if (this._updateScrollDown) {\n this._updateScrollDown();\n }\n\n _get(_getPrototypeOf(PDFSinglePageViewer.prototype), "_scrollUpdate", this).call(this);\n }\n }, {\n key: "_scrollIntoView",\n value: function _scrollIntoView(_ref) {\n var _this2 = this;\n\n var pageDiv = _ref.pageDiv,\n _ref$pageSpot = _ref.pageSpot,\n pageSpot = _ref$pageSpot === void 0 ? null : _ref$pageSpot,\n _ref$pageNumber = _ref.pageNumber,\n pageNumber = _ref$pageNumber === void 0 ? null : _ref$pageNumber;\n\n if (pageNumber) {\n this._setCurrentPageNumber(pageNumber);\n }\n\n var scrolledDown = this._currentPageNumber >= this._previousPageNumber;\n\n this._ensurePageViewVisible();\n\n this.update();\n\n _get(_getPrototypeOf(PDFSinglePageViewer.prototype), "_scrollIntoView", this).call(this, {\n pageDiv: pageDiv,\n pageSpot: pageSpot,\n pageNumber: pageNumber\n });\n\n this._updateScrollDown = function () {\n _this2.scroll.down = scrolledDown;\n _this2._updateScrollDown = null;\n };\n }\n }, {\n key: "_getVisiblePages",\n value: function _getVisiblePages() {\n return this._getCurrentVisiblePage();\n }\n }, {\n key: "_updateHelper",\n value: function _updateHelper(visiblePages) {}\n }, {\n key: "_updateScrollMode",\n value: function _updateScrollMode() {}\n }, {\n key: "_updateSpreadMode",\n value: function _updateSpreadMode() {}\n }, {\n key: "_viewerElement",\n get: function get() {\n return (0, _pdfjsLib.shadow)(this, "_viewerElement", this._shadowViewer);\n }\n }, {\n key: "_isScrollModeHorizontal",\n get: function get() {\n return (0, _pdfjsLib.shadow)(this, "_isScrollModeHorizontal", false);\n }\n }]);\n\n return PDFSinglePageViewer;\n}(_base_viewer.BaseViewer);\n\nexports.PDFSinglePageViewer = PDFSinglePageViewer;\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.BaseViewer = void 0;\n\nvar _ui_utils = __w_pdfjs_require__(3);\n\nvar _pdf_rendering_queue = __w_pdfjs_require__(17);\n\nvar _annotation_layer_builder = __w_pdfjs_require__(1);\n\nvar _pdfjsLib = __w_pdfjs_require__(2);\n\nvar _pdf_page_view = __w_pdfjs_require__(16);\n\nvar _pdf_link_service = __w_pdfjs_require__(7);\n\nvar _text_layer_builder = __w_pdfjs_require__(8);\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar DEFAULT_CACHE_SIZE = 10;\n\nfunction PDFPageViewBuffer(size) {\n var data = [];\n\n this.push = function (view) {\n var i = data.indexOf(view);\n\n if (i >= 0) {\n data.splice(i, 1);\n }\n\n data.push(view);\n\n if (data.length > size) {\n data.shift().destroy();\n }\n };\n\n this.resize = function (newSize, pagesToKeep) {\n size = newSize;\n\n if (pagesToKeep) {\n var pageIdsToKeep = new Set();\n\n for (var i = 0, iMax = pagesToKeep.length; i < iMax; ++i) {\n pageIdsToKeep.add(pagesToKeep[i].id);\n }\n\n (0, _ui_utils.moveToEndOfArray)(data, function (page) {\n return pageIdsToKeep.has(page.id);\n });\n }\n\n while (data.length > size) {\n data.shift().destroy();\n }\n };\n}\n\nfunction isSameScale(oldScale, newScale) {\n if (newScale === oldScale) {\n return true;\n }\n\n if (Math.abs(newScale - oldScale) < 1e-15) {\n return true;\n }\n\n return false;\n}\n\nvar BaseViewer = /*#__PURE__*/function () {\n function BaseViewer(options) {\n var _this = this;\n\n _classCallCheck(this, BaseViewer);\n\n if (this.constructor === BaseViewer) {\n throw new Error("Cannot initialize BaseViewer.");\n }\n\n this._name = this.constructor.name;\n this.container = options.container;\n this.viewer = options.viewer || options.container.firstElementChild;\n\n if (!(this.container instanceof HTMLDivElement && this.viewer instanceof HTMLDivElement)) {\n throw new Error("Invalid `container` and/or `viewer` option.");\n }\n\n this.eventBus = options.eventBus;\n this.linkService = options.linkService || new _pdf_link_service.SimpleLinkService();\n this.downloadManager = options.downloadManager || null;\n this.findController = options.findController || null;\n this.removePageBorders = options.removePageBorders || false;\n this.textLayerMode = Number.isInteger(options.textLayerMode) ? options.textLayerMode : _ui_utils.TextLayerMode.ENABLE;\n this.imageResourcesPath = options.imageResourcesPath || "";\n this.renderInteractiveForms = typeof options.renderInteractiveForms === "boolean" ? options.renderInteractiveForms : true;\n this.enablePrintAutoRotate = options.enablePrintAutoRotate || false;\n this.renderer = options.renderer || _ui_utils.RendererType.CANVAS;\n this.enableWebGL = options.enableWebGL || false;\n this.useOnlyCssZoom = options.useOnlyCssZoom || false;\n this.maxCanvasPixels = options.maxCanvasPixels;\n this.l10n = options.l10n || _ui_utils.NullL10n;\n this.defaultRenderingQueue = !options.renderingQueue;\n\n if (this.defaultRenderingQueue) {\n this.renderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();\n this.renderingQueue.setViewer(this);\n } else {\n this.renderingQueue = options.renderingQueue;\n }\n\n this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdate.bind(this));\n this.presentationModeState = _ui_utils.PresentationModeState.UNKNOWN;\n this._onBeforeDraw = this._onAfterDraw = null;\n\n this._resetView();\n\n if (this.removePageBorders) {\n this.viewer.classList.add("removePageBorders");\n }\n\n Promise.resolve().then(function () {\n _this.eventBus.dispatch("baseviewerinit", {\n source: _this\n });\n });\n }\n\n _createClass(BaseViewer, [{\n key: "getPageView",\n value: function getPageView(index) {\n return this._pages[index];\n }\n }, {\n key: "_setCurrentPageNumber",\n value: function _setCurrentPageNumber(val) {\n var resetCurrentPageView = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (this._currentPageNumber === val) {\n if (resetCurrentPageView) {\n this._resetCurrentPageView();\n }\n\n return true;\n }\n\n if (!(0 < val && val <= this.pagesCount)) {\n return false;\n }\n\n this._currentPageNumber = val;\n this.eventBus.dispatch("pagechanging", {\n source: this,\n pageNumber: val,\n pageLabel: this._pageLabels && this._pageLabels[val - 1]\n });\n\n if (resetCurrentPageView) {\n this._resetCurrentPageView();\n }\n\n return true;\n }\n }, {\n key: "_onePageRenderedOrForceFetch",\n value: function _onePageRenderedOrForceFetch() {\n if (!this.container.offsetParent || this._getVisiblePages().views.length === 0) {\n return Promise.resolve();\n }\n\n return this._onePageRenderedCapability.promise;\n }\n }, {\n key: "setDocument",\n value: function setDocument(pdfDocument) {\n var _this2 = this;\n\n if (this.pdfDocument) {\n this._cancelRendering();\n\n this._resetView();\n\n if (this.findController) {\n this.findController.setDocument(null);\n }\n }\n\n this.pdfDocument = pdfDocument;\n\n if (!pdfDocument) {\n return;\n }\n\n var pagesCount = pdfDocument.numPages;\n var firstPagePromise = pdfDocument.getPage(1);\n var annotationStorage = pdfDocument.annotationStorage;\n var optionalContentConfigPromise = pdfDocument.getOptionalContentConfig();\n\n this._pagesCapability.promise.then(function () {\n _this2.eventBus.dispatch("pagesloaded", {\n source: _this2,\n pagesCount: pagesCount\n });\n });\n\n this._onBeforeDraw = function (evt) {\n var pageView = _this2._pages[evt.pageNumber - 1];\n\n if (!pageView) {\n return;\n }\n\n _this2._buffer.push(pageView);\n };\n\n this.eventBus._on("pagerender", this._onBeforeDraw);\n\n this._onAfterDraw = function (evt) {\n if (evt.cssTransform || _this2._onePageRenderedCapability.settled) {\n return;\n }\n\n _this2._onePageRenderedCapability.resolve();\n\n _this2.eventBus._off("pagerendered", _this2._onAfterDraw);\n\n _this2._onAfterDraw = null;\n };\n\n this.eventBus._on("pagerendered", this._onAfterDraw);\n\n firstPagePromise.then(function (firstPdfPage) {\n _this2._firstPageCapability.resolve(firstPdfPage);\n\n _this2._optionalContentConfigPromise = optionalContentConfigPromise;\n var scale = _this2.currentScale;\n var viewport = firstPdfPage.getViewport({\n scale: scale * _ui_utils.CSS_UNITS\n });\n var textLayerFactory = _this2.textLayerMode !== _ui_utils.TextLayerMode.DISABLE ? _this2 : null;\n\n for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {\n var pageView = new _pdf_page_view.PDFPageView({\n container: _this2._viewerElement,\n eventBus: _this2.eventBus,\n id: pageNum,\n scale: scale,\n defaultViewport: viewport.clone(),\n annotationStorage: annotationStorage,\n optionalContentConfigPromise: optionalContentConfigPromise,\n renderingQueue: _this2.renderingQueue,\n textLayerFactory: textLayerFactory,\n textLayerMode: _this2.textLayerMode,\n annotationLayerFactory: _this2,\n imageResourcesPath: _this2.imageResourcesPath,\n renderInteractiveForms: _this2.renderInteractiveForms,\n renderer: _this2.renderer,\n enableWebGL: _this2.enableWebGL,\n useOnlyCssZoom: _this2.useOnlyCssZoom,\n maxCanvasPixels: _this2.maxCanvasPixels,\n l10n: _this2.l10n\n });\n\n _this2._pages.push(pageView);\n }\n\n var firstPageView = _this2._pages[0];\n\n if (firstPageView) {\n firstPageView.setPdfPage(firstPdfPage);\n\n _this2.linkService.cachePageRef(1, firstPdfPage.ref);\n }\n\n if (_this2._spreadMode !== _ui_utils.SpreadMode.NONE) {\n _this2._updateSpreadMode();\n }\n\n _this2._onePageRenderedOrForceFetch().then(function () {\n if (_this2.findController) {\n _this2.findController.setDocument(pdfDocument);\n }\n\n if (pdfDocument.loadingParams.disableAutoFetch || pagesCount > 7500) {\n _this2._pagesCapability.resolve();\n\n return;\n }\n\n var getPagesLeft = pagesCount - 1;\n\n if (getPagesLeft <= 0) {\n _this2._pagesCapability.resolve();\n\n return;\n }\n\n var _loop = function _loop(_pageNum) {\n pdfDocument.getPage(_pageNum).then(function (pdfPage) {\n var pageView = _this2._pages[_pageNum - 1];\n\n if (!pageView.pdfPage) {\n pageView.setPdfPage(pdfPage);\n }\n\n _this2.linkService.cachePageRef(_pageNum, pdfPage.ref);\n\n if (--getPagesLeft === 0) {\n _this2._pagesCapability.resolve();\n }\n }, function (reason) {\n console.error("Unable to get page ".concat(_pageNum, " to initialize viewer"), reason);\n\n if (--getPagesLeft === 0) {\n _this2._pagesCapability.resolve();\n }\n });\n };\n\n for (var _pageNum = 2; _pageNum <= pagesCount; ++_pageNum) {\n _loop(_pageNum);\n }\n });\n\n _this2.eventBus.dispatch("pagesinit", {\n source: _this2\n });\n\n if (_this2.defaultRenderingQueue) {\n _this2.update();\n }\n })["catch"](function (reason) {\n console.error("Unable to initialize viewer", reason);\n });\n }\n }, {\n key: "setPageLabels",\n value: function setPageLabels(labels) {\n if (!this.pdfDocument) {\n return;\n }\n\n if (!labels) {\n this._pageLabels = null;\n } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) {\n this._pageLabels = null;\n console.error("".concat(this._name, ".setPageLabels: Invalid page labels."));\n } else {\n this._pageLabels = labels;\n }\n\n for (var i = 0, ii = this._pages.length; i < ii; i++) {\n var pageView = this._pages[i];\n var label = this._pageLabels && this._pageLabels[i];\n pageView.setPageLabel(label);\n }\n }\n }, {\n key: "_resetView",\n value: function _resetView() {\n this._pages = [];\n this._currentPageNumber = 1;\n this._currentScale = _ui_utils.UNKNOWN_SCALE;\n this._currentScaleValue = null;\n this._pageLabels = null;\n this._buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE);\n this._location = null;\n this._pagesRotation = 0;\n this._optionalContentConfigPromise = null;\n this._pagesRequests = new WeakMap();\n this._firstPageCapability = (0, _pdfjsLib.createPromiseCapability)();\n this._onePageRenderedCapability = (0, _pdfjsLib.createPromiseCapability)();\n this._pagesCapability = (0, _pdfjsLib.createPromiseCapability)();\n this._scrollMode = _ui_utils.ScrollMode.VERTICAL;\n this._spreadMode = _ui_utils.SpreadMode.NONE;\n\n if (this._onBeforeDraw) {\n this.eventBus._off("pagerender", this._onBeforeDraw);\n\n this._onBeforeDraw = null;\n }\n\n if (this._onAfterDraw) {\n this.eventBus._off("pagerendered", this._onAfterDraw);\n\n this._onAfterDraw = null;\n }\n\n this.viewer.textContent = "";\n\n this._updateScrollMode();\n }\n }, {\n key: "_scrollUpdate",\n value: function _scrollUpdate() {\n if (this.pagesCount === 0) {\n return;\n }\n\n this.update();\n }\n }, {\n key: "_scrollIntoView",\n value: function _scrollIntoView(_ref) {\n var pageDiv = _ref.pageDiv,\n _ref$pageSpot = _ref.pageSpot,\n pageSpot = _ref$pageSpot === void 0 ? null : _ref$pageSpot,\n _ref$pageNumber = _ref.pageNumber,\n pageNumber = _ref$pageNumber === void 0 ? null : _ref$pageNumber;\n (0, _ui_utils.scrollIntoView)(pageDiv, pageSpot);\n }\n }, {\n key: "_setScaleUpdatePages",\n value: function _setScaleUpdatePages(newScale, newValue) {\n var noScroll = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var preset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n this._currentScaleValue = newValue.toString();\n\n if (isSameScale(this._currentScale, newScale)) {\n if (preset) {\n this.eventBus.dispatch("scalechanging", {\n source: this,\n scale: newScale,\n presetValue: newValue\n });\n }\n\n return;\n }\n\n for (var i = 0, ii = this._pages.length; i < ii; i++) {\n this._pages[i].update(newScale);\n }\n\n this._currentScale = newScale;\n\n if (!noScroll) {\n var page = this._currentPageNumber,\n dest;\n\n if (this._location && !(this.isInPresentationMode || this.isChangingPresentationMode)) {\n page = this._location.pageNumber;\n dest = [null, {\n name: "XYZ"\n }, this._location.left, this._location.top, null];\n }\n\n this.scrollPageIntoView({\n pageNumber: page,\n destArray: dest,\n allowNegativeOffset: true\n });\n }\n\n this.eventBus.dispatch("scalechanging", {\n source: this,\n scale: newScale,\n presetValue: preset ? newValue : undefined\n });\n\n if (this.defaultRenderingQueue) {\n this.update();\n }\n }\n }, {\n key: "_setScale",\n value: function _setScale(value) {\n var noScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var scale = parseFloat(value);\n\n if (scale > 0) {\n this._setScaleUpdatePages(scale, value, noScroll, false);\n } else {\n var currentPage = this._pages[this._currentPageNumber - 1];\n\n if (!currentPage) {\n return;\n }\n\n var noPadding = this.isInPresentationMode || this.removePageBorders;\n var hPadding = noPadding ? 0 : _ui_utils.SCROLLBAR_PADDING;\n var vPadding = noPadding ? 0 : _ui_utils.VERTICAL_PADDING;\n\n if (!noPadding && this._isScrollModeHorizontal) {\n var _ref2 = [vPadding, hPadding];\n hPadding = _ref2[0];\n vPadding = _ref2[1];\n }\n\n var pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale;\n var pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale;\n\n switch (value) {\n case "page-actual":\n scale = 1;\n break;\n\n case "page-width":\n scale = pageWidthScale;\n break;\n\n case "page-height":\n scale = pageHeightScale;\n break;\n\n case "page-fit":\n scale = Math.min(pageWidthScale, pageHeightScale);\n break;\n\n case "auto":\n var horizontalScale = (0, _ui_utils.isPortraitOrientation)(currentPage) ? pageWidthScale : Math.min(pageHeightScale, pageWidthScale);\n scale = Math.min(_ui_utils.MAX_AUTO_SCALE, horizontalScale);\n break;\n\n default:\n console.error("".concat(this._name, "._setScale: \\"").concat(value, "\\" is an unknown zoom value."));\n return;\n }\n\n this._setScaleUpdatePages(scale, value, noScroll, true);\n }\n }\n }, {\n key: "_resetCurrentPageView",\n value: function _resetCurrentPageView() {\n if (this.isInPresentationMode) {\n this._setScale(this._currentScaleValue, true);\n }\n\n var pageView = this._pages[this._currentPageNumber - 1];\n\n this._scrollIntoView({\n pageDiv: pageView.div\n });\n }\n }, {\n key: "scrollPageIntoView",\n value: function scrollPageIntoView(_ref3) {\n var pageNumber = _ref3.pageNumber,\n _ref3$destArray = _ref3.destArray,\n destArray = _ref3$destArray === void 0 ? null : _ref3$destArray,\n _ref3$allowNegativeOf = _ref3.allowNegativeOffset,\n allowNegativeOffset = _ref3$allowNegativeOf === void 0 ? false : _ref3$allowNegativeOf,\n _ref3$ignoreDestinati = _ref3.ignoreDestinationZoom,\n ignoreDestinationZoom = _ref3$ignoreDestinati === void 0 ? false : _ref3$ignoreDestinati;\n\n if (!this.pdfDocument) {\n return;\n }\n\n var pageView = Number.isInteger(pageNumber) && this._pages[pageNumber - 1];\n\n if (!pageView) {\n console.error("".concat(this._name, ".scrollPageIntoView: ") + "\\"".concat(pageNumber, "\\" is not a valid pageNumber parameter."));\n return;\n }\n\n if (this.isInPresentationMode || !destArray) {\n this._setCurrentPageNumber(pageNumber, true);\n\n return;\n }\n\n var x = 0,\n y = 0;\n var width = 0,\n height = 0,\n widthScale,\n heightScale;\n var changeOrientation = pageView.rotation % 180 !== 0;\n var pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / _ui_utils.CSS_UNITS;\n var pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / _ui_utils.CSS_UNITS;\n var scale = 0;\n\n switch (destArray[1].name) {\n case "XYZ":\n x = destArray[2];\n y = destArray[3];\n scale = destArray[4];\n x = x !== null ? x : 0;\n y = y !== null ? y : pageHeight;\n break;\n\n case "Fit":\n case "FitB":\n scale = "page-fit";\n break;\n\n case "FitH":\n case "FitBH":\n y = destArray[2];\n scale = "page-width";\n\n if (y === null && this._location) {\n x = this._location.left;\n y = this._location.top;\n }\n\n break;\n\n case "FitV":\n case "FitBV":\n x = destArray[2];\n width = pageWidth;\n height = pageHeight;\n scale = "page-height";\n break;\n\n case "FitR":\n x = destArray[2];\n y = destArray[3];\n width = destArray[4] - x;\n height = destArray[5] - y;\n var hPadding = this.removePageBorders ? 0 : _ui_utils.SCROLLBAR_PADDING;\n var vPadding = this.removePageBorders ? 0 : _ui_utils.VERTICAL_PADDING;\n widthScale = (this.container.clientWidth - hPadding) / width / _ui_utils.CSS_UNITS;\n heightScale = (this.container.clientHeight - vPadding) / height / _ui_utils.CSS_UNITS;\n scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));\n break;\n\n default:\n console.error("".concat(this._name, ".scrollPageIntoView: ") + "\\"".concat(destArray[1].name, "\\" is not a valid destination type."));\n return;\n }\n\n if (!ignoreDestinationZoom) {\n if (scale && scale !== this._currentScale) {\n this.currentScaleValue = scale;\n } else if (this._currentScale === _ui_utils.UNKNOWN_SCALE) {\n this.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE;\n }\n }\n\n if (scale === "page-fit" && !destArray[4]) {\n this._scrollIntoView({\n pageDiv: pageView.div,\n pageNumber: pageNumber\n });\n\n return;\n }\n\n var boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)];\n var left = Math.min(boundingRect[0][0], boundingRect[1][0]);\n var top = Math.min(boundingRect[0][1], boundingRect[1][1]);\n\n if (!allowNegativeOffset) {\n left = Math.max(left, 0);\n top = Math.max(top, 0);\n }\n\n this._scrollIntoView({\n pageDiv: pageView.div,\n pageSpot: {\n left: left,\n top: top\n },\n pageNumber: pageNumber\n });\n }\n }, {\n key: "_updateLocation",\n value: function _updateLocation(firstPage) {\n var currentScale = this._currentScale;\n var currentScaleValue = this._currentScaleValue;\n var normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue;\n var pageNumber = firstPage.id;\n var pdfOpenParams = "#page=" + pageNumber;\n pdfOpenParams += "&zoom=" + normalizedScaleValue;\n var currentPageView = this._pages[pageNumber - 1];\n var container = this.container;\n var topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y);\n var intLeft = Math.round(topLeft[0]);\n var intTop = Math.round(topLeft[1]);\n pdfOpenParams += "," + intLeft + "," + intTop;\n this._location = {\n pageNumber: pageNumber,\n scale: normalizedScaleValue,\n top: intTop,\n left: intLeft,\n rotation: this._pagesRotation,\n pdfOpenParams: pdfOpenParams\n };\n }\n }, {\n key: "_updateHelper",\n value: function _updateHelper(visiblePages) {\n throw new Error("Not implemented: _updateHelper");\n }\n }, {\n key: "update",\n value: function update() {\n var visible = this._getVisiblePages();\n\n var visiblePages = visible.views,\n numVisiblePages = visiblePages.length;\n\n if (numVisiblePages === 0) {\n return;\n }\n\n var newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1);\n\n this._buffer.resize(newCacheSize, visiblePages);\n\n this.renderingQueue.renderHighestPriority(visible);\n\n this._updateHelper(visiblePages);\n\n this._updateLocation(visible.first);\n\n this.eventBus.dispatch("updateviewarea", {\n source: this,\n location: this._location\n });\n }\n }, {\n key: "containsElement",\n value: function containsElement(element) {\n return this.container.contains(element);\n }\n }, {\n key: "focus",\n value: function focus() {\n this.container.focus();\n }\n }, {\n key: "_getCurrentVisiblePage",\n value: function _getCurrentVisiblePage() {\n if (!this.pagesCount) {\n return {\n views: []\n };\n }\n\n var pageView = this._pages[this._currentPageNumber - 1];\n var element = pageView.div;\n var view = {\n id: pageView.id,\n x: element.offsetLeft + element.clientLeft,\n y: element.offsetTop + element.clientTop,\n view: pageView\n };\n return {\n first: view,\n last: view,\n views: [view]\n };\n }\n }, {\n key: "_getVisiblePages",\n value: function _getVisiblePages() {\n return (0, _ui_utils.getVisibleElements)(this.container, this._pages, true, this._isScrollModeHorizontal);\n }\n }, {\n key: "isPageVisible",\n value: function isPageVisible(pageNumber) {\n if (!this.pdfDocument) {\n return false;\n }\n\n if (pageNumber < 1 || pageNumber > this.pagesCount) {\n console.error("".concat(this._name, ".isPageVisible: \\"").concat(pageNumber, "\\" is out of bounds."));\n return false;\n }\n\n return this._getVisiblePages().views.some(function (view) {\n return view.id === pageNumber;\n });\n }\n }, {\n key: "cleanup",\n value: function cleanup() {\n for (var i = 0, ii = this._pages.length; i < ii; i++) {\n if (this._pages[i] && this._pages[i].renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED) {\n this._pages[i].reset();\n }\n }\n }\n }, {\n key: "_cancelRendering",\n value: function _cancelRendering() {\n for (var i = 0, ii = this._pages.length; i < ii; i++) {\n if (this._pages[i]) {\n this._pages[i].cancelRendering();\n }\n }\n }\n }, {\n key: "_ensurePdfPageLoaded",\n value: function _ensurePdfPageLoaded(pageView) {\n var _this3 = this;\n\n if (pageView.pdfPage) {\n return Promise.resolve(pageView.pdfPage);\n }\n\n if (this._pagesRequests.has(pageView)) {\n return this._pagesRequests.get(pageView);\n }\n\n var promise = this.pdfDocument.getPage(pageView.id).then(function (pdfPage) {\n if (!pageView.pdfPage) {\n pageView.setPdfPage(pdfPage);\n }\n\n _this3._pagesRequests["delete"](pageView);\n\n return pdfPage;\n })["catch"](function (reason) {\n console.error("Unable to get page for page view", reason);\n\n _this3._pagesRequests["delete"](pageView);\n });\n\n this._pagesRequests.set(pageView, promise);\n\n return promise;\n }\n }, {\n key: "forceRendering",\n value: function forceRendering(currentlyVisiblePages) {\n var _this4 = this;\n\n var visiblePages = currentlyVisiblePages || this._getVisiblePages();\n\n var scrollAhead = this._isScrollModeHorizontal ? this.scroll.right : this.scroll.down;\n var pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead);\n\n if (pageView) {\n this._ensurePdfPageLoaded(pageView).then(function () {\n _this4.renderingQueue.renderView(pageView);\n });\n\n return true;\n }\n\n return false;\n }\n }, {\n key: "createTextLayerBuilder",\n value: function createTextLayerBuilder(textLayerDiv, pageIndex, viewport) {\n var enhanceTextSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var eventBus = arguments.length > 4 ? arguments[4] : undefined;\n return new _text_layer_builder.TextLayerBuilder({\n textLayerDiv: textLayerDiv,\n eventBus: eventBus,\n pageIndex: pageIndex,\n viewport: viewport,\n findController: this.isInPresentationMode ? null : this.findController,\n enhanceTextSelection: this.isInPresentationMode ? false : enhanceTextSelection\n });\n }\n }, {\n key: "createAnnotationLayerBuilder",\n value: function createAnnotationLayerBuilder(pageDiv, pdfPage) {\n var annotationStorage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var imageResourcesPath = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "";\n var renderInteractiveForms = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var l10n = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : _ui_utils.NullL10n;\n return new _annotation_layer_builder.AnnotationLayerBuilder({\n pageDiv: pageDiv,\n pdfPage: pdfPage,\n annotationStorage: annotationStorage,\n imageResourcesPath: imageResourcesPath,\n renderInteractiveForms: renderInteractiveForms,\n linkService: this.linkService,\n downloadManager: this.downloadManager,\n l10n: l10n\n });\n }\n }, {\n key: "getPagesOverview",\n value: function getPagesOverview() {\n var pagesOverview = this._pages.map(function (pageView) {\n var viewport = pageView.pdfPage.getViewport({\n scale: 1\n });\n return {\n width: viewport.width,\n height: viewport.height,\n rotation: viewport.rotation\n };\n });\n\n if (!this.enablePrintAutoRotate) {\n return pagesOverview;\n }\n\n return pagesOverview.map(function (size) {\n if ((0, _ui_utils.isPortraitOrientation)(size)) {\n return size;\n }\n\n return {\n width: size.height,\n height: size.width,\n rotation: (size.rotation + 90) % 360\n };\n });\n }\n }, {\n key: "_updateScrollMode",\n value: function _updateScrollMode() {\n var pageNumber = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var scrollMode = this._scrollMode,\n viewer = this.viewer;\n viewer.classList.toggle("scrollHorizontal", scrollMode === _ui_utils.ScrollMode.HORIZONTAL);\n viewer.classList.toggle("scrollWrapped", scrollMode === _ui_utils.ScrollMode.WRAPPED);\n\n if (!this.pdfDocument || !pageNumber) {\n return;\n }\n\n if (this._currentScaleValue && isNaN(this._currentScaleValue)) {\n this._setScale(this._currentScaleValue, true);\n }\n\n this._setCurrentPageNumber(pageNumber, true);\n\n this.update();\n }\n }, {\n key: "_updateSpreadMode",\n value: function _updateSpreadMode() {\n var pageNumber = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\n if (!this.pdfDocument) {\n return;\n }\n\n var viewer = this.viewer,\n pages = this._pages;\n viewer.textContent = "";\n\n if (this._spreadMode === _ui_utils.SpreadMode.NONE) {\n for (var i = 0, iMax = pages.length; i < iMax; ++i) {\n viewer.appendChild(pages[i].div);\n }\n } else {\n var parity = this._spreadMode - 1;\n var spread = null;\n\n for (var _i = 0, _iMax = pages.length; _i < _iMax; ++_i) {\n if (spread === null) {\n spread = document.createElement("div");\n spread.className = "spread";\n viewer.appendChild(spread);\n } else if (_i % 2 === parity) {\n spread = spread.cloneNode(false);\n viewer.appendChild(spread);\n }\n\n spread.appendChild(pages[_i].div);\n }\n }\n\n if (!pageNumber) {\n return;\n }\n\n this._setCurrentPageNumber(pageNumber, true);\n\n this.update();\n }\n }, {\n key: "pagesCount",\n get: function get() {\n return this._pages.length;\n }\n }, {\n key: "pageViewsReady",\n get: function get() {\n if (!this._pagesCapability.settled) {\n return false;\n }\n\n return this._pages.every(function (pageView) {\n return pageView && pageView.pdfPage;\n });\n }\n }, {\n key: "currentPageNumber",\n get: function get() {\n return this._currentPageNumber;\n },\n set: function set(val) {\n if (!Number.isInteger(val)) {\n throw new Error("Invalid page number.");\n }\n\n if (!this.pdfDocument) {\n return;\n }\n\n if (!this._setCurrentPageNumber(val, true)) {\n console.error("".concat(this._name, ".currentPageNumber: \\"").concat(val, "\\" is not a valid page."));\n }\n }\n }, {\n key: "currentPageLabel",\n get: function get() {\n return this._pageLabels && this._pageLabels[this._currentPageNumber - 1];\n },\n set: function set(val) {\n if (!this.pdfDocument) {\n return;\n }\n\n var page = val | 0;\n\n if (this._pageLabels) {\n var i = this._pageLabels.indexOf(val);\n\n if (i >= 0) {\n page = i + 1;\n }\n }\n\n if (!this._setCurrentPageNumber(page, true)) {\n console.error("".concat(this._name, ".currentPageLabel: \\"").concat(val, "\\" is not a valid page."));\n }\n }\n }, {\n key: "currentScale",\n get: function get() {\n return this._currentScale !== _ui_utils.UNKNOWN_SCALE ? this._currentScale : _ui_utils.DEFAULT_SCALE;\n },\n set: function set(val) {\n if (isNaN(val)) {\n throw new Error("Invalid numeric scale.");\n }\n\n if (!this.pdfDocument) {\n return;\n }\n\n this._setScale(val, false);\n }\n }, {\n key: "currentScaleValue",\n get: function get() {\n return this._currentScaleValue;\n },\n set: function set(val) {\n if (!this.pdfDocument) {\n return;\n }\n\n this._setScale(val, false);\n }\n }, {\n key: "pagesRotation",\n get: function get() {\n return this._pagesRotation;\n },\n set: function set(rotation) {\n if (!(0, _ui_utils.isValidRotation)(rotation)) {\n throw new Error("Invalid pages rotation angle.");\n }\n\n if (!this.pdfDocument) {\n return;\n }\n\n if (this._pagesRotation === rotation) {\n return;\n }\n\n this._pagesRotation = rotation;\n var pageNumber = this._currentPageNumber;\n\n for (var i = 0, ii = this._pages.length; i < ii; i++) {\n var pageView = this._pages[i];\n pageView.update(pageView.scale, rotation);\n }\n\n if (this._currentScaleValue) {\n this._setScale(this._currentScaleValue, true);\n }\n\n this.eventBus.dispatch("rotationchanging", {\n source: this,\n pagesRotation: rotation,\n pageNumber: pageNumber\n });\n\n if (this.defaultRenderingQueue) {\n this.update();\n }\n }\n }, {\n key: "firstPagePromise",\n get: function get() {\n return this.pdfDocument ? this._firstPageCapability.promise : null;\n }\n }, {\n key: "onePageRendered",\n get: function get() {\n return this.pdfDocument ? this._onePageRenderedCapability.promise : null;\n }\n }, {\n key: "pagesPromise",\n get: function get() {\n return this.pdfDocument ? this._pagesCapability.promise : null;\n }\n }, {\n key: "_viewerElement",\n get: function get() {\n throw new Error("Not implemented: _viewerElement");\n }\n }, {\n key: "_isScrollModeHorizontal",\n get: function get() {\n return this.isInPresentationMode ? false : this._scrollMode === _ui_utils.ScrollMode.HORIZONTAL;\n }\n }, {\n key: "isInPresentationMode",\n get: function get() {\n return this.presentationModeState === _ui_utils.PresentationModeState.FULLSCREEN;\n }\n }, {\n key: "isChangingPresentationMode",\n get: function get() {\n return this.presentationModeState === _ui_utils.PresentationModeState.CHANGING;\n }\n }, {\n key: "isHorizontalScrollbarEnabled",\n get: function get() {\n return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth;\n }\n }, {\n key: "isVerticalScrollbarEnabled",\n get: function get() {\n return this.isInPresentationMode ? false : this.container.scrollHeight > this.container.clientHeight;\n }\n }, {\n key: "hasEqualPageSizes",\n get: function get() {\n var firstPageView = this._pages[0];\n\n for (var i = 1, ii = this._pages.length; i < ii; ++i) {\n var pageView = this._pages[i];\n\n if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) {\n return false;\n }\n }\n\n return true;\n }\n }, {\n key: "optionalContentConfigPromise",\n get: function get() {\n if (!this.pdfDocument) {\n return Promise.resolve(null);\n }\n\n if (!this._optionalContentConfigPromise) {\n return this.pdfDocument.getOptionalContentConfig();\n }\n\n return this._optionalContentConfigPromise;\n },\n set: function set(promise) {\n if (!(promise instanceof Promise)) {\n throw new Error("Invalid optionalContentConfigPromise: ".concat(promise));\n }\n\n if (!this.pdfDocument) {\n return;\n }\n\n if (!this._optionalContentConfigPromise) {\n return;\n }\n\n this._optionalContentConfigPromise = promise;\n\n var _iterator = _createForOfIteratorHelper(this._pages),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var pageView = _step.value;\n pageView.update(pageView.scale, pageView.rotation, promise);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n this.update();\n this.eventBus.dispatch("optionalcontentconfigchanged", {\n source: this,\n promise: promise\n });\n }\n }, {\n key: "scrollMode",\n get: function get() {\n return this._scrollMode;\n },\n set: function set(mode) {\n if (this._scrollMode === mode) {\n return;\n }\n\n if (!(0, _ui_utils.isValidScrollMode)(mode)) {\n throw new Error("Invalid scroll mode: ".concat(mode));\n }\n\n this._scrollMode = mode;\n this.eventBus.dispatch("scrollmodechanged", {\n source: this,\n mode: mode\n });\n\n this._updateScrollMode(this._currentPageNumber);\n }\n }, {\n key: "spreadMode",\n get: function get() {\n return this._spreadMode;\n },\n set: function set(mode) {\n if (this._spreadMode === mode) {\n return;\n }\n\n if (!(0, _ui_utils.isValidSpreadMode)(mode)) {\n throw new Error("Invalid spread mode: ".concat(mode));\n }\n\n this._spreadMode = mode;\n this.eventBus.dispatch("spreadmodechanged", {\n source: this,\n mode: mode\n });\n\n this._updateSpreadMode(this._currentPageNumber);\n }\n }]);\n\n return BaseViewer;\n}();\n\nexports.BaseViewer = BaseViewer;\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __w_pdfjs_require__) {\n\n"use strict";\n\n\nObject.defineProperty(exports, "__esModule", {\n value: true\n});\nexports.PDFViewer = void 0;\n\nvar _base_viewer = __w_pdfjs_require__(19);\n\nvar _pdfjsLib = __w_pdfjs_require__(2);\n\nfunction _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }\n\nfunction _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nvar PDFViewer = /*#__PURE__*/function (_BaseViewer) {\n _inherits(PDFViewer, _BaseViewer);\n\n var _super = _createSuper(PDFViewer);\n\n function PDFViewer() {\n _classCallCheck(this, PDFViewer);\n\n return _super.apply(this, arguments);\n }\n\n _createClass(PDFViewer, [{\n key: "_scrollIntoView",\n value: function _scrollIntoView(_ref) {\n var pageDiv = _ref.pageDiv,\n _ref$pageSpot = _ref.pageSpot,\n pageSpot = _ref$pageSpot === void 0 ? null : _ref$pageSpot,\n _ref$pageNumber = _ref.pageNumber,\n pageNumber = _ref$pageNumber === void 0 ? null : _ref$pageNumber;\n\n if (!pageSpot && !this.isInPresentationMode) {\n var left = pageDiv.offsetLeft + pageDiv.clientLeft;\n var right = left + pageDiv.clientWidth;\n var _this$container = this.container,\n scrollLeft = _this$container.scrollLeft,\n clientWidth = _this$container.clientWidth;\n\n if (this._isScrollModeHorizontal || left < scrollLeft || right > scrollLeft + clientWidth) {\n pageSpot = {\n left: 0,\n top: 0\n };\n }\n }\n\n _get(_getPrototypeOf(PDFViewer.prototype), "_scrollIntoView", this).call(this, {\n pageDiv: pageDiv,\n pageSpot: pageSpot,\n pageNumber: pageNumber\n });\n }\n }, {\n key: "_getVisiblePages",\n value: function _getVisiblePages() {\n if (this.isInPresentationMode) {\n return this._getCurrentVisiblePage();\n }\n\n return _get(_getPrototypeOf(PDFViewer.prototype), "_getVisiblePages", this).call(this);\n }\n }, {\n key: "_updateHelper",\n value: function _updateHelper(visiblePages) {\n if (this.isInPresentationMode) {\n return;\n }\n\n var currentId = this._currentPageNumber;\n var stillFullyVisible = false;\n\n var _iterator = _createForOfIteratorHelper(visiblePages),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var page = _step.value;\n\n if (page.percent < 100) {\n break;\n }\n\n if (page.id === currentId) {\n stillFullyVisible = true;\n break;\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n if (!stillFullyVisible) {\n currentId = visiblePages[0].id;\n }\n\n this._setCurrentPageNumber(currentId);\n }\n }, {\n key: "_viewerElement",\n get: function get() {\n return (0, _pdfjsLib.shadow)(this, "_viewerElement", this.viewer);\n }\n }]);\n\n return PDFViewer;\n}(_base_viewer.BaseViewer);\n\nexports.PDFViewer = PDFViewer;\n\n/***/ })\n/******/ ]);\n});\n//# sourceMappingURL=pdf_viewer.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMVA1dS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy92dWUtcGRmL25vZGVfbW9kdWxlcy9wZGZqcy1kaXN0L2VzNS93ZWIvcGRmX3ZpZXdlci5qcz9kNGZlIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY3N0YXJ0IFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVudGlyZSBsaWNlbnNlIG5vdGljZSBmb3IgdGhlXG4gKiBKYXZhc2NyaXB0IGNvZGUgaW4gdGhpcyBwYWdlXG4gKlxuICogQ29weXJpZ2h0IDIwMjAgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIEBsaWNlbmQgVGhlIGFib3ZlIGlzIHRoZSBlbnRpcmUgbGljZW5zZSBub3RpY2UgZm9yIHRoZVxuICogSmF2YXNjcmlwdCBjb2RlIGluIHRoaXMgcGFnZVxuICovXG5cbihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwicGRmanMtZGlzdC93ZWIvcGRmX3ZpZXdlclwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJwZGZqcy1kaXN0L3dlYi9wZGZfdmlld2VyXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcInBkZmpzLWRpc3Qvd2ViL3BkZl92aWV3ZXJcIl0gPSByb290LnBkZmpzVmlld2VyID0gZmFjdG9yeSgpO1xufSkodGhpcywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dfcGRmanNfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dfcGRmanNfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193X3BkZmpzX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dfcGRmanNfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193X3BkZmpzX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4vKioqKioqLyBcdF9fd19wZGZqc19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbi8qKioqKiovIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuLyoqKioqKi8gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8qKioqKiovIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4vKioqKioqLyBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbi8qKioqKiovIFx0X193X3BkZmpzX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKHZhbHVlKTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuLyoqKioqKi8gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4vKioqKioqLyBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbi8qKioqKiovIFx0XHRfX3dfcGRmanNfcmVxdWlyZV9fLnIobnMpO1xuLyoqKioqKi8gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbi8qKioqKiovIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dfcGRmanNfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4vKioqKioqLyBcdFx0cmV0dXJuIG5zO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193X3BkZmpzX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dfcGRmanNfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dfcGRmanNfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dfcGRmanNfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193X3BkZmpzX3JlcXVpcmVfXyhfX3dfcGRmanNfcmVxdWlyZV9fLnMgPSAwKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkFubm90YXRpb25MYXllckJ1aWxkZXJcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2Fubm90YXRpb25fbGF5ZXJfYnVpbGRlci5Bbm5vdGF0aW9uTGF5ZXJCdWlsZGVyO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkRlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9hbm5vdGF0aW9uX2xheWVyX2J1aWxkZXIuRGVmYXVsdEFubm90YXRpb25MYXllckZhY3Rvcnk7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGVmYXVsdFRleHRMYXllckZhY3RvcnlcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3RleHRfbGF5ZXJfYnVpbGRlci5EZWZhdWx0VGV4dExheWVyRmFjdG9yeTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUZXh0TGF5ZXJCdWlsZGVyXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF90ZXh0X2xheWVyX2J1aWxkZXIuVGV4dExheWVyQnVpbGRlcjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFdmVudEJ1c1wiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfdWlfdXRpbHMuRXZlbnRCdXM7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTnVsbEwxMG5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3VpX3V0aWxzLk51bGxMMTBuO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzQmFyXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF91aV91dGlscy5Qcm9ncmVzc0JhcjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQREZMaW5rU2VydmljZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcGRmX2xpbmtfc2VydmljZS5QREZMaW5rU2VydmljZTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTaW1wbGVMaW5rU2VydmljZVwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcGRmX2xpbmtfc2VydmljZS5TaW1wbGVMaW5rU2VydmljZTtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJEb3dubG9hZE1hbmFnZXJcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX2Rvd25sb2FkX21hbmFnZXIuRG93bmxvYWRNYW5hZ2VyO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkdlbmVyaWNMMTBuXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9nZW5lcmljbDEwbi5HZW5lcmljTDEwbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQREZGaW5kQ29udHJvbGxlclwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgIHJldHVybiBfcGRmX2ZpbmRfY29udHJvbGxlci5QREZGaW5kQ29udHJvbGxlcjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQREZIaXN0b3J5XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9wZGZfaGlzdG9yeS5QREZIaXN0b3J5O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBERlBhZ2VWaWV3XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgcmV0dXJuIF9wZGZfcGFnZV92aWV3LlBERlBhZ2VWaWV3O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBERlNpbmdsZVBhZ2VWaWV3ZXJcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3BkZl9zaW5nbGVfcGFnZV92aWV3ZXIuUERGU2luZ2xlUGFnZVZpZXdlcjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJQREZWaWV3ZXJcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICByZXR1cm4gX3BkZl92aWV3ZXIuUERGVmlld2VyO1xuICB9XG59KTtcblxudmFyIF9hbm5vdGF0aW9uX2xheWVyX2J1aWxkZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDEpO1xuXG52YXIgX3RleHRfbGF5ZXJfYnVpbGRlciA9IF9fd19wZGZqc19yZXF1aXJlX18oOCk7XG5cbnZhciBfdWlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpO1xuXG52YXIgX3BkZl9saW5rX3NlcnZpY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpO1xuXG52YXIgX2Rvd25sb2FkX21hbmFnZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDkpO1xuXG52YXIgX2dlbmVyaWNsMTBuID0gX193X3BkZmpzX3JlcXVpcmVfXygxMSk7XG5cbnZhciBfcGRmX2ZpbmRfY29udHJvbGxlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMTMpO1xuXG52YXIgX3BkZl9oaXN0b3J5ID0gX193X3BkZmpzX3JlcXVpcmVfXygxNSk7XG5cbnZhciBfcGRmX3BhZ2VfdmlldyA9IF9fd19wZGZqc19yZXF1aXJlX18oMTYpO1xuXG52YXIgX3BkZl9zaW5nbGVfcGFnZV92aWV3ZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE4KTtcblxudmFyIF9wZGZfdmlld2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygyMCk7XG5cbnZhciBwZGZqc1ZlcnNpb24gPSAnMi42LjM0Nyc7XG52YXIgcGRmanNCdWlsZCA9ICczYmU5YzY1Zic7XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5EZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeSA9IGV4cG9ydHMuQW5ub3RhdGlvbkxheWVyQnVpbGRlciA9IHZvaWQgMDtcblxudmFyIF9wZGZqc0xpYiA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7XG5cbnZhciBfdWlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpO1xuXG52YXIgX3BkZl9saW5rX3NlcnZpY2UgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDcpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbnZhciBBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQW5ub3RhdGlvbkxheWVyQnVpbGRlcihfcmVmKSB7XG4gICAgdmFyIHBhZ2VEaXYgPSBfcmVmLnBhZ2VEaXYsXG4gICAgICAgIHBkZlBhZ2UgPSBfcmVmLnBkZlBhZ2UsXG4gICAgICAgIGxpbmtTZXJ2aWNlID0gX3JlZi5saW5rU2VydmljZSxcbiAgICAgICAgZG93bmxvYWRNYW5hZ2VyID0gX3JlZi5kb3dubG9hZE1hbmFnZXIsXG4gICAgICAgIF9yZWYkYW5ub3RhdGlvblN0b3JhZyA9IF9yZWYuYW5ub3RhdGlvblN0b3JhZ2UsXG4gICAgICAgIGFubm90YXRpb25TdG9yYWdlID0gX3JlZiRhbm5vdGF0aW9uU3RvcmFnID09PSB2b2lkIDAgPyBudWxsIDogX3JlZiRhbm5vdGF0aW9uU3RvcmFnLFxuICAgICAgICBfcmVmJGltYWdlUmVzb3VyY2VzUGEgPSBfcmVmLmltYWdlUmVzb3VyY2VzUGF0aCxcbiAgICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoID0gX3JlZiRpbWFnZVJlc291cmNlc1BhID09PSB2b2lkIDAgPyBcIlwiIDogX3JlZiRpbWFnZVJlc291cmNlc1BhLFxuICAgICAgICBfcmVmJHJlbmRlckludGVyYWN0aXYgPSBfcmVmLnJlbmRlckludGVyYWN0aXZlRm9ybXMsXG4gICAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXMgPSBfcmVmJHJlbmRlckludGVyYWN0aXYgPT09IHZvaWQgMCA/IHRydWUgOiBfcmVmJHJlbmRlckludGVyYWN0aXYsXG4gICAgICAgIF9yZWYkbDEwbiA9IF9yZWYubDEwbixcbiAgICAgICAgbDEwbiA9IF9yZWYkbDEwbiA9PT0gdm9pZCAwID8gX3VpX3V0aWxzLk51bGxMMTBuIDogX3JlZiRsMTBuO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEFubm90YXRpb25MYXllckJ1aWxkZXIpO1xuXG4gICAgdGhpcy5wYWdlRGl2ID0gcGFnZURpdjtcbiAgICB0aGlzLnBkZlBhZ2UgPSBwZGZQYWdlO1xuICAgIHRoaXMubGlua1NlcnZpY2UgPSBsaW5rU2VydmljZTtcbiAgICB0aGlzLmRvd25sb2FkTWFuYWdlciA9IGRvd25sb2FkTWFuYWdlcjtcbiAgICB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCA9IGltYWdlUmVzb3VyY2VzUGF0aDtcbiAgICB0aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXMgPSByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zO1xuICAgIHRoaXMubDEwbiA9IGwxMG47XG4gICAgdGhpcy5hbm5vdGF0aW9uU3RvcmFnZSA9IGFubm90YXRpb25TdG9yYWdlO1xuICAgIHRoaXMuZGl2ID0gbnVsbDtcbiAgICB0aGlzLl9jYW5jZWxsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHZpZXdwb3J0KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgaW50ZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBcImRpc3BsYXlcIjtcbiAgICAgIHJldHVybiB0aGlzLnBkZlBhZ2UuZ2V0QW5ub3RhdGlvbnMoe1xuICAgICAgICBpbnRlbnQ6IGludGVudFxuICAgICAgfSkudGhlbihmdW5jdGlvbiAoYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgaWYgKF90aGlzLl9jYW5jZWxsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYW5ub3RhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgdmlld3BvcnQ6IHZpZXdwb3J0LmNsb25lKHtcbiAgICAgICAgICAgIGRvbnRGbGlwOiB0cnVlXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZGl2OiBfdGhpcy5kaXYsXG4gICAgICAgICAgYW5ub3RhdGlvbnM6IGFubm90YXRpb25zLFxuICAgICAgICAgIHBhZ2U6IF90aGlzLnBkZlBhZ2UsXG4gICAgICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoOiBfdGhpcy5pbWFnZVJlc291cmNlc1BhdGgsXG4gICAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogX3RoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyxcbiAgICAgICAgICBsaW5rU2VydmljZTogX3RoaXMubGlua1NlcnZpY2UsXG4gICAgICAgICAgZG93bmxvYWRNYW5hZ2VyOiBfdGhpcy5kb3dubG9hZE1hbmFnZXIsXG4gICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IF90aGlzLmFubm90YXRpb25TdG9yYWdlXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKF90aGlzLmRpdikge1xuICAgICAgICAgIF9wZGZqc0xpYi5Bbm5vdGF0aW9uTGF5ZXIudXBkYXRlKHBhcmFtZXRlcnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzLmRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgX3RoaXMuZGl2LmNsYXNzTmFtZSA9IFwiYW5ub3RhdGlvbkxheWVyXCI7XG5cbiAgICAgICAgICBfdGhpcy5wYWdlRGl2LmFwcGVuZENoaWxkKF90aGlzLmRpdik7XG5cbiAgICAgICAgICBwYXJhbWV0ZXJzLmRpdiA9IF90aGlzLmRpdjtcblxuICAgICAgICAgIF9wZGZqc0xpYi5Bbm5vdGF0aW9uTGF5ZXIucmVuZGVyKHBhcmFtZXRlcnMpO1xuXG4gICAgICAgICAgX3RoaXMubDEwbi50cmFuc2xhdGUoX3RoaXMuZGl2KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhbmNlbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICB0aGlzLl9jYW5jZWxsZWQgPSB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoaWRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgICBpZiAoIXRoaXMuZGl2KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIFwidHJ1ZVwiKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQW5ub3RhdGlvbkxheWVyQnVpbGRlcjtcbn0oKTtcblxuZXhwb3J0cy5Bbm5vdGF0aW9uTGF5ZXJCdWlsZGVyID0gQW5ub3RhdGlvbkxheWVyQnVpbGRlcjtcblxudmFyIERlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRGVmYXVsdEFubm90YXRpb25MYXllckZhY3RvcnkoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhEZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeSwgW3tcbiAgICBrZXk6IFwiY3JlYXRlQW5ub3RhdGlvbkxheWVyQnVpbGRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyKHBhZ2VEaXYsIHBkZlBhZ2UpIHtcbiAgICAgIHZhciBhbm5vdGF0aW9uU3RvcmFnZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcbiAgICAgIHZhciBpbWFnZVJlc291cmNlc1BhdGggPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IFwiXCI7XG4gICAgICB2YXIgcmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ICYmIGFyZ3VtZW50c1s0XSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzRdIDogdHJ1ZTtcbiAgICAgIHZhciBsMTBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBfdWlfdXRpbHMuTnVsbEwxMG47XG4gICAgICByZXR1cm4gbmV3IEFubm90YXRpb25MYXllckJ1aWxkZXIoe1xuICAgICAgICBwYWdlRGl2OiBwYWdlRGl2LFxuICAgICAgICBwZGZQYWdlOiBwZGZQYWdlLFxuICAgICAgICBpbWFnZVJlc291cmNlc1BhdGg6IGltYWdlUmVzb3VyY2VzUGF0aCxcbiAgICAgICAgcmVuZGVySW50ZXJhY3RpdmVGb3JtczogcmVuZGVySW50ZXJhY3RpdmVGb3JtcyxcbiAgICAgICAgbGlua1NlcnZpY2U6IG5ldyBfcGRmX2xpbmtfc2VydmljZS5TaW1wbGVMaW5rU2VydmljZSgpLFxuICAgICAgICBsMTBuOiBsMTBuLFxuICAgICAgICBhbm5vdGF0aW9uU3RvcmFnZTogYW5ub3RhdGlvblN0b3JhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBEZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeTtcbn0oKTtcblxuZXhwb3J0cy5EZWZhdWx0QW5ub3RhdGlvbkxheWVyRmFjdG9yeSA9IERlZmF1bHRBbm5vdGF0aW9uTGF5ZXJGYWN0b3J5O1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIHBkZmpzTGliO1xuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3dbXCJwZGZqcy1kaXN0L2J1aWxkL3BkZlwiXSkge1xuICBwZGZqc0xpYiA9IHdpbmRvd1tcInBkZmpzLWRpc3QvYnVpbGQvcGRmXCJdO1xufSBlbHNlIHtcbiAgcGRmanNMaWIgPSByZXF1aXJlKFwiLi4vYnVpbGQvcGRmLmpzXCIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBkZmpzTGliO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuaXNWYWxpZFJvdGF0aW9uID0gaXNWYWxpZFJvdGF0aW9uO1xuZXhwb3J0cy5pc1ZhbGlkU2Nyb2xsTW9kZSA9IGlzVmFsaWRTY3JvbGxNb2RlO1xuZXhwb3J0cy5pc1ZhbGlkU3ByZWFkTW9kZSA9IGlzVmFsaWRTcHJlYWRNb2RlO1xuZXhwb3J0cy5pc1BvcnRyYWl0T3JpZW50YXRpb24gPSBpc1BvcnRyYWl0T3JpZW50YXRpb247XG5leHBvcnRzLmNsYW1wID0gY2xhbXA7XG5leHBvcnRzLmdldFBERkZpbGVOYW1lRnJvbVVSTCA9IGdldFBERkZpbGVOYW1lRnJvbVVSTDtcbmV4cG9ydHMubm9Db250ZXh0TWVudUhhbmRsZXIgPSBub0NvbnRleHRNZW51SGFuZGxlcjtcbmV4cG9ydHMucGFyc2VRdWVyeVN0cmluZyA9IHBhcnNlUXVlcnlTdHJpbmc7XG5leHBvcnRzLmJhY2t0cmFja0JlZm9yZUFsbFZpc2libGVFbGVtZW50cyA9IGJhY2t0cmFja0JlZm9yZUFsbFZpc2libGVFbGVtZW50cztcbmV4cG9ydHMuZ2V0VmlzaWJsZUVsZW1lbnRzID0gZ2V0VmlzaWJsZUVsZW1lbnRzO1xuZXhwb3J0cy5yb3VuZFRvRGl2aWRlID0gcm91bmRUb0RpdmlkZTtcbmV4cG9ydHMuZ2V0UGFnZVNpemVJbmNoZXMgPSBnZXRQYWdlU2l6ZUluY2hlcztcbmV4cG9ydHMuYXBwcm94aW1hdGVGcmFjdGlvbiA9IGFwcHJveGltYXRlRnJhY3Rpb247XG5leHBvcnRzLmdldE91dHB1dFNjYWxlID0gZ2V0T3V0cHV0U2NhbGU7XG5leHBvcnRzLnNjcm9sbEludG9WaWV3ID0gc2Nyb2xsSW50b1ZpZXc7XG5leHBvcnRzLndhdGNoU2Nyb2xsID0gd2F0Y2hTY3JvbGw7XG5leHBvcnRzLmJpbmFyeVNlYXJjaEZpcnN0SXRlbSA9IGJpbmFyeVNlYXJjaEZpcnN0SXRlbTtcbmV4cG9ydHMubm9ybWFsaXplV2hlZWxFdmVudERpcmVjdGlvbiA9IG5vcm1hbGl6ZVdoZWVsRXZlbnREaXJlY3Rpb247XG5leHBvcnRzLm5vcm1hbGl6ZVdoZWVsRXZlbnREZWx0YSA9IG5vcm1hbGl6ZVdoZWVsRXZlbnREZWx0YTtcbmV4cG9ydHMud2FpdE9uRXZlbnRPclRpbWVvdXQgPSB3YWl0T25FdmVudE9yVGltZW91dDtcbmV4cG9ydHMubW92ZVRvRW5kT2ZBcnJheSA9IG1vdmVUb0VuZE9mQXJyYXk7XG5leHBvcnRzLldhaXRPblR5cGUgPSBleHBvcnRzLmFuaW1hdGlvblN0YXJ0ZWQgPSBleHBvcnRzLlByb2dyZXNzQmFyID0gZXhwb3J0cy5FdmVudEJ1cyA9IGV4cG9ydHMuTnVsbEwxMG4gPSBleHBvcnRzLlNwcmVhZE1vZGUgPSBleHBvcnRzLlNjcm9sbE1vZGUgPSBleHBvcnRzLlRleHRMYXllck1vZGUgPSBleHBvcnRzLlJlbmRlcmVyVHlwZSA9IGV4cG9ydHMuUHJlc2VudGF0aW9uTW9kZVN0YXRlID0gZXhwb3J0cy5WRVJUSUNBTF9QQURESU5HID0gZXhwb3J0cy5TQ1JPTExCQVJfUEFERElORyA9IGV4cG9ydHMuTUFYX0FVVE9fU0NBTEUgPSBleHBvcnRzLlVOS05PV05fU0NBTEUgPSBleHBvcnRzLk1BWF9TQ0FMRSA9IGV4cG9ydHMuTUlOX1NDQUxFID0gZXhwb3J0cy5ERUZBVUxUX1NDQUxFID0gZXhwb3J0cy5ERUZBVUxUX1NDQUxFX1ZBTFVFID0gZXhwb3J0cy5DU1NfVU5JVFMgPSBleHBvcnRzLkF1dG9QcmludFJlZ0V4cCA9IHZvaWQgMDtcblxudmFyIF9yZWdlbmVyYXRvciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX193X3BkZmpzX3JlcXVpcmVfXyg0KSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykgeyB0cnkgeyB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7IHZhciB2YWx1ZSA9IGluZm8udmFsdWU7IH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IHJldHVybjsgfSBpZiAoaW5mby5kb25lKSB7IHJlc29sdmUodmFsdWUpOyB9IGVsc2UgeyBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7IH0gfVxuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTsgZnVuY3Rpb24gX25leHQodmFsdWUpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpOyB9IGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7IH0gX25leHQodW5kZWZpbmVkKTsgfSk7IH07IH1cblxudmFyIENTU19VTklUUyA9IDk2LjAgLyA3Mi4wO1xuZXhwb3J0cy5DU1NfVU5JVFMgPSBDU1NfVU5JVFM7XG52YXIgREVGQVVMVF9TQ0FMRV9WQUxVRSA9IFwiYXV0b1wiO1xuZXhwb3J0cy5ERUZBVUxUX1NDQUxFX1ZBTFVFID0gREVGQVVMVF9TQ0FMRV9WQUxVRTtcbnZhciBERUZBVUxUX1NDQUxFID0gMS4wO1xuZXhwb3J0cy5ERUZBVUxUX1NDQUxFID0gREVGQVVMVF9TQ0FMRTtcbnZhciBNSU5fU0NBTEUgPSAwLjE7XG5leHBvcnRzLk1JTl9TQ0FMRSA9IE1JTl9TQ0FMRTtcbnZhciBNQVhfU0NBTEUgPSAxMC4wO1xuZXhwb3J0cy5NQVhfU0NBTEUgPSBNQVhfU0NBTEU7XG52YXIgVU5LTk9XTl9TQ0FMRSA9IDA7XG5leHBvcnRzLlVOS05PV05fU0NBTEUgPSBVTktOT1dOX1NDQUxFO1xudmFyIE1BWF9BVVRPX1NDQUxFID0gMS4yNTtcbmV4cG9ydHMuTUFYX0FVVE9fU0NBTEUgPSBNQVhfQVVUT19TQ0FMRTtcbnZhciBTQ1JPTExCQVJfUEFERElORyA9IDQwO1xuZXhwb3J0cy5TQ1JPTExCQVJfUEFERElORyA9IFNDUk9MTEJBUl9QQURESU5HO1xudmFyIFZFUlRJQ0FMX1BBRERJTkcgPSA1O1xuZXhwb3J0cy5WRVJUSUNBTF9QQURESU5HID0gVkVSVElDQUxfUEFERElORztcbnZhciBQcmVzZW50YXRpb25Nb2RlU3RhdGUgPSB7XG4gIFVOS05PV046IDAsXG4gIE5PUk1BTDogMSxcbiAgQ0hBTkdJTkc6IDIsXG4gIEZVTExTQ1JFRU46IDNcbn07XG5leHBvcnRzLlByZXNlbnRhdGlvbk1vZGVTdGF0ZSA9IFByZXNlbnRhdGlvbk1vZGVTdGF0ZTtcbnZhciBSZW5kZXJlclR5cGUgPSB7XG4gIENBTlZBUzogXCJjYW52YXNcIixcbiAgU1ZHOiBcInN2Z1wiXG59O1xuZXhwb3J0cy5SZW5kZXJlclR5cGUgPSBSZW5kZXJlclR5cGU7XG52YXIgVGV4dExheWVyTW9kZSA9IHtcbiAgRElTQUJMRTogMCxcbiAgRU5BQkxFOiAxLFxuICBFTkFCTEVfRU5IQU5DRTogMlxufTtcbmV4cG9ydHMuVGV4dExheWVyTW9kZSA9IFRleHRMYXllck1vZGU7XG52YXIgU2Nyb2xsTW9kZSA9IHtcbiAgVU5LTk9XTjogLTEsXG4gIFZFUlRJQ0FMOiAwLFxuICBIT1JJWk9OVEFMOiAxLFxuICBXUkFQUEVEOiAyXG59O1xuZXhwb3J0cy5TY3JvbGxNb2RlID0gU2Nyb2xsTW9kZTtcbnZhciBTcHJlYWRNb2RlID0ge1xuICBVTktOT1dOOiAtMSxcbiAgTk9ORTogMCxcbiAgT0REOiAxLFxuICBFVkVOOiAyXG59O1xuZXhwb3J0cy5TcHJlYWRNb2RlID0gU3ByZWFkTW9kZTtcbnZhciBBdXRvUHJpbnRSZWdFeHAgPSAvXFxicHJpbnRcXHMqXFwoLztcbmV4cG9ydHMuQXV0b1ByaW50UmVnRXhwID0gQXV0b1ByaW50UmVnRXhwO1xuXG5mdW5jdGlvbiBmb3JtYXRMMTBuVmFsdWUodGV4dCwgYXJncykge1xuICBpZiAoIWFyZ3MpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xce1xce1xccyooXFx3KylcXHMqXFx9XFx9L2csIGZ1bmN0aW9uIChhbGwsIG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZSBpbiBhcmdzID8gYXJnc1tuYW1lXSA6IFwie3tcIiArIG5hbWUgKyBcIn19XCI7XG4gIH0pO1xufVxuXG52YXIgTnVsbEwxMG4gPSB7XG4gIGdldExhbmd1YWdlOiBmdW5jdGlvbiBnZXRMYW5ndWFnZSgpIHtcbiAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbXCJkZWZhdWx0XCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHtcbiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbXCJkZWZhdWx0XCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgXCJlbi11c1wiKTtcblxuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgX2NhbGxlZSk7XG4gICAgfSkpKCk7XG4gIH0sXG4gIGdldERpcmVjdGlvbjogZnVuY3Rpb24gZ2V0RGlyZWN0aW9uKCkge1xuICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcltcImRlZmF1bHRcIl0ubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHtcbiAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbXCJkZWZhdWx0XCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCBcImx0clwiKTtcblxuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIF9jYWxsZWUyKTtcbiAgICB9KSkoKTtcbiAgfSxcbiAgZ2V0OiBmdW5jdGlvbiBnZXQocHJvcGVydHksIGFyZ3MsIGZhbGxiYWNrKSB7XG4gICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yW1wiZGVmYXVsdFwiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKCkge1xuICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcltcImRlZmF1bHRcIl0ud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgc3dpdGNoIChfY29udGV4dDMucHJldiA9IF9jb250ZXh0My5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KFwicmV0dXJuXCIsIGZvcm1hdEwxMG5WYWx1ZShmYWxsYmFjaywgYXJncykpO1xuXG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgX2NhbGxlZTMpO1xuICAgIH0pKSgpO1xuICB9LFxuICB0cmFuc2xhdGU6IGZ1bmN0aW9uIHRyYW5zbGF0ZShlbGVtZW50KSB7XG4gICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yW1wiZGVmYXVsdFwiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KCkge1xuICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcltcImRlZmF1bHRcIl0ud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7XG4gICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgc3dpdGNoIChfY29udGV4dDQucHJldiA9IF9jb250ZXh0NC5uZXh0KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgX2NhbGxlZTQpO1xuICAgIH0pKSgpO1xuICB9XG59O1xuZXhwb3J0cy5OdWxsTDEwbiA9IE51bGxMMTBuO1xuXG5mdW5jdGlvbiBnZXRPdXRwdXRTY2FsZShjdHgpIHtcbiAgdmFyIGRldmljZVBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxO1xuICB2YXIgYmFja2luZ1N0b3JlUmF0aW8gPSBjdHgud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjdHgubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjdHgubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IGN0eC5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCBjdHguYmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fCAxO1xuICB2YXIgcGl4ZWxSYXRpbyA9IGRldmljZVBpeGVsUmF0aW8gLyBiYWNraW5nU3RvcmVSYXRpbztcbiAgcmV0dXJuIHtcbiAgICBzeDogcGl4ZWxSYXRpbyxcbiAgICBzeTogcGl4ZWxSYXRpbyxcbiAgICBzY2FsZWQ6IHBpeGVsUmF0aW8gIT09IDFcbiAgfTtcbn1cblxuZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcoZWxlbWVudCwgc3BvdCkge1xuICB2YXIgc2tpcE92ZXJmbG93SGlkZGVuRWxlbWVudHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICB2YXIgcGFyZW50ID0gZWxlbWVudC5vZmZzZXRQYXJlbnQ7XG5cbiAgaWYgKCFwYXJlbnQpIHtcbiAgICBjb25zb2xlLmVycm9yKFwib2Zmc2V0UGFyZW50IGlzIG5vdCBzZXQgLS0gY2Fubm90IHNjcm9sbFwiKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgb2Zmc2V0WSA9IGVsZW1lbnQub2Zmc2V0VG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIHZhciBvZmZzZXRYID0gZWxlbWVudC5vZmZzZXRMZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0O1xuXG4gIHdoaWxlIChwYXJlbnQuY2xpZW50SGVpZ2h0ID09PSBwYXJlbnQuc2Nyb2xsSGVpZ2h0ICYmIHBhcmVudC5jbGllbnRXaWR0aCA9PT0gcGFyZW50LnNjcm9sbFdpZHRoIHx8IHNraXBPdmVyZmxvd0hpZGRlbkVsZW1lbnRzICYmIGdldENvbXB1dGVkU3R5bGUocGFyZW50KS5vdmVyZmxvdyA9PT0gXCJoaWRkZW5cIikge1xuICAgIGlmIChwYXJlbnQuZGF0YXNldC5fc2NhbGVZKSB7XG4gICAgICBvZmZzZXRZIC89IHBhcmVudC5kYXRhc2V0Ll9zY2FsZVk7XG4gICAgICBvZmZzZXRYIC89IHBhcmVudC5kYXRhc2V0Ll9zY2FsZVg7XG4gICAgfVxuXG4gICAgb2Zmc2V0WSArPSBwYXJlbnQub2Zmc2V0VG9wO1xuICAgIG9mZnNldFggKz0gcGFyZW50Lm9mZnNldExlZnQ7XG4gICAgcGFyZW50ID0gcGFyZW50Lm9mZnNldFBhcmVudDtcblxuICAgIGlmICghcGFyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKHNwb3QpIHtcbiAgICBpZiAoc3BvdC50b3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb2Zmc2V0WSArPSBzcG90LnRvcDtcbiAgICB9XG5cbiAgICBpZiAoc3BvdC5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9mZnNldFggKz0gc3BvdC5sZWZ0O1xuICAgICAgcGFyZW50LnNjcm9sbExlZnQgPSBvZmZzZXRYO1xuICAgIH1cbiAgfVxuXG4gIHBhcmVudC5zY3JvbGxUb3AgPSBvZmZzZXRZO1xufVxuXG5mdW5jdGlvbiB3YXRjaFNjcm9sbCh2aWV3QXJlYUVsZW1lbnQsIGNhbGxiYWNrKSB7XG4gIHZhciBkZWJvdW5jZVNjcm9sbCA9IGZ1bmN0aW9uIGRlYm91bmNlU2Nyb2xsKGV2dCkge1xuICAgIGlmIChyQUYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByQUYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIHZpZXdBcmVhRWxlbWVudFNjcm9sbGVkKCkge1xuICAgICAgckFGID0gbnVsbDtcbiAgICAgIHZhciBjdXJyZW50WCA9IHZpZXdBcmVhRWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgdmFyIGxhc3RYID0gc3RhdGUubGFzdFg7XG5cbiAgICAgIGlmIChjdXJyZW50WCAhPT0gbGFzdFgpIHtcbiAgICAgICAgc3RhdGUucmlnaHQgPSBjdXJyZW50WCA+IGxhc3RYO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5sYXN0WCA9IGN1cnJlbnRYO1xuICAgICAgdmFyIGN1cnJlbnRZID0gdmlld0FyZWFFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgIHZhciBsYXN0WSA9IHN0YXRlLmxhc3RZO1xuXG4gICAgICBpZiAoY3VycmVudFkgIT09IGxhc3RZKSB7XG4gICAgICAgIHN0YXRlLmRvd24gPSBjdXJyZW50WSA+IGxhc3RZO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5sYXN0WSA9IGN1cnJlbnRZO1xuICAgICAgY2FsbGJhY2soc3RhdGUpO1xuICAgIH0pO1xuICB9O1xuXG4gIHZhciBzdGF0ZSA9IHtcbiAgICByaWdodDogdHJ1ZSxcbiAgICBkb3duOiB0cnVlLFxuICAgIGxhc3RYOiB2aWV3QXJlYUVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICBsYXN0WTogdmlld0FyZWFFbGVtZW50LnNjcm9sbFRvcCxcbiAgICBfZXZlbnRIYW5kbGVyOiBkZWJvdW5jZVNjcm9sbFxuICB9O1xuICB2YXIgckFGID0gbnVsbDtcbiAgdmlld0FyZWFFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgZGVib3VuY2VTY3JvbGwsIHRydWUpO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmcocXVlcnkpIHtcbiAgdmFyIHBhcnRzID0gcXVlcnkuc3BsaXQoXCImXCIpO1xuICB2YXIgcGFyYW1zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICBmb3IgKHZhciBpID0gMCwgaWkgPSBwYXJ0cy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgdmFyIHBhcmFtID0gcGFydHNbaV0uc3BsaXQoXCI9XCIpO1xuICAgIHZhciBrZXkgPSBwYXJhbVswXS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciB2YWx1ZSA9IHBhcmFtLmxlbmd0aCA+IDEgPyBwYXJhbVsxXSA6IG51bGw7XG4gICAgcGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudChrZXkpXSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gcGFyYW1zO1xufVxuXG5mdW5jdGlvbiBiaW5hcnlTZWFyY2hGaXJzdEl0ZW0oaXRlbXMsIGNvbmRpdGlvbikge1xuICB2YXIgbWluSW5kZXggPSAwO1xuICB2YXIgbWF4SW5kZXggPSBpdGVtcy5sZW5ndGggLSAxO1xuXG4gIGlmIChtYXhJbmRleCA8IDAgfHwgIWNvbmRpdGlvbihpdGVtc1ttYXhJbmRleF0pKSB7XG4gICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChjb25kaXRpb24oaXRlbXNbbWluSW5kZXhdKSkge1xuICAgIHJldHVybiBtaW5JbmRleDtcbiAgfVxuXG4gIHdoaWxlIChtaW5JbmRleCA8IG1heEluZGV4KSB7XG4gICAgdmFyIGN1cnJlbnRJbmRleCA9IG1pbkluZGV4ICsgbWF4SW5kZXggPj4gMTtcbiAgICB2YXIgY3VycmVudEl0ZW0gPSBpdGVtc1tjdXJyZW50SW5kZXhdO1xuXG4gICAgaWYgKGNvbmRpdGlvbihjdXJyZW50SXRlbSkpIHtcbiAgICAgIG1heEluZGV4ID0gY3VycmVudEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICBtaW5JbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1pbkluZGV4O1xufVxuXG5mdW5jdGlvbiBhcHByb3hpbWF0ZUZyYWN0aW9uKHgpIHtcbiAgaWYgKE1hdGguZmxvb3IoeCkgPT09IHgpIHtcbiAgICByZXR1cm4gW3gsIDFdO1xuICB9XG5cbiAgdmFyIHhpbnYgPSAxIC8geDtcbiAgdmFyIGxpbWl0ID0gODtcblxuICBpZiAoeGludiA+IGxpbWl0KSB7XG4gICAgcmV0dXJuIFsxLCBsaW1pdF07XG4gIH0gZWxzZSBpZiAoTWF0aC5mbG9vcih4aW52KSA9PT0geGludikge1xuICAgIHJldHVybiBbMSwgeGludl07XG4gIH1cblxuICB2YXIgeF8gPSB4ID4gMSA/IHhpbnYgOiB4O1xuICB2YXIgYSA9IDAsXG4gICAgICBiID0gMSxcbiAgICAgIGMgPSAxLFxuICAgICAgZCA9IDE7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgcCA9IGEgKyBjLFxuICAgICAgICBxID0gYiArIGQ7XG5cbiAgICBpZiAocSA+IGxpbWl0KSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoeF8gPD0gcCAvIHEpIHtcbiAgICAgIGMgPSBwO1xuICAgICAgZCA9IHE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBwO1xuICAgICAgYiA9IHE7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlc3VsdDtcblxuICBpZiAoeF8gLSBhIC8gYiA8IGMgLyBkIC0geF8pIHtcbiAgICByZXN1bHQgPSB4XyA9PT0geCA/IFthLCBiXSA6IFtiLCBhXTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB4XyA9PT0geCA/IFtjLCBkXSA6IFtkLCBjXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJvdW5kVG9EaXZpZGUoeCwgZGl2KSB7XG4gIHZhciByID0geCAlIGRpdjtcbiAgcmV0dXJuIHIgPT09IDAgPyB4IDogTWF0aC5yb3VuZCh4IC0gciArIGRpdik7XG59XG5cbmZ1bmN0aW9uIGdldFBhZ2VTaXplSW5jaGVzKF9yZWYpIHtcbiAgdmFyIHZpZXcgPSBfcmVmLnZpZXcsXG4gICAgICB1c2VyVW5pdCA9IF9yZWYudXNlclVuaXQsXG4gICAgICByb3RhdGUgPSBfcmVmLnJvdGF0ZTtcblxuICB2YXIgX3ZpZXcgPSBfc2xpY2VkVG9BcnJheSh2aWV3LCA0KSxcbiAgICAgIHgxID0gX3ZpZXdbMF0sXG4gICAgICB5MSA9IF92aWV3WzFdLFxuICAgICAgeDIgPSBfdmlld1syXSxcbiAgICAgIHkyID0gX3ZpZXdbM107XG5cbiAgdmFyIGNoYW5nZU9yaWVudGF0aW9uID0gcm90YXRlICUgMTgwICE9PSAwO1xuICB2YXIgd2lkdGggPSAoeDIgLSB4MSkgLyA3MiAqIHVzZXJVbml0O1xuICB2YXIgaGVpZ2h0ID0gKHkyIC0geTEpIC8gNzIgKiB1c2VyVW5pdDtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogY2hhbmdlT3JpZW50YXRpb24gPyBoZWlnaHQgOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGNoYW5nZU9yaWVudGF0aW9uID8gd2lkdGggOiBoZWlnaHRcbiAgfTtcbn1cblxuZnVuY3Rpb24gYmFja3RyYWNrQmVmb3JlQWxsVmlzaWJsZUVsZW1lbnRzKGluZGV4LCB2aWV3cywgdG9wKSB7XG4gIGlmIChpbmRleCA8IDIpIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICB2YXIgZWx0ID0gdmlld3NbaW5kZXhdLmRpdjtcbiAgdmFyIHBhZ2VUb3AgPSBlbHQub2Zmc2V0VG9wICsgZWx0LmNsaWVudFRvcDtcblxuICBpZiAocGFnZVRvcCA+PSB0b3ApIHtcbiAgICBlbHQgPSB2aWV3c1tpbmRleCAtIDFdLmRpdjtcbiAgICBwYWdlVG9wID0gZWx0Lm9mZnNldFRvcCArIGVsdC5jbGllbnRUb3A7XG4gIH1cblxuICBmb3IgKHZhciBpID0gaW5kZXggLSAyOyBpID49IDA7IC0taSkge1xuICAgIGVsdCA9IHZpZXdzW2ldLmRpdjtcblxuICAgIGlmIChlbHQub2Zmc2V0VG9wICsgZWx0LmNsaWVudFRvcCArIGVsdC5jbGllbnRIZWlnaHQgPD0gcGFnZVRvcCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaW5kZXggPSBpO1xuICB9XG5cbiAgcmV0dXJuIGluZGV4O1xufVxuXG5mdW5jdGlvbiBnZXRWaXNpYmxlRWxlbWVudHMoc2Nyb2xsRWwsIHZpZXdzKSB7XG4gIHZhciBzb3J0QnlWaXNpYmlsaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgdmFyIGhvcml6b250YWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuICB2YXIgdG9wID0gc2Nyb2xsRWwuc2Nyb2xsVG9wLFxuICAgICAgYm90dG9tID0gdG9wICsgc2Nyb2xsRWwuY2xpZW50SGVpZ2h0O1xuICB2YXIgbGVmdCA9IHNjcm9sbEVsLnNjcm9sbExlZnQsXG4gICAgICByaWdodCA9IGxlZnQgKyBzY3JvbGxFbC5jbGllbnRXaWR0aDtcblxuICBmdW5jdGlvbiBpc0VsZW1lbnRCb3R0b21BZnRlclZpZXdUb3Aodmlldykge1xuICAgIHZhciBlbGVtZW50ID0gdmlldy5kaXY7XG4gICAgdmFyIGVsZW1lbnRCb3R0b20gPSBlbGVtZW50Lm9mZnNldFRvcCArIGVsZW1lbnQuY2xpZW50VG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgcmV0dXJuIGVsZW1lbnRCb3R0b20gPiB0b3A7XG4gIH1cblxuICBmdW5jdGlvbiBpc0VsZW1lbnRSaWdodEFmdGVyVmlld0xlZnQodmlldykge1xuICAgIHZhciBlbGVtZW50ID0gdmlldy5kaXY7XG4gICAgdmFyIGVsZW1lbnRSaWdodCA9IGVsZW1lbnQub2Zmc2V0TGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdCArIGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgcmV0dXJuIGVsZW1lbnRSaWdodCA+IGxlZnQ7XG4gIH1cblxuICB2YXIgdmlzaWJsZSA9IFtdLFxuICAgICAgbnVtVmlld3MgPSB2aWV3cy5sZW5ndGg7XG4gIHZhciBmaXJzdFZpc2libGVFbGVtZW50SW5kID0gbnVtVmlld3MgPT09IDAgPyAwIDogYmluYXJ5U2VhcmNoRmlyc3RJdGVtKHZpZXdzLCBob3Jpem9udGFsID8gaXNFbGVtZW50UmlnaHRBZnRlclZpZXdMZWZ0IDogaXNFbGVtZW50Qm90dG9tQWZ0ZXJWaWV3VG9wKTtcblxuICBpZiAoZmlyc3RWaXNpYmxlRWxlbWVudEluZCA+IDAgJiYgZmlyc3RWaXNpYmxlRWxlbWVudEluZCA8IG51bVZpZXdzICYmICFob3Jpem9udGFsKSB7XG4gICAgZmlyc3RWaXNpYmxlRWxlbWVudEluZCA9IGJhY2t0cmFja0JlZm9yZUFsbFZpc2libGVFbGVtZW50cyhmaXJzdFZpc2libGVFbGVtZW50SW5kLCB2aWV3cywgdG9wKTtcbiAgfVxuXG4gIHZhciBsYXN0RWRnZSA9IGhvcml6b250YWwgPyByaWdodCA6IC0xO1xuXG4gIGZvciAodmFyIGkgPSBmaXJzdFZpc2libGVFbGVtZW50SW5kOyBpIDwgbnVtVmlld3M7IGkrKykge1xuICAgIHZhciB2aWV3ID0gdmlld3NbaV0sXG4gICAgICAgIGVsZW1lbnQgPSB2aWV3LmRpdjtcbiAgICB2YXIgY3VycmVudFdpZHRoID0gZWxlbWVudC5vZmZzZXRMZWZ0ICsgZWxlbWVudC5jbGllbnRMZWZ0O1xuICAgIHZhciBjdXJyZW50SGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRUb3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgICB2YXIgdmlld1dpZHRoID0gZWxlbWVudC5jbGllbnRXaWR0aCxcbiAgICAgICAgdmlld0hlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIHZhciB2aWV3UmlnaHQgPSBjdXJyZW50V2lkdGggKyB2aWV3V2lkdGg7XG4gICAgdmFyIHZpZXdCb3R0b20gPSBjdXJyZW50SGVpZ2h0ICsgdmlld0hlaWdodDtcblxuICAgIGlmIChsYXN0RWRnZSA9PT0gLTEpIHtcbiAgICAgIGlmICh2aWV3Qm90dG9tID49IGJvdHRvbSkge1xuICAgICAgICBsYXN0RWRnZSA9IHZpZXdCb3R0b207XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgoaG9yaXpvbnRhbCA/IGN1cnJlbnRXaWR0aCA6IGN1cnJlbnRIZWlnaHQpID4gbGFzdEVkZ2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmICh2aWV3Qm90dG9tIDw9IHRvcCB8fCBjdXJyZW50SGVpZ2h0ID49IGJvdHRvbSB8fCB2aWV3UmlnaHQgPD0gbGVmdCB8fCBjdXJyZW50V2lkdGggPj0gcmlnaHQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBoaWRkZW5IZWlnaHQgPSBNYXRoLm1heCgwLCB0b3AgLSBjdXJyZW50SGVpZ2h0KSArIE1hdGgubWF4KDAsIHZpZXdCb3R0b20gLSBib3R0b20pO1xuICAgIHZhciBoaWRkZW5XaWR0aCA9IE1hdGgubWF4KDAsIGxlZnQgLSBjdXJyZW50V2lkdGgpICsgTWF0aC5tYXgoMCwgdmlld1JpZ2h0IC0gcmlnaHQpO1xuICAgIHZhciBwZXJjZW50ID0gKHZpZXdIZWlnaHQgLSBoaWRkZW5IZWlnaHQpICogKHZpZXdXaWR0aCAtIGhpZGRlbldpZHRoKSAqIDEwMCAvIHZpZXdIZWlnaHQgLyB2aWV3V2lkdGggfCAwO1xuICAgIHZpc2libGUucHVzaCh7XG4gICAgICBpZDogdmlldy5pZCxcbiAgICAgIHg6IGN1cnJlbnRXaWR0aCxcbiAgICAgIHk6IGN1cnJlbnRIZWlnaHQsXG4gICAgICB2aWV3OiB2aWV3LFxuICAgICAgcGVyY2VudDogcGVyY2VudFxuICAgIH0pO1xuICB9XG5cbiAgdmFyIGZpcnN0ID0gdmlzaWJsZVswXSxcbiAgICAgIGxhc3QgPSB2aXNpYmxlW3Zpc2libGUubGVuZ3RoIC0gMV07XG5cbiAgaWYgKHNvcnRCeVZpc2liaWxpdHkpIHtcbiAgICB2aXNpYmxlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHZhciBwYyA9IGEucGVyY2VudCAtIGIucGVyY2VudDtcblxuICAgICAgaWYgKE1hdGguYWJzKHBjKSA+IDAuMDAxKSB7XG4gICAgICAgIHJldHVybiAtcGM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhLmlkIC0gYi5pZDtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZmlyc3Q6IGZpcnN0LFxuICAgIGxhc3Q6IGxhc3QsXG4gICAgdmlld3M6IHZpc2libGVcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9Db250ZXh0TWVudUhhbmRsZXIoZXZ0KSB7XG4gIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuXG5mdW5jdGlvbiBpc0RhdGFTY2hlbWEodXJsKSB7XG4gIHZhciBpID0gMDtcbiAgdmFyIGlpID0gdXJsLmxlbmd0aDtcblxuICB3aGlsZSAoaSA8IGlpICYmIHVybFtpXS50cmltKCkgPT09IFwiXCIpIHtcbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4gdXJsLnN1YnN0cmluZyhpLCBpICsgNSkudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhOlwiO1xufVxuXG5mdW5jdGlvbiBnZXRQREZGaWxlTmFtZUZyb21VUkwodXJsKSB7XG4gIHZhciBkZWZhdWx0RmlsZW5hbWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFwiZG9jdW1lbnQucGRmXCI7XG5cbiAgaWYgKHR5cGVvZiB1cmwgIT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gZGVmYXVsdEZpbGVuYW1lO1xuICB9XG5cbiAgaWYgKGlzRGF0YVNjaGVtYSh1cmwpKSB7XG4gICAgY29uc29sZS53YXJuKFwiZ2V0UERGRmlsZU5hbWVGcm9tVVJMOiBcIiArICdpZ25vcmluZyBcImRhdGE6XCIgVVJMIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLicpO1xuICAgIHJldHVybiBkZWZhdWx0RmlsZW5hbWU7XG4gIH1cblxuICB2YXIgcmVVUkkgPSAvXig/Oig/OlteOl0rOik/XFwvXFwvW15cXC9dKyk/KFtePyNdKikoXFw/W14jXSopPygjLiopPyQvO1xuICB2YXIgcmVGaWxlbmFtZSA9IC9bXlxcLz8jPV0rXFwucGRmXFxiKD8hLipcXC5wZGZcXGIpL2k7XG4gIHZhciBzcGxpdFVSSSA9IHJlVVJJLmV4ZWModXJsKTtcbiAgdmFyIHN1Z2dlc3RlZEZpbGVuYW1lID0gcmVGaWxlbmFtZS5leGVjKHNwbGl0VVJJWzFdKSB8fCByZUZpbGVuYW1lLmV4ZWMoc3BsaXRVUklbMl0pIHx8IHJlRmlsZW5hbWUuZXhlYyhzcGxpdFVSSVszXSk7XG5cbiAgaWYgKHN1Z2dlc3RlZEZpbGVuYW1lKSB7XG4gICAgc3VnZ2VzdGVkRmlsZW5hbWUgPSBzdWdnZXN0ZWRGaWxlbmFtZVswXTtcblxuICAgIGlmIChzdWdnZXN0ZWRGaWxlbmFtZS5pbmNsdWRlcyhcIiVcIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN1Z2dlc3RlZEZpbGVuYW1lID0gcmVGaWxlbmFtZS5leGVjKGRlY29kZVVSSUNvbXBvbmVudChzdWdnZXN0ZWRGaWxlbmFtZSkpWzBdO1xuICAgICAgfSBjYXRjaCAoZXgpIHt9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1Z2dlc3RlZEZpbGVuYW1lIHx8IGRlZmF1bHRGaWxlbmFtZTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplV2hlZWxFdmVudERpcmVjdGlvbihldnQpIHtcbiAgdmFyIGRlbHRhID0gTWF0aC5zcXJ0KGV2dC5kZWx0YVggKiBldnQuZGVsdGFYICsgZXZ0LmRlbHRhWSAqIGV2dC5kZWx0YVkpO1xuICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKGV2dC5kZWx0YVksIGV2dC5kZWx0YVgpO1xuXG4gIGlmICgtMC4yNSAqIE1hdGguUEkgPCBhbmdsZSAmJiBhbmdsZSA8IDAuNzUgKiBNYXRoLlBJKSB7XG4gICAgZGVsdGEgPSAtZGVsdGE7XG4gIH1cblxuICByZXR1cm4gZGVsdGE7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVdoZWVsRXZlbnREZWx0YShldnQpIHtcbiAgdmFyIGRlbHRhID0gbm9ybWFsaXplV2hlZWxFdmVudERpcmVjdGlvbihldnQpO1xuICB2YXIgTU9VU0VfRE9NX0RFTFRBX1BJWEVMX01PREUgPSAwO1xuICB2YXIgTU9VU0VfRE9NX0RFTFRBX0xJTkVfTU9ERSA9IDE7XG4gIHZhciBNT1VTRV9QSVhFTFNfUEVSX0xJTkUgPSAzMDtcbiAgdmFyIE1PVVNFX0xJTkVTX1BFUl9QQUdFID0gMzA7XG5cbiAgaWYgKGV2dC5kZWx0YU1vZGUgPT09IE1PVVNFX0RPTV9ERUxUQV9QSVhFTF9NT0RFKSB7XG4gICAgZGVsdGEgLz0gTU9VU0VfUElYRUxTX1BFUl9MSU5FICogTU9VU0VfTElORVNfUEVSX1BBR0U7XG4gIH0gZWxzZSBpZiAoZXZ0LmRlbHRhTW9kZSA9PT0gTU9VU0VfRE9NX0RFTFRBX0xJTkVfTU9ERSkge1xuICAgIGRlbHRhIC89IE1PVVNFX0xJTkVTX1BFUl9QQUdFO1xuICB9XG5cbiAgcmV0dXJuIGRlbHRhO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkUm90YXRpb24oYW5nbGUpIHtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoYW5nbGUpICYmIGFuZ2xlICUgOTAgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRTY3JvbGxNb2RlKG1vZGUpIHtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobW9kZSkgJiYgT2JqZWN0LnZhbHVlcyhTY3JvbGxNb2RlKS5pbmNsdWRlcyhtb2RlKSAmJiBtb2RlICE9PSBTY3JvbGxNb2RlLlVOS05PV047XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRTcHJlYWRNb2RlKG1vZGUpIHtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobW9kZSkgJiYgT2JqZWN0LnZhbHVlcyhTcHJlYWRNb2RlKS5pbmNsdWRlcyhtb2RlKSAmJiBtb2RlICE9PSBTcHJlYWRNb2RlLlVOS05PV047XG59XG5cbmZ1bmN0aW9uIGlzUG9ydHJhaXRPcmllbnRhdGlvbihzaXplKSB7XG4gIHJldHVybiBzaXplLndpZHRoIDw9IHNpemUuaGVpZ2h0O1xufVxuXG52YXIgV2FpdE9uVHlwZSA9IHtcbiAgRVZFTlQ6IFwiZXZlbnRcIixcbiAgVElNRU9VVDogXCJ0aW1lb3V0XCJcbn07XG5leHBvcnRzLldhaXRPblR5cGUgPSBXYWl0T25UeXBlO1xuXG5mdW5jdGlvbiB3YWl0T25FdmVudE9yVGltZW91dChfcmVmMikge1xuICB2YXIgdGFyZ2V0ID0gX3JlZjIudGFyZ2V0LFxuICAgICAgbmFtZSA9IF9yZWYyLm5hbWUsXG4gICAgICBfcmVmMiRkZWxheSA9IF9yZWYyLmRlbGF5LFxuICAgICAgZGVsYXkgPSBfcmVmMiRkZWxheSA9PT0gdm9pZCAwID8gMCA6IF9yZWYyJGRlbGF5O1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGlmIChfdHlwZW9mKHRhcmdldCkgIT09IFwib2JqZWN0XCIgfHwgIShuYW1lICYmIHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB8fCAhKE51bWJlci5pc0ludGVnZXIoZGVsYXkpICYmIGRlbGF5ID49IDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ3YWl0T25FdmVudE9yVGltZW91dCAtIGludmFsaWQgcGFyYW1ldGVycy5cIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlcih0eXBlKSB7XG4gICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRXZlbnRCdXMpIHtcbiAgICAgICAgdGFyZ2V0Ll9vZmYobmFtZSwgZXZlbnRIYW5kbGVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZSh0eXBlKTtcbiAgICB9XG5cbiAgICB2YXIgZXZlbnRIYW5kbGVyID0gaGFuZGxlci5iaW5kKG51bGwsIFdhaXRPblR5cGUuRVZFTlQpO1xuXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEV2ZW50QnVzKSB7XG4gICAgICB0YXJnZXQuX29uKG5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGV2ZW50SGFuZGxlcik7XG4gICAgfVxuXG4gICAgdmFyIHRpbWVvdXRIYW5kbGVyID0gaGFuZGxlci5iaW5kKG51bGwsIFdhaXRPblR5cGUuVElNRU9VVCk7XG4gICAgdmFyIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHRpbWVvdXRIYW5kbGVyLCBkZWxheSk7XG4gIH0pO1xufVxuXG52YXIgYW5pbWF0aW9uU3RhcnRlZCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSk7XG59KTtcbmV4cG9ydHMuYW5pbWF0aW9uU3RhcnRlZCA9IGFuaW1hdGlvblN0YXJ0ZWQ7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRE9NRXZlbnQoZXZlbnROYW1lKSB7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsO1xuICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWQ6IGRpc3BhdGNoRE9NRXZlbnRcIik7XG59XG5cbnZhciBFdmVudEJ1cyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEV2ZW50QnVzKG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRCdXMpO1xuXG4gICAgdGhpcy5fbGlzdGVuZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhFdmVudEJ1cywgW3tcbiAgICBrZXk6IFwib25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gb24oZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgICAgdGhpcy5fb24oZXZlbnROYW1lLCBsaXN0ZW5lciwge1xuICAgICAgICBleHRlcm5hbDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm9mZlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvZmYoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgICAgdGhpcy5fb2ZmKGV2ZW50TmFtZSwgbGlzdGVuZXIsIHtcbiAgICAgICAgZXh0ZXJuYWw6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkaXNwYXRjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNwYXRjaChldmVudE5hbWUpIHtcbiAgICAgIHZhciBldmVudExpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldmVudE5hbWVdO1xuXG4gICAgICBpZiAoIWV2ZW50TGlzdGVuZXJzIHx8IGV2ZW50TGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgIHZhciBleHRlcm5hbExpc3RlbmVycztcbiAgICAgIGV2ZW50TGlzdGVuZXJzLnNsaWNlKDApLmZvckVhY2goZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IF9yZWYzLmxpc3RlbmVyLFxuICAgICAgICAgICAgZXh0ZXJuYWwgPSBfcmVmMy5leHRlcm5hbDtcblxuICAgICAgICBpZiAoZXh0ZXJuYWwpIHtcbiAgICAgICAgICBpZiAoIWV4dGVybmFsTGlzdGVuZXJzKSB7XG4gICAgICAgICAgICBleHRlcm5hbExpc3RlbmVycyA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGV4dGVybmFsTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3RlbmVyLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChleHRlcm5hbExpc3RlbmVycykge1xuICAgICAgICBleHRlcm5hbExpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgIGxpc3RlbmVyLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgICAgZXh0ZXJuYWxMaXN0ZW5lcnMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX29uKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuICAgICAgdmFyIGV2ZW50TGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzW2V2ZW50TmFtZV07XG5cbiAgICAgIGlmICghZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBldmVudExpc3RlbmVycyA9IFtdO1xuICAgICAgfVxuXG4gICAgICBldmVudExpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgbGlzdGVuZXI6IGxpc3RlbmVyLFxuICAgICAgICBleHRlcm5hbDogKG9wdGlvbnMgJiYgb3B0aW9ucy5leHRlcm5hbCkgPT09IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfb2ZmXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vZmYoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICB2YXIgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnROYW1lXTtcblxuICAgICAgaWYgKCFldmVudExpc3RlbmVycykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IGV2ZW50TGlzdGVuZXJzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzW2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgIGV2ZW50TGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRXZlbnRCdXM7XG59KCk7XG5cbmV4cG9ydHMuRXZlbnRCdXMgPSBFdmVudEJ1cztcblxuZnVuY3Rpb24gY2xhbXAodiwgbWluLCBtYXgpIHtcbiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHYsIG1pbiksIG1heCk7XG59XG5cbnZhciBQcm9ncmVzc0JhciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFByb2dyZXNzQmFyKGlkKSB7XG4gICAgdmFyIF9yZWY0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgICAgaGVpZ2h0ID0gX3JlZjQuaGVpZ2h0LFxuICAgICAgICB3aWR0aCA9IF9yZWY0LndpZHRoLFxuICAgICAgICB1bml0cyA9IF9yZWY0LnVuaXRzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFByb2dyZXNzQmFyKTtcblxuICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy5kaXYgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlkICsgXCIgLnByb2dyZXNzXCIpO1xuICAgIHRoaXMuYmFyID0gdGhpcy5kaXYucGFyZW50Tm9kZTtcbiAgICB0aGlzLmhlaWdodCA9IGhlaWdodCB8fCAxMDA7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoIHx8IDEwMDtcbiAgICB0aGlzLnVuaXRzID0gdW5pdHMgfHwgXCIlXCI7XG4gICAgdGhpcy5kaXYuc3R5bGUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQgKyB0aGlzLnVuaXRzO1xuICAgIHRoaXMucGVyY2VudCA9IDA7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUHJvZ3Jlc3NCYXIsIFt7XG4gICAga2V5OiBcIl91cGRhdGVCYXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZUJhcigpIHtcbiAgICAgIGlmICh0aGlzLl9pbmRldGVybWluYXRlKSB7XG4gICAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJpbmRldGVybWluYXRlXCIpO1xuICAgICAgICB0aGlzLmRpdi5zdHlsZS53aWR0aCA9IHRoaXMud2lkdGggKyB0aGlzLnVuaXRzO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5yZW1vdmUoXCJpbmRldGVybWluYXRlXCIpO1xuICAgICAgdmFyIHByb2dyZXNzU2l6ZSA9IHRoaXMud2lkdGggKiB0aGlzLl9wZXJjZW50IC8gMTAwO1xuICAgICAgdGhpcy5kaXYuc3R5bGUud2lkdGggPSBwcm9ncmVzc1NpemUgKyB0aGlzLnVuaXRzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRXaWR0aFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRXaWR0aCh2aWV3ZXIpIHtcbiAgICAgIGlmICghdmlld2VyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRhaW5lciA9IHZpZXdlci5wYXJlbnROb2RlO1xuICAgICAgdmFyIHNjcm9sbGJhcldpZHRoID0gY29udGFpbmVyLm9mZnNldFdpZHRoIC0gdmlld2VyLm9mZnNldFdpZHRoO1xuXG4gICAgICBpZiAoc2Nyb2xsYmFyV2lkdGggPiAwKSB7XG4gICAgICAgIHRoaXMuYmFyLnN0eWxlLndpZHRoID0gXCJjYWxjKDEwMCUgLSBcIi5jb25jYXQoc2Nyb2xsYmFyV2lkdGgsIFwicHgpXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoaWRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgICBpZiAoIXRoaXMudmlzaWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgdGhpcy5iYXIuY2xhc3NMaXN0LmFkZChcImhpZGRlblwiKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShcImxvYWRpbmdJblByb2dyZXNzXCIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzaG93XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgICBpZiAodGhpcy52aXNpYmxlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChcImxvYWRpbmdJblByb2dyZXNzXCIpO1xuICAgICAgdGhpcy5iYXIuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGVyY2VudFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BlcmNlbnQ7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWwpIHtcbiAgICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSBpc05hTih2YWwpO1xuICAgICAgdGhpcy5fcGVyY2VudCA9IGNsYW1wKHZhbCwgMCwgMTAwKTtcblxuICAgICAgdGhpcy5fdXBkYXRlQmFyKCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFByb2dyZXNzQmFyO1xufSgpO1xuXG5leHBvcnRzLlByb2dyZXNzQmFyID0gUHJvZ3Jlc3NCYXI7XG5cbmZ1bmN0aW9uIG1vdmVUb0VuZE9mQXJyYXkoYXJyLCBjb25kaXRpb24pIHtcbiAgdmFyIG1vdmVkID0gW10sXG4gICAgICBsZW4gPSBhcnIubGVuZ3RoO1xuICB2YXIgd3JpdGUgPSAwO1xuXG4gIGZvciAodmFyIHJlYWQgPSAwOyByZWFkIDwgbGVuOyArK3JlYWQpIHtcbiAgICBpZiAoY29uZGl0aW9uKGFycltyZWFkXSkpIHtcbiAgICAgIG1vdmVkLnB1c2goYXJyW3JlYWRdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJyW3dyaXRlXSA9IGFycltyZWFkXTtcbiAgICAgICsrd3JpdGU7XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX3JlYWQgPSAwOyB3cml0ZSA8IGxlbjsgKytfcmVhZCwgKyt3cml0ZSkge1xuICAgIGFyclt3cml0ZV0gPSBtb3ZlZFtfcmVhZF07XG4gIH1cbn1cblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gX193X3BkZmpzX3JlcXVpcmVfXyg1KTtcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbnZhciBydW50aW1lID0gZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkO1xuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBvYmpba2V5XTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgZGVmaW5lKHt9LCBcIlwiKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG5cbiAgZXhwb3J0cy53cmFwID0gd3JhcDtcblxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJub3JtYWxcIixcbiAgICAgICAgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwidGhyb3dcIixcbiAgICAgICAgYXJnOiBlcnJcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG5cbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJiBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9IEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpO1xuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uIChnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3IgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fCAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCIgOiBmYWxzZTtcbiAgfTtcblxuICBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbiAoZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKTtcbiAgICB9XG5cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24gKGFyZykge1xuICAgIHJldHVybiB7XG4gICAgICBfX2F3YWl0OiBhcmdcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yLCBQcm9taXNlSW1wbCkge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcblxuICAgICAgICBpZiAodmFsdWUgJiYgX3R5cGVvZih2YWx1ZSkgPT09IFwib2JqZWN0XCIgJiYgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uICh1bndyYXBwZWQpIHtcbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9IHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuXG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uIChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICBpZiAoUHJvbWlzZUltcGwgPT09IHZvaWQgMCkgUHJvbWlzZUltcGwgPSBQcm9taXNlO1xuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3Iod3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksIFByb21pc2VJbXBsKTtcbiAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pID8gaXRlciA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcblxuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZSA/IEdlblN0YXRlQ29tcGxldGVkIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcblxuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSkge1xuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCFpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuICBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKTtcblxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7XG4gICAgICB0cnlMb2M6IGxvY3NbMF1cbiAgICB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbe1xuICAgICAgdHJ5TG9jOiBcInJvb3RcIlxuICAgIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG5cbiAgICBrZXlzLnJldmVyc2UoKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcblxuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG5cbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsXG4gICAgICAgICAgICBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmV4dDogZG9uZVJlc3VsdFxuICAgIH07XG4gIH1cblxuICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgZG9uZTogdHJ1ZVxuICAgIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcbiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJiBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJiAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcblxuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uIGRpc3BhdGNoRXhjZXB0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcblxuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISFjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGFicnVwdDogZnVuY3Rpb24gYWJydXB0KHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiYgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJiB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiYgKHR5cGUgPT09IFwiYnJlYWtcIiB8fCB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uIGNvbXBsZXRlKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8IHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuXG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24gX2NhdGNoKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uIGRlbGVnYXRlWWllbGQoaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG4gIHJldHVybiBleHBvcnRzO1xufSgoIGZhbHNlID8gdW5kZWZpbmVkIDogX3R5cGVvZihtb2R1bGUpKSA9PT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzIDoge30pO1xuXG50cnkge1xuICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xufSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHtcbiAgRnVuY3Rpb24oXCJyXCIsIFwicmVnZW5lcmF0b3JSdW50aW1lID0gclwiKShydW50aW1lKTtcbn1cbi8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbCh0aGlzLCBfX3dfcGRmanNfcmVxdWlyZV9fKDYpKG1vZHVsZSkpKVxuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobW9kdWxlKSB7XG4gIGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuICAgIG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIG1vZHVsZS5wYXRocyA9IFtdO1xuICAgIGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBtb2R1bGUubDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIG1vZHVsZS5pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuICB9XG5cbiAgcmV0dXJuIG1vZHVsZTtcbn07XG5cbi8qKiovIH0pLFxuLyogNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5TaW1wbGVMaW5rU2VydmljZSA9IGV4cG9ydHMuUERGTGlua1NlcnZpY2UgPSB2b2lkIDA7XG5cbnZhciBfdWlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxudmFyIFBERkxpbmtTZXJ2aWNlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUERGTGlua1NlcnZpY2UoKSB7XG4gICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgICBldmVudEJ1cyA9IF9yZWYuZXZlbnRCdXMsXG4gICAgICAgIF9yZWYkZXh0ZXJuYWxMaW5rVGFyZyA9IF9yZWYuZXh0ZXJuYWxMaW5rVGFyZ2V0LFxuICAgICAgICBleHRlcm5hbExpbmtUYXJnZXQgPSBfcmVmJGV4dGVybmFsTGlua1RhcmcgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJGV4dGVybmFsTGlua1RhcmcsXG4gICAgICAgIF9yZWYkZXh0ZXJuYWxMaW5rUmVsID0gX3JlZi5leHRlcm5hbExpbmtSZWwsXG4gICAgICAgIGV4dGVybmFsTGlua1JlbCA9IF9yZWYkZXh0ZXJuYWxMaW5rUmVsID09PSB2b2lkIDAgPyBudWxsIDogX3JlZiRleHRlcm5hbExpbmtSZWwsXG4gICAgICAgIF9yZWYkZXh0ZXJuYWxMaW5rRW5hYiA9IF9yZWYuZXh0ZXJuYWxMaW5rRW5hYmxlZCxcbiAgICAgICAgZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IF9yZWYkZXh0ZXJuYWxMaW5rRW5hYiA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9yZWYkZXh0ZXJuYWxMaW5rRW5hYixcbiAgICAgICAgX3JlZiRpZ25vcmVEZXN0aW5hdGlvID0gX3JlZi5pZ25vcmVEZXN0aW5hdGlvblpvb20sXG4gICAgICAgIGlnbm9yZURlc3RpbmF0aW9uWm9vbSA9IF9yZWYkaWdub3JlRGVzdGluYXRpbyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmJGlnbm9yZURlc3RpbmF0aW87XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGTGlua1NlcnZpY2UpO1xuXG4gICAgdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzO1xuICAgIHRoaXMuZXh0ZXJuYWxMaW5rVGFyZ2V0ID0gZXh0ZXJuYWxMaW5rVGFyZ2V0O1xuICAgIHRoaXMuZXh0ZXJuYWxMaW5rUmVsID0gZXh0ZXJuYWxMaW5rUmVsO1xuICAgIHRoaXMuZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IGV4dGVybmFsTGlua0VuYWJsZWQ7XG4gICAgdGhpcy5faWdub3JlRGVzdGluYXRpb25ab29tID0gaWdub3JlRGVzdGluYXRpb25ab29tO1xuICAgIHRoaXMuYmFzZVVybCA9IG51bGw7XG4gICAgdGhpcy5wZGZEb2N1bWVudCA9IG51bGw7XG4gICAgdGhpcy5wZGZWaWV3ZXIgPSBudWxsO1xuICAgIHRoaXMucGRmSGlzdG9yeSA9IG51bGw7XG4gICAgdGhpcy5fcGFnZXNSZWZDYWNoZSA9IG51bGw7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUERGTGlua1NlcnZpY2UsIFt7XG4gICAga2V5OiBcInNldERvY3VtZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldERvY3VtZW50KHBkZkRvY3VtZW50KSB7XG4gICAgICB2YXIgYmFzZVVybCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcbiAgICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmw7XG4gICAgICB0aGlzLnBkZkRvY3VtZW50ID0gcGRmRG9jdW1lbnQ7XG4gICAgICB0aGlzLl9wYWdlc1JlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Vmlld2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZpZXdlcihwZGZWaWV3ZXIpIHtcbiAgICAgIHRoaXMucGRmVmlld2VyID0gcGRmVmlld2VyO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZXRIaXN0b3J5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEhpc3RvcnkocGRmSGlzdG9yeSkge1xuICAgICAgdGhpcy5wZGZIaXN0b3J5ID0gcGRmSGlzdG9yeTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibmF2aWdhdGVUb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBuYXZpZ2F0ZVRvKGRlc3QpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBnb1RvRGVzdGluYXRpb24gPSBmdW5jdGlvbiBnb1RvRGVzdGluYXRpb24oX3JlZjIpIHtcbiAgICAgICAgdmFyIG5hbWVkRGVzdCA9IF9yZWYyLm5hbWVkRGVzdCxcbiAgICAgICAgICAgIGV4cGxpY2l0RGVzdCA9IF9yZWYyLmV4cGxpY2l0RGVzdDtcbiAgICAgICAgdmFyIGRlc3RSZWYgPSBleHBsaWNpdERlc3RbMF07XG4gICAgICAgIHZhciBwYWdlTnVtYmVyO1xuXG4gICAgICAgIGlmIChkZXN0UmVmIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgICAgcGFnZU51bWJlciA9IF90aGlzLl9jYWNoZWRQYWdlTnVtYmVyKGRlc3RSZWYpO1xuXG4gICAgICAgICAgaWYgKHBhZ2VOdW1iZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIF90aGlzLnBkZkRvY3VtZW50LmdldFBhZ2VJbmRleChkZXN0UmVmKS50aGVuKGZ1bmN0aW9uIChwYWdlSW5kZXgpIHtcbiAgICAgICAgICAgICAgX3RoaXMuY2FjaGVQYWdlUmVmKHBhZ2VJbmRleCArIDEsIGRlc3RSZWYpO1xuXG4gICAgICAgICAgICAgIGdvVG9EZXN0aW5hdGlvbih7XG4gICAgICAgICAgICAgICAgbmFtZWREZXN0OiBuYW1lZERlc3QsXG4gICAgICAgICAgICAgICAgZXhwbGljaXREZXN0OiBleHBsaWNpdERlc3RcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVtcImNhdGNoXCJdKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlBERkxpbmtTZXJ2aWNlLm5hdmlnYXRlVG86IFxcXCJcIi5jb25jYXQoZGVzdFJlZiwgXCJcXFwiIGlzIG5vdCBcIikgKyBcImEgdmFsaWQgcGFnZSByZWZlcmVuY2UsIGZvciBkZXN0PVxcXCJcIi5jb25jYXQoZGVzdCwgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGRlc3RSZWYpKSB7XG4gICAgICAgICAgcGFnZU51bWJlciA9IGRlc3RSZWYgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJQREZMaW5rU2VydmljZS5uYXZpZ2F0ZVRvOiBcXFwiXCIuY29uY2F0KGRlc3RSZWYsIFwiXFxcIiBpcyBub3QgXCIpICsgXCJhIHZhbGlkIGRlc3RpbmF0aW9uIHJlZmVyZW5jZSwgZm9yIGRlc3Q9XFxcIlwiLmNvbmNhdChkZXN0LCBcIlxcXCIuXCIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhZ2VOdW1iZXIgfHwgcGFnZU51bWJlciA8IDEgfHwgcGFnZU51bWJlciA+IF90aGlzLnBhZ2VzQ291bnQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUERGTGlua1NlcnZpY2UubmF2aWdhdGVUbzogXFxcIlwiLmNvbmNhdChwYWdlTnVtYmVyLCBcIlxcXCIgaXMgbm90IFwiKSArIFwiYSB2YWxpZCBwYWdlIG51bWJlciwgZm9yIGRlc3Q9XFxcIlwiLmNvbmNhdChkZXN0LCBcIlxcXCIuXCIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3RoaXMucGRmSGlzdG9yeSkge1xuICAgICAgICAgIF90aGlzLnBkZkhpc3RvcnkucHVzaEN1cnJlbnRQb3NpdGlvbigpO1xuXG4gICAgICAgICAgX3RoaXMucGRmSGlzdG9yeS5wdXNoKHtcbiAgICAgICAgICAgIG5hbWVkRGVzdDogbmFtZWREZXN0LFxuICAgICAgICAgICAgZXhwbGljaXREZXN0OiBleHBsaWNpdERlc3QsXG4gICAgICAgICAgICBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5wZGZWaWV3ZXIuc2Nyb2xsUGFnZUludG9WaWV3KHtcbiAgICAgICAgICBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyLFxuICAgICAgICAgIGRlc3RBcnJheTogZXhwbGljaXREZXN0LFxuICAgICAgICAgIGlnbm9yZURlc3RpbmF0aW9uWm9vbTogX3RoaXMuX2lnbm9yZURlc3RpbmF0aW9uWm9vbVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkZXN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgX3RoaXMucGRmRG9jdW1lbnQuZ2V0RGVzdGluYXRpb24oZGVzdCkudGhlbihmdW5jdGlvbiAoZGVzdEFycmF5KSB7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgbmFtZWREZXN0OiBkZXN0LFxuICAgICAgICAgICAgICBleHBsaWNpdERlc3Q6IGRlc3RBcnJheVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICBuYW1lZERlc3Q6IFwiXCIsXG4gICAgICAgICAgZXhwbGljaXREZXN0OiBkZXN0XG4gICAgICAgIH0pO1xuICAgICAgfSkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YS5leHBsaWNpdERlc3QpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIlBERkxpbmtTZXJ2aWNlLm5hdmlnYXRlVG86IFxcXCJcIi5jb25jYXQoZGF0YS5leHBsaWNpdERlc3QsIFwiXFxcIiBpc1wiKSArIFwiIG5vdCBhIHZhbGlkIGRlc3RpbmF0aW9uIGFycmF5LCBmb3IgZGVzdD1cXFwiXCIuY29uY2F0KGRlc3QsIFwiXFxcIi5cIikpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGdvVG9EZXN0aW5hdGlvbihkYXRhKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXREZXN0aW5hdGlvbkhhc2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RGVzdGluYXRpb25IYXNoKGRlc3QpIHtcbiAgICAgIGlmICh0eXBlb2YgZGVzdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBbmNob3JVcmwoXCIjXCIgKyBlc2NhcGUoZGVzdCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkZXN0KSkge1xuICAgICAgICB2YXIgc3RyID0gSlNPTi5zdHJpbmdpZnkoZGVzdCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFuY2hvclVybChcIiNcIiArIGVzY2FwZShzdHIpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuZ2V0QW5jaG9yVXJsKFwiXCIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRBbmNob3JVcmxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QW5jaG9yVXJsKGFuY2hvcikge1xuICAgICAgcmV0dXJuICh0aGlzLmJhc2VVcmwgfHwgXCJcIikgKyBhbmNob3I7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldEhhc2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0SGFzaChoYXNoKSB7XG4gICAgICB2YXIgcGFnZU51bWJlciwgZGVzdDtcblxuICAgICAgaWYgKGhhc2guaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSAoMCwgX3VpX3V0aWxzLnBhcnNlUXVlcnlTdHJpbmcpKGhhc2gpO1xuXG4gICAgICAgIGlmIChcInNlYXJjaFwiIGluIHBhcmFtcykge1xuICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJmaW5kZnJvbXVybGhhc2hcIiwge1xuICAgICAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICAgICAgcXVlcnk6IHBhcmFtcy5zZWFyY2gucmVwbGFjZSgvXCIvZywgXCJcIiksXG4gICAgICAgICAgICBwaHJhc2VTZWFyY2g6IHBhcmFtcy5waHJhc2UgPT09IFwidHJ1ZVwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXCJwYWdlXCIgaW4gcGFyYW1zKSB7XG4gICAgICAgICAgcGFnZU51bWJlciA9IHBhcmFtcy5wYWdlIHwgMCB8fCAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFwiem9vbVwiIGluIHBhcmFtcykge1xuICAgICAgICAgIHZhciB6b29tQXJncyA9IHBhcmFtcy56b29tLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICB2YXIgem9vbUFyZyA9IHpvb21BcmdzWzBdO1xuICAgICAgICAgIHZhciB6b29tQXJnTnVtYmVyID0gcGFyc2VGbG9hdCh6b29tQXJnKTtcblxuICAgICAgICAgIGlmICghem9vbUFyZy5pbmNsdWRlcyhcIkZpdFwiKSkge1xuICAgICAgICAgICAgZGVzdCA9IFtudWxsLCB7XG4gICAgICAgICAgICAgIG5hbWU6IFwiWFlaXCJcbiAgICAgICAgICAgIH0sIHpvb21BcmdzLmxlbmd0aCA+IDEgPyB6b29tQXJnc1sxXSB8IDAgOiBudWxsLCB6b29tQXJncy5sZW5ndGggPiAyID8gem9vbUFyZ3NbMl0gfCAwIDogbnVsbCwgem9vbUFyZ051bWJlciA/IHpvb21BcmdOdW1iZXIgLyAxMDAgOiB6b29tQXJnXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHpvb21BcmcgPT09IFwiRml0XCIgfHwgem9vbUFyZyA9PT0gXCJGaXRCXCIpIHtcbiAgICAgICAgICAgICAgZGVzdCA9IFtudWxsLCB7XG4gICAgICAgICAgICAgICAgbmFtZTogem9vbUFyZ1xuICAgICAgICAgICAgICB9XTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoem9vbUFyZyA9PT0gXCJGaXRIXCIgfHwgem9vbUFyZyA9PT0gXCJGaXRCSFwiIHx8IHpvb21BcmcgPT09IFwiRml0VlwiIHx8IHpvb21BcmcgPT09IFwiRml0QlZcIikge1xuICAgICAgICAgICAgICBkZXN0ID0gW251bGwsIHtcbiAgICAgICAgICAgICAgICBuYW1lOiB6b29tQXJnXG4gICAgICAgICAgICAgIH0sIHpvb21BcmdzLmxlbmd0aCA+IDEgPyB6b29tQXJnc1sxXSB8IDAgOiBudWxsXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoem9vbUFyZyA9PT0gXCJGaXRSXCIpIHtcbiAgICAgICAgICAgICAgaWYgKHpvb21BcmdzLmxlbmd0aCAhPT0gNSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1BERkxpbmtTZXJ2aWNlLnNldEhhc2g6IE5vdCBlbm91Z2ggcGFyYW1ldGVycyBmb3IgXCJGaXRSXCIuJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVzdCA9IFtudWxsLCB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiB6b29tQXJnXG4gICAgICAgICAgICAgICAgfSwgem9vbUFyZ3NbMV0gfCAwLCB6b29tQXJnc1syXSB8IDAsIHpvb21BcmdzWzNdIHwgMCwgem9vbUFyZ3NbNF0gfCAwXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlBERkxpbmtTZXJ2aWNlLnNldEhhc2g6IFxcXCJcIi5jb25jYXQoem9vbUFyZywgXCJcXFwiIGlzIG5vdCBcIikgKyBcImEgdmFsaWQgem9vbSB2YWx1ZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlc3QpIHtcbiAgICAgICAgICB0aGlzLnBkZlZpZXdlci5zY3JvbGxQYWdlSW50b1ZpZXcoe1xuICAgICAgICAgICAgcGFnZU51bWJlcjogcGFnZU51bWJlciB8fCB0aGlzLnBhZ2UsXG4gICAgICAgICAgICBkZXN0QXJyYXk6IGRlc3QsXG4gICAgICAgICAgICBhbGxvd05lZ2F0aXZlT2Zmc2V0OiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFnZU51bWJlcikge1xuICAgICAgICAgIHRoaXMucGFnZSA9IHBhZ2VOdW1iZXI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXCJwYWdlbW9kZVwiIGluIHBhcmFtcykge1xuICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJwYWdlbW9kZVwiLCB7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICBtb2RlOiBwYXJhbXMucGFnZW1vZGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcIm5hbWVkZGVzdFwiIGluIHBhcmFtcykge1xuICAgICAgICAgIHRoaXMubmF2aWdhdGVUbyhwYXJhbXMubmFtZWRkZXN0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVzdCA9IHVuZXNjYXBlKGhhc2gpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVzdCA9IEpTT04ucGFyc2UoZGVzdCk7XG5cbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGVzdCkpIHtcbiAgICAgICAgICAgIGRlc3QgPSBkZXN0LnRvU3RyaW5nKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChleCkge31cblxuICAgICAgICBpZiAodHlwZW9mIGRlc3QgPT09IFwic3RyaW5nXCIgfHwgaXNWYWxpZEV4cGxpY2l0RGVzdGluYXRpb24oZGVzdCkpIHtcbiAgICAgICAgICB0aGlzLm5hdmlnYXRlVG8oZGVzdCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5lcnJvcihcIlBERkxpbmtTZXJ2aWNlLnNldEhhc2g6IFxcXCJcIi5jb25jYXQodW5lc2NhcGUoaGFzaCksIFwiXFxcIiBpcyBub3QgXCIpICsgXCJhIHZhbGlkIGRlc3RpbmF0aW9uLlwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZXhlY3V0ZU5hbWVkQWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4ZWN1dGVOYW1lZEFjdGlvbihhY3Rpb24pIHtcbiAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJHb0JhY2tcIjpcbiAgICAgICAgICBpZiAodGhpcy5wZGZIaXN0b3J5KSB7XG4gICAgICAgICAgICB0aGlzLnBkZkhpc3RvcnkuYmFjaygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJHb0ZvcndhcmRcIjpcbiAgICAgICAgICBpZiAodGhpcy5wZGZIaXN0b3J5KSB7XG4gICAgICAgICAgICB0aGlzLnBkZkhpc3RvcnkuZm9yd2FyZCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJOZXh0UGFnZVwiOlxuICAgICAgICAgIGlmICh0aGlzLnBhZ2UgPCB0aGlzLnBhZ2VzQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZSsrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJQcmV2UGFnZVwiOlxuICAgICAgICAgIGlmICh0aGlzLnBhZ2UgPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2UtLTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiTGFzdFBhZ2VcIjpcbiAgICAgICAgICB0aGlzLnBhZ2UgPSB0aGlzLnBhZ2VzQ291bnQ7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIkZpcnN0UGFnZVwiOlxuICAgICAgICAgIHRoaXMucGFnZSA9IDE7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcIm5hbWVkYWN0aW9uXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBhY3Rpb246IGFjdGlvblxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhY2hlUGFnZVJlZlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYWNoZVBhZ2VSZWYocGFnZU51bSwgcGFnZVJlZikge1xuICAgICAgaWYgKCFwYWdlUmVmKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlZlN0ciA9IHBhZ2VSZWYuZ2VuID09PSAwID8gXCJcIi5jb25jYXQocGFnZVJlZi5udW0sIFwiUlwiKSA6IFwiXCIuY29uY2F0KHBhZ2VSZWYubnVtLCBcIlJcIikuY29uY2F0KHBhZ2VSZWYuZ2VuKTtcbiAgICAgIHRoaXMuX3BhZ2VzUmVmQ2FjaGVbcmVmU3RyXSA9IHBhZ2VOdW07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jYWNoZWRQYWdlTnVtYmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jYWNoZWRQYWdlTnVtYmVyKHBhZ2VSZWYpIHtcbiAgICAgIHZhciByZWZTdHIgPSBwYWdlUmVmLmdlbiA9PT0gMCA/IFwiXCIuY29uY2F0KHBhZ2VSZWYubnVtLCBcIlJcIikgOiBcIlwiLmNvbmNhdChwYWdlUmVmLm51bSwgXCJSXCIpLmNvbmNhdChwYWdlUmVmLmdlbik7XG4gICAgICByZXR1cm4gdGhpcy5fcGFnZXNSZWZDYWNoZSAmJiB0aGlzLl9wYWdlc1JlZkNhY2hlW3JlZlN0cl0gfHwgbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNQYWdlVmlzaWJsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1BhZ2VWaXNpYmxlKHBhZ2VOdW1iZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnBkZlZpZXdlci5pc1BhZ2VWaXNpYmxlKHBhZ2VOdW1iZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYWdlc0NvdW50XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudCA/IHRoaXMucGRmRG9jdW1lbnQubnVtUGFnZXMgOiAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYWdlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wZGZWaWV3ZXIuY3VycmVudFBhZ2VOdW1iZXI7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgdGhpcy5wZGZWaWV3ZXIuY3VycmVudFBhZ2VOdW1iZXIgPSB2YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicm90YXRpb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBkZlZpZXdlci5wYWdlc1JvdGF0aW9uO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIHRoaXMucGRmVmlld2VyLnBhZ2VzUm90YXRpb24gPSB2YWx1ZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUERGTGlua1NlcnZpY2U7XG59KCk7XG5cbmV4cG9ydHMuUERGTGlua1NlcnZpY2UgPSBQREZMaW5rU2VydmljZTtcblxuZnVuY3Rpb24gaXNWYWxpZEV4cGxpY2l0RGVzdGluYXRpb24oZGVzdCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGVzdCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgZGVzdExlbmd0aCA9IGRlc3QubGVuZ3RoO1xuXG4gIGlmIChkZXN0TGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBwYWdlID0gZGVzdFswXTtcblxuICBpZiAoIShfdHlwZW9mKHBhZ2UpID09PSBcIm9iamVjdFwiICYmIE51bWJlci5pc0ludGVnZXIocGFnZS5udW0pICYmIE51bWJlci5pc0ludGVnZXIocGFnZS5nZW4pKSAmJiAhKE51bWJlci5pc0ludGVnZXIocGFnZSkgJiYgcGFnZSA+PSAwKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB6b29tID0gZGVzdFsxXTtcblxuICBpZiAoIShfdHlwZW9mKHpvb20pID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiB6b29tLm5hbWUgPT09IFwic3RyaW5nXCIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGFsbG93TnVsbCA9IHRydWU7XG5cbiAgc3dpdGNoICh6b29tLm5hbWUpIHtcbiAgICBjYXNlIFwiWFlaXCI6XG4gICAgICBpZiAoZGVzdExlbmd0aCAhPT0gNSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkZpdFwiOlxuICAgIGNhc2UgXCJGaXRCXCI6XG4gICAgICByZXR1cm4gZGVzdExlbmd0aCA9PT0gMjtcblxuICAgIGNhc2UgXCJGaXRIXCI6XG4gICAgY2FzZSBcIkZpdEJIXCI6XG4gICAgY2FzZSBcIkZpdFZcIjpcbiAgICBjYXNlIFwiRml0QlZcIjpcbiAgICAgIGlmIChkZXN0TGVuZ3RoICE9PSAzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiRml0UlwiOlxuICAgICAgaWYgKGRlc3RMZW5ndGggIT09IDYpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBhbGxvd051bGwgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAyOyBpIDwgZGVzdExlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBhcmFtID0gZGVzdFtpXTtcblxuICAgIGlmICghKHR5cGVvZiBwYXJhbSA9PT0gXCJudW1iZXJcIiB8fCBhbGxvd051bGwgJiYgcGFyYW0gPT09IG51bGwpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbnZhciBTaW1wbGVMaW5rU2VydmljZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNpbXBsZUxpbmtTZXJ2aWNlKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTaW1wbGVMaW5rU2VydmljZSk7XG5cbiAgICB0aGlzLmV4dGVybmFsTGlua1RhcmdldCA9IG51bGw7XG4gICAgdGhpcy5leHRlcm5hbExpbmtSZWwgPSBudWxsO1xuICAgIHRoaXMuZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IHRydWU7XG4gICAgdGhpcy5faWdub3JlRGVzdGluYXRpb25ab29tID0gZmFsc2U7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU2ltcGxlTGlua1NlcnZpY2UsIFt7XG4gICAga2V5OiBcIm5hdmlnYXRlVG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmF2aWdhdGVUbyhkZXN0KSB7fVxuICB9LCB7XG4gICAga2V5OiBcImdldERlc3RpbmF0aW9uSGFzaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZXN0aW5hdGlvbkhhc2goZGVzdCkge1xuICAgICAgcmV0dXJuIFwiI1wiO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRBbmNob3JVcmxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QW5jaG9yVXJsKGhhc2gpIHtcbiAgICAgIHJldHVybiBcIiNcIjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0SGFzaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRIYXNoKGhhc2gpIHt9XG4gIH0sIHtcbiAgICBrZXk6IFwiZXhlY3V0ZU5hbWVkQWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4ZWN1dGVOYW1lZEFjdGlvbihhY3Rpb24pIHt9XG4gIH0sIHtcbiAgICBrZXk6IFwiY2FjaGVQYWdlUmVmXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNhY2hlUGFnZVJlZihwYWdlTnVtLCBwYWdlUmVmKSB7fVxuICB9LCB7XG4gICAga2V5OiBcImlzUGFnZVZpc2libGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNQYWdlVmlzaWJsZShwYWdlTnVtYmVyKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFnZXNDb3VudFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBhZ2VcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHt9XG4gIH0sIHtcbiAgICBrZXk6IFwicm90YXRpb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHt9XG4gIH1dKTtcblxuICByZXR1cm4gU2ltcGxlTGlua1NlcnZpY2U7XG59KCk7XG5cbmV4cG9ydHMuU2ltcGxlTGlua1NlcnZpY2UgPSBTaW1wbGVMaW5rU2VydmljZTtcblxuLyoqKi8gfSksXG4vKiA4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLkRlZmF1bHRUZXh0TGF5ZXJGYWN0b3J5ID0gZXhwb3J0cy5UZXh0TGF5ZXJCdWlsZGVyID0gdm9pZCAwO1xuXG52YXIgX3BkZmpzTGliID0gX193X3BkZmpzX3JlcXVpcmVfXygyKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG52YXIgRVhQQU5EX0RJVlNfVElNRU9VVCA9IDMwMDtcblxudmFyIFRleHRMYXllckJ1aWxkZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUZXh0TGF5ZXJCdWlsZGVyKF9yZWYpIHtcbiAgICB2YXIgdGV4dExheWVyRGl2ID0gX3JlZi50ZXh0TGF5ZXJEaXYsXG4gICAgICAgIGV2ZW50QnVzID0gX3JlZi5ldmVudEJ1cyxcbiAgICAgICAgcGFnZUluZGV4ID0gX3JlZi5wYWdlSW5kZXgsXG4gICAgICAgIHZpZXdwb3J0ID0gX3JlZi52aWV3cG9ydCxcbiAgICAgICAgX3JlZiRmaW5kQ29udHJvbGxlciA9IF9yZWYuZmluZENvbnRyb2xsZXIsXG4gICAgICAgIGZpbmRDb250cm9sbGVyID0gX3JlZiRmaW5kQ29udHJvbGxlciA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkZmluZENvbnRyb2xsZXIsXG4gICAgICAgIF9yZWYkZW5oYW5jZVRleHRTZWxlYyA9IF9yZWYuZW5oYW5jZVRleHRTZWxlY3Rpb24sXG4gICAgICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uID0gX3JlZiRlbmhhbmNlVGV4dFNlbGVjID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkZW5oYW5jZVRleHRTZWxlYztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0TGF5ZXJCdWlsZGVyKTtcblxuICAgIHRoaXMudGV4dExheWVyRGl2ID0gdGV4dExheWVyRGl2O1xuICAgIHRoaXMuZXZlbnRCdXMgPSBldmVudEJ1cztcbiAgICB0aGlzLnRleHRDb250ZW50ID0gbnVsbDtcbiAgICB0aGlzLnRleHRDb250ZW50SXRlbXNTdHIgPSBbXTtcbiAgICB0aGlzLnRleHRDb250ZW50U3RyZWFtID0gbnVsbDtcbiAgICB0aGlzLnJlbmRlcmluZ0RvbmUgPSBmYWxzZTtcbiAgICB0aGlzLnBhZ2VJZHggPSBwYWdlSW5kZXg7XG4gICAgdGhpcy5wYWdlTnVtYmVyID0gdGhpcy5wYWdlSWR4ICsgMTtcbiAgICB0aGlzLm1hdGNoZXMgPSBbXTtcbiAgICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQ7XG4gICAgdGhpcy50ZXh0RGl2cyA9IFtdO1xuICAgIHRoaXMuZmluZENvbnRyb2xsZXIgPSBmaW5kQ29udHJvbGxlcjtcbiAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2sgPSBudWxsO1xuICAgIHRoaXMuZW5oYW5jZVRleHRTZWxlY3Rpb24gPSBlbmhhbmNlVGV4dFNlbGVjdGlvbjtcbiAgICB0aGlzLl9vblVwZGF0ZVRleHRMYXllck1hdGNoZXMgPSBudWxsO1xuXG4gICAgdGhpcy5fYmluZE1vdXNlKCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVGV4dExheWVyQnVpbGRlciwgW3tcbiAgICBrZXk6IFwiX2ZpbmlzaFJlbmRlcmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZmluaXNoUmVuZGVyaW5nKCkge1xuICAgICAgdGhpcy5yZW5kZXJpbmdEb25lID0gdHJ1ZTtcblxuICAgICAgaWYgKCF0aGlzLmVuaGFuY2VUZXh0U2VsZWN0aW9uKSB7XG4gICAgICAgIHZhciBlbmRPZkNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBlbmRPZkNvbnRlbnQuY2xhc3NOYW1lID0gXCJlbmRPZkNvbnRlbnRcIjtcbiAgICAgICAgdGhpcy50ZXh0TGF5ZXJEaXYuYXBwZW5kQ2hpbGQoZW5kT2ZDb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInRleHRsYXllcnJlbmRlcmVkXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBwYWdlTnVtYmVyOiB0aGlzLnBhZ2VOdW1iZXIsXG4gICAgICAgIG51bVRleHREaXZzOiB0aGlzLnRleHREaXZzLmxlbmd0aFxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgdGltZW91dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMDtcblxuICAgICAgaWYgKCEodGhpcy50ZXh0Q29udGVudCB8fCB0aGlzLnRleHRDb250ZW50U3RyZWFtKSB8fCB0aGlzLnJlbmRlcmluZ0RvbmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgdGhpcy50ZXh0RGl2cyA9IFtdO1xuICAgICAgdmFyIHRleHRMYXllckZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICB0aGlzLnRleHRMYXllclJlbmRlclRhc2sgPSAoMCwgX3BkZmpzTGliLnJlbmRlclRleHRMYXllcikoe1xuICAgICAgICB0ZXh0Q29udGVudDogdGhpcy50ZXh0Q29udGVudCxcbiAgICAgICAgdGV4dENvbnRlbnRTdHJlYW06IHRoaXMudGV4dENvbnRlbnRTdHJlYW0sXG4gICAgICAgIGNvbnRhaW5lcjogdGV4dExheWVyRnJhZyxcbiAgICAgICAgdmlld3BvcnQ6IHRoaXMudmlld3BvcnQsXG4gICAgICAgIHRleHREaXZzOiB0aGlzLnRleHREaXZzLFxuICAgICAgICB0ZXh0Q29udGVudEl0ZW1zU3RyOiB0aGlzLnRleHRDb250ZW50SXRlbXNTdHIsXG4gICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQsXG4gICAgICAgIGVuaGFuY2VUZXh0U2VsZWN0aW9uOiB0aGlzLmVuaGFuY2VUZXh0U2VsZWN0aW9uXG4gICAgICB9KTtcbiAgICAgIHRoaXMudGV4dExheWVyUmVuZGVyVGFzay5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpcy50ZXh0TGF5ZXJEaXYuYXBwZW5kQ2hpbGQodGV4dExheWVyRnJhZyk7XG5cbiAgICAgICAgX3RoaXMuX2ZpbmlzaFJlbmRlcmluZygpO1xuXG4gICAgICAgIF90aGlzLl91cGRhdGVNYXRjaGVzKCk7XG4gICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7fSk7XG5cbiAgICAgIGlmICghdGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzKSB7XG4gICAgICAgIHRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcyA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgICBpZiAoZXZ0LnBhZ2VJbmRleCA9PT0gX3RoaXMucGFnZUlkeCB8fCBldnQucGFnZUluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgX3RoaXMuX3VwZGF0ZU1hdGNoZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5ldmVudEJ1cy5fb24oXCJ1cGRhdGV0ZXh0bGF5ZXJtYXRjaGVzXCIsIHRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhbmNlbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgICBpZiAodGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrKSB7XG4gICAgICAgIHRoaXMudGV4dExheWVyUmVuZGVyVGFzay5jYW5jZWwoKTtcbiAgICAgICAgdGhpcy50ZXh0TGF5ZXJSZW5kZXJUYXNrID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcykge1xuICAgICAgICB0aGlzLmV2ZW50QnVzLl9vZmYoXCJ1cGRhdGV0ZXh0bGF5ZXJtYXRjaGVzXCIsIHRoaXMuX29uVXBkYXRlVGV4dExheWVyTWF0Y2hlcyk7XG5cbiAgICAgICAgdGhpcy5fb25VcGRhdGVUZXh0TGF5ZXJNYXRjaGVzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0VGV4dENvbnRlbnRTdHJlYW1cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VGV4dENvbnRlbnRTdHJlYW0ocmVhZGFibGVTdHJlYW0pIHtcbiAgICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgICB0aGlzLnRleHRDb250ZW50U3RyZWFtID0gcmVhZGFibGVTdHJlYW07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFRleHRDb250ZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFRleHRDb250ZW50KHRleHRDb250ZW50KSB7XG4gICAgICB0aGlzLmNhbmNlbCgpO1xuICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHRleHRDb250ZW50O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfY29udmVydE1hdGNoZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2NvbnZlcnRNYXRjaGVzKG1hdGNoZXMsIG1hdGNoZXNMZW5ndGgpIHtcbiAgICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHZhciBmaW5kQ29udHJvbGxlciA9IHRoaXMuZmluZENvbnRyb2xsZXIsXG4gICAgICAgICAgdGV4dENvbnRlbnRJdGVtc1N0ciA9IHRoaXMudGV4dENvbnRlbnRJdGVtc1N0cjtcbiAgICAgIHZhciBpID0gMCxcbiAgICAgICAgICBpSW5kZXggPSAwO1xuICAgICAgdmFyIGVuZCA9IHRleHRDb250ZW50SXRlbXNTdHIubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBxdWVyeUxlbiA9IGZpbmRDb250cm9sbGVyLnN0YXRlLnF1ZXJ5Lmxlbmd0aDtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgZm9yICh2YXIgbSA9IDAsIG1tID0gbWF0Y2hlcy5sZW5ndGg7IG0gPCBtbTsgbSsrKSB7XG4gICAgICAgIHZhciBtYXRjaElkeCA9IG1hdGNoZXNbbV07XG5cbiAgICAgICAgd2hpbGUgKGkgIT09IGVuZCAmJiBtYXRjaElkeCA+PSBpSW5kZXggKyB0ZXh0Q29udGVudEl0ZW1zU3RyW2ldLmxlbmd0aCkge1xuICAgICAgICAgIGlJbmRleCArPSB0ZXh0Q29udGVudEl0ZW1zU3RyW2ldLmxlbmd0aDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaSA9PT0gdGV4dENvbnRlbnRJdGVtc1N0ci5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGZpbmQgYSBtYXRjaGluZyBtYXBwaW5nXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1hdGNoID0ge1xuICAgICAgICAgIGJlZ2luOiB7XG4gICAgICAgICAgICBkaXZJZHg6IGksXG4gICAgICAgICAgICBvZmZzZXQ6IG1hdGNoSWR4IC0gaUluZGV4XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChtYXRjaGVzTGVuZ3RoKSB7XG4gICAgICAgICAgbWF0Y2hJZHggKz0gbWF0Y2hlc0xlbmd0aFttXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXRjaElkeCArPSBxdWVyeUxlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChpICE9PSBlbmQgJiYgbWF0Y2hJZHggPiBpSW5kZXggKyB0ZXh0Q29udGVudEl0ZW1zU3RyW2ldLmxlbmd0aCkge1xuICAgICAgICAgIGlJbmRleCArPSB0ZXh0Q29udGVudEl0ZW1zU3RyW2ldLmxlbmd0aDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cblxuICAgICAgICBtYXRjaC5lbmQgPSB7XG4gICAgICAgICAgZGl2SWR4OiBpLFxuICAgICAgICAgIG9mZnNldDogbWF0Y2hJZHggLSBpSW5kZXhcbiAgICAgICAgfTtcbiAgICAgICAgcmVzdWx0LnB1c2gobWF0Y2gpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfcmVuZGVyTWF0Y2hlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVuZGVyTWF0Y2hlcyhtYXRjaGVzKSB7XG4gICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmluZENvbnRyb2xsZXIgPSB0aGlzLmZpbmRDb250cm9sbGVyLFxuICAgICAgICAgIHBhZ2VJZHggPSB0aGlzLnBhZ2VJZHgsXG4gICAgICAgICAgdGV4dENvbnRlbnRJdGVtc1N0ciA9IHRoaXMudGV4dENvbnRlbnRJdGVtc1N0cixcbiAgICAgICAgICB0ZXh0RGl2cyA9IHRoaXMudGV4dERpdnM7XG4gICAgICB2YXIgaXNTZWxlY3RlZFBhZ2UgPSBwYWdlSWR4ID09PSBmaW5kQ29udHJvbGxlci5zZWxlY3RlZC5wYWdlSWR4O1xuICAgICAgdmFyIHNlbGVjdGVkTWF0Y2hJZHggPSBmaW5kQ29udHJvbGxlci5zZWxlY3RlZC5tYXRjaElkeDtcbiAgICAgIHZhciBoaWdobGlnaHRBbGwgPSBmaW5kQ29udHJvbGxlci5zdGF0ZS5oaWdobGlnaHRBbGw7XG4gICAgICB2YXIgcHJldkVuZCA9IG51bGw7XG4gICAgICB2YXIgaW5maW5pdHkgPSB7XG4gICAgICAgIGRpdklkeDogLTEsXG4gICAgICAgIG9mZnNldDogdW5kZWZpbmVkXG4gICAgICB9O1xuXG4gICAgICBmdW5jdGlvbiBiZWdpblRleHQoYmVnaW4sIGNsYXNzTmFtZSkge1xuICAgICAgICB2YXIgZGl2SWR4ID0gYmVnaW4uZGl2SWR4O1xuICAgICAgICB0ZXh0RGl2c1tkaXZJZHhdLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICAgICAgYXBwZW5kVGV4dFRvRGl2KGRpdklkeCwgMCwgYmVnaW4ub2Zmc2V0LCBjbGFzc05hbWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBhcHBlbmRUZXh0VG9EaXYoZGl2SWR4LCBmcm9tT2Zmc2V0LCB0b09mZnNldCwgY2xhc3NOYW1lKSB7XG4gICAgICAgIHZhciBkaXYgPSB0ZXh0RGl2c1tkaXZJZHhdO1xuICAgICAgICB2YXIgY29udGVudCA9IHRleHRDb250ZW50SXRlbXNTdHJbZGl2SWR4XS5zdWJzdHJpbmcoZnJvbU9mZnNldCwgdG9PZmZzZXQpO1xuICAgICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpO1xuXG4gICAgICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgICAgICB2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgIHNwYW4uY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgICAgICAgZGl2LmFwcGVuZENoaWxkKHNwYW4pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGkwID0gc2VsZWN0ZWRNYXRjaElkeCxcbiAgICAgICAgICBpMSA9IGkwICsgMTtcblxuICAgICAgaWYgKGhpZ2hsaWdodEFsbCkge1xuICAgICAgICBpMCA9IDA7XG4gICAgICAgIGkxID0gbWF0Y2hlcy5sZW5ndGg7XG4gICAgICB9IGVsc2UgaWYgKCFpc1NlbGVjdGVkUGFnZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSBpMDsgaSA8IGkxOyBpKyspIHtcbiAgICAgICAgdmFyIG1hdGNoID0gbWF0Y2hlc1tpXTtcbiAgICAgICAgdmFyIGJlZ2luID0gbWF0Y2guYmVnaW47XG4gICAgICAgIHZhciBlbmQgPSBtYXRjaC5lbmQ7XG4gICAgICAgIHZhciBpc1NlbGVjdGVkID0gaXNTZWxlY3RlZFBhZ2UgJiYgaSA9PT0gc2VsZWN0ZWRNYXRjaElkeDtcbiAgICAgICAgdmFyIGhpZ2hsaWdodFN1ZmZpeCA9IGlzU2VsZWN0ZWQgPyBcIiBzZWxlY3RlZFwiIDogXCJcIjtcblxuICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgIGZpbmRDb250cm9sbGVyLnNjcm9sbE1hdGNoSW50b1ZpZXcoe1xuICAgICAgICAgICAgZWxlbWVudDogdGV4dERpdnNbYmVnaW4uZGl2SWR4XSxcbiAgICAgICAgICAgIHBhZ2VJbmRleDogcGFnZUlkeCxcbiAgICAgICAgICAgIG1hdGNoSW5kZXg6IHNlbGVjdGVkTWF0Y2hJZHhcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcHJldkVuZCB8fCBiZWdpbi5kaXZJZHggIT09IHByZXZFbmQuZGl2SWR4KSB7XG4gICAgICAgICAgaWYgKHByZXZFbmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGFwcGVuZFRleHRUb0RpdihwcmV2RW5kLmRpdklkeCwgcHJldkVuZC5vZmZzZXQsIGluZmluaXR5Lm9mZnNldCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYmVnaW5UZXh0KGJlZ2luKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcHBlbmRUZXh0VG9EaXYocHJldkVuZC5kaXZJZHgsIHByZXZFbmQub2Zmc2V0LCBiZWdpbi5vZmZzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJlZ2luLmRpdklkeCA9PT0gZW5kLmRpdklkeCkge1xuICAgICAgICAgIGFwcGVuZFRleHRUb0RpdihiZWdpbi5kaXZJZHgsIGJlZ2luLm9mZnNldCwgZW5kLm9mZnNldCwgXCJoaWdobGlnaHRcIiArIGhpZ2hsaWdodFN1ZmZpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXBwZW5kVGV4dFRvRGl2KGJlZ2luLmRpdklkeCwgYmVnaW4ub2Zmc2V0LCBpbmZpbml0eS5vZmZzZXQsIFwiaGlnaGxpZ2h0IGJlZ2luXCIgKyBoaWdobGlnaHRTdWZmaXgpO1xuXG4gICAgICAgICAgZm9yICh2YXIgbjAgPSBiZWdpbi5kaXZJZHggKyAxLCBuMSA9IGVuZC5kaXZJZHg7IG4wIDwgbjE7IG4wKyspIHtcbiAgICAgICAgICAgIHRleHREaXZzW24wXS5jbGFzc05hbWUgPSBcImhpZ2hsaWdodCBtaWRkbGVcIiArIGhpZ2hsaWdodFN1ZmZpeDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBiZWdpblRleHQoZW5kLCBcImhpZ2hsaWdodCBlbmRcIiArIGhpZ2hsaWdodFN1ZmZpeCk7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2RW5kID0gZW5kO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldkVuZCkge1xuICAgICAgICBhcHBlbmRUZXh0VG9EaXYocHJldkVuZC5kaXZJZHgsIHByZXZFbmQub2Zmc2V0LCBpbmZpbml0eS5vZmZzZXQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfdXBkYXRlTWF0Y2hlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlTWF0Y2hlcygpIHtcbiAgICAgIGlmICghdGhpcy5yZW5kZXJpbmdEb25lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpbmRDb250cm9sbGVyID0gdGhpcy5maW5kQ29udHJvbGxlcixcbiAgICAgICAgICBtYXRjaGVzID0gdGhpcy5tYXRjaGVzLFxuICAgICAgICAgIHBhZ2VJZHggPSB0aGlzLnBhZ2VJZHgsXG4gICAgICAgICAgdGV4dENvbnRlbnRJdGVtc1N0ciA9IHRoaXMudGV4dENvbnRlbnRJdGVtc1N0cixcbiAgICAgICAgICB0ZXh0RGl2cyA9IHRoaXMudGV4dERpdnM7XG4gICAgICB2YXIgY2xlYXJlZFVudGlsRGl2SWR4ID0gLTE7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IG1hdGNoZXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgICB2YXIgbWF0Y2ggPSBtYXRjaGVzW2ldO1xuICAgICAgICB2YXIgYmVnaW4gPSBNYXRoLm1heChjbGVhcmVkVW50aWxEaXZJZHgsIG1hdGNoLmJlZ2luLmRpdklkeCk7XG5cbiAgICAgICAgZm9yICh2YXIgbiA9IGJlZ2luLCBlbmQgPSBtYXRjaC5lbmQuZGl2SWR4OyBuIDw9IGVuZDsgbisrKSB7XG4gICAgICAgICAgdmFyIGRpdiA9IHRleHREaXZzW25dO1xuICAgICAgICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHRDb250ZW50SXRlbXNTdHJbbl07XG4gICAgICAgICAgZGl2LmNsYXNzTmFtZSA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjbGVhcmVkVW50aWxEaXZJZHggPSBtYXRjaC5lbmQuZGl2SWR4ICsgMTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmaW5kQ29udHJvbGxlciB8fCAhZmluZENvbnRyb2xsZXIuaGlnaGxpZ2h0TWF0Y2hlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBwYWdlTWF0Y2hlcyA9IGZpbmRDb250cm9sbGVyLnBhZ2VNYXRjaGVzW3BhZ2VJZHhdIHx8IG51bGw7XG4gICAgICB2YXIgcGFnZU1hdGNoZXNMZW5ndGggPSBmaW5kQ29udHJvbGxlci5wYWdlTWF0Y2hlc0xlbmd0aFtwYWdlSWR4XSB8fCBudWxsO1xuICAgICAgdGhpcy5tYXRjaGVzID0gdGhpcy5fY29udmVydE1hdGNoZXMocGFnZU1hdGNoZXMsIHBhZ2VNYXRjaGVzTGVuZ3RoKTtcblxuICAgICAgdGhpcy5fcmVuZGVyTWF0Y2hlcyh0aGlzLm1hdGNoZXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfYmluZE1vdXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9iaW5kTW91c2UoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGRpdiA9IHRoaXMudGV4dExheWVyRGl2O1xuICAgICAgdmFyIGV4cGFuZERpdnNUaW1lciA9IG51bGw7XG4gICAgICBkaXYuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgIGlmIChfdGhpczIuZW5oYW5jZVRleHRTZWxlY3Rpb24gJiYgX3RoaXMyLnRleHRMYXllclJlbmRlclRhc2spIHtcbiAgICAgICAgICBfdGhpczIudGV4dExheWVyUmVuZGVyVGFzay5leHBhbmRUZXh0RGl2cyh0cnVlKTtcblxuICAgICAgICAgIGlmIChleHBhbmREaXZzVGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChleHBhbmREaXZzVGltZXIpO1xuICAgICAgICAgICAgZXhwYW5kRGl2c1RpbWVyID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZW5kID0gZGl2LnF1ZXJ5U2VsZWN0b3IoXCIuZW5kT2ZDb250ZW50XCIpO1xuXG4gICAgICAgIGlmICghZW5kKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFkanVzdFRvcCA9IGV2dC50YXJnZXQgIT09IGRpdjtcbiAgICAgICAgYWRqdXN0VG9wID0gYWRqdXN0VG9wICYmIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVuZCkuZ2V0UHJvcGVydHlWYWx1ZShcIi1tb3otdXNlci1zZWxlY3RcIikgIT09IFwibm9uZVwiO1xuXG4gICAgICAgIGlmIChhZGp1c3RUb3ApIHtcbiAgICAgICAgICB2YXIgZGl2Qm91bmRzID0gZGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgIHZhciByID0gTWF0aC5tYXgoMCwgKGV2dC5wYWdlWSAtIGRpdkJvdW5kcy50b3ApIC8gZGl2Qm91bmRzLmhlaWdodCk7XG4gICAgICAgICAgZW5kLnN0eWxlLnRvcCA9IChyICogMTAwKS50b0ZpeGVkKDIpICsgXCIlXCI7XG4gICAgICAgIH1cblxuICAgICAgICBlbmQuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgIH0pO1xuICAgICAgZGl2LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzMi5lbmhhbmNlVGV4dFNlbGVjdGlvbiAmJiBfdGhpczIudGV4dExheWVyUmVuZGVyVGFzaykge1xuICAgICAgICAgIGV4cGFuZERpdnNUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKF90aGlzMi50ZXh0TGF5ZXJSZW5kZXJUYXNrKSB7XG4gICAgICAgICAgICAgIF90aGlzMi50ZXh0TGF5ZXJSZW5kZXJUYXNrLmV4cGFuZFRleHREaXZzKGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZXhwYW5kRGl2c1RpbWVyID0gbnVsbDtcbiAgICAgICAgICB9LCBFWFBBTkRfRElWU19USU1FT1VUKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZW5kID0gZGl2LnF1ZXJ5U2VsZWN0b3IoXCIuZW5kT2ZDb250ZW50XCIpO1xuXG4gICAgICAgIGlmICghZW5kKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZW5kLnN0eWxlLnRvcCA9IFwiXCI7XG4gICAgICAgIGVuZC5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFRleHRMYXllckJ1aWxkZXI7XG59KCk7XG5cbmV4cG9ydHMuVGV4dExheWVyQnVpbGRlciA9IFRleHRMYXllckJ1aWxkZXI7XG5cbnZhciBEZWZhdWx0VGV4dExheWVyRmFjdG9yeSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIERlZmF1bHRUZXh0TGF5ZXJGYWN0b3J5KCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBEZWZhdWx0VGV4dExheWVyRmFjdG9yeSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRGVmYXVsdFRleHRMYXllckZhY3RvcnksIFt7XG4gICAga2V5OiBcImNyZWF0ZVRleHRMYXllckJ1aWxkZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlVGV4dExheWVyQnVpbGRlcih0ZXh0TGF5ZXJEaXYsIHBhZ2VJbmRleCwgdmlld3BvcnQpIHtcbiAgICAgIHZhciBlbmhhbmNlVGV4dFNlbGVjdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7XG4gICAgICB2YXIgZXZlbnRCdXMgPSBhcmd1bWVudHMubGVuZ3RoID4gNCA/IGFyZ3VtZW50c1s0XSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBuZXcgVGV4dExheWVyQnVpbGRlcih7XG4gICAgICAgIHRleHRMYXllckRpdjogdGV4dExheWVyRGl2LFxuICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleCxcbiAgICAgICAgdmlld3BvcnQ6IHZpZXdwb3J0LFxuICAgICAgICBlbmhhbmNlVGV4dFNlbGVjdGlvbjogZW5oYW5jZVRleHRTZWxlY3Rpb24sXG4gICAgICAgIGV2ZW50QnVzOiBldmVudEJ1c1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERlZmF1bHRUZXh0TGF5ZXJGYWN0b3J5O1xufSgpO1xuXG5leHBvcnRzLkRlZmF1bHRUZXh0TGF5ZXJGYWN0b3J5ID0gRGVmYXVsdFRleHRMYXllckZhY3Rvcnk7XG5cbi8qKiovIH0pLFxuLyogOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5Eb3dubG9hZE1hbmFnZXIgPSB2b2lkIDA7XG5cbnZhciBfcGRmanNMaWIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpO1xuXG52YXIgX3ZpZXdlcl9jb21wYXRpYmlsaXR5ID0gX193X3BkZmpzX3JlcXVpcmVfXygxMCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuO1xuXG5mdW5jdGlvbiBfZG93bmxvYWQoYmxvYlVybCwgZmlsZW5hbWUpIHtcbiAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcblxuICBpZiAoIWEuY2xpY2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Rvd25sb2FkTWFuYWdlcjogXCJhLmNsaWNrKClcIiBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICB9XG5cbiAgYS5ocmVmID0gYmxvYlVybDtcbiAgYS50YXJnZXQgPSBcIl9wYXJlbnRcIjtcblxuICBpZiAoXCJkb3dubG9hZFwiIGluIGEpIHtcbiAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gIH1cblxuICAoZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmFwcGVuZENoaWxkKGEpO1xuICBhLmNsaWNrKCk7XG4gIGEucmVtb3ZlKCk7XG59XG5cbnZhciBEb3dubG9hZE1hbmFnZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBEb3dubG9hZE1hbmFnZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERvd25sb2FkTWFuYWdlcik7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRG93bmxvYWRNYW5hZ2VyLCBbe1xuICAgIGtleTogXCJkb3dubG9hZFVybFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkb3dubG9hZFVybCh1cmwsIGZpbGVuYW1lKSB7XG4gICAgICBpZiAoISgwLCBfcGRmanNMaWIuY3JlYXRlVmFsaWRBYnNvbHV0ZVVybCkodXJsLCBcImh0dHA6Ly9leGFtcGxlLmNvbVwiKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF9kb3dubG9hZCh1cmwgKyBcIiNwZGZqcy5hY3Rpb249ZG93bmxvYWRcIiwgZmlsZW5hbWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkb3dubG9hZERhdGFcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZG93bmxvYWREYXRhKGRhdGEsIGZpbGVuYW1lLCBjb250ZW50VHlwZSkge1xuICAgICAgaWYgKG5hdmlnYXRvci5tc1NhdmVCbG9iKSB7XG4gICAgICAgIG5hdmlnYXRvci5tc1NhdmVCbG9iKG5ldyBCbG9iKFtkYXRhXSwge1xuICAgICAgICAgIHR5cGU6IGNvbnRlbnRUeXBlXG4gICAgICAgIH0pLCBmaWxlbmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGJsb2JVcmwgPSAoMCwgX3BkZmpzTGliLmNyZWF0ZU9iamVjdFVSTCkoZGF0YSwgY29udGVudFR5cGUsIF92aWV3ZXJfY29tcGF0aWJpbGl0eS52aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zLmRpc2FibGVDcmVhdGVPYmplY3RVUkwpO1xuXG4gICAgICBfZG93bmxvYWQoYmxvYlVybCwgZmlsZW5hbWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkb3dubG9hZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkb3dubG9hZChibG9iLCB1cmwsIGZpbGVuYW1lKSB7XG4gICAgICB2YXIgc291cmNlRXZlbnRUeXBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBcImRvd25sb2FkXCI7XG5cbiAgICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlQmxvYikge1xuICAgICAgICBpZiAoIW5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKSkge1xuICAgICAgICAgIHRoaXMuZG93bmxvYWRVcmwodXJsLCBmaWxlbmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChfdmlld2VyX2NvbXBhdGliaWxpdHkudmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcy5kaXNhYmxlQ3JlYXRlT2JqZWN0VVJMKSB7XG4gICAgICAgIHRoaXMuZG93bmxvYWRVcmwodXJsLCBmaWxlbmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXG4gICAgICBfZG93bmxvYWQoYmxvYlVybCwgZmlsZW5hbWUpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBEb3dubG9hZE1hbmFnZXI7XG59KCk7XG5cbmV4cG9ydHMuRG93bmxvYWRNYW5hZ2VyID0gRG93bmxvYWRNYW5hZ2VyO1xuXG4vKioqLyB9KSxcbi8qIDEwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnZpZXdlckNvbXBhdGliaWxpdHlQYXJhbXMgPSB2b2lkIDA7XG52YXIgY29tcGF0aWJpbGl0eVBhcmFtcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG57XG4gIHZhciB1c2VyQWdlbnQgPSB0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvci51c2VyQWdlbnQgfHwgXCJcIjtcbiAgdmFyIHBsYXRmb3JtID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXZpZ2F0b3IucGxhdGZvcm0gfHwgXCJcIjtcbiAgdmFyIG1heFRvdWNoUG9pbnRzID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgMTtcbiAgdmFyIGlzQW5kcm9pZCA9IC9BbmRyb2lkLy50ZXN0KHVzZXJBZ2VudCk7XG4gIHZhciBpc0lFID0gL1RyaWRlbnQvLnRlc3QodXNlckFnZW50KTtcbiAgdmFyIGlzSU9TID0gL1xcYihpUGFkfGlQaG9uZXxpUG9kKSg/PTspLy50ZXN0KHVzZXJBZ2VudCkgfHwgcGxhdGZvcm0gPT09IFwiTWFjSW50ZWxcIiAmJiBtYXhUb3VjaFBvaW50cyA+IDE7XG4gIHZhciBpc0lPU0Nocm9tZSA9IC9DcmlPUy8udGVzdCh1c2VyQWdlbnQpO1xuXG4gIChmdW5jdGlvbiBjaGVja09uQmxvYlN1cHBvcnQoKSB7XG4gICAgaWYgKGlzSUUgfHwgaXNJT1NDaHJvbWUpIHtcbiAgICAgIGNvbXBhdGliaWxpdHlQYXJhbXMuZGlzYWJsZUNyZWF0ZU9iamVjdFVSTCA9IHRydWU7XG4gICAgfVxuICB9KSgpO1xuXG4gIChmdW5jdGlvbiBjaGVja0NhbnZhc1NpemVMaW1pdGF0aW9uKCkge1xuICAgIGlmIChpc0lPUyB8fCBpc0FuZHJvaWQpIHtcbiAgICAgIGNvbXBhdGliaWxpdHlQYXJhbXMubWF4Q2FudmFzUGl4ZWxzID0gNTI0Mjg4MDtcbiAgICB9XG4gIH0pKCk7XG59XG52YXIgdmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcyA9IE9iamVjdC5mcmVlemUoY29tcGF0aWJpbGl0eVBhcmFtcyk7XG5leHBvcnRzLnZpZXdlckNvbXBhdGliaWxpdHlQYXJhbXMgPSB2aWV3ZXJDb21wYXRpYmlsaXR5UGFyYW1zO1xuXG4vKioqLyB9KSxcbi8qIDExICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLkdlbmVyaWNMMTBuID0gdm9pZCAwO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dfcGRmanNfcmVxdWlyZV9fKDQpKTtcblxuX193X3BkZmpzX3JlcXVpcmVfXygxMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7IHRyeSB7IHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTsgdmFyIHZhbHVlID0gaW5mby52YWx1ZTsgfSBjYXRjaCAoZXJyb3IpIHsgcmVqZWN0KGVycm9yKTsgcmV0dXJuOyB9IGlmIChpbmZvLmRvbmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0gZWxzZSB7IFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTsgfSB9XG5cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7IHJldHVybiBmdW5jdGlvbiAoKSB7IHZhciBzZWxmID0gdGhpcywgYXJncyA9IGFyZ3VtZW50czsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpOyBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7IH0gZnVuY3Rpb24gX3Rocm93KGVycikgeyBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTsgfSBfbmV4dCh1bmRlZmluZWQpOyB9KTsgfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbnZhciB3ZWJMMTBuID0gZG9jdW1lbnQud2ViTDEwbjtcblxudmFyIEdlbmVyaWNMMTBuID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gR2VuZXJpY0wxMG4obGFuZykge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBHZW5lcmljTDEwbik7XG5cbiAgICB0aGlzLl9sYW5nID0gbGFuZztcbiAgICB0aGlzLl9yZWFkeSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHdlYkwxMG4uc2V0TGFuZ3VhZ2UobGFuZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXNvbHZlKHdlYkwxMG4pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoR2VuZXJpY0wxMG4sIFt7XG4gICAga2V5OiBcImdldExhbmd1YWdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfZ2V0TGFuZ3VhZ2UgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcltcImRlZmF1bHRcIl0ubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkge1xuICAgICAgICB2YXIgbDEwbjtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcltcImRlZmF1bHRcIl0ud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZHk7XG5cbiAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGwxMG4gPSBfY29udGV4dC5zZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgbDEwbi5nZXRMYW5ndWFnZSgpKTtcblxuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZSwgdGhpcyk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIGdldExhbmd1YWdlKCkge1xuICAgICAgICByZXR1cm4gX2dldExhbmd1YWdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBnZXRMYW5ndWFnZTtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJnZXREaXJlY3Rpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9nZXREaXJlY3Rpb24gPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcltcImRlZmF1bHRcIl0ubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHtcbiAgICAgICAgdmFyIGwxMG47XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbXCJkZWZhdWx0XCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZHk7XG5cbiAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGwxMG4gPSBfY29udGV4dDIuc2VudDtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiLCBsMTBuLmdldERpcmVjdGlvbigpKTtcblxuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUyLCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gZ2V0RGlyZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gX2dldERpcmVjdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZ2V0RGlyZWN0aW9uO1xuICAgIH0oKVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2dldCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yW1wiZGVmYXVsdFwiXS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUzKHByb3BlcnR5LCBhcmdzLCBmYWxsYmFjaykge1xuICAgICAgICB2YXIgbDEwbjtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcltcImRlZmF1bHRcIl0ud3JhcChmdW5jdGlvbiBfY2FsbGVlMyQoX2NvbnRleHQzKSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAyO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWFkeTtcblxuICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgbDEwbiA9IF9jb250ZXh0My5zZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuYWJydXB0KFwicmV0dXJuXCIsIGwxMG4uZ2V0KHByb3BlcnR5LCBhcmdzLCBmYWxsYmFjaykpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTMsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICBmdW5jdGlvbiBnZXQoX3gsIF94MiwgX3gzKSB7XG4gICAgICAgIHJldHVybiBfZ2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBnZXQ7XG4gICAgfSgpXG4gIH0sIHtcbiAgICBrZXk6IFwidHJhbnNsYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdHJhbnNsYXRlID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbXCJkZWZhdWx0XCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTQoZWxlbWVudCkge1xuICAgICAgICB2YXIgbDEwbjtcbiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvcltcImRlZmF1bHRcIl0ud3JhcChmdW5jdGlvbiBfY2FsbGVlNCQoX2NvbnRleHQ0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ0LnByZXYgPSBfY29udGV4dDQubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQ0Lm5leHQgPSAyO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWFkeTtcblxuICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgbDEwbiA9IF9jb250ZXh0NC5zZW50O1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuYWJydXB0KFwicmV0dXJuXCIsIGwxMG4udHJhbnNsYXRlKGVsZW1lbnQpKTtcblxuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWU0LCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgZnVuY3Rpb24gdHJhbnNsYXRlKF94NCkge1xuICAgICAgICByZXR1cm4gX3RyYW5zbGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJhbnNsYXRlO1xuICAgIH0oKVxuICB9XSk7XG5cbiAgcmV0dXJuIEdlbmVyaWNMMTBuO1xufSgpO1xuXG5leHBvcnRzLkdlbmVyaWNMMTBuID0gR2VuZXJpY0wxMG47XG5cbi8qKiovIH0pLFxuLyogMTIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuZG9jdW1lbnQud2ViTDEwbiA9IGZ1bmN0aW9uICh3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgdmFyIGdMMTBuRGF0YSA9IHt9O1xuICB2YXIgZ1RleHREYXRhID0gJyc7XG4gIHZhciBnVGV4dFByb3AgPSAndGV4dENvbnRlbnQnO1xuICB2YXIgZ0xhbmd1YWdlID0gJyc7XG4gIHZhciBnTWFjcm9zID0ge307XG4gIHZhciBnUmVhZHlTdGF0ZSA9ICdsb2FkaW5nJztcbiAgdmFyIGdBc3luY1Jlc291cmNlTG9hZGluZyA9IHRydWU7XG5cbiAgZnVuY3Rpb24gZ2V0TDEwblJlc291cmNlTGlua3MoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpbmtbdHlwZT1cImFwcGxpY2F0aW9uL2wxMG5cIl0nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEwxMG5EaWN0aW9uYXJ5KCkge1xuICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbdHlwZT1cImFwcGxpY2F0aW9uL2wxMG5cIl0nKTtcbiAgICByZXR1cm4gc2NyaXB0ID8gSlNPTi5wYXJzZShzY3JpcHQuaW5uZXJIVE1MKSA6IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRUcmFuc2xhdGFibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQgPyBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJypbZGF0YS1sMTBuLWlkXScpIDogW107XG4gIH1cblxuICBmdW5jdGlvbiBnZXRMMTBuQXR0cmlidXRlcyhlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4ge307XG4gICAgdmFyIGwxMG5JZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWwxMG4taWQnKTtcbiAgICB2YXIgbDEwbkFyZ3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1sMTBuLWFyZ3MnKTtcbiAgICB2YXIgYXJncyA9IHt9O1xuXG4gICAgaWYgKGwxMG5BcmdzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhcmdzID0gSlNPTi5wYXJzZShsMTBuQXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignY291bGQgbm90IHBhcnNlIGFyZ3VtZW50cyBmb3IgIycgKyBsMTBuSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogbDEwbklkLFxuICAgICAgYXJnczogYXJnc1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB4aHJMb2FkVGV4dCh1cmwsIG9uU3VjY2Vzcywgb25GYWlsdXJlKSB7XG4gICAgb25TdWNjZXNzID0gb25TdWNjZXNzIHx8IGZ1bmN0aW9uIF9vblN1Y2Nlc3MoZGF0YSkge307XG5cbiAgICBvbkZhaWx1cmUgPSBvbkZhaWx1cmUgfHwgZnVuY3Rpb24gX29uRmFpbHVyZSgpIHt9O1xuXG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIGdBc3luY1Jlc291cmNlTG9hZGluZyk7XG5cbiAgICBpZiAoeGhyLm92ZXJyaWRlTWltZVR5cGUpIHtcbiAgICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Jyk7XG4gICAgfVxuXG4gICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PSA0KSB7XG4gICAgICAgIGlmICh4aHIuc3RhdHVzID09IDIwMCB8fCB4aHIuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgb25TdWNjZXNzKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uRmFpbHVyZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHhoci5vbmVycm9yID0gb25GYWlsdXJlO1xuICAgIHhoci5vbnRpbWVvdXQgPSBvbkZhaWx1cmU7XG5cbiAgICB0cnkge1xuICAgICAgeGhyLnNlbmQobnVsbCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb25GYWlsdXJlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcGFyc2VSZXNvdXJjZShocmVmLCBsYW5nLCBzdWNjZXNzQ2FsbGJhY2ssIGZhaWx1cmVDYWxsYmFjaykge1xuICAgIHZhciBiYXNlVVJMID0gaHJlZi5yZXBsYWNlKC9bXlxcL10qJC8sICcnKSB8fCAnLi8nO1xuXG4gICAgZnVuY3Rpb24gZXZhbFN0cmluZyh0ZXh0KSB7XG4gICAgICBpZiAodGV4dC5sYXN0SW5kZXhPZignXFxcXCcpIDwgMCkgcmV0dXJuIHRleHQ7XG4gICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpLnJlcGxhY2UoL1xcXFxuL2csICdcXG4nKS5yZXBsYWNlKC9cXFxcci9nLCAnXFxyJykucmVwbGFjZSgvXFxcXHQvZywgJ1xcdCcpLnJlcGxhY2UoL1xcXFxiL2csICdcXGInKS5yZXBsYWNlKC9cXFxcZi9nLCAnXFxmJykucmVwbGFjZSgvXFxcXHsvZywgJ3snKS5yZXBsYWNlKC9cXFxcfS9nLCAnfScpLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKS5yZXBsYWNlKC9cXFxcJy9nLCBcIidcIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VQcm9wZXJ0aWVzKHRleHQsIHBhcnNlZFByb3BlcnRpZXNDYWxsYmFjaykge1xuICAgICAgdmFyIGRpY3Rpb25hcnkgPSB7fTtcbiAgICAgIHZhciByZUJsYW5rID0gL15cXHMqfFxccyokLztcbiAgICAgIHZhciByZUNvbW1lbnQgPSAvXlxccyojfF5cXHMqJC87XG4gICAgICB2YXIgcmVTZWN0aW9uID0gL15cXHMqXFxbKC4qKVxcXVxccyokLztcbiAgICAgIHZhciByZUltcG9ydCA9IC9eXFxzKkBpbXBvcnRcXHMrdXJsXFwoKC4qKVxcKVxccyokL2k7XG4gICAgICB2YXIgcmVTcGxpdCA9IC9eKFtePVxcc10qKVxccyo9XFxzKiguKykkLztcblxuICAgICAgZnVuY3Rpb24gcGFyc2VSYXdMaW5lcyhyYXdUZXh0LCBleHRlbmRlZFN5bnRheCwgcGFyc2VkUmF3TGluZXNDYWxsYmFjaykge1xuICAgICAgICB2YXIgZW50cmllcyA9IHJhd1RleHQucmVwbGFjZShyZUJsYW5rLCAnJykuc3BsaXQoL1tcXHJcXG5dKy8pO1xuICAgICAgICB2YXIgY3VycmVudExhbmcgPSAnKic7XG4gICAgICAgIHZhciBnZW5lcmljTGFuZyA9IGxhbmcuc3BsaXQoJy0nLCAxKVswXTtcbiAgICAgICAgdmFyIHNraXBMYW5nID0gZmFsc2U7XG4gICAgICAgIHZhciBtYXRjaCA9ICcnO1xuXG4gICAgICAgIGZ1bmN0aW9uIG5leHRFbnRyeSgpIHtcbiAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgaWYgKCFlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBwYXJzZWRSYXdMaW5lc0NhbGxiYWNrKCk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGxpbmUgPSBlbnRyaWVzLnNoaWZ0KCk7XG4gICAgICAgICAgICBpZiAocmVDb21tZW50LnRlc3QobGluZSkpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAoZXh0ZW5kZWRTeW50YXgpIHtcbiAgICAgICAgICAgICAgbWF0Y2ggPSByZVNlY3Rpb24uZXhlYyhsaW5lKTtcblxuICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGFuZyA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgc2tpcExhbmcgPSBjdXJyZW50TGFuZyAhPT0gJyonICYmIGN1cnJlbnRMYW5nICE9PSBsYW5nICYmIGN1cnJlbnRMYW5nICE9PSBnZW5lcmljTGFuZztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChza2lwTGFuZykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbWF0Y2ggPSByZUltcG9ydC5leGVjKGxpbmUpO1xuXG4gICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgIGxvYWRJbXBvcnQoYmFzZVVSTCArIG1hdGNoWzFdLCBuZXh0RW50cnkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdG1wID0gbGluZS5tYXRjaChyZVNwbGl0KTtcblxuICAgICAgICAgICAgaWYgKHRtcCAmJiB0bXAubGVuZ3RoID09IDMpIHtcbiAgICAgICAgICAgICAgZGljdGlvbmFyeVt0bXBbMV1dID0gZXZhbFN0cmluZyh0bXBbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5leHRFbnRyeSgpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsb2FkSW1wb3J0KHVybCwgY2FsbGJhY2spIHtcbiAgICAgICAgeGhyTG9hZFRleHQodXJsLCBmdW5jdGlvbiAoY29udGVudCkge1xuICAgICAgICAgIHBhcnNlUmF3TGluZXMoY29udGVudCwgZmFsc2UsIGNhbGxiYWNrKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnNvbGUud2Fybih1cmwgKyAnIG5vdCBmb3VuZC4nKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcGFyc2VSYXdMaW5lcyh0ZXh0LCB0cnVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHBhcnNlZFByb3BlcnRpZXNDYWxsYmFjayhkaWN0aW9uYXJ5KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHhockxvYWRUZXh0KGhyZWYsIGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgZ1RleHREYXRhICs9IHJlc3BvbnNlO1xuICAgICAgcGFyc2VQcm9wZXJ0aWVzKHJlc3BvbnNlLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgIHZhciBpZCxcbiAgICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgICAgaW5kZXggPSBrZXkubGFzdEluZGV4T2YoJy4nKTtcblxuICAgICAgICAgIGlmIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgIGlkID0ga2V5LnN1YnN0cmluZygwLCBpbmRleCk7XG4gICAgICAgICAgICBwcm9wID0ga2V5LnN1YnN0cmluZyhpbmRleCArIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZCA9IGtleTtcbiAgICAgICAgICAgIHByb3AgPSBnVGV4dFByb3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFnTDEwbkRhdGFbaWRdKSB7XG4gICAgICAgICAgICBnTDEwbkRhdGFbaWRdID0ge307XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZ0wxMG5EYXRhW2lkXVtwcm9wXSA9IGRhdGFba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdWNjZXNzQ2FsbGJhY2spIHtcbiAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgZmFpbHVyZUNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvYWRMb2NhbGUobGFuZywgY2FsbGJhY2spIHtcbiAgICBpZiAobGFuZykge1xuICAgICAgbGFuZyA9IGxhbmcudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uIF9jYWxsYmFjaygpIHt9O1xuXG4gICAgY2xlYXIoKTtcbiAgICBnTGFuZ3VhZ2UgPSBsYW5nO1xuICAgIHZhciBsYW5nTGlua3MgPSBnZXRMMTBuUmVzb3VyY2VMaW5rcygpO1xuICAgIHZhciBsYW5nQ291bnQgPSBsYW5nTGlua3MubGVuZ3RoO1xuXG4gICAgaWYgKGxhbmdDb3VudCA9PT0gMCkge1xuICAgICAgdmFyIGRpY3QgPSBnZXRMMTBuRGljdGlvbmFyeSgpO1xuXG4gICAgICBpZiAoZGljdCAmJiBkaWN0LmxvY2FsZXMgJiYgZGljdC5kZWZhdWx0X2xvY2FsZSkge1xuICAgICAgICBjb25zb2xlLmxvZygndXNpbmcgdGhlIGVtYmVkZGVkIEpTT04gZGlyZWN0b3J5LCBlYXJseSB3YXkgb3V0Jyk7XG4gICAgICAgIGdMMTBuRGF0YSA9IGRpY3QubG9jYWxlc1tsYW5nXTtcblxuICAgICAgICBpZiAoIWdMMTBuRGF0YSkge1xuICAgICAgICAgIHZhciBkZWZhdWx0TG9jYWxlID0gZGljdC5kZWZhdWx0X2xvY2FsZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgZm9yICh2YXIgYW55Q2FzZUxhbmcgaW4gZGljdC5sb2NhbGVzKSB7XG4gICAgICAgICAgICBhbnlDYXNlTGFuZyA9IGFueUNhc2VMYW5nLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChhbnlDYXNlTGFuZyA9PT0gbGFuZykge1xuICAgICAgICAgICAgICBnTDEwbkRhdGEgPSBkaWN0LmxvY2FsZXNbbGFuZ107XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhbnlDYXNlTGFuZyA9PT0gZGVmYXVsdExvY2FsZSkge1xuICAgICAgICAgICAgICBnTDEwbkRhdGEgPSBkaWN0LmxvY2FsZXNbZGVmYXVsdExvY2FsZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdubyByZXNvdXJjZSB0byBsb2FkLCBlYXJseSB3YXkgb3V0Jyk7XG4gICAgICB9XG5cbiAgICAgIGdSZWFkeVN0YXRlID0gJ2NvbXBsZXRlJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgb25SZXNvdXJjZUxvYWRlZCA9IG51bGw7XG4gICAgdmFyIGdSZXNvdXJjZUNvdW50ID0gMDtcblxuICAgIG9uUmVzb3VyY2VMb2FkZWQgPSBmdW5jdGlvbiBvblJlc291cmNlTG9hZGVkKCkge1xuICAgICAgZ1Jlc291cmNlQ291bnQrKztcblxuICAgICAgaWYgKGdSZXNvdXJjZUNvdW50ID49IGxhbmdDb3VudCkge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICBnUmVhZHlTdGF0ZSA9ICdjb21wbGV0ZSc7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIEwxMG5SZXNvdXJjZUxpbmsobGluaykge1xuICAgICAgdmFyIGhyZWYgPSBsaW5rLmhyZWY7XG5cbiAgICAgIHRoaXMubG9hZCA9IGZ1bmN0aW9uIChsYW5nLCBjYWxsYmFjaykge1xuICAgICAgICBwYXJzZVJlc291cmNlKGhyZWYsIGxhbmcsIGNhbGxiYWNrLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGhyZWYgKyAnIG5vdCBmb3VuZC4nKTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1wiJyArIGxhbmcgKyAnXCIgcmVzb3VyY2Ugbm90IGZvdW5kJyk7XG4gICAgICAgICAgZ0xhbmd1YWdlID0gJyc7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFuZ0NvdW50OyBpKyspIHtcbiAgICAgIHZhciByZXNvdXJjZSA9IG5ldyBMMTBuUmVzb3VyY2VMaW5rKGxhbmdMaW5rc1tpXSk7XG4gICAgICByZXNvdXJjZS5sb2FkKGxhbmcsIG9uUmVzb3VyY2VMb2FkZWQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIGdMMTBuRGF0YSA9IHt9O1xuICAgIGdUZXh0RGF0YSA9ICcnO1xuICAgIGdMYW5ndWFnZSA9ICcnO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UGx1cmFsUnVsZXMobGFuZykge1xuICAgIHZhciBsb2NhbGVzMnJ1bGVzID0ge1xuICAgICAgJ2FmJzogMyxcbiAgICAgICdhayc6IDQsXG4gICAgICAnYW0nOiA0LFxuICAgICAgJ2FyJzogMSxcbiAgICAgICdhc2EnOiAzLFxuICAgICAgJ2F6JzogMCxcbiAgICAgICdiZSc6IDExLFxuICAgICAgJ2JlbSc6IDMsXG4gICAgICAnYmV6JzogMyxcbiAgICAgICdiZyc6IDMsXG4gICAgICAnYmgnOiA0LFxuICAgICAgJ2JtJzogMCxcbiAgICAgICdibic6IDMsXG4gICAgICAnYm8nOiAwLFxuICAgICAgJ2JyJzogMjAsXG4gICAgICAnYnJ4JzogMyxcbiAgICAgICdicyc6IDExLFxuICAgICAgJ2NhJzogMyxcbiAgICAgICdjZ2cnOiAzLFxuICAgICAgJ2Nocic6IDMsXG4gICAgICAnY3MnOiAxMixcbiAgICAgICdjeSc6IDE3LFxuICAgICAgJ2RhJzogMyxcbiAgICAgICdkZSc6IDMsXG4gICAgICAnZHYnOiAzLFxuICAgICAgJ2R6JzogMCxcbiAgICAgICdlZSc6IDMsXG4gICAgICAnZWwnOiAzLFxuICAgICAgJ2VuJzogMyxcbiAgICAgICdlbyc6IDMsXG4gICAgICAnZXMnOiAzLFxuICAgICAgJ2V0JzogMyxcbiAgICAgICdldSc6IDMsXG4gICAgICAnZmEnOiAwLFxuICAgICAgJ2ZmJzogNSxcbiAgICAgICdmaSc6IDMsXG4gICAgICAnZmlsJzogNCxcbiAgICAgICdmbyc6IDMsXG4gICAgICAnZnInOiA1LFxuICAgICAgJ2Z1cic6IDMsXG4gICAgICAnZnknOiAzLFxuICAgICAgJ2dhJzogOCxcbiAgICAgICdnZCc6IDI0LFxuICAgICAgJ2dsJzogMyxcbiAgICAgICdnc3cnOiAzLFxuICAgICAgJ2d1JzogMyxcbiAgICAgICdndXcnOiA0LFxuICAgICAgJ2d2JzogMjMsXG4gICAgICAnaGEnOiAzLFxuICAgICAgJ2hhdyc6IDMsXG4gICAgICAnaGUnOiAyLFxuICAgICAgJ2hpJzogNCxcbiAgICAgICdocic6IDExLFxuICAgICAgJ2h1JzogMCxcbiAgICAgICdpZCc6IDAsXG4gICAgICAnaWcnOiAwLFxuICAgICAgJ2lpJzogMCxcbiAgICAgICdpcyc6IDMsXG4gICAgICAnaXQnOiAzLFxuICAgICAgJ2l1JzogNyxcbiAgICAgICdqYSc6IDAsXG4gICAgICAnam1jJzogMyxcbiAgICAgICdqdic6IDAsXG4gICAgICAna2EnOiAwLFxuICAgICAgJ2thYic6IDUsXG4gICAgICAna2FqJzogMyxcbiAgICAgICdrY2cnOiAzLFxuICAgICAgJ2tkZSc6IDAsXG4gICAgICAna2VhJzogMCxcbiAgICAgICdrayc6IDMsXG4gICAgICAna2wnOiAzLFxuICAgICAgJ2ttJzogMCxcbiAgICAgICdrbic6IDAsXG4gICAgICAna28nOiAwLFxuICAgICAgJ2tzYic6IDMsXG4gICAgICAna3NoJzogMjEsXG4gICAgICAna3UnOiAzLFxuICAgICAgJ2t3JzogNyxcbiAgICAgICdsYWcnOiAxOCxcbiAgICAgICdsYic6IDMsXG4gICAgICAnbGcnOiAzLFxuICAgICAgJ2xuJzogNCxcbiAgICAgICdsbyc6IDAsXG4gICAgICAnbHQnOiAxMCxcbiAgICAgICdsdic6IDYsXG4gICAgICAnbWFzJzogMyxcbiAgICAgICdtZyc6IDQsXG4gICAgICAnbWsnOiAxNixcbiAgICAgICdtbCc6IDMsXG4gICAgICAnbW4nOiAzLFxuICAgICAgJ21vJzogOSxcbiAgICAgICdtcic6IDMsXG4gICAgICAnbXMnOiAwLFxuICAgICAgJ210JzogMTUsXG4gICAgICAnbXknOiAwLFxuICAgICAgJ25haCc6IDMsXG4gICAgICAnbmFxJzogNyxcbiAgICAgICduYic6IDMsXG4gICAgICAnbmQnOiAzLFxuICAgICAgJ25lJzogMyxcbiAgICAgICdubCc6IDMsXG4gICAgICAnbm4nOiAzLFxuICAgICAgJ25vJzogMyxcbiAgICAgICducic6IDMsXG4gICAgICAnbnNvJzogNCxcbiAgICAgICdueSc6IDMsXG4gICAgICAnbnluJzogMyxcbiAgICAgICdvbSc6IDMsXG4gICAgICAnb3InOiAzLFxuICAgICAgJ3BhJzogMyxcbiAgICAgICdwYXAnOiAzLFxuICAgICAgJ3BsJzogMTMsXG4gICAgICAncHMnOiAzLFxuICAgICAgJ3B0JzogMyxcbiAgICAgICdybSc6IDMsXG4gICAgICAncm8nOiA5LFxuICAgICAgJ3JvZic6IDMsXG4gICAgICAncnUnOiAxMSxcbiAgICAgICdyd2snOiAzLFxuICAgICAgJ3NhaCc6IDAsXG4gICAgICAnc2FxJzogMyxcbiAgICAgICdzZSc6IDcsXG4gICAgICAnc2VoJzogMyxcbiAgICAgICdzZXMnOiAwLFxuICAgICAgJ3NnJzogMCxcbiAgICAgICdzaCc6IDExLFxuICAgICAgJ3NoaSc6IDE5LFxuICAgICAgJ3NrJzogMTIsXG4gICAgICAnc2wnOiAxNCxcbiAgICAgICdzbWEnOiA3LFxuICAgICAgJ3NtaSc6IDcsXG4gICAgICAnc21qJzogNyxcbiAgICAgICdzbW4nOiA3LFxuICAgICAgJ3Ntcyc6IDcsXG4gICAgICAnc24nOiAzLFxuICAgICAgJ3NvJzogMyxcbiAgICAgICdzcSc6IDMsXG4gICAgICAnc3InOiAxMSxcbiAgICAgICdzcyc6IDMsXG4gICAgICAnc3N5JzogMyxcbiAgICAgICdzdCc6IDMsXG4gICAgICAnc3YnOiAzLFxuICAgICAgJ3N3JzogMyxcbiAgICAgICdzeXInOiAzLFxuICAgICAgJ3RhJzogMyxcbiAgICAgICd0ZSc6IDMsXG4gICAgICAndGVvJzogMyxcbiAgICAgICd0aCc6IDAsXG4gICAgICAndGknOiA0LFxuICAgICAgJ3RpZyc6IDMsXG4gICAgICAndGsnOiAzLFxuICAgICAgJ3RsJzogNCxcbiAgICAgICd0bic6IDMsXG4gICAgICAndG8nOiAwLFxuICAgICAgJ3RyJzogMCxcbiAgICAgICd0cyc6IDMsXG4gICAgICAndHptJzogMjIsXG4gICAgICAndWsnOiAxMSxcbiAgICAgICd1cic6IDMsXG4gICAgICAndmUnOiAzLFxuICAgICAgJ3ZpJzogMCxcbiAgICAgICd2dW4nOiAzLFxuICAgICAgJ3dhJzogNCxcbiAgICAgICd3YWUnOiAzLFxuICAgICAgJ3dvJzogMCxcbiAgICAgICd4aCc6IDMsXG4gICAgICAneG9nJzogMyxcbiAgICAgICd5byc6IDAsXG4gICAgICAnemgnOiAwLFxuICAgICAgJ3p1JzogM1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBpc0luKG4sIGxpc3QpIHtcbiAgICAgIHJldHVybiBsaXN0LmluZGV4T2YobikgIT09IC0xO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmV0d2VlbihuLCBzdGFydCwgZW5kKSB7XG4gICAgICByZXR1cm4gc3RhcnQgPD0gbiAmJiBuIDw9IGVuZDtcbiAgICB9XG5cbiAgICB2YXIgcGx1cmFsUnVsZXMgPSB7XG4gICAgICAnMCc6IGZ1bmN0aW9uIF8obikge1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMSc6IGZ1bmN0aW9uIF8obikge1xuICAgICAgICBpZiAoaXNCZXR3ZWVuKG4gJSAxMDAsIDMsIDEwKSkgcmV0dXJuICdmZXcnO1xuICAgICAgICBpZiAobiA9PT0gMCkgcmV0dXJuICd6ZXJvJztcbiAgICAgICAgaWYgKGlzQmV0d2VlbihuICUgMTAwLCAxMSwgOTkpKSByZXR1cm4gJ21hbnknO1xuICAgICAgICBpZiAobiA9PSAyKSByZXR1cm4gJ3R3byc7XG4gICAgICAgIGlmIChuID09IDEpIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzInOiBmdW5jdGlvbiBfKG4pIHtcbiAgICAgICAgaWYgKG4gIT09IDAgJiYgbiAlIDEwID09PSAwKSByZXR1cm4gJ21hbnknO1xuICAgICAgICBpZiAobiA9PSAyKSByZXR1cm4gJ3R3byc7XG4gICAgICAgIGlmIChuID09IDEpIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzMnOiBmdW5jdGlvbiBfKG4pIHtcbiAgICAgICAgaWYgKG4gPT0gMSkgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnNCc6IGZ1bmN0aW9uIF8obikge1xuICAgICAgICBpZiAoaXNCZXR3ZWVuKG4sIDAsIDEpKSByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICc1JzogZnVuY3Rpb24gXyhuKSB7XG4gICAgICAgIGlmIChpc0JldHdlZW4obiwgMCwgMikgJiYgbiAhPSAyKSByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICc2JzogZnVuY3Rpb24gXyhuKSB7XG4gICAgICAgIGlmIChuID09PSAwKSByZXR1cm4gJ3plcm8nO1xuICAgICAgICBpZiAobiAlIDEwID09IDEgJiYgbiAlIDEwMCAhPSAxMSkgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnNyc6IGZ1bmN0aW9uIF8obikge1xuICAgICAgICBpZiAobiA9PSAyKSByZXR1cm4gJ3R3byc7XG4gICAgICAgIGlmIChuID09IDEpIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzgnOiBmdW5jdGlvbiBfKG4pIHtcbiAgICAgICAgaWYgKGlzQmV0d2VlbihuLCAzLCA2KSkgcmV0dXJuICdmZXcnO1xuICAgICAgICBpZiAoaXNCZXR3ZWVuKG4sIDcsIDEwKSkgcmV0dXJuICdtYW55JztcbiAgICAgICAgaWYgKG4gPT0gMikgcmV0dXJuICd0d28nO1xuICAgICAgICBpZiAobiA9PSAxKSByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICc5JzogZnVuY3Rpb24gXyhuKSB7XG4gICAgICAgIGlmIChuID09PSAwIHx8IG4gIT0gMSAmJiBpc0JldHdlZW4obiAlIDEwMCwgMSwgMTkpKSByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmIChuID09IDEpIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzEwJzogZnVuY3Rpb24gXyhuKSB7XG4gICAgICAgIGlmIChpc0JldHdlZW4obiAlIDEwLCAyLCA5KSAmJiAhaXNCZXR3ZWVuKG4gJSAxMDAsIDExLCAxOSkpIHJldHVybiAnZmV3JztcbiAgICAgICAgaWYgKG4gJSAxMCA9PSAxICYmICFpc0JldHdlZW4obiAlIDEwMCwgMTEsIDE5KSkgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMTEnOiBmdW5jdGlvbiBfKG4pIHtcbiAgICAgICAgaWYgKGlzQmV0d2VlbihuICUgMTAsIDIsIDQpICYmICFpc0JldHdlZW4obiAlIDEwMCwgMTIsIDE0KSkgcmV0dXJuICdmZXcnO1xuICAgICAgICBpZiAobiAlIDEwID09PSAwIHx8IGlzQmV0d2VlbihuICUgMTAsIDUsIDkpIHx8IGlzQmV0d2VlbihuICUgMTAwLCAxMSwgMTQpKSByZXR1cm4gJ21hbnknO1xuICAgICAgICBpZiAobiAlIDEwID09IDEgJiYgbiAlIDEwMCAhPSAxMSkgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMTInOiBmdW5jdGlvbiBfKG4pIHtcbiAgICAgICAgaWYgKGlzQmV0d2VlbihuLCAyLCA0KSkgcmV0dXJuICdmZXcnO1xuICAgICAgICBpZiAobiA9PSAxKSByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcxMyc6IGZ1bmN0aW9uIF8obikge1xuICAgICAgICBpZiAoaXNCZXR3ZWVuKG4gJSAxMCwgMiwgNCkgJiYgIWlzQmV0d2VlbihuICUgMTAwLCAxMiwgMTQpKSByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmIChuICE9IDEgJiYgaXNCZXR3ZWVuKG4gJSAxMCwgMCwgMSkgfHwgaXNCZXR3ZWVuKG4gJSAxMCwgNSwgOSkgfHwgaXNCZXR3ZWVuKG4gJSAxMDAsIDEyLCAxNCkpIHJldHVybiAnbWFueSc7XG4gICAgICAgIGlmIChuID09IDEpIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzE0JzogZnVuY3Rpb24gXyhuKSB7XG4gICAgICAgIGlmIChpc0JldHdlZW4obiAlIDEwMCwgMywgNCkpIHJldHVybiAnZmV3JztcbiAgICAgICAgaWYgKG4gJSAxMDAgPT0gMikgcmV0dXJuICd0d28nO1xuICAgICAgICBpZiAobiAlIDEwMCA9PSAxKSByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfSxcbiAgICAgICcxNSc6IGZ1bmN0aW9uIF8obikge1xuICAgICAgICBpZiAobiA9PT0gMCB8fCBpc0JldHdlZW4obiAlIDEwMCwgMiwgMTApKSByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmIChpc0JldHdlZW4obiAlIDEwMCwgMTEsIDE5KSkgcmV0dXJuICdtYW55JztcbiAgICAgICAgaWYgKG4gPT0gMSkgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMTYnOiBmdW5jdGlvbiBfKG4pIHtcbiAgICAgICAgaWYgKG4gJSAxMCA9PSAxICYmIG4gIT0gMTEpIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzE3JzogZnVuY3Rpb24gXyhuKSB7XG4gICAgICAgIGlmIChuID09IDMpIHJldHVybiAnZmV3JztcbiAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiAnemVybyc7XG4gICAgICAgIGlmIChuID09IDYpIHJldHVybiAnbWFueSc7XG4gICAgICAgIGlmIChuID09IDIpIHJldHVybiAndHdvJztcbiAgICAgICAgaWYgKG4gPT0gMSkgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMTgnOiBmdW5jdGlvbiBfKG4pIHtcbiAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiAnemVybyc7XG4gICAgICAgIGlmIChpc0JldHdlZW4obiwgMCwgMikgJiYgbiAhPT0gMCAmJiBuICE9IDIpIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzE5JzogZnVuY3Rpb24gXyhuKSB7XG4gICAgICAgIGlmIChpc0JldHdlZW4obiwgMiwgMTApKSByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmIChpc0JldHdlZW4obiwgMCwgMSkpIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzIwJzogZnVuY3Rpb24gXyhuKSB7XG4gICAgICAgIGlmICgoaXNCZXR3ZWVuKG4gJSAxMCwgMywgNCkgfHwgbiAlIDEwID09IDkpICYmICEoaXNCZXR3ZWVuKG4gJSAxMDAsIDEwLCAxOSkgfHwgaXNCZXR3ZWVuKG4gJSAxMDAsIDcwLCA3OSkgfHwgaXNCZXR3ZWVuKG4gJSAxMDAsIDkwLCA5OSkpKSByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmIChuICUgMTAwMDAwMCA9PT0gMCAmJiBuICE9PSAwKSByZXR1cm4gJ21hbnknO1xuICAgICAgICBpZiAobiAlIDEwID09IDIgJiYgIWlzSW4obiAlIDEwMCwgWzEyLCA3MiwgOTJdKSkgcmV0dXJuICd0d28nO1xuICAgICAgICBpZiAobiAlIDEwID09IDEgJiYgIWlzSW4obiAlIDEwMCwgWzExLCA3MSwgOTFdKSkgcmV0dXJuICdvbmUnO1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH0sXG4gICAgICAnMjEnOiBmdW5jdGlvbiBfKG4pIHtcbiAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiAnemVybyc7XG4gICAgICAgIGlmIChuID09IDEpIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzIyJzogZnVuY3Rpb24gXyhuKSB7XG4gICAgICAgIGlmIChpc0JldHdlZW4obiwgMCwgMSkgfHwgaXNCZXR3ZWVuKG4sIDExLCA5OSkpIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzIzJzogZnVuY3Rpb24gXyhuKSB7XG4gICAgICAgIGlmIChpc0JldHdlZW4obiAlIDEwLCAxLCAyKSB8fCBuICUgMjAgPT09IDApIHJldHVybiAnb25lJztcbiAgICAgICAgcmV0dXJuICdvdGhlcic7XG4gICAgICB9LFxuICAgICAgJzI0JzogZnVuY3Rpb24gXyhuKSB7XG4gICAgICAgIGlmIChpc0JldHdlZW4obiwgMywgMTApIHx8IGlzQmV0d2VlbihuLCAxMywgMTkpKSByZXR1cm4gJ2Zldyc7XG4gICAgICAgIGlmIChpc0luKG4sIFsyLCAxMl0pKSByZXR1cm4gJ3R3byc7XG4gICAgICAgIGlmIChpc0luKG4sIFsxLCAxMV0pKSByZXR1cm4gJ29uZSc7XG4gICAgICAgIHJldHVybiAnb3RoZXInO1xuICAgICAgfVxuICAgIH07XG4gICAgdmFyIGluZGV4ID0gbG9jYWxlczJydWxlc1tsYW5nLnJlcGxhY2UoLy0uKiQvLCAnJyldO1xuXG4gICAgaWYgKCEoaW5kZXggaW4gcGx1cmFsUnVsZXMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3BsdXJhbCBmb3JtIHVua25vd24gZm9yIFsnICsgbGFuZyArICddJyk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJ290aGVyJztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHBsdXJhbFJ1bGVzW2luZGV4XTtcbiAgfVxuXG4gIGdNYWNyb3MucGx1cmFsID0gZnVuY3Rpb24gKHN0ciwgcGFyYW0sIGtleSwgcHJvcCkge1xuICAgIHZhciBuID0gcGFyc2VGbG9hdChwYXJhbSk7XG4gICAgaWYgKGlzTmFOKG4pKSByZXR1cm4gc3RyO1xuICAgIGlmIChwcm9wICE9IGdUZXh0UHJvcCkgcmV0dXJuIHN0cjtcblxuICAgIGlmICghZ01hY3Jvcy5fcGx1cmFsUnVsZXMpIHtcbiAgICAgIGdNYWNyb3MuX3BsdXJhbFJ1bGVzID0gZ2V0UGx1cmFsUnVsZXMoZ0xhbmd1YWdlKTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSAnWycgKyBnTWFjcm9zLl9wbHVyYWxSdWxlcyhuKSArICddJztcblxuICAgIGlmIChuID09PSAwICYmIGtleSArICdbemVyb10nIGluIGdMMTBuRGF0YSkge1xuICAgICAgc3RyID0gZ0wxMG5EYXRhW2tleSArICdbemVyb10nXVtwcm9wXTtcbiAgICB9IGVsc2UgaWYgKG4gPT0gMSAmJiBrZXkgKyAnW29uZV0nIGluIGdMMTBuRGF0YSkge1xuICAgICAgc3RyID0gZ0wxMG5EYXRhW2tleSArICdbb25lXSddW3Byb3BdO1xuICAgIH0gZWxzZSBpZiAobiA9PSAyICYmIGtleSArICdbdHdvXScgaW4gZ0wxMG5EYXRhKSB7XG4gICAgICBzdHIgPSBnTDEwbkRhdGFba2V5ICsgJ1t0d29dJ11bcHJvcF07XG4gICAgfSBlbHNlIGlmIChrZXkgKyBpbmRleCBpbiBnTDEwbkRhdGEpIHtcbiAgICAgIHN0ciA9IGdMMTBuRGF0YVtrZXkgKyBpbmRleF1bcHJvcF07XG4gICAgfSBlbHNlIGlmIChrZXkgKyAnW290aGVyXScgaW4gZ0wxMG5EYXRhKSB7XG4gICAgICBzdHIgPSBnTDEwbkRhdGFba2V5ICsgJ1tvdGhlcl0nXVtwcm9wXTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGdldEwxMG5EYXRhKGtleSwgYXJncywgZmFsbGJhY2spIHtcbiAgICB2YXIgZGF0YSA9IGdMMTBuRGF0YVtrZXldO1xuXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBjb25zb2xlLndhcm4oJyMnICsga2V5ICsgJyBpcyB1bmRlZmluZWQuJyk7XG5cbiAgICAgIGlmICghZmFsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGRhdGEgPSBmYWxsYmFjaztcbiAgICB9XG5cbiAgICB2YXIgcnYgPSB7fTtcblxuICAgIGZvciAodmFyIHByb3AgaW4gZGF0YSkge1xuICAgICAgdmFyIHN0ciA9IGRhdGFbcHJvcF07XG4gICAgICBzdHIgPSBzdWJzdEluZGV4ZXMoc3RyLCBhcmdzLCBrZXksIHByb3ApO1xuICAgICAgc3RyID0gc3Vic3RBcmd1bWVudHMoc3RyLCBhcmdzLCBrZXkpO1xuICAgICAgcnZbcHJvcF0gPSBzdHI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ2O1xuICB9XG5cbiAgZnVuY3Rpb24gc3Vic3RJbmRleGVzKHN0ciwgYXJncywga2V5LCBwcm9wKSB7XG4gICAgdmFyIHJlSW5kZXggPSAvXFx7XFxbXFxzKihbYS16QS1aXSspXFwoKFthLXpBLVpdKylcXClcXHMqXFxdXFx9LztcbiAgICB2YXIgcmVNYXRjaCA9IHJlSW5kZXguZXhlYyhzdHIpO1xuICAgIGlmICghcmVNYXRjaCB8fCAhcmVNYXRjaC5sZW5ndGgpIHJldHVybiBzdHI7XG4gICAgdmFyIG1hY3JvTmFtZSA9IHJlTWF0Y2hbMV07XG4gICAgdmFyIHBhcmFtTmFtZSA9IHJlTWF0Y2hbMl07XG4gICAgdmFyIHBhcmFtO1xuXG4gICAgaWYgKGFyZ3MgJiYgcGFyYW1OYW1lIGluIGFyZ3MpIHtcbiAgICAgIHBhcmFtID0gYXJnc1twYXJhbU5hbWVdO1xuICAgIH0gZWxzZSBpZiAocGFyYW1OYW1lIGluIGdMMTBuRGF0YSkge1xuICAgICAgcGFyYW0gPSBnTDEwbkRhdGFbcGFyYW1OYW1lXTtcbiAgICB9XG5cbiAgICBpZiAobWFjcm9OYW1lIGluIGdNYWNyb3MpIHtcbiAgICAgIHZhciBtYWNybyA9IGdNYWNyb3NbbWFjcm9OYW1lXTtcbiAgICAgIHN0ciA9IG1hY3JvKHN0ciwgcGFyYW0sIGtleSwgcHJvcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN1YnN0QXJndW1lbnRzKHN0ciwgYXJncywga2V5KSB7XG4gICAgdmFyIHJlQXJncyA9IC9cXHtcXHtcXHMqKC4rPylcXHMqXFx9XFx9L2c7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKHJlQXJncywgZnVuY3Rpb24gKG1hdGNoZWRfdGV4dCwgYXJnKSB7XG4gICAgICBpZiAoYXJncyAmJiBhcmcgaW4gYXJncykge1xuICAgICAgICByZXR1cm4gYXJnc1thcmddO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJnIGluIGdMMTBuRGF0YSkge1xuICAgICAgICByZXR1cm4gZ0wxMG5EYXRhW2FyZ107XG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUubG9nKCdhcmd1bWVudCB7eycgKyBhcmcgKyAnfX0gZm9yICMnICsga2V5ICsgJyBpcyB1bmRlZmluZWQuJyk7XG4gICAgICByZXR1cm4gbWF0Y2hlZF90ZXh0O1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlRWxlbWVudChlbGVtZW50KSB7XG4gICAgdmFyIGwxMG4gPSBnZXRMMTBuQXR0cmlidXRlcyhlbGVtZW50KTtcbiAgICBpZiAoIWwxMG4uaWQpIHJldHVybjtcbiAgICB2YXIgZGF0YSA9IGdldEwxMG5EYXRhKGwxMG4uaWQsIGwxMG4uYXJncyk7XG5cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGNvbnNvbGUud2FybignIycgKyBsMTBuLmlkICsgJyBpcyB1bmRlZmluZWQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGFbZ1RleHRQcm9wXSkge1xuICAgICAgaWYgKGdldENoaWxkRWxlbWVudENvdW50KGVsZW1lbnQpID09PSAwKSB7XG4gICAgICAgIGVsZW1lbnRbZ1RleHRQcm9wXSA9IGRhdGFbZ1RleHRQcm9wXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgICAgdmFyIGZvdW5kID0gZmFsc2U7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBpZiAoY2hpbGRyZW5baV0ubm9kZVR5cGUgPT09IDMgJiYgL1xcUy8udGVzdChjaGlsZHJlbltpXS5ub2RlVmFsdWUpKSB7XG4gICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW5baV0ubm9kZVZhbHVlID0gJyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjaGlsZHJlbltpXS5ub2RlVmFsdWUgPSBkYXRhW2dUZXh0UHJvcF07XG4gICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgdmFyIHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGF0YVtnVGV4dFByb3BdKTtcbiAgICAgICAgICBlbGVtZW50Lmluc2VydEJlZm9yZSh0ZXh0Tm9kZSwgZWxlbWVudC5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBkZWxldGUgZGF0YVtnVGV4dFByb3BdO1xuICAgIH1cblxuICAgIGZvciAodmFyIGsgaW4gZGF0YSkge1xuICAgICAgZWxlbWVudFtrXSA9IGRhdGFba107XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q2hpbGRFbGVtZW50Q291bnQoZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBlbGVtZW50LmNoaWxkRWxlbWVudENvdW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuY2hpbGRFbGVtZW50Q291bnQ7XG4gICAgfVxuXG4gICAgdmFyIGNvdW50ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb3VudCArPSBlbGVtZW50Lm5vZGVUeXBlID09PSAxID8gMSA6IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlRnJhZ21lbnQoZWxlbWVudCkge1xuICAgIGVsZW1lbnQgPSBlbGVtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB2YXIgY2hpbGRyZW4gPSBnZXRUcmFuc2xhdGFibGVDaGlsZHJlbihlbGVtZW50KTtcbiAgICB2YXIgZWxlbWVudENvdW50ID0gY2hpbGRyZW4ubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50Q291bnQ7IGkrKykge1xuICAgICAgdHJhbnNsYXRlRWxlbWVudChjaGlsZHJlbltpXSk7XG4gICAgfVxuXG4gICAgdHJhbnNsYXRlRWxlbWVudChlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5LCBhcmdzLCBmYWxsYmFja1N0cmluZykge1xuICAgICAgdmFyIGluZGV4ID0ga2V5Lmxhc3RJbmRleE9mKCcuJyk7XG4gICAgICB2YXIgcHJvcCA9IGdUZXh0UHJvcDtcblxuICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICBwcm9wID0ga2V5LnN1YnN0cmluZyhpbmRleCArIDEpO1xuICAgICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKDAsIGluZGV4KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZhbGxiYWNrO1xuXG4gICAgICBpZiAoZmFsbGJhY2tTdHJpbmcpIHtcbiAgICAgICAgZmFsbGJhY2sgPSB7fTtcbiAgICAgICAgZmFsbGJhY2tbcHJvcF0gPSBmYWxsYmFja1N0cmluZztcbiAgICAgIH1cblxuICAgICAgdmFyIGRhdGEgPSBnZXRMMTBuRGF0YShrZXksIGFyZ3MsIGZhbGxiYWNrKTtcblxuICAgICAgaWYgKGRhdGEgJiYgcHJvcCBpbiBkYXRhKSB7XG4gICAgICAgIHJldHVybiBkYXRhW3Byb3BdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ3t7JyArIGtleSArICd9fSc7XG4gICAgfSxcbiAgICBnZXREYXRhOiBmdW5jdGlvbiBnZXREYXRhKCkge1xuICAgICAgcmV0dXJuIGdMMTBuRGF0YTtcbiAgICB9LFxuICAgIGdldFRleHQ6IGZ1bmN0aW9uIGdldFRleHQoKSB7XG4gICAgICByZXR1cm4gZ1RleHREYXRhO1xuICAgIH0sXG4gICAgZ2V0TGFuZ3VhZ2U6IGZ1bmN0aW9uIGdldExhbmd1YWdlKCkge1xuICAgICAgcmV0dXJuIGdMYW5ndWFnZTtcbiAgICB9LFxuICAgIHNldExhbmd1YWdlOiBmdW5jdGlvbiBzZXRMYW5ndWFnZShsYW5nLCBjYWxsYmFjaykge1xuICAgICAgbG9hZExvY2FsZShsYW5nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZ2V0RGlyZWN0aW9uOiBmdW5jdGlvbiBnZXREaXJlY3Rpb24oKSB7XG4gICAgICB2YXIgcnRsTGlzdCA9IFsnYXInLCAnaGUnLCAnZmEnLCAncHMnLCAndXInXTtcbiAgICAgIHZhciBzaG9ydENvZGUgPSBnTGFuZ3VhZ2Uuc3BsaXQoJy0nLCAxKVswXTtcbiAgICAgIHJldHVybiBydGxMaXN0LmluZGV4T2Yoc2hvcnRDb2RlKSA+PSAwID8gJ3J0bCcgOiAnbHRyJztcbiAgICB9LFxuICAgIHRyYW5zbGF0ZTogdHJhbnNsYXRlRnJhZ21lbnQsXG4gICAgZ2V0UmVhZHlTdGF0ZTogZnVuY3Rpb24gZ2V0UmVhZHlTdGF0ZSgpIHtcbiAgICAgIHJldHVybiBnUmVhZHlTdGF0ZTtcbiAgICB9LFxuICAgIHJlYWR5OiBmdW5jdGlvbiByZWFkeShjYWxsYmFjaykge1xuICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKGdSZWFkeVN0YXRlID09ICdjb21wbGV0ZScgfHwgZ1JlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJykge1xuICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbG9jYWxpemVkJywgZnVuY3Rpb24gb25jZSgpIHtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2NhbGl6ZWQnLCBvbmNlKTtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59KHdpbmRvdywgZG9jdW1lbnQpO1xuXG4vKioqLyB9KSxcbi8qIDEzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlBERkZpbmRDb250cm9sbGVyID0gZXhwb3J0cy5GaW5kU3RhdGUgPSB2b2lkIDA7XG5cbnZhciBfcGRmanNMaWIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpO1xuXG52YXIgX3BkZl9maW5kX3V0aWxzID0gX193X3BkZmpzX3JlcXVpcmVfXygxNCk7XG5cbnZhciBfdWlfdXRpbHMgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDMpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbnZhciBGaW5kU3RhdGUgPSB7XG4gIEZPVU5EOiAwLFxuICBOT1RfRk9VTkQ6IDEsXG4gIFdSQVBQRUQ6IDIsXG4gIFBFTkRJTkc6IDNcbn07XG5leHBvcnRzLkZpbmRTdGF0ZSA9IEZpbmRTdGF0ZTtcbnZhciBGSU5EX1RJTUVPVVQgPSAyNTA7XG52YXIgTUFUQ0hfU0NST0xMX09GRlNFVF9UT1AgPSAtNTA7XG52YXIgTUFUQ0hfU0NST0xMX09GRlNFVF9MRUZUID0gLTQwMDtcbnZhciBDSEFSQUNURVJTX1RPX05PUk1BTElaRSA9IHtcbiAgXCJcXHUyMDE4XCI6IFwiJ1wiLFxuICBcIlxcdTIwMTlcIjogXCInXCIsXG4gIFwiXFx1MjAxQVwiOiBcIidcIixcbiAgXCJcXHUyMDFCXCI6IFwiJ1wiLFxuICBcIlxcdTIwMUNcIjogJ1wiJyxcbiAgXCJcXHUyMDFEXCI6ICdcIicsXG4gIFwiXFx1MjAxRVwiOiAnXCInLFxuICBcIlxcdTIwMUZcIjogJ1wiJyxcbiAgXCJcXHhCQ1wiOiBcIjEvNFwiLFxuICBcIlxceEJEXCI6IFwiMS8yXCIsXG4gIFwiXFx4QkVcIjogXCIzLzRcIlxufTtcbnZhciBub3JtYWxpemF0aW9uUmVnZXggPSBudWxsO1xuXG5mdW5jdGlvbiBub3JtYWxpemUodGV4dCkge1xuICBpZiAoIW5vcm1hbGl6YXRpb25SZWdleCkge1xuICAgIHZhciByZXBsYWNlID0gT2JqZWN0LmtleXMoQ0hBUkFDVEVSU19UT19OT1JNQUxJWkUpLmpvaW4oXCJcIik7XG4gICAgbm9ybWFsaXphdGlvblJlZ2V4ID0gbmV3IFJlZ0V4cChcIltcIi5jb25jYXQocmVwbGFjZSwgXCJdXCIpLCBcImdcIik7XG4gIH1cblxuICByZXR1cm4gdGV4dC5yZXBsYWNlKG5vcm1hbGl6YXRpb25SZWdleCwgZnVuY3Rpb24gKGNoKSB7XG4gICAgcmV0dXJuIENIQVJBQ1RFUlNfVE9fTk9STUFMSVpFW2NoXTtcbiAgfSk7XG59XG5cbnZhciBQREZGaW5kQ29udHJvbGxlciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBERkZpbmRDb250cm9sbGVyKF9yZWYpIHtcbiAgICB2YXIgbGlua1NlcnZpY2UgPSBfcmVmLmxpbmtTZXJ2aWNlLFxuICAgICAgICBldmVudEJ1cyA9IF9yZWYuZXZlbnRCdXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGRmluZENvbnRyb2xsZXIpO1xuXG4gICAgdGhpcy5fbGlua1NlcnZpY2UgPSBsaW5rU2VydmljZTtcbiAgICB0aGlzLl9ldmVudEJ1cyA9IGV2ZW50QnVzO1xuXG4gICAgdGhpcy5fcmVzZXQoKTtcblxuICAgIGV2ZW50QnVzLl9vbihcImZpbmRiYXJjbG9zZVwiLCB0aGlzLl9vbkZpbmRCYXJDbG9zZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQREZGaW5kQ29udHJvbGxlciwgW3tcbiAgICBrZXk6IFwic2V0RG9jdW1lbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RG9jdW1lbnQocGRmRG9jdW1lbnQpIHtcbiAgICAgIGlmICh0aGlzLl9wZGZEb2N1bWVudCkge1xuICAgICAgICB0aGlzLl9yZXNldCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXBkZkRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcGRmRG9jdW1lbnQgPSBwZGZEb2N1bWVudDtcblxuICAgICAgdGhpcy5fZmlyc3RQYWdlQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImV4ZWN1dGVDb21tYW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGV4ZWN1dGVDb21tYW5kKGNtZCwgc3RhdGUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcGRmRG9jdW1lbnQgPSB0aGlzLl9wZGZEb2N1bWVudDtcblxuICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBudWxsIHx8IHRoaXMuX3Nob3VsZERpcnR5TWF0Y2goY21kLCBzdGF0ZSkpIHtcbiAgICAgICAgdGhpcy5fZGlydHlNYXRjaCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG5cbiAgICAgIGlmIChjbWQgIT09IFwiZmluZGhpZ2hsaWdodGFsbGNoYW5nZVwiKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVVJU3RhdGUoRmluZFN0YXRlLlBFTkRJTkcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5LnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghX3RoaXMuX3BkZkRvY3VtZW50IHx8IHBkZkRvY3VtZW50ICYmIF90aGlzLl9wZGZEb2N1bWVudCAhPT0gcGRmRG9jdW1lbnQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5fZXh0cmFjdFRleHQoKTtcblxuICAgICAgICB2YXIgZmluZGJhckNsb3NlZCA9ICFfdGhpcy5faGlnaGxpZ2h0TWF0Y2hlcztcbiAgICAgICAgdmFyIHBlbmRpbmdUaW1lb3V0ID0gISFfdGhpcy5fZmluZFRpbWVvdXQ7XG5cbiAgICAgICAgaWYgKF90aGlzLl9maW5kVGltZW91dCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChfdGhpcy5fZmluZFRpbWVvdXQpO1xuICAgICAgICAgIF90aGlzLl9maW5kVGltZW91dCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY21kID09PSBcImZpbmRcIikge1xuICAgICAgICAgIF90aGlzLl9maW5kVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMuX25leHRNYXRjaCgpO1xuXG4gICAgICAgICAgICBfdGhpcy5fZmluZFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgIH0sIEZJTkRfVElNRU9VVCk7XG4gICAgICAgIH0gZWxzZSBpZiAoX3RoaXMuX2RpcnR5TWF0Y2gpIHtcbiAgICAgICAgICBfdGhpcy5fbmV4dE1hdGNoKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY21kID09PSBcImZpbmRhZ2FpblwiKSB7XG4gICAgICAgICAgX3RoaXMuX25leHRNYXRjaCgpO1xuXG4gICAgICAgICAgaWYgKGZpbmRiYXJDbG9zZWQgJiYgX3RoaXMuX3N0YXRlLmhpZ2hsaWdodEFsbCkge1xuICAgICAgICAgICAgX3RoaXMuX3VwZGF0ZUFsbFBhZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNtZCA9PT0gXCJmaW5kaGlnaGxpZ2h0YWxsY2hhbmdlXCIpIHtcbiAgICAgICAgICBpZiAocGVuZGluZ1RpbWVvdXQpIHtcbiAgICAgICAgICAgIF90aGlzLl9uZXh0TWF0Y2goKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMuX2hpZ2hsaWdodE1hdGNoZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzLl91cGRhdGVBbGxQYWdlcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzLl9uZXh0TWF0Y2goKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNjcm9sbE1hdGNoSW50b1ZpZXdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2Nyb2xsTWF0Y2hJbnRvVmlldyhfcmVmMikge1xuICAgICAgdmFyIF9yZWYyJGVsZW1lbnQgPSBfcmVmMi5lbGVtZW50LFxuICAgICAgICAgIGVsZW1lbnQgPSBfcmVmMiRlbGVtZW50ID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjIkZWxlbWVudCxcbiAgICAgICAgICBfcmVmMiRwYWdlSW5kZXggPSBfcmVmMi5wYWdlSW5kZXgsXG4gICAgICAgICAgcGFnZUluZGV4ID0gX3JlZjIkcGFnZUluZGV4ID09PSB2b2lkIDAgPyAtMSA6IF9yZWYyJHBhZ2VJbmRleCxcbiAgICAgICAgICBfcmVmMiRtYXRjaEluZGV4ID0gX3JlZjIubWF0Y2hJbmRleCxcbiAgICAgICAgICBtYXRjaEluZGV4ID0gX3JlZjIkbWF0Y2hJbmRleCA9PT0gdm9pZCAwID8gLTEgOiBfcmVmMiRtYXRjaEluZGV4O1xuXG4gICAgICBpZiAoIXRoaXMuX3Njcm9sbE1hdGNoZXMgfHwgIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChtYXRjaEluZGV4ID09PSAtMSB8fCBtYXRjaEluZGV4ICE9PSB0aGlzLl9zZWxlY3RlZC5tYXRjaElkeCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKHBhZ2VJbmRleCA9PT0gLTEgfHwgcGFnZUluZGV4ICE9PSB0aGlzLl9zZWxlY3RlZC5wYWdlSWR4KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2Nyb2xsTWF0Y2hlcyA9IGZhbHNlO1xuICAgICAgdmFyIHNwb3QgPSB7XG4gICAgICAgIHRvcDogTUFUQ0hfU0NST0xMX09GRlNFVF9UT1AsXG4gICAgICAgIGxlZnQ6IE1BVENIX1NDUk9MTF9PRkZTRVRfTEVGVFxuICAgICAgfTtcbiAgICAgICgwLCBfdWlfdXRpbHMuc2Nyb2xsSW50b1ZpZXcpKGVsZW1lbnQsIHNwb3QsIHRydWUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfcmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3Jlc2V0KCkge1xuICAgICAgdGhpcy5faGlnaGxpZ2h0TWF0Y2hlcyA9IGZhbHNlO1xuICAgICAgdGhpcy5fc2Nyb2xsTWF0Y2hlcyA9IGZhbHNlO1xuICAgICAgdGhpcy5fcGRmRG9jdW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5fcGFnZU1hdGNoZXMgPSBbXTtcbiAgICAgIHRoaXMuX3BhZ2VNYXRjaGVzTGVuZ3RoID0gW107XG4gICAgICB0aGlzLl9zdGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHtcbiAgICAgICAgcGFnZUlkeDogLTEsXG4gICAgICAgIG1hdGNoSWR4OiAtMVxuICAgICAgfTtcbiAgICAgIHRoaXMuX29mZnNldCA9IHtcbiAgICAgICAgcGFnZUlkeDogbnVsbCxcbiAgICAgICAgbWF0Y2hJZHg6IG51bGwsXG4gICAgICAgIHdyYXBwZWQ6IGZhbHNlXG4gICAgICB9O1xuICAgICAgdGhpcy5fZXh0cmFjdFRleHRQcm9taXNlcyA9IFtdO1xuICAgICAgdGhpcy5fcGFnZUNvbnRlbnRzID0gW107XG4gICAgICB0aGlzLl9tYXRjaGVzQ291bnRUb3RhbCA9IDA7XG4gICAgICB0aGlzLl9wYWdlc1RvU2VhcmNoID0gbnVsbDtcbiAgICAgIHRoaXMuX3BlbmRpbmdGaW5kTWF0Y2hlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICB0aGlzLl9yZXN1bWVQYWdlSWR4ID0gbnVsbDtcbiAgICAgIHRoaXMuX2RpcnR5TWF0Y2ggPSBmYWxzZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9maW5kVGltZW91dCk7XG4gICAgICB0aGlzLl9maW5kVGltZW91dCA9IG51bGw7XG4gICAgICB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5ID0gKDAsIF9wZGZqc0xpYi5jcmVhdGVQcm9taXNlQ2FwYWJpbGl0eSkoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3Nob3VsZERpcnR5TWF0Y2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3Nob3VsZERpcnR5TWF0Y2goY21kLCBzdGF0ZSkge1xuICAgICAgaWYgKHN0YXRlLnF1ZXJ5ICE9PSB0aGlzLl9zdGF0ZS5xdWVyeSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChjbWQpIHtcbiAgICAgICAgY2FzZSBcImZpbmRhZ2FpblwiOlxuICAgICAgICAgIHZhciBwYWdlTnVtYmVyID0gdGhpcy5fc2VsZWN0ZWQucGFnZUlkeCArIDE7XG4gICAgICAgICAgdmFyIGxpbmtTZXJ2aWNlID0gdGhpcy5fbGlua1NlcnZpY2U7XG5cbiAgICAgICAgICBpZiAocGFnZU51bWJlciA+PSAxICYmIHBhZ2VOdW1iZXIgPD0gbGlua1NlcnZpY2UucGFnZXNDb3VudCAmJiBwYWdlTnVtYmVyICE9PSBsaW5rU2VydmljZS5wYWdlICYmICFsaW5rU2VydmljZS5pc1BhZ2VWaXNpYmxlKHBhZ2VOdW1iZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY2FzZSBcImZpbmRoaWdobGlnaHRhbGxjaGFuZ2VcIjpcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfcHJlcGFyZU1hdGNoZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3ByZXBhcmVNYXRjaGVzKG1hdGNoZXNXaXRoTGVuZ3RoLCBtYXRjaGVzLCBtYXRjaGVzTGVuZ3RoKSB7XG4gICAgICBmdW5jdGlvbiBpc1N1YlRlcm0oY3VycmVudEluZGV4KSB7XG4gICAgICAgIHZhciBjdXJyZW50RWxlbSA9IG1hdGNoZXNXaXRoTGVuZ3RoW2N1cnJlbnRJbmRleF07XG4gICAgICAgIHZhciBuZXh0RWxlbSA9IG1hdGNoZXNXaXRoTGVuZ3RoW2N1cnJlbnRJbmRleCArIDFdO1xuXG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPCBtYXRjaGVzV2l0aExlbmd0aC5sZW5ndGggLSAxICYmIGN1cnJlbnRFbGVtLm1hdGNoID09PSBuZXh0RWxlbS5tYXRjaCkge1xuICAgICAgICAgIGN1cnJlbnRFbGVtLnNraXBwZWQgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IGN1cnJlbnRJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgdmFyIHByZXZFbGVtID0gbWF0Y2hlc1dpdGhMZW5ndGhbaV07XG5cbiAgICAgICAgICBpZiAocHJldkVsZW0uc2tpcHBlZCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHByZXZFbGVtLm1hdGNoICsgcHJldkVsZW0ubWF0Y2hMZW5ndGggPCBjdXJyZW50RWxlbS5tYXRjaCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHByZXZFbGVtLm1hdGNoICsgcHJldkVsZW0ubWF0Y2hMZW5ndGggPj0gY3VycmVudEVsZW0ubWF0Y2ggKyBjdXJyZW50RWxlbS5tYXRjaExlbmd0aCkge1xuICAgICAgICAgICAgY3VycmVudEVsZW0uc2tpcHBlZCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIG1hdGNoZXNXaXRoTGVuZ3RoLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEubWF0Y2ggPT09IGIubWF0Y2ggPyBhLm1hdGNoTGVuZ3RoIC0gYi5tYXRjaExlbmd0aCA6IGEubWF0Y2ggLSBiLm1hdGNoO1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXRjaGVzV2l0aExlbmd0aC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoaXNTdWJUZXJtKGkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBtYXRjaGVzLnB1c2gobWF0Y2hlc1dpdGhMZW5ndGhbaV0ubWF0Y2gpO1xuICAgICAgICBtYXRjaGVzTGVuZ3RoLnB1c2gobWF0Y2hlc1dpdGhMZW5ndGhbaV0ubWF0Y2hMZW5ndGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfaXNFbnRpcmVXb3JkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9pc0VudGlyZVdvcmQoY29udGVudCwgc3RhcnRJZHgsIGxlbmd0aCkge1xuICAgICAgaWYgKHN0YXJ0SWR4ID4gMCkge1xuICAgICAgICB2YXIgZmlyc3QgPSBjb250ZW50LmNoYXJDb2RlQXQoc3RhcnRJZHgpO1xuICAgICAgICB2YXIgbGltaXQgPSBjb250ZW50LmNoYXJDb2RlQXQoc3RhcnRJZHggLSAxKTtcblxuICAgICAgICBpZiAoKDAsIF9wZGZfZmluZF91dGlscy5nZXRDaGFyYWN0ZXJUeXBlKShmaXJzdCkgPT09ICgwLCBfcGRmX2ZpbmRfdXRpbHMuZ2V0Q2hhcmFjdGVyVHlwZSkobGltaXQpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBlbmRJZHggPSBzdGFydElkeCArIGxlbmd0aCAtIDE7XG5cbiAgICAgIGlmIChlbmRJZHggPCBjb250ZW50Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdmFyIGxhc3QgPSBjb250ZW50LmNoYXJDb2RlQXQoZW5kSWR4KTtcblxuICAgICAgICB2YXIgX2xpbWl0ID0gY29udGVudC5jaGFyQ29kZUF0KGVuZElkeCArIDEpO1xuXG4gICAgICAgIGlmICgoMCwgX3BkZl9maW5kX3V0aWxzLmdldENoYXJhY3RlclR5cGUpKGxhc3QpID09PSAoMCwgX3BkZl9maW5kX3V0aWxzLmdldENoYXJhY3RlclR5cGUpKF9saW1pdCkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jYWxjdWxhdGVQaHJhc2VNYXRjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY2FsY3VsYXRlUGhyYXNlTWF0Y2gocXVlcnksIHBhZ2VJbmRleCwgcGFnZUNvbnRlbnQsIGVudGlyZVdvcmQpIHtcbiAgICAgIHZhciBtYXRjaGVzID0gW107XG4gICAgICB2YXIgcXVlcnlMZW4gPSBxdWVyeS5sZW5ndGg7XG4gICAgICB2YXIgbWF0Y2hJZHggPSAtcXVlcnlMZW47XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIG1hdGNoSWR4ID0gcGFnZUNvbnRlbnQuaW5kZXhPZihxdWVyeSwgbWF0Y2hJZHggKyBxdWVyeUxlbik7XG5cbiAgICAgICAgaWYgKG1hdGNoSWR4ID09PSAtMSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudGlyZVdvcmQgJiYgIXRoaXMuX2lzRW50aXJlV29yZChwYWdlQ29udGVudCwgbWF0Y2hJZHgsIHF1ZXJ5TGVuKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbWF0Y2hlcy5wdXNoKG1hdGNoSWR4KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcGFnZU1hdGNoZXNbcGFnZUluZGV4XSA9IG1hdGNoZXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jYWxjdWxhdGVXb3JkTWF0Y2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2NhbGN1bGF0ZVdvcmRNYXRjaChxdWVyeSwgcGFnZUluZGV4LCBwYWdlQ29udGVudCwgZW50aXJlV29yZCkge1xuICAgICAgdmFyIG1hdGNoZXNXaXRoTGVuZ3RoID0gW107XG4gICAgICB2YXIgcXVlcnlBcnJheSA9IHF1ZXJ5Lm1hdGNoKC9cXFMrL2cpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gcXVlcnlBcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgc3VicXVlcnkgPSBxdWVyeUFycmF5W2ldO1xuICAgICAgICB2YXIgc3VicXVlcnlMZW4gPSBzdWJxdWVyeS5sZW5ndGg7XG4gICAgICAgIHZhciBtYXRjaElkeCA9IC1zdWJxdWVyeUxlbjtcblxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIG1hdGNoSWR4ID0gcGFnZUNvbnRlbnQuaW5kZXhPZihzdWJxdWVyeSwgbWF0Y2hJZHggKyBzdWJxdWVyeUxlbik7XG5cbiAgICAgICAgICBpZiAobWF0Y2hJZHggPT09IC0xKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZW50aXJlV29yZCAmJiAhdGhpcy5faXNFbnRpcmVXb3JkKHBhZ2VDb250ZW50LCBtYXRjaElkeCwgc3VicXVlcnlMZW4pKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBtYXRjaGVzV2l0aExlbmd0aC5wdXNoKHtcbiAgICAgICAgICAgIG1hdGNoOiBtYXRjaElkeCxcbiAgICAgICAgICAgIG1hdGNoTGVuZ3RoOiBzdWJxdWVyeUxlbixcbiAgICAgICAgICAgIHNraXBwZWQ6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fcGFnZU1hdGNoZXNMZW5ndGhbcGFnZUluZGV4XSA9IFtdO1xuICAgICAgdGhpcy5fcGFnZU1hdGNoZXNbcGFnZUluZGV4XSA9IFtdO1xuXG4gICAgICB0aGlzLl9wcmVwYXJlTWF0Y2hlcyhtYXRjaGVzV2l0aExlbmd0aCwgdGhpcy5fcGFnZU1hdGNoZXNbcGFnZUluZGV4XSwgdGhpcy5fcGFnZU1hdGNoZXNMZW5ndGhbcGFnZUluZGV4XSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jYWxjdWxhdGVNYXRjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY2FsY3VsYXRlTWF0Y2gocGFnZUluZGV4KSB7XG4gICAgICB2YXIgcGFnZUNvbnRlbnQgPSB0aGlzLl9wYWdlQ29udGVudHNbcGFnZUluZGV4XTtcbiAgICAgIHZhciBxdWVyeSA9IHRoaXMuX3F1ZXJ5O1xuICAgICAgdmFyIF90aGlzJF9zdGF0ZSA9IHRoaXMuX3N0YXRlLFxuICAgICAgICAgIGNhc2VTZW5zaXRpdmUgPSBfdGhpcyRfc3RhdGUuY2FzZVNlbnNpdGl2ZSxcbiAgICAgICAgICBlbnRpcmVXb3JkID0gX3RoaXMkX3N0YXRlLmVudGlyZVdvcmQsXG4gICAgICAgICAgcGhyYXNlU2VhcmNoID0gX3RoaXMkX3N0YXRlLnBocmFzZVNlYXJjaDtcblxuICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICBwYWdlQ29udGVudCA9IHBhZ2VDb250ZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkudG9Mb3dlckNhc2UoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBocmFzZVNlYXJjaCkge1xuICAgICAgICB0aGlzLl9jYWxjdWxhdGVQaHJhc2VNYXRjaChxdWVyeSwgcGFnZUluZGV4LCBwYWdlQ29udGVudCwgZW50aXJlV29yZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jYWxjdWxhdGVXb3JkTWF0Y2gocXVlcnksIHBhZ2VJbmRleCwgcGFnZUNvbnRlbnQsIGVudGlyZVdvcmQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fc3RhdGUuaGlnaGxpZ2h0QWxsKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVBhZ2UocGFnZUluZGV4KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3Jlc3VtZVBhZ2VJZHggPT09IHBhZ2VJbmRleCkge1xuICAgICAgICB0aGlzLl9yZXN1bWVQYWdlSWR4ID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9uZXh0UGFnZU1hdGNoKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBwYWdlTWF0Y2hlc0NvdW50ID0gdGhpcy5fcGFnZU1hdGNoZXNbcGFnZUluZGV4XS5sZW5ndGg7XG5cbiAgICAgIGlmIChwYWdlTWF0Y2hlc0NvdW50ID4gMCkge1xuICAgICAgICB0aGlzLl9tYXRjaGVzQ291bnRUb3RhbCArPSBwYWdlTWF0Y2hlc0NvdW50O1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZVVJUmVzdWx0c0NvdW50KCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9leHRyYWN0VGV4dFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZXh0cmFjdFRleHQoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2V4dHJhY3RUZXh0UHJvbWlzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGksIGlpKSB7XG4gICAgICAgIHZhciBleHRyYWN0VGV4dENhcGFiaWxpdHkgPSAoMCwgX3BkZmpzTGliLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO1xuICAgICAgICBfdGhpczIuX2V4dHJhY3RUZXh0UHJvbWlzZXNbaV0gPSBleHRyYWN0VGV4dENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICAgICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5fcGRmRG9jdW1lbnQuZ2V0UGFnZShpICsgMSkudGhlbihmdW5jdGlvbiAocGRmUGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuIHBkZlBhZ2UuZ2V0VGV4dENvbnRlbnQoe1xuICAgICAgICAgICAgICBub3JtYWxpemVXaGl0ZXNwYWNlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICh0ZXh0Q29udGVudCkge1xuICAgICAgICAgICAgdmFyIHRleHRJdGVtcyA9IHRleHRDb250ZW50Lml0ZW1zO1xuICAgICAgICAgICAgdmFyIHN0ckJ1ZiA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMCwgamogPSB0ZXh0SXRlbXMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgICAgICBzdHJCdWYucHVzaCh0ZXh0SXRlbXNbal0uc3RyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX3RoaXMyLl9wYWdlQ29udGVudHNbaV0gPSBub3JtYWxpemUoc3RyQnVmLmpvaW4oXCJcIikpO1xuICAgICAgICAgICAgZXh0cmFjdFRleHRDYXBhYmlsaXR5LnJlc29sdmUoaSk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlVuYWJsZSB0byBnZXQgdGV4dCBjb250ZW50IGZvciBwYWdlIFwiLmNvbmNhdChpICsgMSksIHJlYXNvbik7XG4gICAgICAgICAgICBfdGhpczIuX3BhZ2VDb250ZW50c1tpXSA9IFwiXCI7XG4gICAgICAgICAgICBleHRyYWN0VGV4dENhcGFiaWxpdHkucmVzb2x2ZShpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLl9saW5rU2VydmljZS5wYWdlc0NvdW50OyBpIDwgaWk7IGkrKykge1xuICAgICAgICBfbG9vcChpLCBpaSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVQYWdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVQYWdlKGluZGV4KSB7XG4gICAgICBpZiAodGhpcy5fc2Nyb2xsTWF0Y2hlcyAmJiB0aGlzLl9zZWxlY3RlZC5wYWdlSWR4ID09PSBpbmRleCkge1xuICAgICAgICB0aGlzLl9saW5rU2VydmljZS5wYWdlID0gaW5kZXggKyAxO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9ldmVudEJ1cy5kaXNwYXRjaChcInVwZGF0ZXRleHRsYXllcm1hdGNoZXNcIiwge1xuICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgIHBhZ2VJbmRleDogaW5kZXhcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfdXBkYXRlQWxsUGFnZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZUFsbFBhZ2VzKCkge1xuICAgICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goXCJ1cGRhdGV0ZXh0bGF5ZXJtYXRjaGVzXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBwYWdlSW5kZXg6IC0xXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX25leHRNYXRjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfbmV4dE1hdGNoKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBwcmV2aW91cyA9IHRoaXMuX3N0YXRlLmZpbmRQcmV2aW91cztcbiAgICAgIHZhciBjdXJyZW50UGFnZUluZGV4ID0gdGhpcy5fbGlua1NlcnZpY2UucGFnZSAtIDE7XG4gICAgICB2YXIgbnVtUGFnZXMgPSB0aGlzLl9saW5rU2VydmljZS5wYWdlc0NvdW50O1xuICAgICAgdGhpcy5faGlnaGxpZ2h0TWF0Y2hlcyA9IHRydWU7XG5cbiAgICAgIGlmICh0aGlzLl9kaXJ0eU1hdGNoKSB7XG4gICAgICAgIHRoaXMuX2RpcnR5TWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWQucGFnZUlkeCA9IHRoaXMuX3NlbGVjdGVkLm1hdGNoSWR4ID0gLTE7XG4gICAgICAgIHRoaXMuX29mZnNldC5wYWdlSWR4ID0gY3VycmVudFBhZ2VJbmRleDtcbiAgICAgICAgdGhpcy5fb2Zmc2V0Lm1hdGNoSWR4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fb2Zmc2V0LndyYXBwZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcmVzdW1lUGFnZUlkeCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3BhZ2VNYXRjaGVzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX3BhZ2VNYXRjaGVzTGVuZ3RoLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuX21hdGNoZXNDb3VudFRvdGFsID0gMDtcblxuICAgICAgICB0aGlzLl91cGRhdGVBbGxQYWdlcygpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtUGFnZXM7IGkrKykge1xuICAgICAgICAgIGlmICh0aGlzLl9wZW5kaW5nRmluZE1hdGNoZXNbaV0gPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuX3BlbmRpbmdGaW5kTWF0Y2hlc1tpXSA9IHRydWU7XG5cbiAgICAgICAgICB0aGlzLl9leHRyYWN0VGV4dFByb21pc2VzW2ldLnRoZW4oZnVuY3Rpb24gKHBhZ2VJZHgpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBfdGhpczMuX3BlbmRpbmdGaW5kTWF0Y2hlc1twYWdlSWR4XTtcblxuICAgICAgICAgICAgX3RoaXMzLl9jYWxjdWxhdGVNYXRjaChwYWdlSWR4KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fcXVlcnkgPT09IFwiXCIpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlVUlTdGF0ZShGaW5kU3RhdGUuRk9VTkQpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3Jlc3VtZVBhZ2VJZHgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0O1xuICAgICAgdGhpcy5fcGFnZXNUb1NlYXJjaCA9IG51bVBhZ2VzO1xuXG4gICAgICBpZiAob2Zmc2V0Lm1hdGNoSWR4ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBudW1QYWdlTWF0Y2hlcyA9IHRoaXMuX3BhZ2VNYXRjaGVzW29mZnNldC5wYWdlSWR4XS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKCFwcmV2aW91cyAmJiBvZmZzZXQubWF0Y2hJZHggKyAxIDwgbnVtUGFnZU1hdGNoZXMgfHwgcHJldmlvdXMgJiYgb2Zmc2V0Lm1hdGNoSWR4ID4gMCkge1xuICAgICAgICAgIG9mZnNldC5tYXRjaElkeCA9IHByZXZpb3VzID8gb2Zmc2V0Lm1hdGNoSWR4IC0gMSA6IG9mZnNldC5tYXRjaElkeCArIDE7XG5cbiAgICAgICAgICB0aGlzLl91cGRhdGVNYXRjaCh0cnVlKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FkdmFuY2VPZmZzZXRQYWdlKHByZXZpb3VzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbmV4dFBhZ2VNYXRjaCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfbWF0Y2hlc1JlYWR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9tYXRjaGVzUmVhZHkobWF0Y2hlcykge1xuICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX29mZnNldDtcbiAgICAgIHZhciBudW1NYXRjaGVzID0gbWF0Y2hlcy5sZW5ndGg7XG4gICAgICB2YXIgcHJldmlvdXMgPSB0aGlzLl9zdGF0ZS5maW5kUHJldmlvdXM7XG5cbiAgICAgIGlmIChudW1NYXRjaGVzKSB7XG4gICAgICAgIG9mZnNldC5tYXRjaElkeCA9IHByZXZpb3VzID8gbnVtTWF0Y2hlcyAtIDEgOiAwO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZU1hdGNoKHRydWUpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9hZHZhbmNlT2Zmc2V0UGFnZShwcmV2aW91cyk7XG5cbiAgICAgIGlmIChvZmZzZXQud3JhcHBlZCkge1xuICAgICAgICBvZmZzZXQubWF0Y2hJZHggPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLl9wYWdlc1RvU2VhcmNoIDwgMCkge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZU1hdGNoKGZhbHNlKTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX25leHRQYWdlTWF0Y2hcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX25leHRQYWdlTWF0Y2goKSB7XG4gICAgICBpZiAodGhpcy5fcmVzdW1lUGFnZUlkeCAhPT0gbnVsbCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiVGhlcmUgY2FuIG9ubHkgYmUgb25lIHBlbmRpbmcgcGFnZS5cIik7XG4gICAgICB9XG5cbiAgICAgIHZhciBtYXRjaGVzID0gbnVsbDtcblxuICAgICAgZG8ge1xuICAgICAgICB2YXIgcGFnZUlkeCA9IHRoaXMuX29mZnNldC5wYWdlSWR4O1xuICAgICAgICBtYXRjaGVzID0gdGhpcy5fcGFnZU1hdGNoZXNbcGFnZUlkeF07XG5cbiAgICAgICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICAgICAgdGhpcy5fcmVzdW1lUGFnZUlkeCA9IHBhZ2VJZHg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKCF0aGlzLl9tYXRjaGVzUmVhZHkobWF0Y2hlcykpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfYWR2YW5jZU9mZnNldFBhZ2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2FkdmFuY2VPZmZzZXRQYWdlKHByZXZpb3VzKSB7XG4gICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0O1xuICAgICAgdmFyIG51bVBhZ2VzID0gdGhpcy5fbGlua1NlcnZpY2UucGFnZXNDb3VudDtcbiAgICAgIG9mZnNldC5wYWdlSWR4ID0gcHJldmlvdXMgPyBvZmZzZXQucGFnZUlkeCAtIDEgOiBvZmZzZXQucGFnZUlkeCArIDE7XG4gICAgICBvZmZzZXQubWF0Y2hJZHggPSBudWxsO1xuICAgICAgdGhpcy5fcGFnZXNUb1NlYXJjaC0tO1xuXG4gICAgICBpZiAob2Zmc2V0LnBhZ2VJZHggPj0gbnVtUGFnZXMgfHwgb2Zmc2V0LnBhZ2VJZHggPCAwKSB7XG4gICAgICAgIG9mZnNldC5wYWdlSWR4ID0gcHJldmlvdXMgPyBudW1QYWdlcyAtIDEgOiAwO1xuICAgICAgICBvZmZzZXQud3JhcHBlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVNYXRjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlTWF0Y2goKSB7XG4gICAgICB2YXIgZm91bmQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgICAgdmFyIHN0YXRlID0gRmluZFN0YXRlLk5PVF9GT1VORDtcbiAgICAgIHZhciB3cmFwcGVkID0gdGhpcy5fb2Zmc2V0LndyYXBwZWQ7XG4gICAgICB0aGlzLl9vZmZzZXQud3JhcHBlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgdmFyIHByZXZpb3VzUGFnZSA9IHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHg7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkLnBhZ2VJZHggPSB0aGlzLl9vZmZzZXQucGFnZUlkeDtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWQubWF0Y2hJZHggPSB0aGlzLl9vZmZzZXQubWF0Y2hJZHg7XG4gICAgICAgIHN0YXRlID0gd3JhcHBlZCA/IEZpbmRTdGF0ZS5XUkFQUEVEIDogRmluZFN0YXRlLkZPVU5EO1xuXG4gICAgICAgIGlmIChwcmV2aW91c1BhZ2UgIT09IC0xICYmIHByZXZpb3VzUGFnZSAhPT0gdGhpcy5fc2VsZWN0ZWQucGFnZUlkeCkge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZVBhZ2UocHJldmlvdXNQYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl91cGRhdGVVSVN0YXRlKHN0YXRlLCB0aGlzLl9zdGF0ZS5maW5kUHJldmlvdXMpO1xuXG4gICAgICBpZiAodGhpcy5fc2VsZWN0ZWQucGFnZUlkeCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5fc2Nyb2xsTWF0Y2hlcyA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlUGFnZSh0aGlzLl9zZWxlY3RlZC5wYWdlSWR4KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uRmluZEJhckNsb3NlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9vbkZpbmRCYXJDbG9zZShldnQpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICB2YXIgcGRmRG9jdW1lbnQgPSB0aGlzLl9wZGZEb2N1bWVudDtcblxuICAgICAgdGhpcy5fZmlyc3RQYWdlQ2FwYWJpbGl0eS5wcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIV90aGlzNC5fcGRmRG9jdW1lbnQgfHwgcGRmRG9jdW1lbnQgJiYgX3RoaXM0Ll9wZGZEb2N1bWVudCAhPT0gcGRmRG9jdW1lbnQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3RoaXM0Ll9maW5kVGltZW91dCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dChfdGhpczQuX2ZpbmRUaW1lb3V0KTtcbiAgICAgICAgICBfdGhpczQuX2ZpbmRUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpczQuX3Jlc3VtZVBhZ2VJZHgpIHtcbiAgICAgICAgICBfdGhpczQuX3Jlc3VtZVBhZ2VJZHggPSBudWxsO1xuICAgICAgICAgIF90aGlzNC5fZGlydHlNYXRjaCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczQuX3VwZGF0ZVVJU3RhdGUoRmluZFN0YXRlLkZPVU5EKTtcblxuICAgICAgICBfdGhpczQuX2hpZ2hsaWdodE1hdGNoZXMgPSBmYWxzZTtcblxuICAgICAgICBfdGhpczQuX3VwZGF0ZUFsbFBhZ2VzKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3JlcXVlc3RNYXRjaGVzQ291bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3JlcXVlc3RNYXRjaGVzQ291bnQoKSB7XG4gICAgICB2YXIgX3RoaXMkX3NlbGVjdGVkID0gdGhpcy5fc2VsZWN0ZWQsXG4gICAgICAgICAgcGFnZUlkeCA9IF90aGlzJF9zZWxlY3RlZC5wYWdlSWR4LFxuICAgICAgICAgIG1hdGNoSWR4ID0gX3RoaXMkX3NlbGVjdGVkLm1hdGNoSWR4O1xuICAgICAgdmFyIGN1cnJlbnQgPSAwLFxuICAgICAgICAgIHRvdGFsID0gdGhpcy5fbWF0Y2hlc0NvdW50VG90YWw7XG5cbiAgICAgIGlmIChtYXRjaElkeCAhPT0gLTEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWdlSWR4OyBpKyspIHtcbiAgICAgICAgICBjdXJyZW50ICs9IHRoaXMuX3BhZ2VNYXRjaGVzW2ldICYmIHRoaXMuX3BhZ2VNYXRjaGVzW2ldLmxlbmd0aCB8fCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudCArPSBtYXRjaElkeCArIDE7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50IDwgMSB8fCBjdXJyZW50ID4gdG90YWwpIHtcbiAgICAgICAgY3VycmVudCA9IHRvdGFsID0gMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VycmVudDogY3VycmVudCxcbiAgICAgICAgdG90YWw6IHRvdGFsXG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfdXBkYXRlVUlSZXN1bHRzQ291bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZVVJUmVzdWx0c0NvdW50KCkge1xuICAgICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goXCJ1cGRhdGVmaW5kbWF0Y2hlc2NvdW50XCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBtYXRjaGVzQ291bnQ6IHRoaXMuX3JlcXVlc3RNYXRjaGVzQ291bnQoKVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVVSVN0YXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVVSVN0YXRlKHN0YXRlLCBwcmV2aW91cykge1xuICAgICAgdGhpcy5fZXZlbnRCdXMuZGlzcGF0Y2goXCJ1cGRhdGVmaW5kY29udHJvbHN0YXRlXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgIHByZXZpb3VzOiBwcmV2aW91cyxcbiAgICAgICAgbWF0Y2hlc0NvdW50OiB0aGlzLl9yZXF1ZXN0TWF0Y2hlc0NvdW50KCksXG4gICAgICAgIHJhd1F1ZXJ5OiB0aGlzLl9zdGF0ZSA/IHRoaXMuX3N0YXRlLnF1ZXJ5IDogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhpZ2hsaWdodE1hdGNoZXNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9oaWdobGlnaHRNYXRjaGVzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYWdlTWF0Y2hlc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VNYXRjaGVzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYWdlTWF0Y2hlc0xlbmd0aFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VNYXRjaGVzTGVuZ3RoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzZWxlY3RlZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdGF0ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfcXVlcnlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLl9zdGF0ZS5xdWVyeSAhPT0gdGhpcy5fcmF3UXVlcnkpIHtcbiAgICAgICAgdGhpcy5fcmF3UXVlcnkgPSB0aGlzLl9zdGF0ZS5xdWVyeTtcbiAgICAgICAgdGhpcy5fbm9ybWFsaXplZFF1ZXJ5ID0gbm9ybWFsaXplKHRoaXMuX3N0YXRlLnF1ZXJ5KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX25vcm1hbGl6ZWRRdWVyeTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUERGRmluZENvbnRyb2xsZXI7XG59KCk7XG5cbmV4cG9ydHMuUERGRmluZENvbnRyb2xsZXIgPSBQREZGaW5kQ29udHJvbGxlcjtcblxuLyoqKi8gfSksXG4vKiAxNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRDaGFyYWN0ZXJUeXBlID0gZ2V0Q2hhcmFjdGVyVHlwZTtcbmV4cG9ydHMuQ2hhcmFjdGVyVHlwZSA9IHZvaWQgMDtcbnZhciBDaGFyYWN0ZXJUeXBlID0ge1xuICBTUEFDRTogMCxcbiAgQUxQSEFfTEVUVEVSOiAxLFxuICBQVU5DVDogMixcbiAgSEFOX0xFVFRFUjogMyxcbiAgS0FUQUtBTkFfTEVUVEVSOiA0LFxuICBISVJBR0FOQV9MRVRURVI6IDUsXG4gIEhBTEZXSURUSF9LQVRBS0FOQV9MRVRURVI6IDYsXG4gIFRIQUlfTEVUVEVSOiA3XG59O1xuZXhwb3J0cy5DaGFyYWN0ZXJUeXBlID0gQ2hhcmFjdGVyVHlwZTtcblxuZnVuY3Rpb24gaXNBbHBoYWJldGljYWxTY3JpcHQoY2hhckNvZGUpIHtcbiAgcmV0dXJuIGNoYXJDb2RlIDwgMHgyZTgwO1xufVxuXG5mdW5jdGlvbiBpc0FzY2lpKGNoYXJDb2RlKSB7XG4gIHJldHVybiAoY2hhckNvZGUgJiAweGZmODApID09PSAwO1xufVxuXG5mdW5jdGlvbiBpc0FzY2lpQWxwaGEoY2hhckNvZGUpIHtcbiAgcmV0dXJuIGNoYXJDb2RlID49IDB4NjEgJiYgY2hhckNvZGUgPD0gMHg3YSB8fCBjaGFyQ29kZSA+PSAweDQxICYmIGNoYXJDb2RlIDw9IDB4NWE7XG59XG5cbmZ1bmN0aW9uIGlzQXNjaWlEaWdpdChjaGFyQ29kZSkge1xuICByZXR1cm4gY2hhckNvZGUgPj0gMHgzMCAmJiBjaGFyQ29kZSA8PSAweDM5O1xufVxuXG5mdW5jdGlvbiBpc0FzY2lpU3BhY2UoY2hhckNvZGUpIHtcbiAgcmV0dXJuIGNoYXJDb2RlID09PSAweDIwIHx8IGNoYXJDb2RlID09PSAweDA5IHx8IGNoYXJDb2RlID09PSAweDBkIHx8IGNoYXJDb2RlID09PSAweDBhO1xufVxuXG5mdW5jdGlvbiBpc0hhbihjaGFyQ29kZSkge1xuICByZXR1cm4gY2hhckNvZGUgPj0gMHgzNDAwICYmIGNoYXJDb2RlIDw9IDB4OWZmZiB8fCBjaGFyQ29kZSA+PSAweGY5MDAgJiYgY2hhckNvZGUgPD0gMHhmYWZmO1xufVxuXG5mdW5jdGlvbiBpc0thdGFrYW5hKGNoYXJDb2RlKSB7XG4gIHJldHVybiBjaGFyQ29kZSA+PSAweDMwYTAgJiYgY2hhckNvZGUgPD0gMHgzMGZmO1xufVxuXG5mdW5jdGlvbiBpc0hpcmFnYW5hKGNoYXJDb2RlKSB7XG4gIHJldHVybiBjaGFyQ29kZSA+PSAweDMwNDAgJiYgY2hhckNvZGUgPD0gMHgzMDlmO1xufVxuXG5mdW5jdGlvbiBpc0hhbGZ3aWR0aEthdGFrYW5hKGNoYXJDb2RlKSB7XG4gIHJldHVybiBjaGFyQ29kZSA+PSAweGZmNjAgJiYgY2hhckNvZGUgPD0gMHhmZjlmO1xufVxuXG5mdW5jdGlvbiBpc1RoYWkoY2hhckNvZGUpIHtcbiAgcmV0dXJuIChjaGFyQ29kZSAmIDB4ZmY4MCkgPT09IDB4MGUwMDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hhcmFjdGVyVHlwZShjaGFyQ29kZSkge1xuICBpZiAoaXNBbHBoYWJldGljYWxTY3JpcHQoY2hhckNvZGUpKSB7XG4gICAgaWYgKGlzQXNjaWkoY2hhckNvZGUpKSB7XG4gICAgICBpZiAoaXNBc2NpaVNwYWNlKGNoYXJDb2RlKSkge1xuICAgICAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5TUEFDRTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBc2NpaUFscGhhKGNoYXJDb2RlKSB8fCBpc0FzY2lpRGlnaXQoY2hhckNvZGUpIHx8IGNoYXJDb2RlID09PSAweDVmKSB7XG4gICAgICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLkFMUEhBX0xFVFRFUjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENoYXJhY3RlclR5cGUuUFVOQ1Q7XG4gICAgfSBlbHNlIGlmIChpc1RoYWkoY2hhckNvZGUpKSB7XG4gICAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5USEFJX0xFVFRFUjtcbiAgICB9IGVsc2UgaWYgKGNoYXJDb2RlID09PSAweGEwKSB7XG4gICAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5TUEFDRTtcbiAgICB9XG5cbiAgICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5BTFBIQV9MRVRURVI7XG4gIH1cblxuICBpZiAoaXNIYW4oY2hhckNvZGUpKSB7XG4gICAgcmV0dXJuIENoYXJhY3RlclR5cGUuSEFOX0xFVFRFUjtcbiAgfSBlbHNlIGlmIChpc0thdGFrYW5hKGNoYXJDb2RlKSkge1xuICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLktBVEFLQU5BX0xFVFRFUjtcbiAgfSBlbHNlIGlmIChpc0hpcmFnYW5hKGNoYXJDb2RlKSkge1xuICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLkhJUkFHQU5BX0xFVFRFUjtcbiAgfSBlbHNlIGlmIChpc0hhbGZ3aWR0aEthdGFrYW5hKGNoYXJDb2RlKSkge1xuICAgIHJldHVybiBDaGFyYWN0ZXJUeXBlLkhBTEZXSURUSF9LQVRBS0FOQV9MRVRURVI7XG4gIH1cblxuICByZXR1cm4gQ2hhcmFjdGVyVHlwZS5BTFBIQV9MRVRURVI7XG59XG5cbi8qKiovIH0pLFxuLyogMTUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuaXNEZXN0SGFzaGVzRXF1YWwgPSBpc0Rlc3RIYXNoZXNFcXVhbDtcbmV4cG9ydHMuaXNEZXN0QXJyYXlzRXF1YWwgPSBpc0Rlc3RBcnJheXNFcXVhbDtcbmV4cG9ydHMuUERGSGlzdG9yeSA9IHZvaWQgMDtcblxudmFyIF91aV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7IHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7IH1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47IHZhciBfYXJyID0gW107IHZhciBfbiA9IHRydWU7IHZhciBfZCA9IGZhbHNlOyB2YXIgX2UgPSB1bmRlZmluZWQ7IHRyeSB7IGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG52YXIgSEFTSF9DSEFOR0VfVElNRU9VVCA9IDEwMDA7XG52YXIgUE9TSVRJT05fVVBEQVRFRF9USFJFU0hPTEQgPSA1MDtcbnZhciBVUERBVEVfVklFV0FSRUFfVElNRU9VVCA9IDEwMDA7XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRIYXNoKCkge1xuICByZXR1cm4gZG9jdW1lbnQubG9jYXRpb24uaGFzaDtcbn1cblxudmFyIFBERkhpc3RvcnkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQREZIaXN0b3J5KF9yZWYpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIGxpbmtTZXJ2aWNlID0gX3JlZi5saW5rU2VydmljZSxcbiAgICAgICAgZXZlbnRCdXMgPSBfcmVmLmV2ZW50QnVzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBERkhpc3RvcnkpO1xuXG4gICAgdGhpcy5saW5rU2VydmljZSA9IGxpbmtTZXJ2aWNlO1xuICAgIHRoaXMuZXZlbnRCdXMgPSBldmVudEJ1cztcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuX2ZpbmdlcnByaW50ID0gXCJcIjtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5fYm91bmRFdmVudHMgPSBudWxsO1xuICAgIHRoaXMuX2lzVmlld2VySW5QcmVzZW50YXRpb25Nb2RlID0gZmFsc2U7XG5cbiAgICB0aGlzLmV2ZW50QnVzLl9vbihcInByZXNlbnRhdGlvbm1vZGVjaGFuZ2VkXCIsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIF90aGlzLl9pc1ZpZXdlckluUHJlc2VudGF0aW9uTW9kZSA9IGV2dC5hY3RpdmUgfHwgZXZ0LnN3aXRjaEluUHJvZ3Jlc3M7XG4gICAgfSk7XG5cbiAgICB0aGlzLmV2ZW50QnVzLl9vbihcInBhZ2VzaW5pdFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5faXNQYWdlc0xvYWRlZCA9IGZhbHNlO1xuXG4gICAgICB2YXIgb25QYWdlc0xvYWRlZCA9IGZ1bmN0aW9uIG9uUGFnZXNMb2FkZWQoZXZ0KSB7XG4gICAgICAgIF90aGlzLmV2ZW50QnVzLl9vZmYoXCJwYWdlc2xvYWRlZFwiLCBvblBhZ2VzTG9hZGVkKTtcblxuICAgICAgICBfdGhpcy5faXNQYWdlc0xvYWRlZCA9ICEhZXZ0LnBhZ2VzQ291bnQ7XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5ldmVudEJ1cy5fb24oXCJwYWdlc2xvYWRlZFwiLCBvblBhZ2VzTG9hZGVkKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQREZIaXN0b3J5LCBbe1xuICAgIGtleTogXCJpbml0aWFsaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRpYWxpemUoX3JlZjIpIHtcbiAgICAgIHZhciBmaW5nZXJwcmludCA9IF9yZWYyLmZpbmdlcnByaW50LFxuICAgICAgICAgIF9yZWYyJHJlc2V0SGlzdG9yeSA9IF9yZWYyLnJlc2V0SGlzdG9yeSxcbiAgICAgICAgICByZXNldEhpc3RvcnkgPSBfcmVmMiRyZXNldEhpc3RvcnkgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjIkcmVzZXRIaXN0b3J5LFxuICAgICAgICAgIF9yZWYyJHVwZGF0ZVVybCA9IF9yZWYyLnVwZGF0ZVVybCxcbiAgICAgICAgICB1cGRhdGVVcmwgPSBfcmVmMiR1cGRhdGVVcmwgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZjIkdXBkYXRlVXJsO1xuXG4gICAgICBpZiAoIWZpbmdlcnByaW50IHx8IHR5cGVvZiBmaW5nZXJwcmludCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdQREZIaXN0b3J5LmluaXRpYWxpemU6IFRoZSBcImZpbmdlcnByaW50XCIgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlSW5pdGlhbGl6ZWQgPSB0aGlzLl9maW5nZXJwcmludCAhPT0gXCJcIiAmJiB0aGlzLl9maW5nZXJwcmludCAhPT0gZmluZ2VycHJpbnQ7XG4gICAgICB0aGlzLl9maW5nZXJwcmludCA9IGZpbmdlcnByaW50O1xuICAgICAgdGhpcy5fdXBkYXRlVXJsID0gdXBkYXRlVXJsID09PSB0cnVlO1xuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICB0aGlzLl9iaW5kRXZlbnRzKCk7XG5cbiAgICAgIHZhciBzdGF0ZSA9IHdpbmRvdy5oaXN0b3J5LnN0YXRlO1xuICAgICAgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICB0aGlzLl9ibG9ja0hhc2hDaGFuZ2UgPSAwO1xuICAgICAgdGhpcy5fY3VycmVudEhhc2ggPSBnZXRDdXJyZW50SGFzaCgpO1xuICAgICAgdGhpcy5fbnVtUG9zaXRpb25VcGRhdGVzID0gMDtcbiAgICAgIHRoaXMuX3VpZCA9IHRoaXMuX21heFVpZCA9IDA7XG4gICAgICB0aGlzLl9kZXN0aW5hdGlvbiA9IG51bGw7XG4gICAgICB0aGlzLl9wb3NpdGlvbiA9IG51bGw7XG5cbiAgICAgIGlmICghdGhpcy5faXNWYWxpZFN0YXRlKHN0YXRlLCB0cnVlKSB8fCByZXNldEhpc3RvcnkpIHtcbiAgICAgICAgdmFyIF90aGlzJF9wYXJzZUN1cnJlbnRIYSA9IHRoaXMuX3BhcnNlQ3VycmVudEhhc2godHJ1ZSksXG4gICAgICAgICAgICBoYXNoID0gX3RoaXMkX3BhcnNlQ3VycmVudEhhLmhhc2gsXG4gICAgICAgICAgICBwYWdlID0gX3RoaXMkX3BhcnNlQ3VycmVudEhhLnBhZ2UsXG4gICAgICAgICAgICByb3RhdGlvbiA9IF90aGlzJF9wYXJzZUN1cnJlbnRIYS5yb3RhdGlvbjtcblxuICAgICAgICBpZiAoIWhhc2ggfHwgcmVJbml0aWFsaXplZCB8fCByZXNldEhpc3RvcnkpIHtcbiAgICAgICAgICB0aGlzLl9wdXNoT3JSZXBsYWNlU3RhdGUobnVsbCwgdHJ1ZSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wdXNoT3JSZXBsYWNlU3RhdGUoe1xuICAgICAgICAgIGhhc2g6IGhhc2gsXG4gICAgICAgICAgcGFnZTogcGFnZSxcbiAgICAgICAgICByb3RhdGlvbjogcm90YXRpb25cbiAgICAgICAgfSwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGVzdGluYXRpb24gPSBzdGF0ZS5kZXN0aW5hdGlvbjtcblxuICAgICAgdGhpcy5fdXBkYXRlSW50ZXJuYWxTdGF0ZShkZXN0aW5hdGlvbiwgc3RhdGUudWlkLCB0cnVlKTtcblxuICAgICAgaWYgKHRoaXMuX3VpZCA+IHRoaXMuX21heFVpZCkge1xuICAgICAgICB0aGlzLl9tYXhVaWQgPSB0aGlzLl91aWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChkZXN0aW5hdGlvbi5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxSb3RhdGlvbiA9IGRlc3RpbmF0aW9uLnJvdGF0aW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVzdGluYXRpb24uZGVzdCkge1xuICAgICAgICB0aGlzLl9pbml0aWFsQm9va21hcmsgPSBKU09OLnN0cmluZ2lmeShkZXN0aW5hdGlvbi5kZXN0KTtcbiAgICAgICAgdGhpcy5fZGVzdGluYXRpb24ucGFnZSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmhhc2gpIHtcbiAgICAgICAgdGhpcy5faW5pdGlhbEJvb2ttYXJrID0gZGVzdGluYXRpb24uaGFzaDtcbiAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24ucGFnZSkge1xuICAgICAgICB0aGlzLl9pbml0aWFsQm9va21hcmsgPSBcInBhZ2U9XCIuY29uY2F0KGRlc3RpbmF0aW9uLnBhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgICB0aGlzLl9wYWdlSGlkZSgpO1xuXG4gICAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fdW5iaW5kRXZlbnRzKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2luaXRpYWxCb29rbWFyayA9IG51bGw7XG4gICAgICB0aGlzLl9pbml0aWFsUm90YXRpb24gPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwdXNoXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHB1c2goX3JlZjMpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgX3JlZjMkbmFtZWREZXN0ID0gX3JlZjMubmFtZWREZXN0LFxuICAgICAgICAgIG5hbWVkRGVzdCA9IF9yZWYzJG5hbWVkRGVzdCA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYzJG5hbWVkRGVzdCxcbiAgICAgICAgICBleHBsaWNpdERlc3QgPSBfcmVmMy5leHBsaWNpdERlc3QsXG4gICAgICAgICAgcGFnZU51bWJlciA9IF9yZWYzLnBhZ2VOdW1iZXI7XG5cbiAgICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobmFtZWREZXN0ICYmIHR5cGVvZiBuYW1lZERlc3QgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlBERkhpc3RvcnkucHVzaDogXCIgKyBcIlxcXCJcIi5jb25jYXQobmFtZWREZXN0LCBcIlxcXCIgaXMgbm90IGEgdmFsaWQgbmFtZWREZXN0IHBhcmFtZXRlci5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KGV4cGxpY2l0RGVzdCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlBERkhpc3RvcnkucHVzaDogXCIgKyBcIlxcXCJcIi5jb25jYXQoZXhwbGljaXREZXN0LCBcIlxcXCIgaXMgbm90IGEgdmFsaWQgZXhwbGljaXREZXN0IHBhcmFtZXRlci5cIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcihwYWdlTnVtYmVyKSAmJiBwYWdlTnVtYmVyID4gMCAmJiBwYWdlTnVtYmVyIDw9IHRoaXMubGlua1NlcnZpY2UucGFnZXNDb3VudCkpIHtcbiAgICAgICAgaWYgKHBhZ2VOdW1iZXIgIT09IG51bGwgfHwgdGhpcy5fZGVzdGluYXRpb24pIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUERGSGlzdG9yeS5wdXNoOiBcIiArIFwiXFxcIlwiLmNvbmNhdChwYWdlTnVtYmVyLCBcIlxcXCIgaXMgbm90IGEgdmFsaWQgcGFnZU51bWJlciBwYXJhbWV0ZXIuXCIpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGhhc2ggPSBuYW1lZERlc3QgfHwgSlNPTi5zdHJpbmdpZnkoZXhwbGljaXREZXN0KTtcblxuICAgICAgaWYgKCFoYXNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGZvcmNlUmVwbGFjZSA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5fZGVzdGluYXRpb24gJiYgKGlzRGVzdEhhc2hlc0VxdWFsKHRoaXMuX2Rlc3RpbmF0aW9uLmhhc2gsIGhhc2gpIHx8IGlzRGVzdEFycmF5c0VxdWFsKHRoaXMuX2Rlc3RpbmF0aW9uLmRlc3QsIGV4cGxpY2l0RGVzdCkpKSB7XG4gICAgICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvbi5wYWdlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yY2VSZXBsYWNlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcyAmJiAhZm9yY2VSZXBsYWNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKHtcbiAgICAgICAgZGVzdDogZXhwbGljaXREZXN0LFxuICAgICAgICBoYXNoOiBoYXNoLFxuICAgICAgICBwYWdlOiBwYWdlTnVtYmVyLFxuICAgICAgICByb3RhdGlvbjogdGhpcy5saW5rU2VydmljZS5yb3RhdGlvblxuICAgICAgfSwgZm9yY2VSZXBsYWNlKTtcblxuICAgICAgaWYgKCF0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLl9wb3BTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInB1c2hDdXJyZW50UG9zaXRpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHVzaEN1cnJlbnRQb3NpdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQgfHwgdGhpcy5fcG9wU3RhdGVJblByb2dyZXNzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdHJ5UHVzaEN1cnJlbnRQb3NpdGlvbigpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJiYWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJhY2soKSB7XG4gICAgICBpZiAoIXRoaXMuX2luaXRpYWxpemVkIHx8IHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGF0ZSA9IHdpbmRvdy5oaXN0b3J5LnN0YXRlO1xuXG4gICAgICBpZiAodGhpcy5faXNWYWxpZFN0YXRlKHN0YXRlKSAmJiBzdGF0ZS51aWQgPiAwKSB7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LmJhY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9yd2FyZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3J3YXJkKCkge1xuICAgICAgaWYgKCF0aGlzLl9pbml0aWFsaXplZCB8fCB0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5zdGF0ZTtcblxuICAgICAgaWYgKHRoaXMuX2lzVmFsaWRTdGF0ZShzdGF0ZSkgJiYgc3RhdGUudWlkIDwgdGhpcy5fbWF4VWlkKSB7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LmZvcndhcmQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3B1c2hPclJlcGxhY2VTdGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfcHVzaE9yUmVwbGFjZVN0YXRlKGRlc3RpbmF0aW9uKSB7XG4gICAgICB2YXIgZm9yY2VSZXBsYWNlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICAgIHZhciBzaG91bGRSZXBsYWNlID0gZm9yY2VSZXBsYWNlIHx8ICF0aGlzLl9kZXN0aW5hdGlvbjtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IHtcbiAgICAgICAgZmluZ2VycHJpbnQ6IHRoaXMuX2ZpbmdlcnByaW50LFxuICAgICAgICB1aWQ6IHNob3VsZFJlcGxhY2UgPyB0aGlzLl91aWQgOiB0aGlzLl91aWQgKyAxLFxuICAgICAgICBkZXN0aW5hdGlvbjogZGVzdGluYXRpb25cbiAgICAgIH07XG5cbiAgICAgIHRoaXMuX3VwZGF0ZUludGVybmFsU3RhdGUoZGVzdGluYXRpb24sIG5ld1N0YXRlLnVpZCk7XG5cbiAgICAgIHZhciBuZXdVcmw7XG5cbiAgICAgIGlmICh0aGlzLl91cGRhdGVVcmwgJiYgZGVzdGluYXRpb24gJiYgZGVzdGluYXRpb24uaGFzaCkge1xuICAgICAgICB2YXIgYmFzZVVybCA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuc3BsaXQoXCIjXCIpWzBdO1xuXG4gICAgICAgIGlmICghYmFzZVVybC5zdGFydHNXaXRoKFwiZmlsZTovL1wiKSkge1xuICAgICAgICAgIG5ld1VybCA9IFwiXCIuY29uY2F0KGJhc2VVcmwsIFwiI1wiKS5jb25jYXQoZGVzdGluYXRpb24uaGFzaCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFJlcGxhY2UpIHtcbiAgICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG5ld1N0YXRlLCBcIlwiLCBuZXdVcmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbWF4VWlkID0gdGhpcy5fdWlkO1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobmV3U3RhdGUsIFwiXCIsIG5ld1VybCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl90cnlQdXNoQ3VycmVudFBvc2l0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF90cnlQdXNoQ3VycmVudFBvc2l0aW9uKCkge1xuICAgICAgdmFyIHRlbXBvcmFyeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG5cbiAgICAgIGlmICghdGhpcy5fcG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLl9wb3NpdGlvbjtcblxuICAgICAgaWYgKHRlbXBvcmFyeSkge1xuICAgICAgICBwb3NpdGlvbiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShudWxsKSwgdGhpcy5fcG9zaXRpb24pO1xuICAgICAgICBwb3NpdGlvbi50ZW1wb3JhcnkgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX2Rlc3RpbmF0aW9uKSB7XG4gICAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZShwb3NpdGlvbik7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZGVzdGluYXRpb24udGVtcG9yYXJ5KSB7XG4gICAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZShwb3NpdGlvbiwgdHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fZGVzdGluYXRpb24uaGFzaCA9PT0gcG9zaXRpb24uaGFzaCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5fZGVzdGluYXRpb24ucGFnZSAmJiAoUE9TSVRJT05fVVBEQVRFRF9USFJFU0hPTEQgPD0gMCB8fCB0aGlzLl9udW1Qb3NpdGlvblVwZGF0ZXMgPD0gUE9TSVRJT05fVVBEQVRFRF9USFJFU0hPTEQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGZvcmNlUmVwbGFjZSA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5fZGVzdGluYXRpb24ucGFnZSA+PSBwb3NpdGlvbi5maXJzdCAmJiB0aGlzLl9kZXN0aW5hdGlvbi5wYWdlIDw9IHBvc2l0aW9uLnBhZ2UpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Rlc3RpbmF0aW9uLmRlc3QgfHwgIXRoaXMuX2Rlc3RpbmF0aW9uLmZpcnN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yY2VSZXBsYWNlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcHVzaE9yUmVwbGFjZVN0YXRlKHBvc2l0aW9uLCBmb3JjZVJlcGxhY2UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfaXNWYWxpZFN0YXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9pc1ZhbGlkU3RhdGUoc3RhdGUpIHtcbiAgICAgIHZhciBjaGVja1JlbG9hZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUuZmluZ2VycHJpbnQgIT09IHRoaXMuX2ZpbmdlcnByaW50KSB7XG4gICAgICAgIGlmIChjaGVja1JlbG9hZCkge1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RhdGUuZmluZ2VycHJpbnQgIT09IFwic3RyaW5nXCIgfHwgc3RhdGUuZmluZ2VycHJpbnQubGVuZ3RoICE9PSB0aGlzLl9maW5nZXJwcmludC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3BlcmZvcm1hbmNlJGdldEVudHJpID0gcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZShcIm5hdmlnYXRpb25cIiksXG4gICAgICAgICAgICAgIF9wZXJmb3JtYW5jZSRnZXRFbnRyaTIgPSBfc2xpY2VkVG9BcnJheShfcGVyZm9ybWFuY2UkZ2V0RW50cmksIDEpLFxuICAgICAgICAgICAgICBwZXJmRW50cnkgPSBfcGVyZm9ybWFuY2UkZ2V0RW50cmkyWzBdO1xuXG4gICAgICAgICAgaWYgKCFwZXJmRW50cnkgfHwgcGVyZkVudHJ5LnR5cGUgIT09IFwicmVsb2FkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihzdGF0ZS51aWQpIHx8IHN0YXRlLnVpZCA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUuZGVzdGluYXRpb24gPT09IG51bGwgfHwgX3R5cGVvZihzdGF0ZS5kZXN0aW5hdGlvbikgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3VwZGF0ZUludGVybmFsU3RhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZUludGVybmFsU3RhdGUoZGVzdGluYXRpb24sIHVpZCkge1xuICAgICAgdmFyIHJlbW92ZVRlbXBvcmFyeSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG5cbiAgICAgIGlmICh0aGlzLl91cGRhdGVWaWV3YXJlYVRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW1vdmVUZW1wb3JhcnkgJiYgZGVzdGluYXRpb24gJiYgZGVzdGluYXRpb24udGVtcG9yYXJ5KSB7XG4gICAgICAgIGRlbGV0ZSBkZXN0aW5hdGlvbi50ZW1wb3Jhcnk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2Rlc3RpbmF0aW9uID0gZGVzdGluYXRpb247XG4gICAgICB0aGlzLl91aWQgPSB1aWQ7XG4gICAgICB0aGlzLl9udW1Qb3NpdGlvblVwZGF0ZXMgPSAwO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfcGFyc2VDdXJyZW50SGFzaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfcGFyc2VDdXJyZW50SGFzaCgpIHtcbiAgICAgIHZhciBjaGVja05hbWVkZGVzdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZmFsc2U7XG4gICAgICB2YXIgaGFzaCA9IHVuZXNjYXBlKGdldEN1cnJlbnRIYXNoKCkpLnN1YnN0cmluZygxKTtcbiAgICAgIHZhciBwYXJhbXMgPSAoMCwgX3VpX3V0aWxzLnBhcnNlUXVlcnlTdHJpbmcpKGhhc2gpO1xuICAgICAgdmFyIG5hbWVkZGVzdCA9IHBhcmFtcy5uYW1lZGRlc3QgfHwgXCJcIjtcbiAgICAgIHZhciBwYWdlID0gcGFyYW1zLnBhZ2UgfCAwO1xuXG4gICAgICBpZiAoIShOdW1iZXIuaXNJbnRlZ2VyKHBhZ2UpICYmIHBhZ2UgPiAwICYmIHBhZ2UgPD0gdGhpcy5saW5rU2VydmljZS5wYWdlc0NvdW50KSB8fCBjaGVja05hbWVkZGVzdCAmJiBuYW1lZGRlc3QubGVuZ3RoID4gMCkge1xuICAgICAgICBwYWdlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGFzaDogaGFzaCxcbiAgICAgICAgcGFnZTogcGFnZSxcbiAgICAgICAgcm90YXRpb246IHRoaXMubGlua1NlcnZpY2Uucm90YXRpb25cbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVWaWV3YXJlYVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdXBkYXRlVmlld2FyZWEoX3JlZjQpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgbG9jYXRpb24gPSBfcmVmNC5sb2NhdGlvbjtcblxuICAgICAgaWYgKHRoaXMuX3VwZGF0ZVZpZXdhcmVhVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcG9zaXRpb24gPSB7XG4gICAgICAgIGhhc2g6IHRoaXMuX2lzVmlld2VySW5QcmVzZW50YXRpb25Nb2RlID8gXCJwYWdlPVwiLmNvbmNhdChsb2NhdGlvbi5wYWdlTnVtYmVyKSA6IGxvY2F0aW9uLnBkZk9wZW5QYXJhbXMuc3Vic3RyaW5nKDEpLFxuICAgICAgICBwYWdlOiB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UsXG4gICAgICAgIGZpcnN0OiBsb2NhdGlvbi5wYWdlTnVtYmVyLFxuICAgICAgICByb3RhdGlvbjogbG9jYXRpb24ucm90YXRpb25cbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLl9wb3BTdGF0ZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoUE9TSVRJT05fVVBEQVRFRF9USFJFU0hPTEQgPiAwICYmIHRoaXMuX2lzUGFnZXNMb2FkZWQgJiYgdGhpcy5fZGVzdGluYXRpb24gJiYgIXRoaXMuX2Rlc3RpbmF0aW9uLnBhZ2UpIHtcbiAgICAgICAgdGhpcy5fbnVtUG9zaXRpb25VcGRhdGVzKys7XG4gICAgICB9XG5cbiAgICAgIGlmIChVUERBVEVfVklFV0FSRUFfVElNRU9VVCA+IDApIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFfdGhpczMuX3BvcFN0YXRlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgX3RoaXMzLl90cnlQdXNoQ3VycmVudFBvc2l0aW9uKHRydWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF90aGlzMy5fdXBkYXRlVmlld2FyZWFUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgfSwgVVBEQVRFX1ZJRVdBUkVBX1RJTUVPVVQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfcG9wU3RhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3BvcFN0YXRlKF9yZWY1KSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdmFyIHN0YXRlID0gX3JlZjUuc3RhdGU7XG4gICAgICB2YXIgbmV3SGFzaCA9IGdldEN1cnJlbnRIYXNoKCksXG4gICAgICAgICAgaGFzaENoYW5nZWQgPSB0aGlzLl9jdXJyZW50SGFzaCAhPT0gbmV3SGFzaDtcbiAgICAgIHRoaXMuX2N1cnJlbnRIYXNoID0gbmV3SGFzaDtcblxuICAgICAgaWYgKCFzdGF0ZSkge1xuICAgICAgICB0aGlzLl91aWQrKztcblxuICAgICAgICB2YXIgX3RoaXMkX3BhcnNlQ3VycmVudEhhMiA9IHRoaXMuX3BhcnNlQ3VycmVudEhhc2goKSxcbiAgICAgICAgICAgIGhhc2ggPSBfdGhpcyRfcGFyc2VDdXJyZW50SGEyLmhhc2gsXG4gICAgICAgICAgICBwYWdlID0gX3RoaXMkX3BhcnNlQ3VycmVudEhhMi5wYWdlLFxuICAgICAgICAgICAgcm90YXRpb24gPSBfdGhpcyRfcGFyc2VDdXJyZW50SGEyLnJvdGF0aW9uO1xuXG4gICAgICAgIHRoaXMuX3B1c2hPclJlcGxhY2VTdGF0ZSh7XG4gICAgICAgICAgaGFzaDogaGFzaCxcbiAgICAgICAgICBwYWdlOiBwYWdlLFxuICAgICAgICAgIHJvdGF0aW9uOiByb3RhdGlvblxuICAgICAgICB9LCB0cnVlKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5faXNWYWxpZFN0YXRlKHN0YXRlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcyA9IHRydWU7XG5cbiAgICAgIGlmIChoYXNoQ2hhbmdlZCkge1xuICAgICAgICB0aGlzLl9ibG9ja0hhc2hDaGFuZ2UrKztcbiAgICAgICAgKDAsIF91aV91dGlscy53YWl0T25FdmVudE9yVGltZW91dCkoe1xuICAgICAgICAgIHRhcmdldDogd2luZG93LFxuICAgICAgICAgIG5hbWU6IFwiaGFzaGNoYW5nZVwiLFxuICAgICAgICAgIGRlbGF5OiBIQVNIX0NIQU5HRV9USU1FT1VUXG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzNC5fYmxvY2tIYXNoQ2hhbmdlLS07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGVzdGluYXRpb24gPSBzdGF0ZS5kZXN0aW5hdGlvbjtcblxuICAgICAgdGhpcy5fdXBkYXRlSW50ZXJuYWxTdGF0ZShkZXN0aW5hdGlvbiwgc3RhdGUudWlkLCB0cnVlKTtcblxuICAgICAgaWYgKHRoaXMuX3VpZCA+IHRoaXMuX21heFVpZCkge1xuICAgICAgICB0aGlzLl9tYXhVaWQgPSB0aGlzLl91aWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICgoMCwgX3VpX3V0aWxzLmlzVmFsaWRSb3RhdGlvbikoZGVzdGluYXRpb24ucm90YXRpb24pKSB7XG4gICAgICAgIHRoaXMubGlua1NlcnZpY2Uucm90YXRpb24gPSBkZXN0aW5hdGlvbi5yb3RhdGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlc3RpbmF0aW9uLmRlc3QpIHtcbiAgICAgICAgdGhpcy5saW5rU2VydmljZS5uYXZpZ2F0ZVRvKGRlc3RpbmF0aW9uLmRlc3QpO1xuICAgICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5oYXNoKSB7XG4gICAgICAgIHRoaXMubGlua1NlcnZpY2Uuc2V0SGFzaChkZXN0aW5hdGlvbi5oYXNoKTtcbiAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24ucGFnZSkge1xuICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgPSBkZXN0aW5hdGlvbi5wYWdlO1xuICAgICAgfVxuXG4gICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXM0Ll9wb3BTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfcGFnZUhpZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3BhZ2VIaWRlKCkge1xuICAgICAgaWYgKCF0aGlzLl9kZXN0aW5hdGlvbiB8fCB0aGlzLl9kZXN0aW5hdGlvbi50ZW1wb3JhcnkpIHtcbiAgICAgICAgdGhpcy5fdHJ5UHVzaEN1cnJlbnRQb3NpdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfYmluZEV2ZW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfYmluZEV2ZW50cygpIHtcbiAgICAgIGlmICh0aGlzLl9ib3VuZEV2ZW50cykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2JvdW5kRXZlbnRzID0ge1xuICAgICAgICB1cGRhdGVWaWV3YXJlYTogdGhpcy5fdXBkYXRlVmlld2FyZWEuYmluZCh0aGlzKSxcbiAgICAgICAgcG9wU3RhdGU6IHRoaXMuX3BvcFN0YXRlLmJpbmQodGhpcyksXG4gICAgICAgIHBhZ2VIaWRlOiB0aGlzLl9wYWdlSGlkZS5iaW5kKHRoaXMpXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmV2ZW50QnVzLl9vbihcInVwZGF0ZXZpZXdhcmVhXCIsIHRoaXMuX2JvdW5kRXZlbnRzLnVwZGF0ZVZpZXdhcmVhKTtcblxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCB0aGlzLl9ib3VuZEV2ZW50cy5wb3BTdGF0ZSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIHRoaXMuX2JvdW5kRXZlbnRzLnBhZ2VIaWRlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3VuYmluZEV2ZW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfdW5iaW5kRXZlbnRzKCkge1xuICAgICAgaWYgKCF0aGlzLl9ib3VuZEV2ZW50cykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXZlbnRCdXMuX29mZihcInVwZGF0ZXZpZXdhcmVhXCIsIHRoaXMuX2JvdW5kRXZlbnRzLnVwZGF0ZVZpZXdhcmVhKTtcblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCB0aGlzLl9ib3VuZEV2ZW50cy5wb3BTdGF0ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBhZ2VoaWRlXCIsIHRoaXMuX2JvdW5kRXZlbnRzLnBhZ2VIaWRlKTtcbiAgICAgIHRoaXMuX2JvdW5kRXZlbnRzID0gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicG9wU3RhdGVJblByb2dyZXNzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5faW5pdGlhbGl6ZWQgJiYgKHRoaXMuX3BvcFN0YXRlSW5Qcm9ncmVzcyB8fCB0aGlzLl9ibG9ja0hhc2hDaGFuZ2UgPiAwKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdGlhbEJvb2ttYXJrXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5faW5pdGlhbGl6ZWQgPyB0aGlzLl9pbml0aWFsQm9va21hcmsgOiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbml0aWFsUm90YXRpb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXplZCA/IHRoaXMuX2luaXRpYWxSb3RhdGlvbiA6IG51bGw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBERkhpc3Rvcnk7XG59KCk7XG5cbmV4cG9ydHMuUERGSGlzdG9yeSA9IFBERkhpc3Rvcnk7XG5cbmZ1bmN0aW9uIGlzRGVzdEhhc2hlc0VxdWFsKGRlc3RIYXNoLCBwdXNoSGFzaCkge1xuICBpZiAodHlwZW9mIGRlc3RIYXNoICE9PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBwdXNoSGFzaCAhPT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChkZXN0SGFzaCA9PT0gcHVzaEhhc2gpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHZhciBfcGFyc2VRdWVyeVN0cmluZyA9ICgwLCBfdWlfdXRpbHMucGFyc2VRdWVyeVN0cmluZykoZGVzdEhhc2gpLFxuICAgICAgbmFtZWRkZXN0ID0gX3BhcnNlUXVlcnlTdHJpbmcubmFtZWRkZXN0O1xuXG4gIGlmIChuYW1lZGRlc3QgPT09IHB1c2hIYXNoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzRGVzdEFycmF5c0VxdWFsKGZpcnN0RGVzdCwgc2Vjb25kRGVzdCkge1xuICBmdW5jdGlvbiBpc0VudHJ5RXF1YWwoZmlyc3QsIHNlY29uZCkge1xuICAgIGlmIChfdHlwZW9mKGZpcnN0KSAhPT0gX3R5cGVvZihzZWNvbmQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmlyc3QpIHx8IEFycmF5LmlzQXJyYXkoc2Vjb25kKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChmaXJzdCAhPT0gbnVsbCAmJiBfdHlwZW9mKGZpcnN0KSA9PT0gXCJvYmplY3RcIiAmJiBzZWNvbmQgIT09IG51bGwpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhmaXJzdCkubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhzZWNvbmQpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBmaXJzdCkge1xuICAgICAgICBpZiAoIWlzRW50cnlFcXVhbChmaXJzdFtrZXldLCBzZWNvbmRba2V5XSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpcnN0ID09PSBzZWNvbmQgfHwgTnVtYmVyLmlzTmFOKGZpcnN0KSAmJiBOdW1iZXIuaXNOYU4oc2Vjb25kKTtcbiAgfVxuXG4gIGlmICghKEFycmF5LmlzQXJyYXkoZmlyc3REZXN0KSAmJiBBcnJheS5pc0FycmF5KHNlY29uZERlc3QpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChmaXJzdERlc3QubGVuZ3RoICE9PSBzZWNvbmREZXN0Lmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCBpaSA9IGZpcnN0RGVzdC5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgaWYgKCFpc0VudHJ5RXF1YWwoZmlyc3REZXN0W2ldLCBzZWNvbmREZXN0W2ldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKioqLyB9KSxcbi8qIDE2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlBERlBhZ2VWaWV3ID0gdm9pZCAwO1xuXG52YXIgX3JlZ2VuZXJhdG9yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfX3dfcGRmanNfcmVxdWlyZV9fKDQpKTtcblxudmFyIF91aV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7XG5cbnZhciBfcGRmanNMaWIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpO1xuXG52YXIgX3BkZl9yZW5kZXJpbmdfcXVldWUgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE3KTtcblxudmFyIF92aWV3ZXJfY29tcGF0aWJpbGl0eSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTApO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBcImRlZmF1bHRcIjogb2JqIH07IH1cblxuZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykgeyB0cnkgeyB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7IHZhciB2YWx1ZSA9IGluZm8udmFsdWU7IH0gY2F0Y2ggKGVycm9yKSB7IHJlamVjdChlcnJvcik7IHJldHVybjsgfSBpZiAoaW5mby5kb25lKSB7IHJlc29sdmUodmFsdWUpOyB9IGVsc2UgeyBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7IH0gfVxuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyB2YXIgc2VsZiA9IHRoaXMsIGFyZ3MgPSBhcmd1bWVudHM7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTsgZnVuY3Rpb24gX25leHQodmFsdWUpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpOyB9IGZ1bmN0aW9uIF90aHJvdyhlcnIpIHsgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7IH0gX25leHQodW5kZWZpbmVkKTsgfSk7IH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG52YXIgTUFYX0NBTlZBU19QSVhFTFMgPSBfdmlld2VyX2NvbXBhdGliaWxpdHkudmlld2VyQ29tcGF0aWJpbGl0eVBhcmFtcy5tYXhDYW52YXNQaXhlbHMgfHwgMTY3NzcyMTY7XG5cbnZhciBQREZQYWdlVmlldyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBERlBhZ2VWaWV3KG9wdGlvbnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGUGFnZVZpZXcpO1xuXG4gICAgdmFyIGNvbnRhaW5lciA9IG9wdGlvbnMuY29udGFpbmVyO1xuICAgIHZhciBkZWZhdWx0Vmlld3BvcnQgPSBvcHRpb25zLmRlZmF1bHRWaWV3cG9ydDtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZDtcbiAgICB0aGlzLnJlbmRlcmluZ0lkID0gXCJwYWdlXCIgKyB0aGlzLmlkO1xuICAgIHRoaXMucGRmUGFnZSA9IG51bGw7XG4gICAgdGhpcy5wYWdlTGFiZWwgPSBudWxsO1xuICAgIHRoaXMucm90YXRpb24gPSAwO1xuICAgIHRoaXMuc2NhbGUgPSBvcHRpb25zLnNjYWxlIHx8IF91aV91dGlscy5ERUZBVUxUX1NDQUxFO1xuICAgIHRoaXMudmlld3BvcnQgPSBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgdGhpcy5wZGZQYWdlUm90YXRlID0gZGVmYXVsdFZpZXdwb3J0LnJvdGF0aW9uO1xuICAgIHRoaXMuX2Fubm90YXRpb25TdG9yYWdlID0gb3B0aW9ucy5hbm5vdGF0aW9uU3RvcmFnZSB8fCBudWxsO1xuICAgIHRoaXMuX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBvcHRpb25zLm9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgfHwgbnVsbDtcbiAgICB0aGlzLmhhc1Jlc3RyaWN0ZWRTY2FsaW5nID0gZmFsc2U7XG4gICAgdGhpcy50ZXh0TGF5ZXJNb2RlID0gTnVtYmVyLmlzSW50ZWdlcihvcHRpb25zLnRleHRMYXllck1vZGUpID8gb3B0aW9ucy50ZXh0TGF5ZXJNb2RlIDogX3VpX3V0aWxzLlRleHRMYXllck1vZGUuRU5BQkxFO1xuICAgIHRoaXMuaW1hZ2VSZXNvdXJjZXNQYXRoID0gb3B0aW9ucy5pbWFnZVJlc291cmNlc1BhdGggfHwgXCJcIjtcbiAgICB0aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXMgPSB0eXBlb2Ygb3B0aW9ucy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID09PSBcImJvb2xlYW5cIiA/IG9wdGlvbnMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA6IHRydWU7XG4gICAgdGhpcy51c2VPbmx5Q3NzWm9vbSA9IG9wdGlvbnMudXNlT25seUNzc1pvb20gfHwgZmFsc2U7XG4gICAgdGhpcy5tYXhDYW52YXNQaXhlbHMgPSBvcHRpb25zLm1heENhbnZhc1BpeGVscyB8fCBNQVhfQ0FOVkFTX1BJWEVMUztcbiAgICB0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcbiAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlID0gb3B0aW9ucy5yZW5kZXJpbmdRdWV1ZTtcbiAgICB0aGlzLnRleHRMYXllckZhY3RvcnkgPSBvcHRpb25zLnRleHRMYXllckZhY3Rvcnk7XG4gICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXJGYWN0b3J5ID0gb3B0aW9ucy5hbm5vdGF0aW9uTGF5ZXJGYWN0b3J5O1xuICAgIHRoaXMucmVuZGVyZXIgPSBvcHRpb25zLnJlbmRlcmVyIHx8IF91aV91dGlscy5SZW5kZXJlclR5cGUuQ0FOVkFTO1xuICAgIHRoaXMuZW5hYmxlV2ViR0wgPSBvcHRpb25zLmVuYWJsZVdlYkdMIHx8IGZhbHNlO1xuICAgIHRoaXMubDEwbiA9IG9wdGlvbnMubDEwbiB8fCBfdWlfdXRpbHMuTnVsbEwxMG47XG4gICAgdGhpcy5wYWludFRhc2sgPSBudWxsO1xuICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLklOSVRJQUw7XG4gICAgdGhpcy5yZXN1bWUgPSBudWxsO1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyID0gbnVsbDtcbiAgICB0aGlzLnRleHRMYXllciA9IG51bGw7XG4gICAgdGhpcy56b29tTGF5ZXIgPSBudWxsO1xuICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGRpdi5jbGFzc05hbWUgPSBcInBhZ2VcIjtcbiAgICBkaXYuc3R5bGUud2lkdGggPSBNYXRoLmZsb29yKHRoaXMudmlld3BvcnQud2lkdGgpICsgXCJweFwiO1xuICAgIGRpdi5zdHlsZS5oZWlnaHQgPSBNYXRoLmZsb29yKHRoaXMudmlld3BvcnQuaGVpZ2h0KSArIFwicHhcIjtcbiAgICBkaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1wYWdlLW51bWJlclwiLCB0aGlzLmlkKTtcbiAgICB0aGlzLmRpdiA9IGRpdjtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQREZQYWdlVmlldywgW3tcbiAgICBrZXk6IFwic2V0UGRmUGFnZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQZGZQYWdlKHBkZlBhZ2UpIHtcbiAgICAgIHRoaXMucGRmUGFnZSA9IHBkZlBhZ2U7XG4gICAgICB0aGlzLnBkZlBhZ2VSb3RhdGUgPSBwZGZQYWdlLnJvdGF0ZTtcbiAgICAgIHZhciB0b3RhbFJvdGF0aW9uID0gKHRoaXMucm90YXRpb24gKyB0aGlzLnBkZlBhZ2VSb3RhdGUpICUgMzYwO1xuICAgICAgdGhpcy52aWV3cG9ydCA9IHBkZlBhZ2UuZ2V0Vmlld3BvcnQoe1xuICAgICAgICBzY2FsZTogdGhpcy5zY2FsZSAqIF91aV91dGlscy5DU1NfVU5JVFMsXG4gICAgICAgIHJvdGF0aW9uOiB0b3RhbFJvdGF0aW9uXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc3RhdHMgPSBwZGZQYWdlLnN0YXRzO1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZXN0cm95XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLnJlc2V0KCk7XG5cbiAgICAgIGlmICh0aGlzLnBkZlBhZ2UpIHtcbiAgICAgICAgdGhpcy5wZGZQYWdlLmNsZWFudXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3JlbmRlckFubm90YXRpb25MYXllclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3JlbmRlckFubm90YXRpb25MYXllcjIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL19yZWdlbmVyYXRvcltcImRlZmF1bHRcIl0ubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkge1xuICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JbXCJkZWZhdWx0XCJdLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSAxO1xuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA0O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFubm90YXRpb25MYXllci5yZW5kZXIodGhpcy52aWV3cG9ydCwgXCJkaXNwbGF5XCIpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gOTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQucHJldiA9IDY7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQudDAgPSBfY29udGV4dFtcImNhdGNoXCJdKDEpO1xuICAgICAgICAgICAgICAgIGVycm9yID0gX2NvbnRleHQudDA7XG5cbiAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgIF9jb250ZXh0LnByZXYgPSA5O1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJhbm5vdGF0aW9ubGF5ZXJyZW5kZXJlZFwiLCB7XG4gICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmZpbmlzaCg5KTtcblxuICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUsIHRoaXMsIFtbMSwgNiwgOSwgMTJdXSk7XG4gICAgICB9KSk7XG5cbiAgICAgIGZ1bmN0aW9uIF9yZW5kZXJBbm5vdGF0aW9uTGF5ZXIoKSB7XG4gICAgICAgIHJldHVybiBfcmVuZGVyQW5ub3RhdGlvbkxheWVyMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3JlbmRlckFubm90YXRpb25MYXllcjtcbiAgICB9KClcbiAgfSwge1xuICAgIGtleTogXCJfcmVzZXRab29tTGF5ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3Jlc2V0Wm9vbUxheWVyKCkge1xuICAgICAgdmFyIHJlbW92ZUZyb21ET00gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuXG4gICAgICBpZiAoIXRoaXMuem9vbUxheWVyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHpvb21MYXllckNhbnZhcyA9IHRoaXMuem9vbUxheWVyLmZpcnN0Q2hpbGQ7XG4gICAgICB0aGlzLnBhaW50ZWRWaWV3cG9ydE1hcFtcImRlbGV0ZVwiXSh6b29tTGF5ZXJDYW52YXMpO1xuICAgICAgem9vbUxheWVyQ2FudmFzLndpZHRoID0gMDtcbiAgICAgIHpvb21MYXllckNhbnZhcy5oZWlnaHQgPSAwO1xuXG4gICAgICBpZiAocmVtb3ZlRnJvbURPTSkge1xuICAgICAgICB0aGlzLnpvb21MYXllci5yZW1vdmUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy56b29tTGF5ZXIgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIHZhciBrZWVwWm9vbUxheWVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICAgIHZhciBrZWVwQW5ub3RhdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgICAgdGhpcy5jYW5jZWxSZW5kZXJpbmcoa2VlcEFubm90YXRpb25zKTtcbiAgICAgIHRoaXMucmVuZGVyaW5nU3RhdGUgPSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuSU5JVElBTDtcbiAgICAgIHZhciBkaXYgPSB0aGlzLmRpdjtcbiAgICAgIGRpdi5zdHlsZS53aWR0aCA9IE1hdGguZmxvb3IodGhpcy52aWV3cG9ydC53aWR0aCkgKyBcInB4XCI7XG4gICAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gTWF0aC5mbG9vcih0aGlzLnZpZXdwb3J0LmhlaWdodCkgKyBcInB4XCI7XG4gICAgICB2YXIgY2hpbGROb2RlcyA9IGRpdi5jaGlsZE5vZGVzO1xuICAgICAgdmFyIGN1cnJlbnRab29tTGF5ZXJOb2RlID0ga2VlcFpvb21MYXllciAmJiB0aGlzLnpvb21MYXllciB8fCBudWxsO1xuICAgICAgdmFyIGN1cnJlbnRBbm5vdGF0aW9uTm9kZSA9IGtlZXBBbm5vdGF0aW9ucyAmJiB0aGlzLmFubm90YXRpb25MYXllciAmJiB0aGlzLmFubm90YXRpb25MYXllci5kaXYgfHwgbnVsbDtcblxuICAgICAgZm9yICh2YXIgaSA9IGNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgdmFyIG5vZGUgPSBjaGlsZE5vZGVzW2ldO1xuXG4gICAgICAgIGlmIChjdXJyZW50Wm9vbUxheWVyTm9kZSA9PT0gbm9kZSB8fCBjdXJyZW50QW5ub3RhdGlvbk5vZGUgPT09IG5vZGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpdi5yZW1vdmVDaGlsZChub2RlKTtcbiAgICAgIH1cblxuICAgICAgZGl2LnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtbG9hZGVkXCIpO1xuXG4gICAgICBpZiAoY3VycmVudEFubm90YXRpb25Ob2RlKSB7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyLmhpZGUoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hbm5vdGF0aW9uTGF5ZXIpIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuY2FuY2VsKCk7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjdXJyZW50Wm9vbUxheWVyTm9kZSkge1xuICAgICAgICBpZiAodGhpcy5jYW52YXMpIHtcbiAgICAgICAgICB0aGlzLnBhaW50ZWRWaWV3cG9ydE1hcFtcImRlbGV0ZVwiXSh0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSAwO1xuICAgICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IDA7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuY2FudmFzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmVzZXRab29tTGF5ZXIoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3ZnKSB7XG4gICAgICAgIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwW1wiZGVsZXRlXCJdKHRoaXMuc3ZnKTtcbiAgICAgICAgZGVsZXRlIHRoaXMuc3ZnO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvYWRpbmdJY29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIHRoaXMubG9hZGluZ0ljb25EaXYuY2xhc3NOYW1lID0gXCJsb2FkaW5nSWNvblwiO1xuICAgICAgZGl2LmFwcGVuZENoaWxkKHRoaXMubG9hZGluZ0ljb25EaXYpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKHNjYWxlLCByb3RhdGlvbikge1xuICAgICAgdmFyIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG4gICAgICB0aGlzLnNjYWxlID0gc2NhbGUgfHwgdGhpcy5zY2FsZTtcblxuICAgICAgaWYgKHR5cGVvZiByb3RhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB0aGlzLnJvdGF0aW9uID0gcm90YXRpb247XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICB0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlID0gb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHRvdGFsUm90YXRpb24gPSAodGhpcy5yb3RhdGlvbiArIHRoaXMucGRmUGFnZVJvdGF0ZSkgJSAzNjA7XG4gICAgICB0aGlzLnZpZXdwb3J0ID0gdGhpcy52aWV3cG9ydC5jbG9uZSh7XG4gICAgICAgIHNjYWxlOiB0aGlzLnNjYWxlICogX3VpX3V0aWxzLkNTU19VTklUUyxcbiAgICAgICAgcm90YXRpb246IHRvdGFsUm90YXRpb25cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5zdmcpIHtcbiAgICAgICAgdGhpcy5jc3NUcmFuc2Zvcm0odGhpcy5zdmcsIHRydWUpO1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKFwicGFnZXJlbmRlcmVkXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgcGFnZU51bWJlcjogdGhpcy5pZCxcbiAgICAgICAgICBjc3NUcmFuc2Zvcm06IHRydWUsXG4gICAgICAgICAgdGltZXN0YW1wOiBwZXJmb3JtYW5jZS5ub3coKVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNTY2FsaW5nUmVzdHJpY3RlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5tYXhDYW52YXNQaXhlbHMgPiAwKSB7XG4gICAgICAgIHZhciBvdXRwdXRTY2FsZSA9IHRoaXMub3V0cHV0U2NhbGU7XG5cbiAgICAgICAgaWYgKChNYXRoLmZsb29yKHRoaXMudmlld3BvcnQud2lkdGgpICogb3V0cHV0U2NhbGUuc3ggfCAwKSAqIChNYXRoLmZsb29yKHRoaXMudmlld3BvcnQuaGVpZ2h0KSAqIG91dHB1dFNjYWxlLnN5IHwgMCkgPiB0aGlzLm1heENhbnZhc1BpeGVscykge1xuICAgICAgICAgIGlzU2NhbGluZ1Jlc3RyaWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNhbnZhcykge1xuICAgICAgICBpZiAodGhpcy51c2VPbmx5Q3NzWm9vbSB8fCB0aGlzLmhhc1Jlc3RyaWN0ZWRTY2FsaW5nICYmIGlzU2NhbGluZ1Jlc3RyaWN0ZWQpIHtcbiAgICAgICAgICB0aGlzLmNzc1RyYW5zZm9ybSh0aGlzLmNhbnZhcywgdHJ1ZSk7XG4gICAgICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInBhZ2VyZW5kZXJlZFwiLCB7XG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgICAgICBwYWdlTnVtYmVyOiB0aGlzLmlkLFxuICAgICAgICAgICAgY3NzVHJhbnNmb3JtOiB0cnVlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBwZXJmb3JtYW5jZS5ub3coKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy56b29tTGF5ZXIgJiYgIXRoaXMuY2FudmFzLmhhc0F0dHJpYnV0ZShcImhpZGRlblwiKSkge1xuICAgICAgICAgIHRoaXMuem9vbUxheWVyID0gdGhpcy5jYW52YXMucGFyZW50Tm9kZTtcbiAgICAgICAgICB0aGlzLnpvb21MYXllci5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy56b29tTGF5ZXIpIHtcbiAgICAgICAgdGhpcy5jc3NUcmFuc2Zvcm0odGhpcy56b29tTGF5ZXIuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVzZXQodHJ1ZSwgdHJ1ZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNhbmNlbFJlbmRlcmluZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjYW5jZWxSZW5kZXJpbmcoKSB7XG4gICAgICB2YXIga2VlcEFubm90YXRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMucGFpbnRUYXNrKSB7XG4gICAgICAgIHRoaXMucGFpbnRUYXNrLmNhbmNlbCgpO1xuICAgICAgICB0aGlzLnBhaW50VGFzayA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVzdW1lID0gbnVsbDtcblxuICAgICAgaWYgKHRoaXMudGV4dExheWVyKSB7XG4gICAgICAgIHRoaXMudGV4dExheWVyLmNhbmNlbCgpO1xuICAgICAgICB0aGlzLnRleHRMYXllciA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICgha2VlcEFubm90YXRpb25zICYmIHRoaXMuYW5ub3RhdGlvbkxheWVyKSB7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkxheWVyLmNhbmNlbCgpO1xuICAgICAgICB0aGlzLmFubm90YXRpb25MYXllciA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNzc1RyYW5zZm9ybVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjc3NUcmFuc2Zvcm0odGFyZ2V0KSB7XG4gICAgICB2YXIgcmVkcmF3QW5ub3RhdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgICAgdmFyIHdpZHRoID0gdGhpcy52aWV3cG9ydC53aWR0aDtcbiAgICAgIHZhciBoZWlnaHQgPSB0aGlzLnZpZXdwb3J0LmhlaWdodDtcbiAgICAgIHZhciBkaXYgPSB0aGlzLmRpdjtcbiAgICAgIHRhcmdldC5zdHlsZS53aWR0aCA9IHRhcmdldC5wYXJlbnROb2RlLnN0eWxlLndpZHRoID0gZGl2LnN0eWxlLndpZHRoID0gTWF0aC5mbG9vcih3aWR0aCkgKyBcInB4XCI7XG4gICAgICB0YXJnZXQuc3R5bGUuaGVpZ2h0ID0gdGFyZ2V0LnBhcmVudE5vZGUuc3R5bGUuaGVpZ2h0ID0gZGl2LnN0eWxlLmhlaWdodCA9IE1hdGguZmxvb3IoaGVpZ2h0KSArIFwicHhcIjtcbiAgICAgIHZhciByZWxhdGl2ZVJvdGF0aW9uID0gdGhpcy52aWV3cG9ydC5yb3RhdGlvbiAtIHRoaXMucGFpbnRlZFZpZXdwb3J0TWFwLmdldCh0YXJnZXQpLnJvdGF0aW9uO1xuICAgICAgdmFyIGFic1JvdGF0aW9uID0gTWF0aC5hYnMocmVsYXRpdmVSb3RhdGlvbik7XG4gICAgICB2YXIgc2NhbGVYID0gMSxcbiAgICAgICAgICBzY2FsZVkgPSAxO1xuXG4gICAgICBpZiAoYWJzUm90YXRpb24gPT09IDkwIHx8IGFic1JvdGF0aW9uID09PSAyNzApIHtcbiAgICAgICAgc2NhbGVYID0gaGVpZ2h0IC8gd2lkdGg7XG4gICAgICAgIHNjYWxlWSA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICB2YXIgY3NzVHJhbnNmb3JtID0gXCJyb3RhdGUoXCIgKyByZWxhdGl2ZVJvdGF0aW9uICsgXCJkZWcpIFwiICsgXCJzY2FsZShcIiArIHNjYWxlWCArIFwiLFwiICsgc2NhbGVZICsgXCIpXCI7XG4gICAgICB0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gY3NzVHJhbnNmb3JtO1xuXG4gICAgICBpZiAodGhpcy50ZXh0TGF5ZXIpIHtcbiAgICAgICAgdmFyIHRleHRMYXllclZpZXdwb3J0ID0gdGhpcy50ZXh0TGF5ZXIudmlld3BvcnQ7XG4gICAgICAgIHZhciB0ZXh0UmVsYXRpdmVSb3RhdGlvbiA9IHRoaXMudmlld3BvcnQucm90YXRpb24gLSB0ZXh0TGF5ZXJWaWV3cG9ydC5yb3RhdGlvbjtcbiAgICAgICAgdmFyIHRleHRBYnNSb3RhdGlvbiA9IE1hdGguYWJzKHRleHRSZWxhdGl2ZVJvdGF0aW9uKTtcbiAgICAgICAgdmFyIHNjYWxlID0gd2lkdGggLyB0ZXh0TGF5ZXJWaWV3cG9ydC53aWR0aDtcblxuICAgICAgICBpZiAodGV4dEFic1JvdGF0aW9uID09PSA5MCB8fCB0ZXh0QWJzUm90YXRpb24gPT09IDI3MCkge1xuICAgICAgICAgIHNjYWxlID0gd2lkdGggLyB0ZXh0TGF5ZXJWaWV3cG9ydC5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdGV4dExheWVyRGl2ID0gdGhpcy50ZXh0TGF5ZXIudGV4dExheWVyRGl2O1xuICAgICAgICB2YXIgdHJhbnNYLCB0cmFuc1k7XG5cbiAgICAgICAgc3dpdGNoICh0ZXh0QWJzUm90YXRpb24pIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICB0cmFuc1ggPSB0cmFuc1kgPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIDkwOlxuICAgICAgICAgICAgdHJhbnNYID0gMDtcbiAgICAgICAgICAgIHRyYW5zWSA9IFwiLVwiICsgdGV4dExheWVyRGl2LnN0eWxlLmhlaWdodDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxODA6XG4gICAgICAgICAgICB0cmFuc1ggPSBcIi1cIiArIHRleHRMYXllckRpdi5zdHlsZS53aWR0aDtcbiAgICAgICAgICAgIHRyYW5zWSA9IFwiLVwiICsgdGV4dExheWVyRGl2LnN0eWxlLmhlaWdodDtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAyNzA6XG4gICAgICAgICAgICB0cmFuc1ggPSBcIi1cIiArIHRleHRMYXllckRpdi5zdHlsZS53aWR0aDtcbiAgICAgICAgICAgIHRyYW5zWSA9IDA7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQmFkIHJvdGF0aW9uIHZhbHVlLlwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGV4dExheWVyRGl2LnN0eWxlLnRyYW5zZm9ybSA9IFwicm90YXRlKFwiICsgdGV4dEFic1JvdGF0aW9uICsgXCJkZWcpIFwiICsgXCJzY2FsZShcIiArIHNjYWxlICsgXCIsIFwiICsgc2NhbGUgKyBcIikgXCIgKyBcInRyYW5zbGF0ZShcIiArIHRyYW5zWCArIFwiLCBcIiArIHRyYW5zWSArIFwiKVwiO1xuICAgICAgICB0ZXh0TGF5ZXJEaXYuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gXCIwJSAwJVwiO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVkcmF3QW5ub3RhdGlvbnMgJiYgdGhpcy5hbm5vdGF0aW9uTGF5ZXIpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyQW5ub3RhdGlvbkxheWVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFBhZ2VQb2ludFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYWdlUG9pbnQoeCwgeSkge1xuICAgICAgcmV0dXJuIHRoaXMudmlld3BvcnQuY29udmVydFRvUGRmUG9pbnQoeCwgeSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRyYXdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZHJhdygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICh0aGlzLnJlbmRlcmluZ1N0YXRlICE9PSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuSU5JVElBTCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiTXVzdCBiZSBpbiBuZXcgc3RhdGUgYmVmb3JlIGRyYXdpbmdcIik7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGRpdiA9IHRoaXMuZGl2LFxuICAgICAgICAgIHBkZlBhZ2UgPSB0aGlzLnBkZlBhZ2U7XG5cbiAgICAgIGlmICghcGRmUGFnZSkge1xuICAgICAgICB0aGlzLnJlbmRlcmluZ1N0YXRlID0gX3BkZl9yZW5kZXJpbmdfcXVldWUuUmVuZGVyaW5nU3RhdGVzLkZJTklTSEVEO1xuXG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmdJY29uRGl2KSB7XG4gICAgICAgICAgZGl2LnJlbW92ZUNoaWxkKHRoaXMubG9hZGluZ0ljb25EaXYpO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmxvYWRpbmdJY29uRGl2O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcInBkZlBhZ2UgaXMgbm90IGxvYWRlZFwiKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmVuZGVyaW5nU3RhdGUgPSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuUlVOTklORztcbiAgICAgIHZhciBjYW52YXNXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGNhbnZhc1dyYXBwZXIuc3R5bGUud2lkdGggPSBkaXYuc3R5bGUud2lkdGg7XG4gICAgICBjYW52YXNXcmFwcGVyLnN0eWxlLmhlaWdodCA9IGRpdi5zdHlsZS5oZWlnaHQ7XG4gICAgICBjYW52YXNXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJjYW52YXNXcmFwcGVyXCIpO1xuXG4gICAgICBpZiAodGhpcy5hbm5vdGF0aW9uTGF5ZXIgJiYgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuZGl2KSB7XG4gICAgICAgIGRpdi5pbnNlcnRCZWZvcmUoY2FudmFzV3JhcHBlciwgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuZGl2KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpdi5hcHBlbmRDaGlsZChjYW52YXNXcmFwcGVyKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHRleHRMYXllciA9IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLnRleHRMYXllck1vZGUgIT09IF91aV91dGlscy5UZXh0TGF5ZXJNb2RlLkRJU0FCTEUgJiYgdGhpcy50ZXh0TGF5ZXJGYWN0b3J5KSB7XG4gICAgICAgIHZhciB0ZXh0TGF5ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0ZXh0TGF5ZXJEaXYuY2xhc3NOYW1lID0gXCJ0ZXh0TGF5ZXJcIjtcbiAgICAgICAgdGV4dExheWVyRGl2LnN0eWxlLndpZHRoID0gY2FudmFzV3JhcHBlci5zdHlsZS53aWR0aDtcbiAgICAgICAgdGV4dExheWVyRGl2LnN0eWxlLmhlaWdodCA9IGNhbnZhc1dyYXBwZXIuc3R5bGUuaGVpZ2h0O1xuXG4gICAgICAgIGlmICh0aGlzLmFubm90YXRpb25MYXllciAmJiB0aGlzLmFubm90YXRpb25MYXllci5kaXYpIHtcbiAgICAgICAgICBkaXYuaW5zZXJ0QmVmb3JlKHRleHRMYXllckRpdiwgdGhpcy5hbm5vdGF0aW9uTGF5ZXIuZGl2KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQodGV4dExheWVyRGl2KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRleHRMYXllciA9IHRoaXMudGV4dExheWVyRmFjdG9yeS5jcmVhdGVUZXh0TGF5ZXJCdWlsZGVyKHRleHRMYXllckRpdiwgdGhpcy5pZCAtIDEsIHRoaXMudmlld3BvcnQsIHRoaXMudGV4dExheWVyTW9kZSA9PT0gX3VpX3V0aWxzLlRleHRMYXllck1vZGUuRU5BQkxFX0VOSEFOQ0UsIHRoaXMuZXZlbnRCdXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRleHRMYXllciA9IHRleHRMYXllcjtcbiAgICAgIHZhciByZW5kZXJDb250aW51ZUNhbGxiYWNrID0gbnVsbDtcblxuICAgICAgaWYgKHRoaXMucmVuZGVyaW5nUXVldWUpIHtcbiAgICAgICAgcmVuZGVyQ29udGludWVDYWxsYmFjayA9IGZ1bmN0aW9uIHJlbmRlckNvbnRpbnVlQ2FsbGJhY2soY29udCkge1xuICAgICAgICAgIGlmICghX3RoaXMucmVuZGVyaW5nUXVldWUuaXNIaWdoZXN0UHJpb3JpdHkoX3RoaXMpKSB7XG4gICAgICAgICAgICBfdGhpcy5yZW5kZXJpbmdTdGF0ZSA9IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlJlbmRlcmluZ1N0YXRlcy5QQVVTRUQ7XG5cbiAgICAgICAgICAgIF90aGlzLnJlc3VtZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgX3RoaXMucmVuZGVyaW5nU3RhdGUgPSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuUlVOTklORztcbiAgICAgICAgICAgICAgY29udCgpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnQoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpbmlzaFBhaW50VGFzayA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfcmVmID0gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9fcmVnZW5lcmF0b3JbXCJkZWZhdWx0XCJdLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gX3JlZ2VuZXJhdG9yW1wiZGVmYXVsdFwiXS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgIGlmIChwYWludFRhc2sgPT09IF90aGlzLnBhaW50VGFzaykge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5wYWludFRhc2sgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIF9wZGZqc0xpYi5SZW5kZXJpbmdDYW5jZWxsZWRFeGNlcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIF90aGlzLmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIpO1xuXG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgX3RoaXMucmVuZGVyaW5nU3RhdGUgPSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQ7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5sb2FkaW5nSWNvbkRpdikge1xuICAgICAgICAgICAgICAgICAgICBkaXYucmVtb3ZlQ2hpbGQoX3RoaXMubG9hZGluZ0ljb25EaXYpO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3RoaXMubG9hZGluZ0ljb25EaXY7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIF90aGlzLl9yZXNldFpvb21MYXllcih0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgX3RoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICAgIF90aGlzLnN0YXRzID0gcGRmUGFnZS5zdGF0cztcblxuICAgICAgICAgICAgICAgICAgX3RoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJwYWdlcmVuZGVyZWRcIiwge1xuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IF90aGlzLFxuICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyOiBfdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgY3NzVHJhbnNmb3JtOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBwZXJmb3JtYW5jZS5ub3coKVxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIF9jYWxsZWUyKTtcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiBmaW5pc2hQYWludFRhc2soX3gpIHtcbiAgICAgICAgICByZXR1cm4gX3JlZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9O1xuICAgICAgfSgpO1xuXG4gICAgICB2YXIgcGFpbnRUYXNrID0gdGhpcy5yZW5kZXJlciA9PT0gX3VpX3V0aWxzLlJlbmRlcmVyVHlwZS5TVkcgPyB0aGlzLnBhaW50T25TdmcoY2FudmFzV3JhcHBlcikgOiB0aGlzLnBhaW50T25DYW52YXMoY2FudmFzV3JhcHBlcik7XG4gICAgICBwYWludFRhc2sub25SZW5kZXJDb250aW51ZSA9IHJlbmRlckNvbnRpbnVlQ2FsbGJhY2s7XG4gICAgICB0aGlzLnBhaW50VGFzayA9IHBhaW50VGFzaztcbiAgICAgIHZhciByZXN1bHRQcm9taXNlID0gcGFpbnRUYXNrLnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmaW5pc2hQYWludFRhc2sobnVsbCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHRleHRMYXllcikge1xuICAgICAgICAgICAgdmFyIHJlYWRhYmxlU3RyZWFtID0gcGRmUGFnZS5zdHJlYW1UZXh0Q29udGVudCh7XG4gICAgICAgICAgICAgIG5vcm1hbGl6ZVdoaXRlc3BhY2U6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGV4dExheWVyLnNldFRleHRDb250ZW50U3RyZWFtKHJlYWRhYmxlU3RyZWFtKTtcbiAgICAgICAgICAgIHRleHRMYXllci5yZW5kZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICByZXR1cm4gZmluaXNoUGFpbnRUYXNrKHJlYXNvbik7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbkxheWVyRmFjdG9yeSkge1xuICAgICAgICBpZiAoIXRoaXMuYW5ub3RhdGlvbkxheWVyKSB7XG4gICAgICAgICAgdGhpcy5hbm5vdGF0aW9uTGF5ZXIgPSB0aGlzLmFubm90YXRpb25MYXllckZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkxheWVyQnVpbGRlcihkaXYsIHBkZlBhZ2UsIHRoaXMuX2Fubm90YXRpb25TdG9yYWdlLCB0aGlzLmltYWdlUmVzb3VyY2VzUGF0aCwgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zLCB0aGlzLmwxMG4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyQW5ub3RhdGlvbkxheWVyKCk7XG4gICAgICB9XG5cbiAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWxvYWRlZFwiLCB0cnVlKTtcbiAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJwYWdlcmVuZGVyXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBwYWdlTnVtYmVyOiB0aGlzLmlkXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHRQcm9taXNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYWludE9uQ2FudmFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhaW50T25DYW52YXMoY2FudmFzV3JhcHBlcikge1xuICAgICAgdmFyIHJlbmRlckNhcGFiaWxpdHkgPSAoMCwgX3BkZmpzTGliLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO1xuICAgICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgcHJvbWlzZTogcmVuZGVyQ2FwYWJpbGl0eS5wcm9taXNlLFxuICAgICAgICBvblJlbmRlckNvbnRpbnVlOiBmdW5jdGlvbiBvblJlbmRlckNvbnRpbnVlKGNvbnQpIHtcbiAgICAgICAgICBjb250KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgICAgICAgIHJlbmRlclRhc2suY2FuY2VsKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB2YXIgdmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0O1xuICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICB0aGlzLmwxMG4uZ2V0KFwicGFnZV9jYW52YXNcIiwge1xuICAgICAgICBwYWdlOiB0aGlzLmlkXG4gICAgICB9LCBcIlBhZ2Uge3twYWdlfX1cIikudGhlbihmdW5jdGlvbiAobXNnKSB7XG4gICAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIG1zZyk7XG4gICAgICB9KTtcbiAgICAgIGNhbnZhcy5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIiwgXCJoaWRkZW5cIik7XG4gICAgICB2YXIgaXNDYW52YXNIaWRkZW4gPSB0cnVlO1xuXG4gICAgICB2YXIgc2hvd0NhbnZhcyA9IGZ1bmN0aW9uIHNob3dDYW52YXMoKSB7XG4gICAgICAgIGlmIChpc0NhbnZhc0hpZGRlbikge1xuICAgICAgICAgIGNhbnZhcy5yZW1vdmVBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICAgICAgaXNDYW52YXNIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY2FudmFzV3JhcHBlci5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG4gICAgICBjYW52YXMubW96T3BhcXVlID0gdHJ1ZTtcbiAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIsIHtcbiAgICAgICAgYWxwaGE6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHZhciBvdXRwdXRTY2FsZSA9ICgwLCBfdWlfdXRpbHMuZ2V0T3V0cHV0U2NhbGUpKGN0eCk7XG4gICAgICB0aGlzLm91dHB1dFNjYWxlID0gb3V0cHV0U2NhbGU7XG5cbiAgICAgIGlmICh0aGlzLnVzZU9ubHlDc3Nab29tKSB7XG4gICAgICAgIHZhciBhY3R1YWxTaXplVmlld3BvcnQgPSB2aWV3cG9ydC5jbG9uZSh7XG4gICAgICAgICAgc2NhbGU6IF91aV91dGlscy5DU1NfVU5JVFNcbiAgICAgICAgfSk7XG4gICAgICAgIG91dHB1dFNjYWxlLnN4ICo9IGFjdHVhbFNpemVWaWV3cG9ydC53aWR0aCAvIHZpZXdwb3J0LndpZHRoO1xuICAgICAgICBvdXRwdXRTY2FsZS5zeSAqPSBhY3R1YWxTaXplVmlld3BvcnQuaGVpZ2h0IC8gdmlld3BvcnQuaGVpZ2h0O1xuICAgICAgICBvdXRwdXRTY2FsZS5zY2FsZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXhDYW52YXNQaXhlbHMgPiAwKSB7XG4gICAgICAgIHZhciBwaXhlbHNJblZpZXdwb3J0ID0gdmlld3BvcnQud2lkdGggKiB2aWV3cG9ydC5oZWlnaHQ7XG4gICAgICAgIHZhciBtYXhTY2FsZSA9IE1hdGguc3FydCh0aGlzLm1heENhbnZhc1BpeGVscyAvIHBpeGVsc0luVmlld3BvcnQpO1xuXG4gICAgICAgIGlmIChvdXRwdXRTY2FsZS5zeCA+IG1heFNjYWxlIHx8IG91dHB1dFNjYWxlLnN5ID4gbWF4U2NhbGUpIHtcbiAgICAgICAgICBvdXRwdXRTY2FsZS5zeCA9IG1heFNjYWxlO1xuICAgICAgICAgIG91dHB1dFNjYWxlLnN5ID0gbWF4U2NhbGU7XG4gICAgICAgICAgb3V0cHV0U2NhbGUuc2NhbGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmhhc1Jlc3RyaWN0ZWRTY2FsaW5nID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmhhc1Jlc3RyaWN0ZWRTY2FsaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNmeCA9ICgwLCBfdWlfdXRpbHMuYXBwcm94aW1hdGVGcmFjdGlvbikob3V0cHV0U2NhbGUuc3gpO1xuICAgICAgdmFyIHNmeSA9ICgwLCBfdWlfdXRpbHMuYXBwcm94aW1hdGVGcmFjdGlvbikob3V0cHV0U2NhbGUuc3kpO1xuICAgICAgY2FudmFzLndpZHRoID0gKDAsIF91aV91dGlscy5yb3VuZFRvRGl2aWRlKSh2aWV3cG9ydC53aWR0aCAqIG91dHB1dFNjYWxlLnN4LCBzZnhbMF0pO1xuICAgICAgY2FudmFzLmhlaWdodCA9ICgwLCBfdWlfdXRpbHMucm91bmRUb0RpdmlkZSkodmlld3BvcnQuaGVpZ2h0ICogb3V0cHV0U2NhbGUuc3ksIHNmeVswXSk7XG4gICAgICBjYW52YXMuc3R5bGUud2lkdGggPSAoMCwgX3VpX3V0aWxzLnJvdW5kVG9EaXZpZGUpKHZpZXdwb3J0LndpZHRoLCBzZnhbMV0pICsgXCJweFwiO1xuICAgICAgY2FudmFzLnN0eWxlLmhlaWdodCA9ICgwLCBfdWlfdXRpbHMucm91bmRUb0RpdmlkZSkodmlld3BvcnQuaGVpZ2h0LCBzZnlbMV0pICsgXCJweFwiO1xuICAgICAgdGhpcy5wYWludGVkVmlld3BvcnRNYXAuc2V0KGNhbnZhcywgdmlld3BvcnQpO1xuICAgICAgdmFyIHRyYW5zZm9ybSA9ICFvdXRwdXRTY2FsZS5zY2FsZWQgPyBudWxsIDogW291dHB1dFNjYWxlLnN4LCAwLCAwLCBvdXRwdXRTY2FsZS5zeSwgMCwgMF07XG4gICAgICB2YXIgcmVuZGVyQ29udGV4dCA9IHtcbiAgICAgICAgY2FudmFzQ29udGV4dDogY3R4LFxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybSxcbiAgICAgICAgdmlld3BvcnQ6IHRoaXMudmlld3BvcnQsXG4gICAgICAgIGVuYWJsZVdlYkdMOiB0aGlzLmVuYWJsZVdlYkdMLFxuICAgICAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zOiB0aGlzLnJlbmRlckludGVyYWN0aXZlRm9ybXMsXG4gICAgICAgIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2U6IHRoaXMuX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2VcbiAgICAgIH07XG4gICAgICB2YXIgcmVuZGVyVGFzayA9IHRoaXMucGRmUGFnZS5yZW5kZXIocmVuZGVyQ29udGV4dCk7XG5cbiAgICAgIHJlbmRlclRhc2sub25Db250aW51ZSA9IGZ1bmN0aW9uIChjb250KSB7XG4gICAgICAgIHNob3dDYW52YXMoKTtcblxuICAgICAgICBpZiAocmVzdWx0Lm9uUmVuZGVyQ29udGludWUpIHtcbiAgICAgICAgICByZXN1bHQub25SZW5kZXJDb250aW51ZShjb250KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250KCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlbmRlclRhc2sucHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2hvd0NhbnZhcygpO1xuICAgICAgICByZW5kZXJDYXBhYmlsaXR5LnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBzaG93Q2FudmFzKCk7XG4gICAgICAgIHJlbmRlckNhcGFiaWxpdHkucmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFpbnRPblN2Z1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYWludE9uU3ZnKHdyYXBwZXIpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICB2YXIgY2FuY2VsbGVkID0gZmFsc2U7XG5cbiAgICAgIHZhciBlbnN1cmVOb3RDYW5jZWxsZWQgPSBmdW5jdGlvbiBlbnN1cmVOb3RDYW5jZWxsZWQoKSB7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgX3BkZmpzTGliLlJlbmRlcmluZ0NhbmNlbGxlZEV4Y2VwdGlvbihcIlJlbmRlcmluZyBjYW5jZWxsZWQsIHBhZ2UgXCIuY29uY2F0KF90aGlzMi5pZCksIFwic3ZnXCIpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgcGRmUGFnZSA9IHRoaXMucGRmUGFnZTtcbiAgICAgIHZhciBhY3R1YWxTaXplVmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0LmNsb25lKHtcbiAgICAgICAgc2NhbGU6IF91aV91dGlscy5DU1NfVU5JVFNcbiAgICAgIH0pO1xuICAgICAgdmFyIHByb21pc2UgPSBwZGZQYWdlLmdldE9wZXJhdG9yTGlzdCgpLnRoZW4oZnVuY3Rpb24gKG9wTGlzdCkge1xuICAgICAgICBlbnN1cmVOb3RDYW5jZWxsZWQoKTtcbiAgICAgICAgdmFyIHN2Z0dmeCA9IG5ldyBfcGRmanNMaWIuU1ZHR3JhcGhpY3MocGRmUGFnZS5jb21tb25PYmpzLCBwZGZQYWdlLm9ianMpO1xuICAgICAgICByZXR1cm4gc3ZnR2Z4LmdldFNWRyhvcExpc3QsIGFjdHVhbFNpemVWaWV3cG9ydCkudGhlbihmdW5jdGlvbiAoc3ZnKSB7XG4gICAgICAgICAgZW5zdXJlTm90Q2FuY2VsbGVkKCk7XG4gICAgICAgICAgX3RoaXMyLnN2ZyA9IHN2ZztcblxuICAgICAgICAgIF90aGlzMi5wYWludGVkVmlld3BvcnRNYXAuc2V0KHN2ZywgYWN0dWFsU2l6ZVZpZXdwb3J0KTtcblxuICAgICAgICAgIHN2Zy5zdHlsZS53aWR0aCA9IHdyYXBwZXIuc3R5bGUud2lkdGg7XG4gICAgICAgICAgc3ZnLnN0eWxlLmhlaWdodCA9IHdyYXBwZXIuc3R5bGUuaGVpZ2h0O1xuICAgICAgICAgIF90aGlzMi5yZW5kZXJpbmdTdGF0ZSA9IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlJlbmRlcmluZ1N0YXRlcy5GSU5JU0hFRDtcbiAgICAgICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHN2Zyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcm9taXNlOiBwcm9taXNlLFxuICAgICAgICBvblJlbmRlckNvbnRpbnVlOiBmdW5jdGlvbiBvblJlbmRlckNvbnRpbnVlKGNvbnQpIHtcbiAgICAgICAgICBjb250KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGNhbmNlbDogZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFBhZ2VMYWJlbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQYWdlTGFiZWwobGFiZWwpIHtcbiAgICAgIHRoaXMucGFnZUxhYmVsID0gdHlwZW9mIGxhYmVsID09PSBcInN0cmluZ1wiID8gbGFiZWwgOiBudWxsO1xuXG4gICAgICBpZiAodGhpcy5wYWdlTGFiZWwgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5kaXYuc2V0QXR0cmlidXRlKFwiZGF0YS1wYWdlLWxhYmVsXCIsIHRoaXMucGFnZUxhYmVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGl2LnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtcGFnZS1sYWJlbFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwid2lkdGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpZXdwb3J0LndpZHRoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJoZWlnaHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpZXdwb3J0LmhlaWdodDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUERGUGFnZVZpZXc7XG59KCk7XG5cbmV4cG9ydHMuUERGUGFnZVZpZXcgPSBQREZQYWdlVmlldztcblxuLyoqKi8gfSksXG4vKiAxNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193X3BkZmpzX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5QREZSZW5kZXJpbmdRdWV1ZSA9IGV4cG9ydHMuUmVuZGVyaW5nU3RhdGVzID0gdm9pZCAwO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbnZhciBDTEVBTlVQX1RJTUVPVVQgPSAzMDAwMDtcbnZhciBSZW5kZXJpbmdTdGF0ZXMgPSB7XG4gIElOSVRJQUw6IDAsXG4gIFJVTk5JTkc6IDEsXG4gIFBBVVNFRDogMixcbiAgRklOSVNIRUQ6IDNcbn07XG5leHBvcnRzLlJlbmRlcmluZ1N0YXRlcyA9IFJlbmRlcmluZ1N0YXRlcztcblxudmFyIFBERlJlbmRlcmluZ1F1ZXVlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUERGUmVuZGVyaW5nUXVldWUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFBERlJlbmRlcmluZ1F1ZXVlKTtcblxuICAgIHRoaXMucGRmVmlld2VyID0gbnVsbDtcbiAgICB0aGlzLnBkZlRodW1ibmFpbFZpZXdlciA9IG51bGw7XG4gICAgdGhpcy5vbklkbGUgPSBudWxsO1xuICAgIHRoaXMuaGlnaGVzdFByaW9yaXR5UGFnZSA9IG51bGw7XG4gICAgdGhpcy5pZGxlVGltZW91dCA9IG51bGw7XG4gICAgdGhpcy5wcmludGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNUaHVtYm5haWxWaWV3RW5hYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFBERlJlbmRlcmluZ1F1ZXVlLCBbe1xuICAgIGtleTogXCJzZXRWaWV3ZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Vmlld2VyKHBkZlZpZXdlcikge1xuICAgICAgdGhpcy5wZGZWaWV3ZXIgPSBwZGZWaWV3ZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNldFRodW1ibmFpbFZpZXdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRUaHVtYm5haWxWaWV3ZXIocGRmVGh1bWJuYWlsVmlld2VyKSB7XG4gICAgICB0aGlzLnBkZlRodW1ibmFpbFZpZXdlciA9IHBkZlRodW1ibmFpbFZpZXdlcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNIaWdoZXN0UHJpb3JpdHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNIaWdoZXN0UHJpb3JpdHkodmlldykge1xuICAgICAgcmV0dXJuIHRoaXMuaGlnaGVzdFByaW9yaXR5UGFnZSA9PT0gdmlldy5yZW5kZXJpbmdJZDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVySGlnaGVzdFByaW9yaXR5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlckhpZ2hlc3RQcmlvcml0eShjdXJyZW50bHlWaXNpYmxlUGFnZXMpIHtcbiAgICAgIGlmICh0aGlzLmlkbGVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlkbGVUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5pZGxlVGltZW91dCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnBkZlZpZXdlci5mb3JjZVJlbmRlcmluZyhjdXJyZW50bHlWaXNpYmxlUGFnZXMpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucGRmVGh1bWJuYWlsVmlld2VyICYmIHRoaXMuaXNUaHVtYm5haWxWaWV3RW5hYmxlZCkge1xuICAgICAgICBpZiAodGhpcy5wZGZUaHVtYm5haWxWaWV3ZXIuZm9yY2VSZW5kZXJpbmcoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wcmludGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9uSWRsZSkge1xuICAgICAgICB0aGlzLmlkbGVUaW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLm9uSWRsZS5iaW5kKHRoaXMpLCBDTEVBTlVQX1RJTUVPVVQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRIaWdoZXN0UHJpb3JpdHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5KHZpc2libGUsIHZpZXdzLCBzY3JvbGxlZERvd24pIHtcbiAgICAgIHZhciB2aXNpYmxlVmlld3MgPSB2aXNpYmxlLnZpZXdzO1xuICAgICAgdmFyIG51bVZpc2libGUgPSB2aXNpYmxlVmlld3MubGVuZ3RoO1xuXG4gICAgICBpZiAobnVtVmlzaWJsZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1WaXNpYmxlOyArK2kpIHtcbiAgICAgICAgdmFyIHZpZXcgPSB2aXNpYmxlVmlld3NbaV0udmlldztcblxuICAgICAgICBpZiAoIXRoaXMuaXNWaWV3RmluaXNoZWQodmlldykpIHtcbiAgICAgICAgICByZXR1cm4gdmlldztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2Nyb2xsZWREb3duKSB7XG4gICAgICAgIHZhciBuZXh0UGFnZUluZGV4ID0gdmlzaWJsZS5sYXN0LmlkO1xuXG4gICAgICAgIGlmICh2aWV3c1tuZXh0UGFnZUluZGV4XSAmJiAhdGhpcy5pc1ZpZXdGaW5pc2hlZCh2aWV3c1tuZXh0UGFnZUluZGV4XSkpIHtcbiAgICAgICAgICByZXR1cm4gdmlld3NbbmV4dFBhZ2VJbmRleF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwcmV2aW91c1BhZ2VJbmRleCA9IHZpc2libGUuZmlyc3QuaWQgLSAyO1xuXG4gICAgICAgIGlmICh2aWV3c1twcmV2aW91c1BhZ2VJbmRleF0gJiYgIXRoaXMuaXNWaWV3RmluaXNoZWQodmlld3NbcHJldmlvdXNQYWdlSW5kZXhdKSkge1xuICAgICAgICAgIHJldHVybiB2aWV3c1twcmV2aW91c1BhZ2VJbmRleF07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImlzVmlld0ZpbmlzaGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzVmlld0ZpbmlzaGVkKHZpZXcpIHtcbiAgICAgIHJldHVybiB2aWV3LnJlbmRlcmluZ1N0YXRlID09PSBSZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclZpZXdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyVmlldyh2aWV3KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBzd2l0Y2ggKHZpZXcucmVuZGVyaW5nU3RhdGUpIHtcbiAgICAgICAgY2FzZSBSZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQ6XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNhc2UgUmVuZGVyaW5nU3RhdGVzLlBBVVNFRDpcbiAgICAgICAgICB0aGlzLmhpZ2hlc3RQcmlvcml0eVBhZ2UgPSB2aWV3LnJlbmRlcmluZ0lkO1xuICAgICAgICAgIHZpZXcucmVzdW1lKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBSZW5kZXJpbmdTdGF0ZXMuUlVOTklORzpcbiAgICAgICAgICB0aGlzLmhpZ2hlc3RQcmlvcml0eVBhZ2UgPSB2aWV3LnJlbmRlcmluZ0lkO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUmVuZGVyaW5nU3RhdGVzLklOSVRJQUw6XG4gICAgICAgICAgdGhpcy5oaWdoZXN0UHJpb3JpdHlQYWdlID0gdmlldy5yZW5kZXJpbmdJZDtcbiAgICAgICAgICB2aWV3LmRyYXcoKVtcImZpbmFsbHlcIl0oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMucmVuZGVySGlnaGVzdFByaW9yaXR5KCk7XG4gICAgICAgICAgfSlbXCJjYXRjaFwiXShmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwicmVuZGVyVmlldzogXFxcIlwiLmNvbmNhdChyZWFzb24sIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQREZSZW5kZXJpbmdRdWV1ZTtcbn0oKTtcblxuZXhwb3J0cy5QREZSZW5kZXJpbmdRdWV1ZSA9IFBERlJlbmRlcmluZ1F1ZXVlO1xuXG4vKioqLyB9KSxcbi8qIDE4ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dfcGRmanNfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlBERlNpbmdsZVBhZ2VWaWV3ZXIgPSB2b2lkIDA7XG5cbnZhciBfYmFzZV92aWV3ZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE5KTtcblxudmFyIF9wZGZqc0xpYiA9IF9fd19wZGZqc19yZXF1aXJlX18oMik7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfTsgfSBlbHNlIHsgX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mKG9iaik7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG5mdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBSZWZsZWN0LmdldCkgeyBfZ2V0ID0gUmVmbGVjdC5nZXQ7IH0gZWxzZSB7IF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7IHZhciBiYXNlID0gX3N1cGVyUHJvcEJhc2UodGFyZ2V0LCBwcm9wZXJ0eSk7IGlmICghYmFzZSkgcmV0dXJuOyB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSwgcHJvcGVydHkpOyBpZiAoZGVzYy5nZXQpIHsgcmV0dXJuIGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIpOyB9IHJldHVybiBkZXNjLnZhbHVlOyB9OyB9IHJldHVybiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyIHx8IHRhcmdldCk7IH1cblxuZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkgeyB3aGlsZSAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSkgeyBvYmplY3QgPSBfZ2V0UHJvdG90eXBlT2Yob2JqZWN0KTsgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7IH0gcmV0dXJuIG9iamVjdDsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5mdW5jdGlvbiBfY3JlYXRlU3VwZXIoRGVyaXZlZCkgeyB2YXIgaGFzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKTsgcmV0dXJuIGZ1bmN0aW9uIF9jcmVhdGVTdXBlckludGVybmFsKCkgeyB2YXIgU3VwZXIgPSBfZ2V0UHJvdG90eXBlT2YoRGVyaXZlZCksIHJlc3VsdDsgaWYgKGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QpIHsgdmFyIE5ld1RhcmdldCA9IF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3RvcjsgcmVzdWx0ID0gUmVmbGVjdC5jb25zdHJ1Y3QoU3VwZXIsIGFyZ3VtZW50cywgTmV3VGFyZ2V0KTsgfSBlbHNlIHsgcmVzdWx0ID0gU3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfSByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgcmVzdWx0KTsgfTsgfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7IHJldHVybiBjYWxsOyB9IHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpOyB9XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikgeyBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gc2VsZjsgfVxuXG5mdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkgeyBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7IGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7IGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7IHRyeSB7IERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7IHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7IH07IHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7IH1cblxudmFyIFBERlNpbmdsZVBhZ2VWaWV3ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9CYXNlVmlld2VyKSB7XG4gIF9pbmhlcml0cyhQREZTaW5nbGVQYWdlVmlld2VyLCBfQmFzZVZpZXdlcik7XG5cbiAgdmFyIF9zdXBlciA9IF9jcmVhdGVTdXBlcihQREZTaW5nbGVQYWdlVmlld2VyKTtcblxuICBmdW5jdGlvbiBQREZTaW5nbGVQYWdlVmlld2VyKG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUERGU2luZ2xlUGFnZVZpZXdlcik7XG5cbiAgICBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgX3RoaXMuZXZlbnRCdXMuX29uKFwicGFnZXNpbml0XCIsIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgIF90aGlzLl9lbnN1cmVQYWdlVmlld1Zpc2libGUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQREZTaW5nbGVQYWdlVmlld2VyLCBbe1xuICAgIGtleTogXCJfcmVzZXRWaWV3XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9yZXNldFZpZXcoKSB7XG4gICAgICBfZ2V0KF9nZXRQcm90b3R5cGVPZihQREZTaW5nbGVQYWdlVmlld2VyLnByb3RvdHlwZSksIFwiX3Jlc2V0Vmlld1wiLCB0aGlzKS5jYWxsKHRoaXMpO1xuXG4gICAgICB0aGlzLl9wcmV2aW91c1BhZ2VOdW1iZXIgPSAxO1xuICAgICAgdGhpcy5fc2hhZG93Vmlld2VyID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgdGhpcy5fdXBkYXRlU2Nyb2xsRG93biA9IG51bGw7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9lbnN1cmVQYWdlVmlld1Zpc2libGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2Vuc3VyZVBhZ2VWaWV3VmlzaWJsZSgpIHtcbiAgICAgIHZhciBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07XG4gICAgICB2YXIgcHJldmlvdXNQYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX3ByZXZpb3VzUGFnZU51bWJlciAtIDFdO1xuICAgICAgdmFyIHZpZXdlck5vZGVzID0gdGhpcy52aWV3ZXIuY2hpbGROb2RlcztcblxuICAgICAgc3dpdGNoICh2aWV3ZXJOb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHRoaXMudmlld2VyLmFwcGVuZENoaWxkKHBhZ2VWaWV3LmRpdik7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmICh2aWV3ZXJOb2Rlc1swXSAhPT0gcHJldmlvdXNQYWdlVmlldy5kaXYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIl9lbnN1cmVQYWdlVmlld1Zpc2libGU6IFVuZXhwZWN0ZWQgcHJldmlvdXNseSB2aXNpYmxlIHBhZ2UuXCIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwYWdlVmlldyA9PT0gcHJldmlvdXNQYWdlVmlldykge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fc2hhZG93Vmlld2VyLmFwcGVuZENoaWxkKHByZXZpb3VzUGFnZVZpZXcuZGl2KTtcblxuICAgICAgICAgIHRoaXMudmlld2VyLmFwcGVuZENoaWxkKHBhZ2VWaWV3LmRpdik7XG4gICAgICAgICAgdGhpcy5jb250YWluZXIuc2Nyb2xsVG9wID0gMDtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIl9lbnN1cmVQYWdlVmlld1Zpc2libGU6IE9ubHkgb25lIHBhZ2Ugc2hvdWxkIGJlIHZpc2libGUgYXQgYSB0aW1lLlwiKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcHJldmlvdXNQYWdlTnVtYmVyID0gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXI7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9zY3JvbGxVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3Njcm9sbFVwZGF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLl91cGRhdGVTY3JvbGxEb3duKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVNjcm9sbERvd24oKTtcbiAgICAgIH1cblxuICAgICAgX2dldChfZ2V0UHJvdG90eXBlT2YoUERGU2luZ2xlUGFnZVZpZXdlci5wcm90b3R5cGUpLCBcIl9zY3JvbGxVcGRhdGVcIiwgdGhpcykuY2FsbCh0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3Njcm9sbEludG9WaWV3XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9zY3JvbGxJbnRvVmlldyhfcmVmKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHBhZ2VEaXYgPSBfcmVmLnBhZ2VEaXYsXG4gICAgICAgICAgX3JlZiRwYWdlU3BvdCA9IF9yZWYucGFnZVNwb3QsXG4gICAgICAgICAgcGFnZVNwb3QgPSBfcmVmJHBhZ2VTcG90ID09PSB2b2lkIDAgPyBudWxsIDogX3JlZiRwYWdlU3BvdCxcbiAgICAgICAgICBfcmVmJHBhZ2VOdW1iZXIgPSBfcmVmLnBhZ2VOdW1iZXIsXG4gICAgICAgICAgcGFnZU51bWJlciA9IF9yZWYkcGFnZU51bWJlciA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkcGFnZU51bWJlcjtcblxuICAgICAgaWYgKHBhZ2VOdW1iZXIpIHtcbiAgICAgICAgdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIocGFnZU51bWJlcik7XG4gICAgICB9XG5cbiAgICAgIHZhciBzY3JvbGxlZERvd24gPSB0aGlzLl9jdXJyZW50UGFnZU51bWJlciA+PSB0aGlzLl9wcmV2aW91c1BhZ2VOdW1iZXI7XG5cbiAgICAgIHRoaXMuX2Vuc3VyZVBhZ2VWaWV3VmlzaWJsZSgpO1xuXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICBfZ2V0KF9nZXRQcm90b3R5cGVPZihQREZTaW5nbGVQYWdlVmlld2VyLnByb3RvdHlwZSksIFwiX3Njcm9sbEludG9WaWV3XCIsIHRoaXMpLmNhbGwodGhpcywge1xuICAgICAgICBwYWdlRGl2OiBwYWdlRGl2LFxuICAgICAgICBwYWdlU3BvdDogcGFnZVNwb3QsXG4gICAgICAgIHBhZ2VOdW1iZXI6IHBhZ2VOdW1iZXJcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl91cGRhdGVTY3JvbGxEb3duID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczIuc2Nyb2xsLmRvd24gPSBzY3JvbGxlZERvd247XG4gICAgICAgIF90aGlzMi5fdXBkYXRlU2Nyb2xsRG93biA9IG51bGw7XG4gICAgICB9O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfZ2V0VmlzaWJsZVBhZ2VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRWaXNpYmxlUGFnZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0Q3VycmVudFZpc2libGVQYWdlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVIZWxwZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZUhlbHBlcih2aXNpYmxlUGFnZXMpIHt9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3VwZGF0ZVNjcm9sbE1vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZVNjcm9sbE1vZGUoKSB7fVxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVTcHJlYWRNb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVTcHJlYWRNb2RlKCkge31cbiAgfSwge1xuICAgIGtleTogXCJfdmlld2VyRWxlbWVudFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuICgwLCBfcGRmanNMaWIuc2hhZG93KSh0aGlzLCBcIl92aWV3ZXJFbGVtZW50XCIsIHRoaXMuX3NoYWRvd1ZpZXdlcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9pc1Njcm9sbE1vZGVIb3Jpem9udGFsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gKDAsIF9wZGZqc0xpYi5zaGFkb3cpKHRoaXMsIFwiX2lzU2Nyb2xsTW9kZUhvcml6b250YWxcIiwgZmFsc2UpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQREZTaW5nbGVQYWdlVmlld2VyO1xufShfYmFzZV92aWV3ZXIuQmFzZVZpZXdlcik7XG5cbmV4cG9ydHMuUERGU2luZ2xlUGFnZVZpZXdlciA9IFBERlNpbmdsZVBhZ2VWaWV3ZXI7XG5cbi8qKiovIH0pLFxuLyogMTkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuQmFzZVZpZXdlciA9IHZvaWQgMDtcblxudmFyIF91aV91dGlscyA9IF9fd19wZGZqc19yZXF1aXJlX18oMyk7XG5cbnZhciBfcGRmX3JlbmRlcmluZ19xdWV1ZSA9IF9fd19wZGZqc19yZXF1aXJlX18oMTcpO1xuXG52YXIgX2Fubm90YXRpb25fbGF5ZXJfYnVpbGRlciA9IF9fd19wZGZqc19yZXF1aXJlX18oMSk7XG5cbnZhciBfcGRmanNMaWIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpO1xuXG52YXIgX3BkZl9wYWdlX3ZpZXcgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDE2KTtcblxudmFyIF9wZGZfbGlua19zZXJ2aWNlID0gX193X3BkZmpzX3JlcXVpcmVfXyg3KTtcblxudmFyIF90ZXh0X2xheWVyX2J1aWxkZXIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDgpO1xuXG5mdW5jdGlvbiBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcihvLCBhbGxvd0FycmF5TGlrZSkgeyB2YXIgaXQ7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8IG9bU3ltYm9sLml0ZXJhdG9yXSA9PSBudWxsKSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IG9bU3ltYm9sLml0ZXJhdG9yXSgpOyB9LCBuOiBmdW5jdGlvbiBuKCkgeyB2YXIgc3RlcCA9IGl0Lm5leHQoKTsgbm9ybWFsQ29tcGxldGlvbiA9IHN0ZXAuZG9uZTsgcmV0dXJuIHN0ZXA7IH0sIGU6IGZ1bmN0aW9uIGUoX2UyKSB7IGRpZEVyciA9IHRydWU7IGVyciA9IF9lMjsgfSwgZjogZnVuY3Rpb24gZigpIHsgdHJ5IHsgaWYgKCFub3JtYWxDb21wbGV0aW9uICYmIGl0W1wicmV0dXJuXCJdICE9IG51bGwpIGl0W1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChkaWRFcnIpIHRocm93IGVycjsgfSB9IH07IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9XG5cbnZhciBERUZBVUxUX0NBQ0hFX1NJWkUgPSAxMDtcblxuZnVuY3Rpb24gUERGUGFnZVZpZXdCdWZmZXIoc2l6ZSkge1xuICB2YXIgZGF0YSA9IFtdO1xuXG4gIHRoaXMucHVzaCA9IGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgdmFyIGkgPSBkYXRhLmluZGV4T2Yodmlldyk7XG5cbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICBkYXRhLnNwbGljZShpLCAxKTtcbiAgICB9XG5cbiAgICBkYXRhLnB1c2godmlldyk7XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPiBzaXplKSB7XG4gICAgICBkYXRhLnNoaWZ0KCkuZGVzdHJveSgpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnJlc2l6ZSA9IGZ1bmN0aW9uIChuZXdTaXplLCBwYWdlc1RvS2VlcCkge1xuICAgIHNpemUgPSBuZXdTaXplO1xuXG4gICAgaWYgKHBhZ2VzVG9LZWVwKSB7XG4gICAgICB2YXIgcGFnZUlkc1RvS2VlcCA9IG5ldyBTZXQoKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIGlNYXggPSBwYWdlc1RvS2VlcC5sZW5ndGg7IGkgPCBpTWF4OyArK2kpIHtcbiAgICAgICAgcGFnZUlkc1RvS2VlcC5hZGQocGFnZXNUb0tlZXBbaV0uaWQpO1xuICAgICAgfVxuXG4gICAgICAoMCwgX3VpX3V0aWxzLm1vdmVUb0VuZE9mQXJyYXkpKGRhdGEsIGZ1bmN0aW9uIChwYWdlKSB7XG4gICAgICAgIHJldHVybiBwYWdlSWRzVG9LZWVwLmhhcyhwYWdlLmlkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHdoaWxlIChkYXRhLmxlbmd0aCA+IHNpemUpIHtcbiAgICAgIGRhdGEuc2hpZnQoKS5kZXN0cm95KCk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBpc1NhbWVTY2FsZShvbGRTY2FsZSwgbmV3U2NhbGUpIHtcbiAgaWYgKG5ld1NjYWxlID09PSBvbGRTY2FsZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKG5ld1NjYWxlIC0gb2xkU2NhbGUpIDwgMWUtMTUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIEJhc2VWaWV3ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBCYXNlVmlld2VyKG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJhc2VWaWV3ZXIpO1xuXG4gICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IEJhc2VWaWV3ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBpbml0aWFsaXplIEJhc2VWaWV3ZXIuXCIpO1xuICAgIH1cblxuICAgIHRoaXMuX25hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhpcy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcbiAgICB0aGlzLnZpZXdlciA9IG9wdGlvbnMudmlld2VyIHx8IG9wdGlvbnMuY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgaWYgKCEodGhpcy5jb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRGl2RWxlbWVudCAmJiB0aGlzLnZpZXdlciBpbnN0YW5jZW9mIEhUTUxEaXZFbGVtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBgY29udGFpbmVyYCBhbmQvb3IgYHZpZXdlcmAgb3B0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcbiAgICB0aGlzLmxpbmtTZXJ2aWNlID0gb3B0aW9ucy5saW5rU2VydmljZSB8fCBuZXcgX3BkZl9saW5rX3NlcnZpY2UuU2ltcGxlTGlua1NlcnZpY2UoKTtcbiAgICB0aGlzLmRvd25sb2FkTWFuYWdlciA9IG9wdGlvbnMuZG93bmxvYWRNYW5hZ2VyIHx8IG51bGw7XG4gICAgdGhpcy5maW5kQ29udHJvbGxlciA9IG9wdGlvbnMuZmluZENvbnRyb2xsZXIgfHwgbnVsbDtcbiAgICB0aGlzLnJlbW92ZVBhZ2VCb3JkZXJzID0gb3B0aW9ucy5yZW1vdmVQYWdlQm9yZGVycyB8fCBmYWxzZTtcbiAgICB0aGlzLnRleHRMYXllck1vZGUgPSBOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMudGV4dExheWVyTW9kZSkgPyBvcHRpb25zLnRleHRMYXllck1vZGUgOiBfdWlfdXRpbHMuVGV4dExheWVyTW9kZS5FTkFCTEU7XG4gICAgdGhpcy5pbWFnZVJlc291cmNlc1BhdGggPSBvcHRpb25zLmltYWdlUmVzb3VyY2VzUGF0aCB8fCBcIlwiO1xuICAgIHRoaXMucmVuZGVySW50ZXJhY3RpdmVGb3JtcyA9IHR5cGVvZiBvcHRpb25zLnJlbmRlckludGVyYWN0aXZlRm9ybXMgPT09IFwiYm9vbGVhblwiID8gb3B0aW9ucy5yZW5kZXJJbnRlcmFjdGl2ZUZvcm1zIDogdHJ1ZTtcbiAgICB0aGlzLmVuYWJsZVByaW50QXV0b1JvdGF0ZSA9IG9wdGlvbnMuZW5hYmxlUHJpbnRBdXRvUm90YXRlIHx8IGZhbHNlO1xuICAgIHRoaXMucmVuZGVyZXIgPSBvcHRpb25zLnJlbmRlcmVyIHx8IF91aV91dGlscy5SZW5kZXJlclR5cGUuQ0FOVkFTO1xuICAgIHRoaXMuZW5hYmxlV2ViR0wgPSBvcHRpb25zLmVuYWJsZVdlYkdMIHx8IGZhbHNlO1xuICAgIHRoaXMudXNlT25seUNzc1pvb20gPSBvcHRpb25zLnVzZU9ubHlDc3Nab29tIHx8IGZhbHNlO1xuICAgIHRoaXMubWF4Q2FudmFzUGl4ZWxzID0gb3B0aW9ucy5tYXhDYW52YXNQaXhlbHM7XG4gICAgdGhpcy5sMTBuID0gb3B0aW9ucy5sMTBuIHx8IF91aV91dGlscy5OdWxsTDEwbjtcbiAgICB0aGlzLmRlZmF1bHRSZW5kZXJpbmdRdWV1ZSA9ICFvcHRpb25zLnJlbmRlcmluZ1F1ZXVlO1xuXG4gICAgaWYgKHRoaXMuZGVmYXVsdFJlbmRlcmluZ1F1ZXVlKSB7XG4gICAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlID0gbmV3IF9wZGZfcmVuZGVyaW5nX3F1ZXVlLlBERlJlbmRlcmluZ1F1ZXVlKCk7XG4gICAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlLnNldFZpZXdlcih0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJpbmdRdWV1ZSA9IG9wdGlvbnMucmVuZGVyaW5nUXVldWU7XG4gICAgfVxuXG4gICAgdGhpcy5zY3JvbGwgPSAoMCwgX3VpX3V0aWxzLndhdGNoU2Nyb2xsKSh0aGlzLmNvbnRhaW5lciwgdGhpcy5fc2Nyb2xsVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIHRoaXMucHJlc2VudGF0aW9uTW9kZVN0YXRlID0gX3VpX3V0aWxzLlByZXNlbnRhdGlvbk1vZGVTdGF0ZS5VTktOT1dOO1xuICAgIHRoaXMuX29uQmVmb3JlRHJhdyA9IHRoaXMuX29uQWZ0ZXJEcmF3ID0gbnVsbDtcblxuICAgIHRoaXMuX3Jlc2V0VmlldygpO1xuXG4gICAgaWYgKHRoaXMucmVtb3ZlUGFnZUJvcmRlcnMpIHtcbiAgICAgIHRoaXMudmlld2VyLmNsYXNzTGlzdC5hZGQoXCJyZW1vdmVQYWdlQm9yZGVyc1wiKTtcbiAgICB9XG5cbiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmV2ZW50QnVzLmRpc3BhdGNoKFwiYmFzZXZpZXdlcmluaXRcIiwge1xuICAgICAgICBzb3VyY2U6IF90aGlzXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhCYXNlVmlld2VyLCBbe1xuICAgIGtleTogXCJnZXRQYWdlVmlld1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYWdlVmlldyhpbmRleCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzW2luZGV4XTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3NldEN1cnJlbnRQYWdlTnVtYmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9zZXRDdXJyZW50UGFnZU51bWJlcih2YWwpIHtcbiAgICAgIHZhciByZXNldEN1cnJlbnRQYWdlVmlldyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgICAgIGlmICh0aGlzLl9jdXJyZW50UGFnZU51bWJlciA9PT0gdmFsKSB7XG4gICAgICAgIGlmIChyZXNldEN1cnJlbnRQYWdlVmlldykge1xuICAgICAgICAgIHRoaXMuX3Jlc2V0Q3VycmVudFBhZ2VWaWV3KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoMCA8IHZhbCAmJiB2YWwgPD0gdGhpcy5wYWdlc0NvdW50KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID0gdmFsO1xuICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInBhZ2VjaGFuZ2luZ1wiLCB7XG4gICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgcGFnZU51bWJlcjogdmFsLFxuICAgICAgICBwYWdlTGFiZWw6IHRoaXMuX3BhZ2VMYWJlbHMgJiYgdGhpcy5fcGFnZUxhYmVsc1t2YWwgLSAxXVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNldEN1cnJlbnRQYWdlVmlldykge1xuICAgICAgICB0aGlzLl9yZXNldEN1cnJlbnRQYWdlVmlldygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX29uZVBhZ2VSZW5kZXJlZE9yRm9yY2VGZXRjaFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfb25lUGFnZVJlbmRlcmVkT3JGb3JjZUZldGNoKCkge1xuICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5vZmZzZXRQYXJlbnQgfHwgdGhpcy5fZ2V0VmlzaWJsZVBhZ2VzKCkudmlld3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX29uZVBhZ2VSZW5kZXJlZENhcGFiaWxpdHkucHJvbWlzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0RG9jdW1lbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RG9jdW1lbnQocGRmRG9jdW1lbnQpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgICB0aGlzLl9jYW5jZWxSZW5kZXJpbmcoKTtcblxuICAgICAgICB0aGlzLl9yZXNldFZpZXcoKTtcblxuICAgICAgICBpZiAodGhpcy5maW5kQ29udHJvbGxlcikge1xuICAgICAgICAgIHRoaXMuZmluZENvbnRyb2xsZXIuc2V0RG9jdW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5wZGZEb2N1bWVudCA9IHBkZkRvY3VtZW50O1xuXG4gICAgICBpZiAoIXBkZkRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBhZ2VzQ291bnQgPSBwZGZEb2N1bWVudC5udW1QYWdlcztcbiAgICAgIHZhciBmaXJzdFBhZ2VQcm9taXNlID0gcGRmRG9jdW1lbnQuZ2V0UGFnZSgxKTtcbiAgICAgIHZhciBhbm5vdGF0aW9uU3RvcmFnZSA9IHBkZkRvY3VtZW50LmFubm90YXRpb25TdG9yYWdlO1xuICAgICAgdmFyIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBwZGZEb2N1bWVudC5nZXRPcHRpb25hbENvbnRlbnRDb25maWcoKTtcblxuICAgICAgdGhpcy5fcGFnZXNDYXBhYmlsaXR5LnByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5ldmVudEJ1cy5kaXNwYXRjaChcInBhZ2VzbG9hZGVkXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IF90aGlzMixcbiAgICAgICAgICBwYWdlc0NvdW50OiBwYWdlc0NvdW50XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX29uQmVmb3JlRHJhdyA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgdmFyIHBhZ2VWaWV3ID0gX3RoaXMyLl9wYWdlc1tldnQucGFnZU51bWJlciAtIDFdO1xuXG4gICAgICAgIGlmICghcGFnZVZpZXcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczIuX2J1ZmZlci5wdXNoKHBhZ2VWaWV3KTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZXZlbnRCdXMuX29uKFwicGFnZXJlbmRlclwiLCB0aGlzLl9vbkJlZm9yZURyYXcpO1xuXG4gICAgICB0aGlzLl9vbkFmdGVyRHJhdyA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgaWYgKGV2dC5jc3NUcmFuc2Zvcm0gfHwgX3RoaXMyLl9vbmVQYWdlUmVuZGVyZWRDYXBhYmlsaXR5LnNldHRsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczIuX29uZVBhZ2VSZW5kZXJlZENhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXG4gICAgICAgIF90aGlzMi5ldmVudEJ1cy5fb2ZmKFwicGFnZXJlbmRlcmVkXCIsIF90aGlzMi5fb25BZnRlckRyYXcpO1xuXG4gICAgICAgIF90aGlzMi5fb25BZnRlckRyYXcgPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5ldmVudEJ1cy5fb24oXCJwYWdlcmVuZGVyZWRcIiwgdGhpcy5fb25BZnRlckRyYXcpO1xuXG4gICAgICBmaXJzdFBhZ2VQcm9taXNlLnRoZW4oZnVuY3Rpb24gKGZpcnN0UGRmUGFnZSkge1xuICAgICAgICBfdGhpczIuX2ZpcnN0UGFnZUNhcGFiaWxpdHkucmVzb2x2ZShmaXJzdFBkZlBhZ2UpO1xuXG4gICAgICAgIF90aGlzMi5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2U7XG4gICAgICAgIHZhciBzY2FsZSA9IF90aGlzMi5jdXJyZW50U2NhbGU7XG4gICAgICAgIHZhciB2aWV3cG9ydCA9IGZpcnN0UGRmUGFnZS5nZXRWaWV3cG9ydCh7XG4gICAgICAgICAgc2NhbGU6IHNjYWxlICogX3VpX3V0aWxzLkNTU19VTklUU1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHRleHRMYXllckZhY3RvcnkgPSBfdGhpczIudGV4dExheWVyTW9kZSAhPT0gX3VpX3V0aWxzLlRleHRMYXllck1vZGUuRElTQUJMRSA/IF90aGlzMiA6IG51bGw7XG5cbiAgICAgICAgZm9yICh2YXIgcGFnZU51bSA9IDE7IHBhZ2VOdW0gPD0gcGFnZXNDb3VudDsgKytwYWdlTnVtKSB7XG4gICAgICAgICAgdmFyIHBhZ2VWaWV3ID0gbmV3IF9wZGZfcGFnZV92aWV3LlBERlBhZ2VWaWV3KHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogX3RoaXMyLl92aWV3ZXJFbGVtZW50LFxuICAgICAgICAgICAgZXZlbnRCdXM6IF90aGlzMi5ldmVudEJ1cyxcbiAgICAgICAgICAgIGlkOiBwYWdlTnVtLFxuICAgICAgICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgICAgICAgZGVmYXVsdFZpZXdwb3J0OiB2aWV3cG9ydC5jbG9uZSgpLFxuICAgICAgICAgICAgYW5ub3RhdGlvblN0b3JhZ2U6IGFubm90YXRpb25TdG9yYWdlLFxuICAgICAgICAgICAgb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTogb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSxcbiAgICAgICAgICAgIHJlbmRlcmluZ1F1ZXVlOiBfdGhpczIucmVuZGVyaW5nUXVldWUsXG4gICAgICAgICAgICB0ZXh0TGF5ZXJGYWN0b3J5OiB0ZXh0TGF5ZXJGYWN0b3J5LFxuICAgICAgICAgICAgdGV4dExheWVyTW9kZTogX3RoaXMyLnRleHRMYXllck1vZGUsXG4gICAgICAgICAgICBhbm5vdGF0aW9uTGF5ZXJGYWN0b3J5OiBfdGhpczIsXG4gICAgICAgICAgICBpbWFnZVJlc291cmNlc1BhdGg6IF90aGlzMi5pbWFnZVJlc291cmNlc1BhdGgsXG4gICAgICAgICAgICByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zOiBfdGhpczIucmVuZGVySW50ZXJhY3RpdmVGb3JtcyxcbiAgICAgICAgICAgIHJlbmRlcmVyOiBfdGhpczIucmVuZGVyZXIsXG4gICAgICAgICAgICBlbmFibGVXZWJHTDogX3RoaXMyLmVuYWJsZVdlYkdMLFxuICAgICAgICAgICAgdXNlT25seUNzc1pvb206IF90aGlzMi51c2VPbmx5Q3NzWm9vbSxcbiAgICAgICAgICAgIG1heENhbnZhc1BpeGVsczogX3RoaXMyLm1heENhbnZhc1BpeGVscyxcbiAgICAgICAgICAgIGwxMG46IF90aGlzMi5sMTBuXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBfdGhpczIuX3BhZ2VzLnB1c2gocGFnZVZpZXcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZpcnN0UGFnZVZpZXcgPSBfdGhpczIuX3BhZ2VzWzBdO1xuXG4gICAgICAgIGlmIChmaXJzdFBhZ2VWaWV3KSB7XG4gICAgICAgICAgZmlyc3RQYWdlVmlldy5zZXRQZGZQYWdlKGZpcnN0UGRmUGFnZSk7XG5cbiAgICAgICAgICBfdGhpczIubGlua1NlcnZpY2UuY2FjaGVQYWdlUmVmKDEsIGZpcnN0UGRmUGFnZS5yZWYpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF90aGlzMi5fc3ByZWFkTW9kZSAhPT0gX3VpX3V0aWxzLlNwcmVhZE1vZGUuTk9ORSkge1xuICAgICAgICAgIF90aGlzMi5fdXBkYXRlU3ByZWFkTW9kZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMyLl9vbmVQYWdlUmVuZGVyZWRPckZvcmNlRmV0Y2goKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoX3RoaXMyLmZpbmRDb250cm9sbGVyKSB7XG4gICAgICAgICAgICBfdGhpczIuZmluZENvbnRyb2xsZXIuc2V0RG9jdW1lbnQocGRmRG9jdW1lbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwZGZEb2N1bWVudC5sb2FkaW5nUGFyYW1zLmRpc2FibGVBdXRvRmV0Y2ggfHwgcGFnZXNDb3VudCA+IDc1MDApIHtcbiAgICAgICAgICAgIF90aGlzMi5fcGFnZXNDYXBhYmlsaXR5LnJlc29sdmUoKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBnZXRQYWdlc0xlZnQgPSBwYWdlc0NvdW50IC0gMTtcblxuICAgICAgICAgIGlmIChnZXRQYWdlc0xlZnQgPD0gMCkge1xuICAgICAgICAgICAgX3RoaXMyLl9wYWdlc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoX3BhZ2VOdW0pIHtcbiAgICAgICAgICAgIHBkZkRvY3VtZW50LmdldFBhZ2UoX3BhZ2VOdW0pLnRoZW4oZnVuY3Rpb24gKHBkZlBhZ2UpIHtcbiAgICAgICAgICAgICAgdmFyIHBhZ2VWaWV3ID0gX3RoaXMyLl9wYWdlc1tfcGFnZU51bSAtIDFdO1xuXG4gICAgICAgICAgICAgIGlmICghcGFnZVZpZXcucGRmUGFnZSkge1xuICAgICAgICAgICAgICAgIHBhZ2VWaWV3LnNldFBkZlBhZ2UocGRmUGFnZSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfdGhpczIubGlua1NlcnZpY2UuY2FjaGVQYWdlUmVmKF9wYWdlTnVtLCBwZGZQYWdlLnJlZik7XG5cbiAgICAgICAgICAgICAgaWYgKC0tZ2V0UGFnZXNMZWZ0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMyLl9wYWdlc0NhcGFiaWxpdHkucmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmFibGUgdG8gZ2V0IHBhZ2UgXCIuY29uY2F0KF9wYWdlTnVtLCBcIiB0byBpbml0aWFsaXplIHZpZXdlclwiKSwgcmVhc29uKTtcblxuICAgICAgICAgICAgICBpZiAoLS1nZXRQYWdlc0xlZnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICBfdGhpczIuX3BhZ2VzQ2FwYWJpbGl0eS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBmb3IgKHZhciBfcGFnZU51bSA9IDI7IF9wYWdlTnVtIDw9IHBhZ2VzQ291bnQ7ICsrX3BhZ2VOdW0pIHtcbiAgICAgICAgICAgIF9sb29wKF9wYWdlTnVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMi5ldmVudEJ1cy5kaXNwYXRjaChcInBhZ2VzaW5pdFwiLCB7XG4gICAgICAgICAgc291cmNlOiBfdGhpczJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKF90aGlzMi5kZWZhdWx0UmVuZGVyaW5nUXVldWUpIHtcbiAgICAgICAgICBfdGhpczIudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiVW5hYmxlIHRvIGluaXRpYWxpemUgdmlld2VyXCIsIHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0UGFnZUxhYmVsc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQYWdlTGFiZWxzKGxhYmVscykge1xuICAgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFsYWJlbHMpIHtcbiAgICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKCEoQXJyYXkuaXNBcnJheShsYWJlbHMpICYmIHRoaXMucGRmRG9jdW1lbnQubnVtUGFnZXMgPT09IGxhYmVscy5sZW5ndGgpKSB7XG4gICAgICAgIHRoaXMuX3BhZ2VMYWJlbHMgPSBudWxsO1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiXCIuY29uY2F0KHRoaXMuX25hbWUsIFwiLnNldFBhZ2VMYWJlbHM6IEludmFsaWQgcGFnZSBsYWJlbHMuXCIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3BhZ2VMYWJlbHMgPSBsYWJlbHM7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgdmFyIHBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbaV07XG4gICAgICAgIHZhciBsYWJlbCA9IHRoaXMuX3BhZ2VMYWJlbHMgJiYgdGhpcy5fcGFnZUxhYmVsc1tpXTtcbiAgICAgICAgcGFnZVZpZXcuc2V0UGFnZUxhYmVsKGxhYmVsKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3Jlc2V0Vmlld1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVzZXRWaWV3KCkge1xuICAgICAgdGhpcy5fcGFnZXMgPSBbXTtcbiAgICAgIHRoaXMuX2N1cnJlbnRQYWdlTnVtYmVyID0gMTtcbiAgICAgIHRoaXMuX2N1cnJlbnRTY2FsZSA9IF91aV91dGlscy5VTktOT1dOX1NDQUxFO1xuICAgICAgdGhpcy5fY3VycmVudFNjYWxlVmFsdWUgPSBudWxsO1xuICAgICAgdGhpcy5fcGFnZUxhYmVscyA9IG51bGw7XG4gICAgICB0aGlzLl9idWZmZXIgPSBuZXcgUERGUGFnZVZpZXdCdWZmZXIoREVGQVVMVF9DQUNIRV9TSVpFKTtcbiAgICAgIHRoaXMuX2xvY2F0aW9uID0gbnVsbDtcbiAgICAgIHRoaXMuX3BhZ2VzUm90YXRpb24gPSAwO1xuICAgICAgdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSA9IG51bGw7XG4gICAgICB0aGlzLl9wYWdlc1JlcXVlc3RzID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgIHRoaXMuX2ZpcnN0UGFnZUNhcGFiaWxpdHkgPSAoMCwgX3BkZmpzTGliLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO1xuICAgICAgdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eSA9ICgwLCBfcGRmanNMaWIuY3JlYXRlUHJvbWlzZUNhcGFiaWxpdHkpKCk7XG4gICAgICB0aGlzLl9wYWdlc0NhcGFiaWxpdHkgPSAoMCwgX3BkZmpzTGliLmNyZWF0ZVByb21pc2VDYXBhYmlsaXR5KSgpO1xuICAgICAgdGhpcy5fc2Nyb2xsTW9kZSA9IF91aV91dGlscy5TY3JvbGxNb2RlLlZFUlRJQ0FMO1xuICAgICAgdGhpcy5fc3ByZWFkTW9kZSA9IF91aV91dGlscy5TcHJlYWRNb2RlLk5PTkU7XG5cbiAgICAgIGlmICh0aGlzLl9vbkJlZm9yZURyYXcpIHtcbiAgICAgICAgdGhpcy5ldmVudEJ1cy5fb2ZmKFwicGFnZXJlbmRlclwiLCB0aGlzLl9vbkJlZm9yZURyYXcpO1xuXG4gICAgICAgIHRoaXMuX29uQmVmb3JlRHJhdyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9vbkFmdGVyRHJhdykge1xuICAgICAgICB0aGlzLmV2ZW50QnVzLl9vZmYoXCJwYWdlcmVuZGVyZWRcIiwgdGhpcy5fb25BZnRlckRyYXcpO1xuXG4gICAgICAgIHRoaXMuX29uQWZ0ZXJEcmF3ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdGhpcy52aWV3ZXIudGV4dENvbnRlbnQgPSBcIlwiO1xuXG4gICAgICB0aGlzLl91cGRhdGVTY3JvbGxNb2RlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9zY3JvbGxVcGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3Njcm9sbFVwZGF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLnBhZ2VzQ291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfc2Nyb2xsSW50b1ZpZXdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3Njcm9sbEludG9WaWV3KF9yZWYpIHtcbiAgICAgIHZhciBwYWdlRGl2ID0gX3JlZi5wYWdlRGl2LFxuICAgICAgICAgIF9yZWYkcGFnZVNwb3QgPSBfcmVmLnBhZ2VTcG90LFxuICAgICAgICAgIHBhZ2VTcG90ID0gX3JlZiRwYWdlU3BvdCA9PT0gdm9pZCAwID8gbnVsbCA6IF9yZWYkcGFnZVNwb3QsXG4gICAgICAgICAgX3JlZiRwYWdlTnVtYmVyID0gX3JlZi5wYWdlTnVtYmVyLFxuICAgICAgICAgIHBhZ2VOdW1iZXIgPSBfcmVmJHBhZ2VOdW1iZXIgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJHBhZ2VOdW1iZXI7XG4gICAgICAoMCwgX3VpX3V0aWxzLnNjcm9sbEludG9WaWV3KShwYWdlRGl2LCBwYWdlU3BvdCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9zZXRTY2FsZVVwZGF0ZVBhZ2VzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9zZXRTY2FsZVVwZGF0ZVBhZ2VzKG5ld1NjYWxlLCBuZXdWYWx1ZSkge1xuICAgICAgdmFyIG5vU2Nyb2xsID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcbiAgICAgIHZhciBwcmVzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuICAgICAgdGhpcy5fY3VycmVudFNjYWxlVmFsdWUgPSBuZXdWYWx1ZS50b1N0cmluZygpO1xuXG4gICAgICBpZiAoaXNTYW1lU2NhbGUodGhpcy5fY3VycmVudFNjYWxlLCBuZXdTY2FsZSkpIHtcbiAgICAgICAgaWYgKHByZXNldCkge1xuICAgICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJzY2FsZWNoYW5naW5nXCIsIHtcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICAgIHNjYWxlOiBuZXdTY2FsZSxcbiAgICAgICAgICAgIHByZXNldFZhbHVlOiBuZXdWYWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSB0aGlzLl9wYWdlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHRoaXMuX3BhZ2VzW2ldLnVwZGF0ZShuZXdTY2FsZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2N1cnJlbnRTY2FsZSA9IG5ld1NjYWxlO1xuXG4gICAgICBpZiAoIW5vU2Nyb2xsKSB7XG4gICAgICAgIHZhciBwYWdlID0gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXIsXG4gICAgICAgICAgICBkZXN0O1xuXG4gICAgICAgIGlmICh0aGlzLl9sb2NhdGlvbiAmJiAhKHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUgfHwgdGhpcy5pc0NoYW5naW5nUHJlc2VudGF0aW9uTW9kZSkpIHtcbiAgICAgICAgICBwYWdlID0gdGhpcy5fbG9jYXRpb24ucGFnZU51bWJlcjtcbiAgICAgICAgICBkZXN0ID0gW251bGwsIHtcbiAgICAgICAgICAgIG5hbWU6IFwiWFlaXCJcbiAgICAgICAgICB9LCB0aGlzLl9sb2NhdGlvbi5sZWZ0LCB0aGlzLl9sb2NhdGlvbi50b3AsIG51bGxdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY3JvbGxQYWdlSW50b1ZpZXcoe1xuICAgICAgICAgIHBhZ2VOdW1iZXI6IHBhZ2UsXG4gICAgICAgICAgZGVzdEFycmF5OiBkZXN0LFxuICAgICAgICAgIGFsbG93TmVnYXRpdmVPZmZzZXQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJzY2FsZWNoYW5naW5nXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBzY2FsZTogbmV3U2NhbGUsXG4gICAgICAgIHByZXNldFZhbHVlOiBwcmVzZXQgPyBuZXdWYWx1ZSA6IHVuZGVmaW5lZFxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLmRlZmF1bHRSZW5kZXJpbmdRdWV1ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfc2V0U2NhbGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3NldFNjYWxlKHZhbHVlKSB7XG4gICAgICB2YXIgbm9TY3JvbGwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgICAgdmFyIHNjYWxlID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG5cbiAgICAgIGlmIChzY2FsZSA+IDApIHtcbiAgICAgICAgdGhpcy5fc2V0U2NhbGVVcGRhdGVQYWdlcyhzY2FsZSwgdmFsdWUsIG5vU2Nyb2xsLCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgY3VycmVudFBhZ2UgPSB0aGlzLl9wYWdlc1t0aGlzLl9jdXJyZW50UGFnZU51bWJlciAtIDFdO1xuXG4gICAgICAgIGlmICghY3VycmVudFBhZ2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm9QYWRkaW5nID0gdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSB8fCB0aGlzLnJlbW92ZVBhZ2VCb3JkZXJzO1xuICAgICAgICB2YXIgaFBhZGRpbmcgPSBub1BhZGRpbmcgPyAwIDogX3VpX3V0aWxzLlNDUk9MTEJBUl9QQURESU5HO1xuICAgICAgICB2YXIgdlBhZGRpbmcgPSBub1BhZGRpbmcgPyAwIDogX3VpX3V0aWxzLlZFUlRJQ0FMX1BBRERJTkc7XG5cbiAgICAgICAgaWYgKCFub1BhZGRpbmcgJiYgdGhpcy5faXNTY3JvbGxNb2RlSG9yaXpvbnRhbCkge1xuICAgICAgICAgIHZhciBfcmVmMiA9IFt2UGFkZGluZywgaFBhZGRpbmddO1xuICAgICAgICAgIGhQYWRkaW5nID0gX3JlZjJbMF07XG4gICAgICAgICAgdlBhZGRpbmcgPSBfcmVmMlsxXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYWdlV2lkdGhTY2FsZSA9ICh0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCAtIGhQYWRkaW5nKSAvIGN1cnJlbnRQYWdlLndpZHRoICogY3VycmVudFBhZ2Uuc2NhbGU7XG4gICAgICAgIHZhciBwYWdlSGVpZ2h0U2NhbGUgPSAodGhpcy5jb250YWluZXIuY2xpZW50SGVpZ2h0IC0gdlBhZGRpbmcpIC8gY3VycmVudFBhZ2UuaGVpZ2h0ICogY3VycmVudFBhZ2Uuc2NhbGU7XG5cbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgIGNhc2UgXCJwYWdlLWFjdHVhbFwiOlxuICAgICAgICAgICAgc2NhbGUgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwicGFnZS13aWR0aFwiOlxuICAgICAgICAgICAgc2NhbGUgPSBwYWdlV2lkdGhTY2FsZTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcInBhZ2UtaGVpZ2h0XCI6XG4gICAgICAgICAgICBzY2FsZSA9IHBhZ2VIZWlnaHRTY2FsZTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBcInBhZ2UtZml0XCI6XG4gICAgICAgICAgICBzY2FsZSA9IE1hdGgubWluKHBhZ2VXaWR0aFNjYWxlLCBwYWdlSGVpZ2h0U2NhbGUpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIFwiYXV0b1wiOlxuICAgICAgICAgICAgdmFyIGhvcml6b250YWxTY2FsZSA9ICgwLCBfdWlfdXRpbHMuaXNQb3J0cmFpdE9yaWVudGF0aW9uKShjdXJyZW50UGFnZSkgPyBwYWdlV2lkdGhTY2FsZSA6IE1hdGgubWluKHBhZ2VIZWlnaHRTY2FsZSwgcGFnZVdpZHRoU2NhbGUpO1xuICAgICAgICAgICAgc2NhbGUgPSBNYXRoLm1pbihfdWlfdXRpbHMuTUFYX0FVVE9fU0NBTEUsIGhvcml6b250YWxTY2FsZSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiXCIuY29uY2F0KHRoaXMuX25hbWUsIFwiLl9zZXRTY2FsZTogXFxcIlwiKS5jb25jYXQodmFsdWUsIFwiXFxcIiBpcyBhbiB1bmtub3duIHpvb20gdmFsdWUuXCIpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NldFNjYWxlVXBkYXRlUGFnZXMoc2NhbGUsIHZhbHVlLCBub1Njcm9sbCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9yZXNldEN1cnJlbnRQYWdlVmlld1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVzZXRDdXJyZW50UGFnZVZpZXcoKSB7XG4gICAgICBpZiAodGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSkge1xuICAgICAgICB0aGlzLl9zZXRTY2FsZSh0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07XG5cbiAgICAgIHRoaXMuX3Njcm9sbEludG9WaWV3KHtcbiAgICAgICAgcGFnZURpdjogcGFnZVZpZXcuZGl2XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic2Nyb2xsUGFnZUludG9WaWV3XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNjcm9sbFBhZ2VJbnRvVmlldyhfcmVmMykge1xuICAgICAgdmFyIHBhZ2VOdW1iZXIgPSBfcmVmMy5wYWdlTnVtYmVyLFxuICAgICAgICAgIF9yZWYzJGRlc3RBcnJheSA9IF9yZWYzLmRlc3RBcnJheSxcbiAgICAgICAgICBkZXN0QXJyYXkgPSBfcmVmMyRkZXN0QXJyYXkgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmMyRkZXN0QXJyYXksXG4gICAgICAgICAgX3JlZjMkYWxsb3dOZWdhdGl2ZU9mID0gX3JlZjMuYWxsb3dOZWdhdGl2ZU9mZnNldCxcbiAgICAgICAgICBhbGxvd05lZ2F0aXZlT2Zmc2V0ID0gX3JlZjMkYWxsb3dOZWdhdGl2ZU9mID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYzJGFsbG93TmVnYXRpdmVPZixcbiAgICAgICAgICBfcmVmMyRpZ25vcmVEZXN0aW5hdGkgPSBfcmVmMy5pZ25vcmVEZXN0aW5hdGlvblpvb20sXG4gICAgICAgICAgaWdub3JlRGVzdGluYXRpb25ab29tID0gX3JlZjMkaWdub3JlRGVzdGluYXRpID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYzJGlnbm9yZURlc3RpbmF0aTtcblxuICAgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBhZ2VWaWV3ID0gTnVtYmVyLmlzSW50ZWdlcihwYWdlTnVtYmVyKSAmJiB0aGlzLl9wYWdlc1twYWdlTnVtYmVyIC0gMV07XG5cbiAgICAgIGlmICghcGFnZVZpZXcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlwiLmNvbmNhdCh0aGlzLl9uYW1lLCBcIi5zY3JvbGxQYWdlSW50b1ZpZXc6IFwiKSArIFwiXFxcIlwiLmNvbmNhdChwYWdlTnVtYmVyLCBcIlxcXCIgaXMgbm90IGEgdmFsaWQgcGFnZU51bWJlciBwYXJhbWV0ZXIuXCIpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSB8fCAhZGVzdEFycmF5KSB7XG4gICAgICAgIHRoaXMuX3NldEN1cnJlbnRQYWdlTnVtYmVyKHBhZ2VOdW1iZXIsIHRydWUpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHggPSAwLFxuICAgICAgICAgIHkgPSAwO1xuICAgICAgdmFyIHdpZHRoID0gMCxcbiAgICAgICAgICBoZWlnaHQgPSAwLFxuICAgICAgICAgIHdpZHRoU2NhbGUsXG4gICAgICAgICAgaGVpZ2h0U2NhbGU7XG4gICAgICB2YXIgY2hhbmdlT3JpZW50YXRpb24gPSBwYWdlVmlldy5yb3RhdGlvbiAlIDE4MCAhPT0gMDtcbiAgICAgIHZhciBwYWdlV2lkdGggPSAoY2hhbmdlT3JpZW50YXRpb24gPyBwYWdlVmlldy5oZWlnaHQgOiBwYWdlVmlldy53aWR0aCkgLyBwYWdlVmlldy5zY2FsZSAvIF91aV91dGlscy5DU1NfVU5JVFM7XG4gICAgICB2YXIgcGFnZUhlaWdodCA9IChjaGFuZ2VPcmllbnRhdGlvbiA/IHBhZ2VWaWV3LndpZHRoIDogcGFnZVZpZXcuaGVpZ2h0KSAvIHBhZ2VWaWV3LnNjYWxlIC8gX3VpX3V0aWxzLkNTU19VTklUUztcbiAgICAgIHZhciBzY2FsZSA9IDA7XG5cbiAgICAgIHN3aXRjaCAoZGVzdEFycmF5WzFdLm5hbWUpIHtcbiAgICAgICAgY2FzZSBcIlhZWlwiOlxuICAgICAgICAgIHggPSBkZXN0QXJyYXlbMl07XG4gICAgICAgICAgeSA9IGRlc3RBcnJheVszXTtcbiAgICAgICAgICBzY2FsZSA9IGRlc3RBcnJheVs0XTtcbiAgICAgICAgICB4ID0geCAhPT0gbnVsbCA/IHggOiAwO1xuICAgICAgICAgIHkgPSB5ICE9PSBudWxsID8geSA6IHBhZ2VIZWlnaHQ7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIkZpdFwiOlxuICAgICAgICBjYXNlIFwiRml0QlwiOlxuICAgICAgICAgIHNjYWxlID0gXCJwYWdlLWZpdFwiO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJGaXRIXCI6XG4gICAgICAgIGNhc2UgXCJGaXRCSFwiOlxuICAgICAgICAgIHkgPSBkZXN0QXJyYXlbMl07XG4gICAgICAgICAgc2NhbGUgPSBcInBhZ2Utd2lkdGhcIjtcblxuICAgICAgICAgIGlmICh5ID09PSBudWxsICYmIHRoaXMuX2xvY2F0aW9uKSB7XG4gICAgICAgICAgICB4ID0gdGhpcy5fbG9jYXRpb24ubGVmdDtcbiAgICAgICAgICAgIHkgPSB0aGlzLl9sb2NhdGlvbi50b3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIkZpdFZcIjpcbiAgICAgICAgY2FzZSBcIkZpdEJWXCI6XG4gICAgICAgICAgeCA9IGRlc3RBcnJheVsyXTtcbiAgICAgICAgICB3aWR0aCA9IHBhZ2VXaWR0aDtcbiAgICAgICAgICBoZWlnaHQgPSBwYWdlSGVpZ2h0O1xuICAgICAgICAgIHNjYWxlID0gXCJwYWdlLWhlaWdodFwiO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJGaXRSXCI6XG4gICAgICAgICAgeCA9IGRlc3RBcnJheVsyXTtcbiAgICAgICAgICB5ID0gZGVzdEFycmF5WzNdO1xuICAgICAgICAgIHdpZHRoID0gZGVzdEFycmF5WzRdIC0geDtcbiAgICAgICAgICBoZWlnaHQgPSBkZXN0QXJyYXlbNV0gLSB5O1xuICAgICAgICAgIHZhciBoUGFkZGluZyA9IHRoaXMucmVtb3ZlUGFnZUJvcmRlcnMgPyAwIDogX3VpX3V0aWxzLlNDUk9MTEJBUl9QQURESU5HO1xuICAgICAgICAgIHZhciB2UGFkZGluZyA9IHRoaXMucmVtb3ZlUGFnZUJvcmRlcnMgPyAwIDogX3VpX3V0aWxzLlZFUlRJQ0FMX1BBRERJTkc7XG4gICAgICAgICAgd2lkdGhTY2FsZSA9ICh0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCAtIGhQYWRkaW5nKSAvIHdpZHRoIC8gX3VpX3V0aWxzLkNTU19VTklUUztcbiAgICAgICAgICBoZWlnaHRTY2FsZSA9ICh0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQgLSB2UGFkZGluZykgLyBoZWlnaHQgLyBfdWlfdXRpbHMuQ1NTX1VOSVRTO1xuICAgICAgICAgIHNjYWxlID0gTWF0aC5taW4oTWF0aC5hYnMod2lkdGhTY2FsZSksIE1hdGguYWJzKGhlaWdodFNjYWxlKSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiXCIuY29uY2F0KHRoaXMuX25hbWUsIFwiLnNjcm9sbFBhZ2VJbnRvVmlldzogXCIpICsgXCJcXFwiXCIuY29uY2F0KGRlc3RBcnJheVsxXS5uYW1lLCBcIlxcXCIgaXMgbm90IGEgdmFsaWQgZGVzdGluYXRpb24gdHlwZS5cIikpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpZ25vcmVEZXN0aW5hdGlvblpvb20pIHtcbiAgICAgICAgaWYgKHNjYWxlICYmIHNjYWxlICE9PSB0aGlzLl9jdXJyZW50U2NhbGUpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRTY2FsZVZhbHVlID0gc2NhbGU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY3VycmVudFNjYWxlID09PSBfdWlfdXRpbHMuVU5LTk9XTl9TQ0FMRSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFNjYWxlVmFsdWUgPSBfdWlfdXRpbHMuREVGQVVMVF9TQ0FMRV9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2NhbGUgPT09IFwicGFnZS1maXRcIiAmJiAhZGVzdEFycmF5WzRdKSB7XG4gICAgICAgIHRoaXMuX3Njcm9sbEludG9WaWV3KHtcbiAgICAgICAgICBwYWdlRGl2OiBwYWdlVmlldy5kaXYsXG4gICAgICAgICAgcGFnZU51bWJlcjogcGFnZU51bWJlclxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBib3VuZGluZ1JlY3QgPSBbcGFnZVZpZXcudmlld3BvcnQuY29udmVydFRvVmlld3BvcnRQb2ludCh4LCB5KSwgcGFnZVZpZXcudmlld3BvcnQuY29udmVydFRvVmlld3BvcnRQb2ludCh4ICsgd2lkdGgsIHkgKyBoZWlnaHQpXTtcbiAgICAgIHZhciBsZWZ0ID0gTWF0aC5taW4oYm91bmRpbmdSZWN0WzBdWzBdLCBib3VuZGluZ1JlY3RbMV1bMF0pO1xuICAgICAgdmFyIHRvcCA9IE1hdGgubWluKGJvdW5kaW5nUmVjdFswXVsxXSwgYm91bmRpbmdSZWN0WzFdWzFdKTtcblxuICAgICAgaWYgKCFhbGxvd05lZ2F0aXZlT2Zmc2V0KSB7XG4gICAgICAgIGxlZnQgPSBNYXRoLm1heChsZWZ0LCAwKTtcbiAgICAgICAgdG9wID0gTWF0aC5tYXgodG9wLCAwKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2Nyb2xsSW50b1ZpZXcoe1xuICAgICAgICBwYWdlRGl2OiBwYWdlVmlldy5kaXYsXG4gICAgICAgIHBhZ2VTcG90OiB7XG4gICAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgICB0b3A6IHRvcFxuICAgICAgICB9LFxuICAgICAgICBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3VwZGF0ZUxvY2F0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVMb2NhdGlvbihmaXJzdFBhZ2UpIHtcbiAgICAgIHZhciBjdXJyZW50U2NhbGUgPSB0aGlzLl9jdXJyZW50U2NhbGU7XG4gICAgICB2YXIgY3VycmVudFNjYWxlVmFsdWUgPSB0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZTtcbiAgICAgIHZhciBub3JtYWxpemVkU2NhbGVWYWx1ZSA9IHBhcnNlRmxvYXQoY3VycmVudFNjYWxlVmFsdWUpID09PSBjdXJyZW50U2NhbGUgPyBNYXRoLnJvdW5kKGN1cnJlbnRTY2FsZSAqIDEwMDAwKSAvIDEwMCA6IGN1cnJlbnRTY2FsZVZhbHVlO1xuICAgICAgdmFyIHBhZ2VOdW1iZXIgPSBmaXJzdFBhZ2UuaWQ7XG4gICAgICB2YXIgcGRmT3BlblBhcmFtcyA9IFwiI3BhZ2U9XCIgKyBwYWdlTnVtYmVyO1xuICAgICAgcGRmT3BlblBhcmFtcyArPSBcIiZ6b29tPVwiICsgbm9ybWFsaXplZFNjYWxlVmFsdWU7XG4gICAgICB2YXIgY3VycmVudFBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbcGFnZU51bWJlciAtIDFdO1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyO1xuICAgICAgdmFyIHRvcExlZnQgPSBjdXJyZW50UGFnZVZpZXcuZ2V0UGFnZVBvaW50KGNvbnRhaW5lci5zY3JvbGxMZWZ0IC0gZmlyc3RQYWdlLngsIGNvbnRhaW5lci5zY3JvbGxUb3AgLSBmaXJzdFBhZ2UueSk7XG4gICAgICB2YXIgaW50TGVmdCA9IE1hdGgucm91bmQodG9wTGVmdFswXSk7XG4gICAgICB2YXIgaW50VG9wID0gTWF0aC5yb3VuZCh0b3BMZWZ0WzFdKTtcbiAgICAgIHBkZk9wZW5QYXJhbXMgKz0gXCIsXCIgKyBpbnRMZWZ0ICsgXCIsXCIgKyBpbnRUb3A7XG4gICAgICB0aGlzLl9sb2NhdGlvbiA9IHtcbiAgICAgICAgcGFnZU51bWJlcjogcGFnZU51bWJlcixcbiAgICAgICAgc2NhbGU6IG5vcm1hbGl6ZWRTY2FsZVZhbHVlLFxuICAgICAgICB0b3A6IGludFRvcCxcbiAgICAgICAgbGVmdDogaW50TGVmdCxcbiAgICAgICAgcm90YXRpb246IHRoaXMuX3BhZ2VzUm90YXRpb24sXG4gICAgICAgIHBkZk9wZW5QYXJhbXM6IHBkZk9wZW5QYXJhbXNcbiAgICAgIH07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVIZWxwZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZUhlbHBlcih2aXNpYmxlUGFnZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZDogX3VwZGF0ZUhlbHBlclwiKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIHZhciB2aXNpYmxlID0gdGhpcy5fZ2V0VmlzaWJsZVBhZ2VzKCk7XG5cbiAgICAgIHZhciB2aXNpYmxlUGFnZXMgPSB2aXNpYmxlLnZpZXdzLFxuICAgICAgICAgIG51bVZpc2libGVQYWdlcyA9IHZpc2libGVQYWdlcy5sZW5ndGg7XG5cbiAgICAgIGlmIChudW1WaXNpYmxlUGFnZXMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3Q2FjaGVTaXplID0gTWF0aC5tYXgoREVGQVVMVF9DQUNIRV9TSVpFLCAyICogbnVtVmlzaWJsZVBhZ2VzICsgMSk7XG5cbiAgICAgIHRoaXMuX2J1ZmZlci5yZXNpemUobmV3Q2FjaGVTaXplLCB2aXNpYmxlUGFnZXMpO1xuXG4gICAgICB0aGlzLnJlbmRlcmluZ1F1ZXVlLnJlbmRlckhpZ2hlc3RQcmlvcml0eSh2aXNpYmxlKTtcblxuICAgICAgdGhpcy5fdXBkYXRlSGVscGVyKHZpc2libGVQYWdlcyk7XG5cbiAgICAgIHRoaXMuX3VwZGF0ZUxvY2F0aW9uKHZpc2libGUuZmlyc3QpO1xuXG4gICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKFwidXBkYXRldmlld2FyZWFcIiwge1xuICAgICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICAgIGxvY2F0aW9uOiB0aGlzLl9sb2NhdGlvblxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbnRhaW5zRWxlbWVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb250YWluc0VsZW1lbnQoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLmNvbnRhaW5zKGVsZW1lbnQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb2N1c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmZvY3VzKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9nZXRDdXJyZW50VmlzaWJsZVBhZ2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2dldEN1cnJlbnRWaXNpYmxlUGFnZSgpIHtcbiAgICAgIGlmICghdGhpcy5wYWdlc0NvdW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmlld3M6IFtdXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHZhciBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07XG4gICAgICB2YXIgZWxlbWVudCA9IHBhZ2VWaWV3LmRpdjtcbiAgICAgIHZhciB2aWV3ID0ge1xuICAgICAgICBpZDogcGFnZVZpZXcuaWQsXG4gICAgICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdCxcbiAgICAgICAgeTogZWxlbWVudC5vZmZzZXRUb3AgKyBlbGVtZW50LmNsaWVudFRvcCxcbiAgICAgICAgdmlldzogcGFnZVZpZXdcbiAgICAgIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaXJzdDogdmlldyxcbiAgICAgICAgbGFzdDogdmlldyxcbiAgICAgICAgdmlld3M6IFt2aWV3XVxuICAgICAgfTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2dldFZpc2libGVQYWdlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0VmlzaWJsZVBhZ2VzKCkge1xuICAgICAgcmV0dXJuICgwLCBfdWlfdXRpbHMuZ2V0VmlzaWJsZUVsZW1lbnRzKSh0aGlzLmNvbnRhaW5lciwgdGhpcy5fcGFnZXMsIHRydWUsIHRoaXMuX2lzU2Nyb2xsTW9kZUhvcml6b250YWwpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc1BhZ2VWaXNpYmxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzUGFnZVZpc2libGUocGFnZU51bWJlcikge1xuICAgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhZ2VOdW1iZXIgPCAxIHx8IHBhZ2VOdW1iZXIgPiB0aGlzLnBhZ2VzQ291bnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlwiLmNvbmNhdCh0aGlzLl9uYW1lLCBcIi5pc1BhZ2VWaXNpYmxlOiBcXFwiXCIpLmNvbmNhdChwYWdlTnVtYmVyLCBcIlxcXCIgaXMgb3V0IG9mIGJvdW5kcy5cIikpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9nZXRWaXNpYmxlUGFnZXMoKS52aWV3cy5zb21lKGZ1bmN0aW9uICh2aWV3KSB7XG4gICAgICAgIHJldHVybiB2aWV3LmlkID09PSBwYWdlTnVtYmVyO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNsZWFudXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhZ2VzW2ldICYmIHRoaXMuX3BhZ2VzW2ldLnJlbmRlcmluZ1N0YXRlICE9PSBfcGRmX3JlbmRlcmluZ19xdWV1ZS5SZW5kZXJpbmdTdGF0ZXMuRklOSVNIRUQpIHtcbiAgICAgICAgICB0aGlzLl9wYWdlc1tpXS5yZXNldCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9jYW5jZWxSZW5kZXJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2NhbmNlbFJlbmRlcmluZygpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhZ2VzW2ldKSB7XG4gICAgICAgICAgdGhpcy5fcGFnZXNbaV0uY2FuY2VsUmVuZGVyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2Vuc3VyZVBkZlBhZ2VMb2FkZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2Vuc3VyZVBkZlBhZ2VMb2FkZWQocGFnZVZpZXcpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBpZiAocGFnZVZpZXcucGRmUGFnZSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHBhZ2VWaWV3LnBkZlBhZ2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fcGFnZXNSZXF1ZXN0cy5oYXMocGFnZVZpZXcpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdlc1JlcXVlc3RzLmdldChwYWdlVmlldyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9taXNlID0gdGhpcy5wZGZEb2N1bWVudC5nZXRQYWdlKHBhZ2VWaWV3LmlkKS50aGVuKGZ1bmN0aW9uIChwZGZQYWdlKSB7XG4gICAgICAgIGlmICghcGFnZVZpZXcucGRmUGFnZSkge1xuICAgICAgICAgIHBhZ2VWaWV3LnNldFBkZlBhZ2UocGRmUGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczMuX3BhZ2VzUmVxdWVzdHNbXCJkZWxldGVcIl0ocGFnZVZpZXcpO1xuXG4gICAgICAgIHJldHVybiBwZGZQYWdlO1xuICAgICAgfSlbXCJjYXRjaFwiXShmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmFibGUgdG8gZ2V0IHBhZ2UgZm9yIHBhZ2Ugdmlld1wiLCByZWFzb24pO1xuXG4gICAgICAgIF90aGlzMy5fcGFnZXNSZXF1ZXN0c1tcImRlbGV0ZVwiXShwYWdlVmlldyk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fcGFnZXNSZXF1ZXN0cy5zZXQocGFnZVZpZXcsIHByb21pc2UpO1xuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZm9yY2VSZW5kZXJpbmdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9yY2VSZW5kZXJpbmcoY3VycmVudGx5VmlzaWJsZVBhZ2VzKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdmFyIHZpc2libGVQYWdlcyA9IGN1cnJlbnRseVZpc2libGVQYWdlcyB8fCB0aGlzLl9nZXRWaXNpYmxlUGFnZXMoKTtcblxuICAgICAgdmFyIHNjcm9sbEFoZWFkID0gdGhpcy5faXNTY3JvbGxNb2RlSG9yaXpvbnRhbCA/IHRoaXMuc2Nyb2xsLnJpZ2h0IDogdGhpcy5zY3JvbGwuZG93bjtcbiAgICAgIHZhciBwYWdlVmlldyA9IHRoaXMucmVuZGVyaW5nUXVldWUuZ2V0SGlnaGVzdFByaW9yaXR5KHZpc2libGVQYWdlcywgdGhpcy5fcGFnZXMsIHNjcm9sbEFoZWFkKTtcblxuICAgICAgaWYgKHBhZ2VWaWV3KSB7XG4gICAgICAgIHRoaXMuX2Vuc3VyZVBkZlBhZ2VMb2FkZWQocGFnZVZpZXcpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzNC5yZW5kZXJpbmdRdWV1ZS5yZW5kZXJWaWV3KHBhZ2VWaWV3KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlVGV4dExheWVyQnVpbGRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVUZXh0TGF5ZXJCdWlsZGVyKHRleHRMYXllckRpdiwgcGFnZUluZGV4LCB2aWV3cG9ydCkge1xuICAgICAgdmFyIGVuaGFuY2VUZXh0U2VsZWN0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmYWxzZTtcbiAgICAgIHZhciBldmVudEJ1cyA9IGFyZ3VtZW50cy5sZW5ndGggPiA0ID8gYXJndW1lbnRzWzRdIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIG5ldyBfdGV4dF9sYXllcl9idWlsZGVyLlRleHRMYXllckJ1aWxkZXIoe1xuICAgICAgICB0ZXh0TGF5ZXJEaXY6IHRleHRMYXllckRpdixcbiAgICAgICAgZXZlbnRCdXM6IGV2ZW50QnVzLFxuICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleCxcbiAgICAgICAgdmlld3BvcnQ6IHZpZXdwb3J0LFxuICAgICAgICBmaW5kQ29udHJvbGxlcjogdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSA/IG51bGwgOiB0aGlzLmZpbmRDb250cm9sbGVyLFxuICAgICAgICBlbmhhbmNlVGV4dFNlbGVjdGlvbjogdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSA/IGZhbHNlIDogZW5oYW5jZVRleHRTZWxlY3Rpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVBbm5vdGF0aW9uTGF5ZXJCdWlsZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUFubm90YXRpb25MYXllckJ1aWxkZXIocGFnZURpdiwgcGRmUGFnZSkge1xuICAgICAgdmFyIGFubm90YXRpb25TdG9yYWdlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsO1xuICAgICAgdmFyIGltYWdlUmVzb3VyY2VzUGF0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogXCJcIjtcbiAgICAgIHZhciByZW5kZXJJbnRlcmFjdGl2ZUZvcm1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiBmYWxzZTtcbiAgICAgIHZhciBsMTBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDUgJiYgYXJndW1lbnRzWzVdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNV0gOiBfdWlfdXRpbHMuTnVsbEwxMG47XG4gICAgICByZXR1cm4gbmV3IF9hbm5vdGF0aW9uX2xheWVyX2J1aWxkZXIuQW5ub3RhdGlvbkxheWVyQnVpbGRlcih7XG4gICAgICAgIHBhZ2VEaXY6IHBhZ2VEaXYsXG4gICAgICAgIHBkZlBhZ2U6IHBkZlBhZ2UsXG4gICAgICAgIGFubm90YXRpb25TdG9yYWdlOiBhbm5vdGF0aW9uU3RvcmFnZSxcbiAgICAgICAgaW1hZ2VSZXNvdXJjZXNQYXRoOiBpbWFnZVJlc291cmNlc1BhdGgsXG4gICAgICAgIHJlbmRlckludGVyYWN0aXZlRm9ybXM6IHJlbmRlckludGVyYWN0aXZlRm9ybXMsXG4gICAgICAgIGxpbmtTZXJ2aWNlOiB0aGlzLmxpbmtTZXJ2aWNlLFxuICAgICAgICBkb3dubG9hZE1hbmFnZXI6IHRoaXMuZG93bmxvYWRNYW5hZ2VyLFxuICAgICAgICBsMTBuOiBsMTBuXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UGFnZXNPdmVydmlld1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQYWdlc092ZXJ2aWV3KCkge1xuICAgICAgdmFyIHBhZ2VzT3ZlcnZpZXcgPSB0aGlzLl9wYWdlcy5tYXAoZnVuY3Rpb24gKHBhZ2VWaWV3KSB7XG4gICAgICAgIHZhciB2aWV3cG9ydCA9IHBhZ2VWaWV3LnBkZlBhZ2UuZ2V0Vmlld3BvcnQoe1xuICAgICAgICAgIHNjYWxlOiAxXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdpZHRoOiB2aWV3cG9ydC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHZpZXdwb3J0LmhlaWdodCxcbiAgICAgICAgICByb3RhdGlvbjogdmlld3BvcnQucm90YXRpb25cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXRoaXMuZW5hYmxlUHJpbnRBdXRvUm90YXRlKSB7XG4gICAgICAgIHJldHVybiBwYWdlc092ZXJ2aWV3O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFnZXNPdmVydmlldy5tYXAoZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgICAgaWYgKCgwLCBfdWlfdXRpbHMuaXNQb3J0cmFpdE9yaWVudGF0aW9uKShzaXplKSkge1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB3aWR0aDogc2l6ZS5oZWlnaHQsXG4gICAgICAgICAgaGVpZ2h0OiBzaXplLndpZHRoLFxuICAgICAgICAgIHJvdGF0aW9uOiAoc2l6ZS5yb3RhdGlvbiArIDkwKSAlIDM2MFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl91cGRhdGVTY3JvbGxNb2RlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVTY3JvbGxNb2RlKCkge1xuICAgICAgdmFyIHBhZ2VOdW1iZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgICB2YXIgc2Nyb2xsTW9kZSA9IHRoaXMuX3Njcm9sbE1vZGUsXG4gICAgICAgICAgdmlld2VyID0gdGhpcy52aWV3ZXI7XG4gICAgICB2aWV3ZXIuY2xhc3NMaXN0LnRvZ2dsZShcInNjcm9sbEhvcml6b250YWxcIiwgc2Nyb2xsTW9kZSA9PT0gX3VpX3V0aWxzLlNjcm9sbE1vZGUuSE9SSVpPTlRBTCk7XG4gICAgICB2aWV3ZXIuY2xhc3NMaXN0LnRvZ2dsZShcInNjcm9sbFdyYXBwZWRcIiwgc2Nyb2xsTW9kZSA9PT0gX3VpX3V0aWxzLlNjcm9sbE1vZGUuV1JBUFBFRCk7XG5cbiAgICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCB8fCAhcGFnZU51bWJlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSAmJiBpc05hTih0aGlzLl9jdXJyZW50U2NhbGVWYWx1ZSkpIHtcbiAgICAgICAgdGhpcy5fc2V0U2NhbGUodGhpcy5fY3VycmVudFNjYWxlVmFsdWUsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihwYWdlTnVtYmVyLCB0cnVlKTtcblxuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3VwZGF0ZVNwcmVhZE1vZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3VwZGF0ZVNwcmVhZE1vZGUoKSB7XG4gICAgICB2YXIgcGFnZU51bWJlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcblxuICAgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHZpZXdlciA9IHRoaXMudmlld2VyLFxuICAgICAgICAgIHBhZ2VzID0gdGhpcy5fcGFnZXM7XG4gICAgICB2aWV3ZXIudGV4dENvbnRlbnQgPSBcIlwiO1xuXG4gICAgICBpZiAodGhpcy5fc3ByZWFkTW9kZSA9PT0gX3VpX3V0aWxzLlNwcmVhZE1vZGUuTk9ORSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaU1heCA9IHBhZ2VzLmxlbmd0aDsgaSA8IGlNYXg7ICsraSkge1xuICAgICAgICAgIHZpZXdlci5hcHBlbmRDaGlsZChwYWdlc1tpXS5kaXYpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcGFyaXR5ID0gdGhpcy5fc3ByZWFkTW9kZSAtIDE7XG4gICAgICAgIHZhciBzcHJlYWQgPSBudWxsO1xuXG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgX2lNYXggPSBwYWdlcy5sZW5ndGg7IF9pIDwgX2lNYXg7ICsrX2kpIHtcbiAgICAgICAgICBpZiAoc3ByZWFkID09PSBudWxsKSB7XG4gICAgICAgICAgICBzcHJlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgc3ByZWFkLmNsYXNzTmFtZSA9IFwic3ByZWFkXCI7XG4gICAgICAgICAgICB2aWV3ZXIuYXBwZW5kQ2hpbGQoc3ByZWFkKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKF9pICUgMiA9PT0gcGFyaXR5KSB7XG4gICAgICAgICAgICBzcHJlYWQgPSBzcHJlYWQuY2xvbmVOb2RlKGZhbHNlKTtcbiAgICAgICAgICAgIHZpZXdlci5hcHBlbmRDaGlsZChzcHJlYWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNwcmVhZC5hcHBlbmRDaGlsZChwYWdlc1tfaV0uZGl2KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXBhZ2VOdW1iZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihwYWdlTnVtYmVyLCB0cnVlKTtcblxuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFnZXNDb3VudFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzLmxlbmd0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFnZVZpZXdzUmVhZHlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICghdGhpcy5fcGFnZXNDYXBhYmlsaXR5LnNldHRsZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fcGFnZXMuZXZlcnkoZnVuY3Rpb24gKHBhZ2VWaWV3KSB7XG4gICAgICAgIHJldHVybiBwYWdlVmlldyAmJiBwYWdlVmlldy5wZGZQYWdlO1xuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImN1cnJlbnRQYWdlTnVtYmVyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXI7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWwpIHtcbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih2YWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFnZSBudW1iZXIuXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX3NldEN1cnJlbnRQYWdlTnVtYmVyKHZhbCwgdHJ1ZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlwiLmNvbmNhdCh0aGlzLl9uYW1lLCBcIi5jdXJyZW50UGFnZU51bWJlcjogXFxcIlwiKS5jb25jYXQodmFsLCBcIlxcXCIgaXMgbm90IGEgdmFsaWQgcGFnZS5cIikpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjdXJyZW50UGFnZUxhYmVsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGFnZUxhYmVscyAmJiB0aGlzLl9wYWdlTGFiZWxzW3RoaXMuX2N1cnJlbnRQYWdlTnVtYmVyIC0gMV07XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWwpIHtcbiAgICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBwYWdlID0gdmFsIHwgMDtcblxuICAgICAgaWYgKHRoaXMuX3BhZ2VMYWJlbHMpIHtcbiAgICAgICAgdmFyIGkgPSB0aGlzLl9wYWdlTGFiZWxzLmluZGV4T2YodmFsKTtcblxuICAgICAgICBpZiAoaSA+PSAwKSB7XG4gICAgICAgICAgcGFnZSA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5fc2V0Q3VycmVudFBhZ2VOdW1iZXIocGFnZSwgdHJ1ZSkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlwiLmNvbmNhdCh0aGlzLl9uYW1lLCBcIi5jdXJyZW50UGFnZUxhYmVsOiBcXFwiXCIpLmNvbmNhdCh2YWwsIFwiXFxcIiBpcyBub3QgYSB2YWxpZCBwYWdlLlwiKSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImN1cnJlbnRTY2FsZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTY2FsZSAhPT0gX3VpX3V0aWxzLlVOS05PV05fU0NBTEUgPyB0aGlzLl9jdXJyZW50U2NhbGUgOiBfdWlfdXRpbHMuREVGQVVMVF9TQ0FMRTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbCkge1xuICAgICAgaWYgKGlzTmFOKHZhbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBudW1lcmljIHNjYWxlLlwiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnBkZkRvY3VtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2V0U2NhbGUodmFsLCBmYWxzZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImN1cnJlbnRTY2FsZVZhbHVlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY3VycmVudFNjYWxlVmFsdWU7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWwpIHtcbiAgICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NldFNjYWxlKHZhbCwgZmFsc2UpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwYWdlc1JvdGF0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGFnZXNSb3RhdGlvbjtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHJvdGF0aW9uKSB7XG4gICAgICBpZiAoISgwLCBfdWlfdXRpbHMuaXNWYWxpZFJvdGF0aW9uKShyb3RhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWdlcyByb3RhdGlvbiBhbmdsZS5cIik7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9wYWdlc1JvdGF0aW9uID09PSByb3RhdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3BhZ2VzUm90YXRpb24gPSByb3RhdGlvbjtcbiAgICAgIHZhciBwYWdlTnVtYmVyID0gdGhpcy5fY3VycmVudFBhZ2VOdW1iZXI7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBpaSA9IHRoaXMuX3BhZ2VzLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgdmFyIHBhZ2VWaWV3ID0gdGhpcy5fcGFnZXNbaV07XG4gICAgICAgIHBhZ2VWaWV3LnVwZGF0ZShwYWdlVmlldy5zY2FsZSwgcm90YXRpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY3VycmVudFNjYWxlVmFsdWUpIHtcbiAgICAgICAgdGhpcy5fc2V0U2NhbGUodGhpcy5fY3VycmVudFNjYWxlVmFsdWUsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKFwicm90YXRpb25jaGFuZ2luZ1wiLCB7XG4gICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgcGFnZXNSb3RhdGlvbjogcm90YXRpb24sXG4gICAgICAgIHBhZ2VOdW1iZXI6IHBhZ2VOdW1iZXJcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5kZWZhdWx0UmVuZGVyaW5nUXVldWUpIHtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZmlyc3RQYWdlUHJvbWlzZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucGRmRG9jdW1lbnQgPyB0aGlzLl9maXJzdFBhZ2VDYXBhYmlsaXR5LnByb21pc2UgOiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvbmVQYWdlUmVuZGVyZWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50ID8gdGhpcy5fb25lUGFnZVJlbmRlcmVkQ2FwYWJpbGl0eS5wcm9taXNlIDogbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFnZXNQcm9taXNlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wZGZEb2N1bWVudCA/IHRoaXMuX3BhZ2VzQ2FwYWJpbGl0eS5wcm9taXNlIDogbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX3ZpZXdlckVsZW1lbnRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vdCBpbXBsZW1lbnRlZDogX3ZpZXdlckVsZW1lbnRcIik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIl9pc1Njcm9sbE1vZGVIb3Jpem9udGFsXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSA/IGZhbHNlIDogdGhpcy5fc2Nyb2xsTW9kZSA9PT0gX3VpX3V0aWxzLlNjcm9sbE1vZGUuSE9SSVpPTlRBTDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNJblByZXNlbnRhdGlvbk1vZGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnByZXNlbnRhdGlvbk1vZGVTdGF0ZSA9PT0gX3VpX3V0aWxzLlByZXNlbnRhdGlvbk1vZGVTdGF0ZS5GVUxMU0NSRUVOO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0NoYW5naW5nUHJlc2VudGF0aW9uTW9kZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJlc2VudGF0aW9uTW9kZVN0YXRlID09PSBfdWlfdXRpbHMuUHJlc2VudGF0aW9uTW9kZVN0YXRlLkNIQU5HSU5HO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpc0hvcml6b250YWxTY3JvbGxiYXJFbmFibGVkXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSA/IGZhbHNlIDogdGhpcy5jb250YWluZXIuc2Nyb2xsV2lkdGggPiB0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaXNWZXJ0aWNhbFNjcm9sbGJhckVuYWJsZWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlID8gZmFsc2UgOiB0aGlzLmNvbnRhaW5lci5zY3JvbGxIZWlnaHQgPiB0aGlzLmNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc0VxdWFsUGFnZVNpemVzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgZmlyc3RQYWdlVmlldyA9IHRoaXMuX3BhZ2VzWzBdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMSwgaWkgPSB0aGlzLl9wYWdlcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgICAgIHZhciBwYWdlVmlldyA9IHRoaXMuX3BhZ2VzW2ldO1xuXG4gICAgICAgIGlmIChwYWdlVmlldy53aWR0aCAhPT0gZmlyc3RQYWdlVmlldy53aWR0aCB8fCBwYWdlVmlldy5oZWlnaHQgIT09IGZpcnN0UGFnZVZpZXcuaGVpZ2h0KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJvcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBpZiAoIXRoaXMucGRmRG9jdW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLl9vcHRpb25hbENvbnRlbnRDb25maWdQcm9taXNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50LmdldE9wdGlvbmFsQ29udGVudENvbmZpZygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHByb21pc2UpIHtcbiAgICAgIGlmICghKHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG9wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2U6IFwiLmNvbmNhdChwcm9taXNlKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5wZGZEb2N1bWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5fb3B0aW9uYWxDb250ZW50Q29uZmlnUHJvbWlzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX29wdGlvbmFsQ29udGVudENvbmZpZ1Byb21pc2UgPSBwcm9taXNlO1xuXG4gICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodGhpcy5fcGFnZXMpLFxuICAgICAgICAgIF9zdGVwO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykge1xuICAgICAgICAgIHZhciBwYWdlVmlldyA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIHBhZ2VWaWV3LnVwZGF0ZShwYWdlVmlldy5zY2FsZSwgcGFnZVZpZXcucm90YXRpb24sIHByb21pc2UpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKFwib3B0aW9uYWxjb250ZW50Y29uZmlnY2hhbmdlZFwiLCB7XG4gICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgcHJvbWlzZTogcHJvbWlzZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNjcm9sbE1vZGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxNb2RlO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQobW9kZSkge1xuICAgICAgaWYgKHRoaXMuX3Njcm9sbE1vZGUgPT09IG1vZGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoISgwLCBfdWlfdXRpbHMuaXNWYWxpZFNjcm9sbE1vZGUpKG1vZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2Nyb2xsIG1vZGU6IFwiLmNvbmNhdChtb2RlKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3Njcm9sbE1vZGUgPSBtb2RlO1xuICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInNjcm9sbG1vZGVjaGFuZ2VkXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBtb2RlOiBtb2RlXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fdXBkYXRlU2Nyb2xsTW9kZSh0aGlzLl9jdXJyZW50UGFnZU51bWJlcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInNwcmVhZE1vZGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zcHJlYWRNb2RlO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQobW9kZSkge1xuICAgICAgaWYgKHRoaXMuX3NwcmVhZE1vZGUgPT09IG1vZGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoISgwLCBfdWlfdXRpbHMuaXNWYWxpZFNwcmVhZE1vZGUpKG1vZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3ByZWFkIG1vZGU6IFwiLmNvbmNhdChtb2RlKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3NwcmVhZE1vZGUgPSBtb2RlO1xuICAgICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcInNwcmVhZG1vZGVjaGFuZ2VkXCIsIHtcbiAgICAgICAgc291cmNlOiB0aGlzLFxuICAgICAgICBtb2RlOiBtb2RlXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fdXBkYXRlU3ByZWFkTW9kZSh0aGlzLl9jdXJyZW50UGFnZU51bWJlcik7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEJhc2VWaWV3ZXI7XG59KCk7XG5cbmV4cG9ydHMuQmFzZVZpZXdlciA9IEJhc2VWaWV3ZXI7XG5cbi8qKiovIH0pLFxuLyogMjAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd19wZGZqc19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuUERGVmlld2VyID0gdm9pZCAwO1xuXG52YXIgX2Jhc2Vfdmlld2VyID0gX193X3BkZmpzX3JlcXVpcmVfXygxOSk7XG5cbnZhciBfcGRmanNMaWIgPSBfX3dfcGRmanNfcmVxdWlyZV9fKDIpO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikgeyBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7IGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikgeyBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZihvYmopOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdDsgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgb1tTeW1ib2wuaXRlcmF0b3JdID09IG51bGwpIHsgaWYgKEFycmF5LmlzQXJyYXkobykgfHwgKGl0ID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8pKSB8fCBhbGxvd0FycmF5TGlrZSAmJiBvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgeyBpZiAoaXQpIG8gPSBpdDsgdmFyIGkgPSAwOyB2YXIgRiA9IGZ1bmN0aW9uIEYoKSB7fTsgcmV0dXJuIHsgczogRiwgbjogZnVuY3Rpb24gbigpIHsgaWYgKGkgPj0gby5sZW5ndGgpIHJldHVybiB7IGRvbmU6IHRydWUgfTsgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBvW2krK10gfTsgfSwgZTogZnVuY3Rpb24gZShfZSkgeyB0aHJvdyBfZTsgfSwgZjogRiB9OyB9IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTsgfSB2YXIgbm9ybWFsQ29tcGxldGlvbiA9IHRydWUsIGRpZEVyciA9IGZhbHNlLCBlcnI7IHJldHVybiB7IHM6IGZ1bmN0aW9uIHMoKSB7IGl0ID0gb1tTeW1ib2wuaXRlcmF0b3JdKCk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXRbXCJyZXR1cm5cIl0gIT0gbnVsbCkgaXRbXCJyZXR1cm5cIl0oKTsgfSBmaW5hbGx5IHsgaWYgKGRpZEVycikgdGhyb3cgZXJyOyB9IH0gfTsgfVxuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7IGlmICghbykgcmV0dXJuOyBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7IGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7IGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pOyBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IH1cblxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikgeyBpZiAodHlwZW9mIFJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiYgUmVmbGVjdC5nZXQpIHsgX2dldCA9IFJlZmxlY3QuZ2V0OyB9IGVsc2UgeyBfZ2V0ID0gZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikgeyB2YXIgYmFzZSA9IF9zdXBlclByb3BCYXNlKHRhcmdldCwgcHJvcGVydHkpOyBpZiAoIWJhc2UpIHJldHVybjsgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJhc2UsIHByb3BlcnR5KTsgaWYgKGRlc2MuZ2V0KSB7IHJldHVybiBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKTsgfSByZXR1cm4gZGVzYy52YWx1ZTsgfTsgfSByZXR1cm4gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlciB8fCB0YXJnZXQpOyB9XG5cbmZ1bmN0aW9uIF9zdXBlclByb3BCYXNlKG9iamVjdCwgcHJvcGVydHkpIHsgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHsgb2JqZWN0ID0gX2dldFByb3RvdHlwZU9mKG9iamVjdCk7IGlmIChvYmplY3QgPT09IG51bGwpIGJyZWFrOyB9IHJldHVybiBvYmplY3Q7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuZnVuY3Rpb24gX2NyZWF0ZVN1cGVyKERlcml2ZWQpIHsgdmFyIGhhc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCk7IHJldHVybiBmdW5jdGlvbiBfY3JlYXRlU3VwZXJJbnRlcm5hbCgpIHsgdmFyIFN1cGVyID0gX2dldFByb3RvdHlwZU9mKERlcml2ZWQpLCByZXN1bHQ7IGlmIChoYXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KSB7IHZhciBOZXdUYXJnZXQgPSBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3I7IHJlc3VsdCA9IFJlZmxlY3QuY29uc3RydWN0KFN1cGVyLCBhcmd1bWVudHMsIE5ld1RhcmdldCk7IH0gZWxzZSB7IHJlc3VsdCA9IFN1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH0gcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIHJlc3VsdCk7IH07IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkgeyByZXR1cm4gY2FsbDsgfSByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTsgfVxuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHsgaWYgKHNlbGYgPT09IHZvaWQgMCkgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIHNlbGY7IH1cblxuZnVuY3Rpb24gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHsgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlOyBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlOyBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlOyB0cnkgeyBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpOyByZXR1cm4gdHJ1ZTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH0gfVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2YobykgeyByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pOyB9OyByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pOyB9XG5cbnZhciBQREZWaWV3ZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9CYXNlVmlld2VyKSB7XG4gIF9pbmhlcml0cyhQREZWaWV3ZXIsIF9CYXNlVmlld2VyKTtcblxuICB2YXIgX3N1cGVyID0gX2NyZWF0ZVN1cGVyKFBERlZpZXdlcik7XG5cbiAgZnVuY3Rpb24gUERGVmlld2VyKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQREZWaWV3ZXIpO1xuXG4gICAgcmV0dXJuIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFBERlZpZXdlciwgW3tcbiAgICBrZXk6IFwiX3Njcm9sbEludG9WaWV3XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9zY3JvbGxJbnRvVmlldyhfcmVmKSB7XG4gICAgICB2YXIgcGFnZURpdiA9IF9yZWYucGFnZURpdixcbiAgICAgICAgICBfcmVmJHBhZ2VTcG90ID0gX3JlZi5wYWdlU3BvdCxcbiAgICAgICAgICBwYWdlU3BvdCA9IF9yZWYkcGFnZVNwb3QgPT09IHZvaWQgMCA/IG51bGwgOiBfcmVmJHBhZ2VTcG90LFxuICAgICAgICAgIF9yZWYkcGFnZU51bWJlciA9IF9yZWYucGFnZU51bWJlcixcbiAgICAgICAgICBwYWdlTnVtYmVyID0gX3JlZiRwYWdlTnVtYmVyID09PSB2b2lkIDAgPyBudWxsIDogX3JlZiRwYWdlTnVtYmVyO1xuXG4gICAgICBpZiAoIXBhZ2VTcG90ICYmICF0aGlzLmlzSW5QcmVzZW50YXRpb25Nb2RlKSB7XG4gICAgICAgIHZhciBsZWZ0ID0gcGFnZURpdi5vZmZzZXRMZWZ0ICsgcGFnZURpdi5jbGllbnRMZWZ0O1xuICAgICAgICB2YXIgcmlnaHQgPSBsZWZ0ICsgcGFnZURpdi5jbGllbnRXaWR0aDtcbiAgICAgICAgdmFyIF90aGlzJGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLFxuICAgICAgICAgICAgc2Nyb2xsTGVmdCA9IF90aGlzJGNvbnRhaW5lci5zY3JvbGxMZWZ0LFxuICAgICAgICAgICAgY2xpZW50V2lkdGggPSBfdGhpcyRjb250YWluZXIuY2xpZW50V2lkdGg7XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzU2Nyb2xsTW9kZUhvcml6b250YWwgfHwgbGVmdCA8IHNjcm9sbExlZnQgfHwgcmlnaHQgPiBzY3JvbGxMZWZ0ICsgY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICBwYWdlU3BvdCA9IHtcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICB0b3A6IDBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF9nZXQoX2dldFByb3RvdHlwZU9mKFBERlZpZXdlci5wcm90b3R5cGUpLCBcIl9zY3JvbGxJbnRvVmlld1wiLCB0aGlzKS5jYWxsKHRoaXMsIHtcbiAgICAgICAgcGFnZURpdjogcGFnZURpdixcbiAgICAgICAgcGFnZVNwb3Q6IHBhZ2VTcG90LFxuICAgICAgICBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiX2dldFZpc2libGVQYWdlc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0VmlzaWJsZVBhZ2VzKCkge1xuICAgICAgaWYgKHRoaXMuaXNJblByZXNlbnRhdGlvbk1vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEN1cnJlbnRWaXNpYmxlUGFnZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2dldChfZ2V0UHJvdG90eXBlT2YoUERGVmlld2VyLnByb3RvdHlwZSksIFwiX2dldFZpc2libGVQYWdlc1wiLCB0aGlzKS5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfdXBkYXRlSGVscGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVIZWxwZXIodmlzaWJsZVBhZ2VzKSB7XG4gICAgICBpZiAodGhpcy5pc0luUHJlc2VudGF0aW9uTW9kZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBjdXJyZW50SWQgPSB0aGlzLl9jdXJyZW50UGFnZU51bWJlcjtcbiAgICAgIHZhciBzdGlsbEZ1bGx5VmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodmlzaWJsZVBhZ2VzKSxcbiAgICAgICAgICBfc3RlcDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgcGFnZSA9IF9zdGVwLnZhbHVlO1xuXG4gICAgICAgICAgaWYgKHBhZ2UucGVyY2VudCA8IDEwMCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhZ2UuaWQgPT09IGN1cnJlbnRJZCkge1xuICAgICAgICAgICAgc3RpbGxGdWxseVZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgX2l0ZXJhdG9yLmUoZXJyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIF9pdGVyYXRvci5mKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RpbGxGdWxseVZpc2libGUpIHtcbiAgICAgICAgY3VycmVudElkID0gdmlzaWJsZVBhZ2VzWzBdLmlkO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXRDdXJyZW50UGFnZU51bWJlcihjdXJyZW50SWQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJfdmlld2VyRWxlbWVudFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuICgwLCBfcGRmanNMaWIuc2hhZG93KSh0aGlzLCBcIl92aWV3ZXJFbGVtZW50XCIsIHRoaXMudmlld2VyKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUERGVmlld2VyO1xufShfYmFzZV92aWV3ZXIuQmFzZVZpZXdlcik7XG5cbmV4cG9ydHMuUERGVmlld2VyID0gUERGVmlld2VyO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBkZl92aWV3ZXIuanMubWFwXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvdnVlLXBkZi9ub2RlX21vZHVsZXMvcGRmanMtZGlzdC9lczUvd2ViL3BkZl92aWV3ZXIuanNcbi8vIG1vZHVsZSBpZCA9IDFQNXVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1P5u\n')},"1Xk4":function(module,exports,__webpack_require__){"use strict";eval('\nvar window = __webpack_require__("awF4")\nvar isFunction = __webpack_require__("Rl2i")\nvar parseHeaders = __webpack_require__("sD9O")\nvar xtend = __webpack_require__("q+vg")\n\nmodule.exports = createXHR\ncreateXHR.XMLHttpRequest = window.XMLHttpRequest || noop\ncreateXHR.XDomainRequest = "withCredentials" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest\n\nforEachArray(["get", "put", "post", "patch", "head", "delete"], function(method) {\n createXHR[method === "delete" ? "del" : method] = function(uri, options, callback) {\n options = initParams(uri, options, callback)\n options.method = method.toUpperCase()\n return _createXHR(options)\n }\n})\n\nfunction forEachArray(array, iterator) {\n for (var i = 0; i < array.length; i++) {\n iterator(array[i])\n }\n}\n\nfunction isEmpty(obj){\n for(var i in obj){\n if(obj.hasOwnProperty(i)) return false\n }\n return true\n}\n\nfunction initParams(uri, options, callback) {\n var params = uri\n\n if (isFunction(options)) {\n callback = options\n if (typeof uri === "string") {\n params = {uri:uri}\n }\n } else {\n params = xtend(options, {uri: uri})\n }\n\n params.callback = callback\n return params\n}\n\nfunction createXHR(uri, options, callback) {\n options = initParams(uri, options, callback)\n return _createXHR(options)\n}\n\nfunction _createXHR(options) {\n if(typeof options.callback === "undefined"){\n throw new Error("callback argument missing")\n }\n\n var called = false\n var callback = function cbOnce(err, response, body){\n if(!called){\n called = true\n options.callback(err, response, body)\n }\n }\n\n function readystatechange() {\n if (xhr.readyState === 4) {\n setTimeout(loadFunc, 0)\n }\n }\n\n function getBody() {\n // Chrome with requestType=blob throws errors arround when even testing access to responseText\n var body = undefined\n\n if (xhr.response) {\n body = xhr.response\n } else {\n body = xhr.responseText || getXml(xhr)\n }\n\n if (isJson) {\n try {\n body = JSON.parse(body)\n } catch (e) {}\n }\n\n return body\n }\n\n function errorFunc(evt) {\n clearTimeout(timeoutTimer)\n if(!(evt instanceof Error)){\n evt = new Error("" + (evt || "Unknown XMLHttpRequest Error") )\n }\n evt.statusCode = 0\n return callback(evt, failureResponse)\n }\n\n // will load the data & process the response in a special response object\n function loadFunc() {\n if (aborted) return\n var status\n clearTimeout(timeoutTimer)\n if(options.useXDR && xhr.status===undefined) {\n //IE8 CORS GET successful response doesn\'t have a status field, but body is fine\n status = 200\n } else {\n status = (xhr.status === 1223 ? 204 : xhr.status)\n }\n var response = failureResponse\n var err = null\n\n if (status !== 0){\n response = {\n body: getBody(),\n statusCode: status,\n method: method,\n headers: {},\n url: uri,\n rawRequest: xhr\n }\n if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE\n response.headers = parseHeaders(xhr.getAllResponseHeaders())\n }\n } else {\n err = new Error("Internal XMLHttpRequest Error")\n }\n return callback(err, response, response.body)\n }\n\n var xhr = options.xhr || null\n\n if (!xhr) {\n if (options.cors || options.useXDR) {\n xhr = new createXHR.XDomainRequest()\n }else{\n xhr = new createXHR.XMLHttpRequest()\n }\n }\n\n var key\n var aborted\n var uri = xhr.url = options.uri || options.url\n var method = xhr.method = options.method || "GET"\n var body = options.body || options.data\n var headers = xhr.headers = options.headers || {}\n var sync = !!options.sync\n var isJson = false\n var timeoutTimer\n var failureResponse = {\n body: undefined,\n headers: {},\n statusCode: 0,\n method: method,\n url: uri,\n rawRequest: xhr\n }\n\n if ("json" in options && options.json !== false) {\n isJson = true\n headers["accept"] || headers["Accept"] || (headers["Accept"] = "application/json") //Don\'t override existing accept header declared by user\n if (method !== "GET" && method !== "HEAD") {\n headers["content-type"] || headers["Content-Type"] || (headers["Content-Type"] = "application/json") //Don\'t override existing accept header declared by user\n body = JSON.stringify(options.json === true ? body : options.json)\n }\n }\n\n xhr.onreadystatechange = readystatechange\n xhr.onload = loadFunc\n xhr.onerror = errorFunc\n // IE9 must have onprogress be set to a unique function.\n xhr.onprogress = function () {\n // IE must die\n }\n xhr.onabort = function(){\n aborted = true;\n }\n xhr.ontimeout = errorFunc\n xhr.open(method, uri, !sync, options.username, options.password)\n //has to be after open\n if(!sync) {\n xhr.withCredentials = !!options.withCredentials\n }\n // Cannot set timeout with sync request\n // not setting timeout on the xhr object, because of old webkits etc. not handling that correctly\n // both npm\'s request and jquery 1.x use this kind of timeout, so this is being consistent\n if (!sync && options.timeout > 0 ) {\n timeoutTimer = setTimeout(function(){\n if (aborted) return\n aborted = true//IE9 may still call readystatechange\n xhr.abort("timeout")\n var e = new Error("XMLHttpRequest timeout")\n e.code = "ETIMEDOUT"\n errorFunc(e)\n }, options.timeout )\n }\n\n if (xhr.setRequestHeader) {\n for(key in headers){\n if(headers.hasOwnProperty(key)){\n xhr.setRequestHeader(key, headers[key])\n }\n }\n } else if (options.headers && !isEmpty(options.headers)) {\n throw new Error("Headers cannot be set on an XDomainRequest object")\n }\n\n if ("responseType" in options) {\n xhr.responseType = options.responseType\n }\n\n if ("beforeSend" in options &&\n typeof options.beforeSend === "function"\n ) {\n options.beforeSend(xhr)\n }\n\n // Microsoft Edge browser sends "undefined" when send is called with undefined value.\n // XMLHttpRequest spec says to pass null as body to indicate no body\n // See https://github.com/naugtur/xhr/issues/100.\n xhr.send(body || null)\n\n return xhr\n\n\n}\n\nfunction getXml(xhr) {\n if (xhr.responseType === "document") {\n return xhr.responseXML\n }\n var firefoxBugTakenEffect = xhr.responseXML && xhr.responseXML.documentElement.nodeName === "parsererror"\n if (xhr.responseType === "" && !firefoxBugTakenEffect) {\n return xhr.responseXML\n }\n\n return null\n}\n\nfunction noop() {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMVhrNC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy94aHIvaW5kZXguanM/ZDU3OSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnZhciB3aW5kb3cgPSByZXF1aXJlKFwiZ2xvYmFsL3dpbmRvd1wiKVxudmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKFwiaXMtZnVuY3Rpb25cIilcbnZhciBwYXJzZUhlYWRlcnMgPSByZXF1aXJlKFwicGFyc2UtaGVhZGVyc1wiKVxudmFyIHh0ZW5kID0gcmVxdWlyZShcInh0ZW5kXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlWEhSXG5jcmVhdGVYSFIuWE1MSHR0cFJlcXVlc3QgPSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QgfHwgbm9vcFxuY3JlYXRlWEhSLlhEb21haW5SZXF1ZXN0ID0gXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiAobmV3IGNyZWF0ZVhIUi5YTUxIdHRwUmVxdWVzdCgpKSA/IGNyZWF0ZVhIUi5YTUxIdHRwUmVxdWVzdCA6IHdpbmRvdy5YRG9tYWluUmVxdWVzdFxuXG5mb3JFYWNoQXJyYXkoW1wiZ2V0XCIsIFwicHV0XCIsIFwicG9zdFwiLCBcInBhdGNoXCIsIFwiaGVhZFwiLCBcImRlbGV0ZVwiXSwgZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgY3JlYXRlWEhSW21ldGhvZCA9PT0gXCJkZWxldGVcIiA/IFwiZGVsXCIgOiBtZXRob2RdID0gZnVuY3Rpb24odXJpLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICBvcHRpb25zID0gaW5pdFBhcmFtcyh1cmksIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgICAgICBvcHRpb25zLm1ldGhvZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gICAgICAgIHJldHVybiBfY3JlYXRlWEhSKG9wdGlvbnMpXG4gICAgfVxufSlcblxuZnVuY3Rpb24gZm9yRWFjaEFycmF5KGFycmF5LCBpdGVyYXRvcikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaXRlcmF0b3IoYXJyYXlbaV0pXG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc0VtcHR5KG9iail7XG4gICAgZm9yKHZhciBpIGluIG9iail7XG4gICAgICAgIGlmKG9iai5oYXNPd25Qcm9wZXJ0eShpKSkgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIGluaXRQYXJhbXModXJpLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIHZhciBwYXJhbXMgPSB1cmlcblxuICAgIGlmIChpc0Z1bmN0aW9uKG9wdGlvbnMpKSB7XG4gICAgICAgIGNhbGxiYWNrID0gb3B0aW9uc1xuICAgICAgICBpZiAodHlwZW9mIHVyaSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcGFyYW1zID0ge3VyaTp1cml9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbXMgPSB4dGVuZChvcHRpb25zLCB7dXJpOiB1cml9KVxuICAgIH1cblxuICAgIHBhcmFtcy5jYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgcmV0dXJuIHBhcmFtc1xufVxuXG5mdW5jdGlvbiBjcmVhdGVYSFIodXJpLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIG9wdGlvbnMgPSBpbml0UGFyYW1zKHVyaSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICAgcmV0dXJuIF9jcmVhdGVYSFIob3B0aW9ucylcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZVhIUihvcHRpb25zKSB7XG4gICAgaWYodHlwZW9mIG9wdGlvbnMuY2FsbGJhY2sgPT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjYWxsYmFjayBhcmd1bWVudCBtaXNzaW5nXCIpXG4gICAgfVxuXG4gICAgdmFyIGNhbGxlZCA9IGZhbHNlXG4gICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gY2JPbmNlKGVyciwgcmVzcG9uc2UsIGJvZHkpe1xuICAgICAgICBpZighY2FsbGVkKXtcbiAgICAgICAgICAgIGNhbGxlZCA9IHRydWVcbiAgICAgICAgICAgIG9wdGlvbnMuY2FsbGJhY2soZXJyLCByZXNwb25zZSwgYm9keSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlYWR5c3RhdGVjaGFuZ2UoKSB7XG4gICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgc2V0VGltZW91dChsb2FkRnVuYywgMClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEJvZHkoKSB7XG4gICAgICAgIC8vIENocm9tZSB3aXRoIHJlcXVlc3RUeXBlPWJsb2IgdGhyb3dzIGVycm9ycyBhcnJvdW5kIHdoZW4gZXZlbiB0ZXN0aW5nIGFjY2VzcyB0byByZXNwb25zZVRleHRcbiAgICAgICAgdmFyIGJvZHkgPSB1bmRlZmluZWRcblxuICAgICAgICBpZiAoeGhyLnJlc3BvbnNlKSB7XG4gICAgICAgICAgICBib2R5ID0geGhyLnJlc3BvbnNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib2R5ID0geGhyLnJlc3BvbnNlVGV4dCB8fCBnZXRYbWwoeGhyKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzSnNvbikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBib2R5XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJyb3JGdW5jKGV2dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dFRpbWVyKVxuICAgICAgICBpZighKGV2dCBpbnN0YW5jZW9mIEVycm9yKSl7XG4gICAgICAgICAgICBldnQgPSBuZXcgRXJyb3IoXCJcIiArIChldnQgfHwgXCJVbmtub3duIFhNTEh0dHBSZXF1ZXN0IEVycm9yXCIpIClcbiAgICAgICAgfVxuICAgICAgICBldnQuc3RhdHVzQ29kZSA9IDBcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGV2dCwgZmFpbHVyZVJlc3BvbnNlKVxuICAgIH1cblxuICAgIC8vIHdpbGwgbG9hZCB0aGUgZGF0YSAmIHByb2Nlc3MgdGhlIHJlc3BvbnNlIGluIGEgc3BlY2lhbCByZXNwb25zZSBvYmplY3RcbiAgICBmdW5jdGlvbiBsb2FkRnVuYygpIHtcbiAgICAgICAgaWYgKGFib3J0ZWQpIHJldHVyblxuICAgICAgICB2YXIgc3RhdHVzXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0VGltZXIpXG4gICAgICAgIGlmKG9wdGlvbnMudXNlWERSICYmIHhoci5zdGF0dXM9PT11bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vSUU4IENPUlMgR0VUIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgZG9lc24ndCBoYXZlIGEgc3RhdHVzIGZpZWxkLCBidXQgYm9keSBpcyBmaW5lXG4gICAgICAgICAgICBzdGF0dXMgPSAyMDBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXR1cyA9ICh4aHIuc3RhdHVzID09PSAxMjIzID8gMjA0IDogeGhyLnN0YXR1cylcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzcG9uc2UgPSBmYWlsdXJlUmVzcG9uc2VcbiAgICAgICAgdmFyIGVyciA9IG51bGxcblxuICAgICAgICBpZiAoc3RhdHVzICE9PSAwKXtcbiAgICAgICAgICAgIHJlc3BvbnNlID0ge1xuICAgICAgICAgICAgICAgIGJvZHk6IGdldEJvZHkoKSxcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiBzdGF0dXMsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgICAgICAgICAgdXJsOiB1cmksXG4gICAgICAgICAgICAgICAgcmF3UmVxdWVzdDogeGhyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKXsgLy9yZW1lbWJlciB4aHIgY2FuIGluIGZhY3QgYmUgWERSIGZvciBDT1JTIGluIElFXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycyA9IHBhcnNlSGVhZGVycyh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoXCJJbnRlcm5hbCBYTUxIdHRwUmVxdWVzdCBFcnJvclwiKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIsIHJlc3BvbnNlLCByZXNwb25zZS5ib2R5KVxuICAgIH1cblxuICAgIHZhciB4aHIgPSBvcHRpb25zLnhociB8fCBudWxsXG5cbiAgICBpZiAoIXhocikge1xuICAgICAgICBpZiAob3B0aW9ucy5jb3JzIHx8IG9wdGlvbnMudXNlWERSKSB7XG4gICAgICAgICAgICB4aHIgPSBuZXcgY3JlYXRlWEhSLlhEb21haW5SZXF1ZXN0KClcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB4aHIgPSBuZXcgY3JlYXRlWEhSLlhNTEh0dHBSZXF1ZXN0KClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBrZXlcbiAgICB2YXIgYWJvcnRlZFxuICAgIHZhciB1cmkgPSB4aHIudXJsID0gb3B0aW9ucy51cmkgfHwgb3B0aW9ucy51cmxcbiAgICB2YXIgbWV0aG9kID0geGhyLm1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8IFwiR0VUXCJcbiAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keSB8fCBvcHRpb25zLmRhdGFcbiAgICB2YXIgaGVhZGVycyA9IHhoci5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9XG4gICAgdmFyIHN5bmMgPSAhIW9wdGlvbnMuc3luY1xuICAgIHZhciBpc0pzb24gPSBmYWxzZVxuICAgIHZhciB0aW1lb3V0VGltZXJcbiAgICB2YXIgZmFpbHVyZVJlc3BvbnNlID0ge1xuICAgICAgICBib2R5OiB1bmRlZmluZWQsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBzdGF0dXNDb2RlOiAwLFxuICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgdXJsOiB1cmksXG4gICAgICAgIHJhd1JlcXVlc3Q6IHhoclxuICAgIH1cblxuICAgIGlmIChcImpzb25cIiBpbiBvcHRpb25zICYmIG9wdGlvbnMuanNvbiAhPT0gZmFsc2UpIHtcbiAgICAgICAgaXNKc29uID0gdHJ1ZVxuICAgICAgICBoZWFkZXJzW1wiYWNjZXB0XCJdIHx8IGhlYWRlcnNbXCJBY2NlcHRcIl0gfHwgKGhlYWRlcnNbXCJBY2NlcHRcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIikgLy9Eb24ndCBvdmVycmlkZSBleGlzdGluZyBhY2NlcHQgaGVhZGVyIGRlY2xhcmVkIGJ5IHVzZXJcbiAgICAgICAgaWYgKG1ldGhvZCAhPT0gXCJHRVRcIiAmJiBtZXRob2QgIT09IFwiSEVBRFwiKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiY29udGVudC10eXBlXCJdIHx8IGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gfHwgKGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIikgLy9Eb24ndCBvdmVycmlkZSBleGlzdGluZyBhY2NlcHQgaGVhZGVyIGRlY2xhcmVkIGJ5IHVzZXJcbiAgICAgICAgICAgIGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmpzb24gPT09IHRydWUgPyBib2R5IDogb3B0aW9ucy5qc29uKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHJlYWR5c3RhdGVjaGFuZ2VcbiAgICB4aHIub25sb2FkID0gbG9hZEZ1bmNcbiAgICB4aHIub25lcnJvciA9IGVycm9yRnVuY1xuICAgIC8vIElFOSBtdXN0IGhhdmUgb25wcm9ncmVzcyBiZSBzZXQgdG8gYSB1bmlxdWUgZnVuY3Rpb24uXG4gICAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIElFIG11c3QgZGllXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgYWJvcnRlZCA9IHRydWU7XG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBlcnJvckZ1bmNcbiAgICB4aHIub3BlbihtZXRob2QsIHVyaSwgIXN5bmMsIG9wdGlvbnMudXNlcm5hbWUsIG9wdGlvbnMucGFzc3dvcmQpXG4gICAgLy9oYXMgdG8gYmUgYWZ0ZXIgb3BlblxuICAgIGlmKCFzeW5jKSB7XG4gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSAhIW9wdGlvbnMud2l0aENyZWRlbnRpYWxzXG4gICAgfVxuICAgIC8vIENhbm5vdCBzZXQgdGltZW91dCB3aXRoIHN5bmMgcmVxdWVzdFxuICAgIC8vIG5vdCBzZXR0aW5nIHRpbWVvdXQgb24gdGhlIHhociBvYmplY3QsIGJlY2F1c2Ugb2Ygb2xkIHdlYmtpdHMgZXRjLiBub3QgaGFuZGxpbmcgdGhhdCBjb3JyZWN0bHlcbiAgICAvLyBib3RoIG5wbSdzIHJlcXVlc3QgYW5kIGpxdWVyeSAxLnggdXNlIHRoaXMga2luZCBvZiB0aW1lb3V0LCBzbyB0aGlzIGlzIGJlaW5nIGNvbnNpc3RlbnRcbiAgICBpZiAoIXN5bmMgJiYgb3B0aW9ucy50aW1lb3V0ID4gMCApIHtcbiAgICAgICAgdGltZW91dFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYgKGFib3J0ZWQpIHJldHVyblxuICAgICAgICAgICAgYWJvcnRlZCA9IHRydWUvL0lFOSBtYXkgc3RpbGwgY2FsbCByZWFkeXN0YXRlY2hhbmdlXG4gICAgICAgICAgICB4aHIuYWJvcnQoXCJ0aW1lb3V0XCIpXG4gICAgICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcihcIlhNTEh0dHBSZXF1ZXN0IHRpbWVvdXRcIilcbiAgICAgICAgICAgIGUuY29kZSA9IFwiRVRJTUVET1VUXCJcbiAgICAgICAgICAgIGVycm9yRnVuYyhlKVxuICAgICAgICB9LCBvcHRpb25zLnRpbWVvdXQgKVxuICAgIH1cblxuICAgIGlmICh4aHIuc2V0UmVxdWVzdEhlYWRlcikge1xuICAgICAgICBmb3Ioa2V5IGluIGhlYWRlcnMpe1xuICAgICAgICAgICAgaWYoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShrZXkpKXtcbiAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrZXksIGhlYWRlcnNba2V5XSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5oZWFkZXJzICYmICFpc0VtcHR5KG9wdGlvbnMuaGVhZGVycykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSGVhZGVycyBjYW5ub3QgYmUgc2V0IG9uIGFuIFhEb21haW5SZXF1ZXN0IG9iamVjdFwiKVxuICAgIH1cblxuICAgIGlmIChcInJlc3BvbnNlVHlwZVwiIGluIG9wdGlvbnMpIHtcbiAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9IG9wdGlvbnMucmVzcG9uc2VUeXBlXG4gICAgfVxuXG4gICAgaWYgKFwiYmVmb3JlU2VuZFwiIGluIG9wdGlvbnMgJiZcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMuYmVmb3JlU2VuZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgKSB7XG4gICAgICAgIG9wdGlvbnMuYmVmb3JlU2VuZCh4aHIpXG4gICAgfVxuXG4gICAgLy8gTWljcm9zb2Z0IEVkZ2UgYnJvd3NlciBzZW5kcyBcInVuZGVmaW5lZFwiIHdoZW4gc2VuZCBpcyBjYWxsZWQgd2l0aCB1bmRlZmluZWQgdmFsdWUuXG4gICAgLy8gWE1MSHR0cFJlcXVlc3Qgc3BlYyBzYXlzIHRvIHBhc3MgbnVsbCBhcyBib2R5IHRvIGluZGljYXRlIG5vIGJvZHlcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25hdWd0dXIveGhyL2lzc3Vlcy8xMDAuXG4gICAgeGhyLnNlbmQoYm9keSB8fCBudWxsKVxuXG4gICAgcmV0dXJuIHhoclxuXG5cbn1cblxuZnVuY3Rpb24gZ2V0WG1sKHhocikge1xuICAgIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSBcImRvY3VtZW50XCIpIHtcbiAgICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVhNTFxuICAgIH1cbiAgICB2YXIgZmlyZWZveEJ1Z1Rha2VuRWZmZWN0ID0geGhyLnJlc3BvbnNlWE1MICYmIHhoci5yZXNwb25zZVhNTC5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgPT09IFwicGFyc2VyZXJyb3JcIlxuICAgIGlmICh4aHIucmVzcG9uc2VUeXBlID09PSBcIlwiICYmICFmaXJlZm94QnVnVGFrZW5FZmZlY3QpIHtcbiAgICAgICAgcmV0dXJuIHhoci5yZXNwb25zZVhNTFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMveGhyL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSAxWGs0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1Xk4\n')},"1gAI":function(module,exports,__webpack_require__){eval('/*\n *\tMP3 huffman table selecting and bit counting\n *\n *\tCopyright (c) 1999-2005 Takehiro TOMINAGA\n *\tCopyright (c) 2002-2005 Gabriel Bouvigne\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\t See the GNU\n * Library General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the\n * Free Software Foundation, Inc., 59 Temple Place - Suite 330,\n * Boston, MA 02111-1307, USA.\n */\n\n/* $Id: Takehiro.java,v 1.26 2011/05/24 20:48:06 kenchis Exp $ */\n\n//package mp3;\n\n//import java.util.Arrays;\nvar 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\nvar Encoder = __webpack_require__("/00o");\nvar Tables = __webpack_require__("OSvQ");\nvar GrInfo = __webpack_require__("0mjX");\nvar QuantizePVT = __webpack_require__("mlh9");\n\n\nfunction Takehiro() {\n\n var qupvt = null;\n this.qupvt = null;\n\n this.setModules = function (_qupvt) {\n this.qupvt = _qupvt;\n qupvt = _qupvt;\n }\n\n function Bits(b) {\n this.bits = 0 | b;\n }\n\n var subdv_table = [[0, 0], /* 0 bands */\n [0, 0], /* 1 bands */\n [0, 0], /* 2 bands */\n [0, 0], /* 3 bands */\n [0, 0], /* 4 bands */\n [0, 1], /* 5 bands */\n [1, 1], /* 6 bands */\n [1, 1], /* 7 bands */\n [1, 2], /* 8 bands */\n [2, 2], /* 9 bands */\n [2, 3], /* 10 bands */\n [2, 3], /* 11 bands */\n [3, 4], /* 12 bands */\n [3, 4], /* 13 bands */\n [3, 4], /* 14 bands */\n [4, 5], /* 15 bands */\n [4, 5], /* 16 bands */\n [4, 6], /* 17 bands */\n [5, 6], /* 18 bands */\n [5, 6], /* 19 bands */\n [5, 7], /* 20 bands */\n [6, 7], /* 21 bands */\n [6, 7], /* 22 bands */\n ];\n\n /**\n * nonlinear quantization of xr More accurate formula than the ISO formula.\n * Takes into account the fact that we are quantizing xr . ix, but we want\n * ix^4/3 to be as close as possible to x^4/3. (taking the nearest int would\n * mean ix is as close as possible to xr, which is different.)\n *\n * From Segher Boessenkool 11/1999\n *\n * 09/2000: ASM code removed in favor of IEEE754 hack by Takehiro Tominaga.\n * If you need the ASM code, check CVS circa Aug 2000.\n *\n * 01/2004: Optimizations by Gabriel Bouvigne\n */\n function quantize_lines_xrpow_01(l, istep, xr, xrPos, ix, ixPos) {\n var compareval0 = (1.0 - 0.4054) / istep;\n\n assert(l > 0);\n l = l >> 1;\n while ((l--) != 0) {\n ix[ixPos++] = (compareval0 > xr[xrPos++]) ? 0 : 1;\n ix[ixPos++] = (compareval0 > xr[xrPos++]) ? 0 : 1;\n }\n }\n\n /**\n * XRPOW_FTOI is a macro to convert floats to ints.
\n * if XRPOW_FTOI(x) = nearest_int(x), then QUANTFAC(x)=adj43asm[x]
\n * ROUNDFAC= -0.0946
\n *\n * if XRPOW_FTOI(x) = floor(x), then QUANTFAC(x)=asj43[x]
\n * ROUNDFAC=0.4054
\n *\n * Note: using floor() or 0| is extremely slow. On machines where the\n * TAKEHIRO_IEEE754_HACK code above does not work, it is worthwile to write\n * some ASM for XRPOW_FTOI().\n */\n function quantize_lines_xrpow(l, istep, xr, xrPos, ix, ixPos) {\n assert(l > 0);\n\n l = l >> 1;\n var remaining = l % 2;\n l = l >> 1;\n while (l-- != 0) {\n var x0, x1, x2, x3;\n var rx0, rx1, rx2, rx3;\n\n x0 = xr[xrPos++] * istep;\n x1 = xr[xrPos++] * istep;\n rx0 = 0 | x0;\n x2 = xr[xrPos++] * istep;\n rx1 = 0 | x1;\n x3 = xr[xrPos++] * istep;\n rx2 = 0 | x2;\n x0 += qupvt.adj43[rx0];\n rx3 = 0 | x3;\n x1 += qupvt.adj43[rx1];\n ix[ixPos++] = 0 | x0;\n x2 += qupvt.adj43[rx2];\n ix[ixPos++] = 0 | x1;\n x3 += qupvt.adj43[rx3];\n ix[ixPos++] = 0 | x2;\n ix[ixPos++] = 0 | x3;\n }\n if (remaining != 0) {\n var x0, x1;\n var rx0, rx1;\n\n x0 = xr[xrPos++] * istep;\n x1 = xr[xrPos++] * istep;\n rx0 = 0 | x0;\n rx1 = 0 | x1;\n x0 += qupvt.adj43[rx0];\n x1 += qupvt.adj43[rx1];\n ix[ixPos++] = 0 | x0;\n ix[ixPos++] = 0 | x1;\n }\n }\n\n /**\n * Quantization function This function will select which lines to quantize\n * and call the proper quantization function\n */\n function quantize_xrpow(xp, pi, istep, codInfo, prevNoise) {\n /* quantize on xr^(3/4) instead of xr */\n var sfb;\n var sfbmax;\n var j = 0;\n var prev_data_use;\n var accumulate = 0;\n var accumulate01 = 0;\n var xpPos = 0;\n var iData = pi;\n var iDataPos = 0;\n var acc_iData = iData;\n var acc_iDataPos = 0;\n var acc_xp = xp;\n var acc_xpPos = 0;\n\n /*\n * Reusing previously computed data does not seems to work if global\n * gain is changed. Finding why it behaves this way would allow to use a\n * cache of previously computed values (let\'s 10 cached values per sfb)\n * that would probably provide a noticeable speedup\n */\n prev_data_use = (prevNoise != null && (codInfo.global_gain == prevNoise.global_gain));\n\n if (codInfo.block_type == Encoder.SHORT_TYPE)\n sfbmax = 38;\n else\n sfbmax = 21;\n\n for (sfb = 0; sfb <= sfbmax; sfb++) {\n var step = -1;\n\n if (prev_data_use || codInfo.block_type == Encoder.NORM_TYPE) {\n step = codInfo.global_gain\n - ((codInfo.scalefac[sfb] + (codInfo.preflag != 0 ? qupvt.pretab[sfb]\n : 0)) << (codInfo.scalefac_scale + 1))\n - codInfo.subblock_gain[codInfo.window[sfb]] * 8;\n }\n assert(codInfo.width[sfb] >= 0);\n if (prev_data_use && (prevNoise.step[sfb] == step)) {\n /*\n * do not recompute this part, but compute accumulated lines\n */\n if (accumulate != 0) {\n quantize_lines_xrpow(accumulate, istep, acc_xp, acc_xpPos,\n acc_iData, acc_iDataPos);\n accumulate = 0;\n }\n if (accumulate01 != 0) {\n quantize_lines_xrpow_01(accumulate01, istep, acc_xp,\n acc_xpPos, acc_iData, acc_iDataPos);\n accumulate01 = 0;\n }\n } else { /* should compute this part */\n var l = codInfo.width[sfb];\n\n if ((j + codInfo.width[sfb]) > codInfo.max_nonzero_coeff) {\n /* do not compute upper zero part */\n var usefullsize;\n usefullsize = codInfo.max_nonzero_coeff - j + 1;\n Arrays.fill(pi, codInfo.max_nonzero_coeff, 576, 0);\n l = usefullsize;\n\n if (l < 0) {\n l = 0;\n }\n\n /* no need to compute higher sfb values */\n sfb = sfbmax + 1;\n }\n\n /* accumulate lines to quantize */\n if (0 == accumulate && 0 == accumulate01) {\n acc_iData = iData;\n acc_iDataPos = iDataPos;\n acc_xp = xp;\n acc_xpPos = xpPos;\n }\n if (prevNoise != null && prevNoise.sfb_count1 > 0\n && sfb >= prevNoise.sfb_count1\n && prevNoise.step[sfb] > 0\n && step >= prevNoise.step[sfb]) {\n\n if (accumulate != 0) {\n quantize_lines_xrpow(accumulate, istep, acc_xp,\n acc_xpPos, acc_iData, acc_iDataPos);\n accumulate = 0;\n acc_iData = iData;\n acc_iDataPos = iDataPos;\n acc_xp = xp;\n acc_xpPos = xpPos;\n }\n accumulate01 += l;\n } else {\n if (accumulate01 != 0) {\n quantize_lines_xrpow_01(accumulate01, istep, acc_xp,\n acc_xpPos, acc_iData, acc_iDataPos);\n accumulate01 = 0;\n acc_iData = iData;\n acc_iDataPos = iDataPos;\n acc_xp = xp;\n acc_xpPos = xpPos;\n }\n accumulate += l;\n }\n\n if (l <= 0) {\n /*\n * rh: 20040215 may happen due to "prev_data_use"\n * optimization\n */\n if (accumulate01 != 0) {\n quantize_lines_xrpow_01(accumulate01, istep, acc_xp,\n acc_xpPos, acc_iData, acc_iDataPos);\n accumulate01 = 0;\n }\n if (accumulate != 0) {\n quantize_lines_xrpow(accumulate, istep, acc_xp,\n acc_xpPos, acc_iData, acc_iDataPos);\n accumulate = 0;\n }\n\n break;\n /* ends for-loop */\n }\n }\n if (sfb <= sfbmax) {\n iDataPos += codInfo.width[sfb];\n xpPos += codInfo.width[sfb];\n j += codInfo.width[sfb];\n }\n }\n if (accumulate != 0) { /* last data part */\n quantize_lines_xrpow(accumulate, istep, acc_xp, acc_xpPos,\n acc_iData, acc_iDataPos);\n accumulate = 0;\n }\n if (accumulate01 != 0) { /* last data part */\n quantize_lines_xrpow_01(accumulate01, istep, acc_xp, acc_xpPos,\n acc_iData, acc_iDataPos);\n accumulate01 = 0;\n }\n\n }\n\n /**\n * ix_max\n */\n function ix_max(ix, ixPos, endPos) {\n var max1 = 0, max2 = 0;\n\n do {\n var x1 = ix[ixPos++];\n var x2 = ix[ixPos++];\n if (max1 < x1)\n max1 = x1;\n\n if (max2 < x2)\n max2 = x2;\n } while (ixPos < endPos);\n if (max1 < max2)\n max1 = max2;\n return max1;\n }\n\n function count_bit_ESC(ix, ixPos, end, t1, t2, s) {\n /* ESC-table is used */\n var linbits = Tables.ht[t1].xlen * 65536 + Tables.ht[t2].xlen;\n var sum = 0, sum2;\n\n do {\n var x = ix[ixPos++];\n var y = ix[ixPos++];\n\n if (x != 0) {\n if (x > 14) {\n x = 15;\n sum += linbits;\n }\n x *= 16;\n }\n\n if (y != 0) {\n if (y > 14) {\n y = 15;\n sum += linbits;\n }\n x += y;\n }\n\n sum += Tables.largetbl[x];\n } while (ixPos < end);\n\n sum2 = sum & 0xffff;\n sum >>= 16;\n\n if (sum > sum2) {\n sum = sum2;\n t1 = t2;\n }\n\n s.bits += sum;\n return t1;\n }\n\n function count_bit_noESC(ix, ixPos, end, s) {\n /* No ESC-words */\n var sum1 = 0;\n var hlen1 = Tables.ht[1].hlen;\n\n do {\n var x = ix[ixPos + 0] * 2 + ix[ixPos + 1];\n ixPos += 2;\n sum1 += hlen1[x];\n } while (ixPos < end);\n\n s.bits += sum1;\n return 1;\n }\n\n function count_bit_noESC_from2(ix, ixPos, end, t1, s) {\n /* No ESC-words */\n var sum = 0, sum2;\n var xlen = Tables.ht[t1].xlen;\n var hlen;\n if (t1 == 2)\n hlen = Tables.table23;\n else\n hlen = Tables.table56;\n\n do {\n var x = ix[ixPos + 0] * xlen + ix[ixPos + 1];\n ixPos += 2;\n sum += hlen[x];\n } while (ixPos < end);\n\n sum2 = sum & 0xffff;\n sum >>= 16;\n\n if (sum > sum2) {\n sum = sum2;\n t1++;\n }\n\n s.bits += sum;\n return t1;\n }\n\n function count_bit_noESC_from3(ix, ixPos, end, t1, s) {\n /* No ESC-words */\n var sum1 = 0;\n var sum2 = 0;\n var sum3 = 0;\n var xlen = Tables.ht[t1].xlen;\n var hlen1 = Tables.ht[t1].hlen;\n var hlen2 = Tables.ht[t1 + 1].hlen;\n var hlen3 = Tables.ht[t1 + 2].hlen;\n\n do {\n var x = ix[ixPos + 0] * xlen + ix[ixPos + 1];\n ixPos += 2;\n sum1 += hlen1[x];\n sum2 += hlen2[x];\n sum3 += hlen3[x];\n } while (ixPos < end);\n var t = t1;\n if (sum1 > sum2) {\n sum1 = sum2;\n t++;\n }\n if (sum1 > sum3) {\n sum1 = sum3;\n t = t1 + 2;\n }\n s.bits += sum1;\n\n return t;\n }\n\n /*************************************************************************/\n /* choose table */\n /*************************************************************************/\n\n var huf_tbl_noESC = [1, 2, 5, 7, 7, 10, 10, 13, 13,\n 13, 13, 13, 13, 13, 13];\n\n /**\n * Choose the Huffman table that will encode ix[begin..end] with the fewest\n * bits.\n *\n * Note: This code contains knowledge about the sizes and characteristics of\n * the Huffman tables as defined in the IS (Table B.7), and will not work\n * with any arbitrary tables.\n */\n function choose_table(ix, ixPos, endPos, s) {\n var max = ix_max(ix, ixPos, endPos);\n\n switch (max) {\n case 0:\n return max;\n\n case 1:\n return count_bit_noESC(ix, ixPos, endPos, s);\n\n case 2:\n case 3:\n return count_bit_noESC_from2(ix, ixPos, endPos,\n huf_tbl_noESC[max - 1], s);\n\n case 4:\n case 5:\n case 6:\n case 7:\n case 8:\n case 9:\n case 10:\n case 11:\n case 12:\n case 13:\n case 14:\n case 15:\n return count_bit_noESC_from3(ix, ixPos, endPos,\n huf_tbl_noESC[max - 1], s);\n\n default:\n /* try tables with linbits */\n if (max > QuantizePVT.IXMAX_VAL) {\n s.bits = QuantizePVT.LARGE_BITS;\n return -1;\n }\n max -= 15;\n var choice2;\n for (choice2 = 24; choice2 < 32; choice2++) {\n if (Tables.ht[choice2].linmax >= max) {\n break;\n }\n }\n var choice;\n for (choice = choice2 - 8; choice < 24; choice++) {\n if (Tables.ht[choice].linmax >= max) {\n break;\n }\n }\n return count_bit_ESC(ix, ixPos, endPos, choice, choice2, s);\n }\n }\n\n /**\n * count_bit\n */\n this.noquant_count_bits = function (gfc, gi, prev_noise) {\n var ix = gi.l3_enc;\n var i = Math.min(576, ((gi.max_nonzero_coeff + 2) >> 1) << 1);\n\n if (prev_noise != null)\n prev_noise.sfb_count1 = 0;\n\n /* Determine count1 region */\n for (; i > 1; i -= 2)\n if ((ix[i - 1] | ix[i - 2]) != 0)\n break;\n gi.count1 = i;\n\n /* Determines the number of bits to encode the quadruples. */\n var a1 = 0;\n var a2 = 0;\n for (; i > 3; i -= 4) {\n var p;\n /* hack to check if all values <= 1 */\n //throw "TODO: HACK if ((((long) ix[i - 1] | (long) ix[i - 2] | (long) ix[i - 3] | (long) ix[i - 4]) & 0xffffffffL) > 1L "\n //if (true) {\n if (((ix[i - 1] | ix[i - 2] | ix[i - 3] | ix[i - 4]) & 0x7fffffff) > 1) {\n break;\n }\n p = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1];\n a1 += Tables.t32l[p];\n a2 += Tables.t33l[p];\n }\n var bits = a1;\n gi.count1table_select = 0;\n if (a1 > a2) {\n bits = a2;\n gi.count1table_select = 1;\n }\n\n gi.count1bits = bits;\n gi.big_values = i;\n if (i == 0)\n return bits;\n\n if (gi.block_type == Encoder.SHORT_TYPE) {\n a1 = 3 * gfc.scalefac_band.s[3];\n if (a1 > gi.big_values)\n a1 = gi.big_values;\n a2 = gi.big_values;\n\n } else if (gi.block_type == Encoder.NORM_TYPE) {\n assert(i <= 576);\n /* bv_scf has 576 entries (0..575) */\n a1 = gi.region0_count = gfc.bv_scf[i - 2];\n a2 = gi.region1_count = gfc.bv_scf[i - 1];\n\n assert(a1 + a2 + 2 < Encoder.SBPSY_l);\n a2 = gfc.scalefac_band.l[a1 + a2 + 2];\n a1 = gfc.scalefac_band.l[a1 + 1];\n if (a2 < i) {\n var bi = new Bits(bits);\n gi.table_select[2] = choose_table(ix, a2, i, bi);\n bits = bi.bits;\n }\n } else {\n gi.region0_count = 7;\n /* gi.region1_count = SBPSY_l - 7 - 1; */\n gi.region1_count = Encoder.SBMAX_l - 1 - 7 - 1;\n a1 = gfc.scalefac_band.l[7 + 1];\n a2 = i;\n if (a1 > a2) {\n a1 = a2;\n }\n }\n\n /* have to allow for the case when bigvalues < region0 < region1 */\n /* (and region0, region1 are ignored) */\n a1 = Math.min(a1, i);\n a2 = Math.min(a2, i);\n\n assert(a1 >= 0);\n assert(a2 >= 0);\n\n /* Count the number of bits necessary to code the bigvalues region. */\n if (0 < a1) {\n var bi = new Bits(bits);\n gi.table_select[0] = choose_table(ix, 0, a1, bi);\n bits = bi.bits;\n }\n if (a1 < a2) {\n var bi = new Bits(bits);\n gi.table_select[1] = choose_table(ix, a1, a2, bi);\n bits = bi.bits;\n }\n if (gfc.use_best_huffman == 2) {\n gi.part2_3_length = bits;\n best_huffman_divide(gfc, gi);\n bits = gi.part2_3_length;\n }\n\n if (prev_noise != null) {\n if (gi.block_type == Encoder.NORM_TYPE) {\n var sfb = 0;\n while (gfc.scalefac_band.l[sfb] < gi.big_values) {\n sfb++;\n }\n prev_noise.sfb_count1 = sfb;\n }\n }\n\n return bits;\n }\n\n this.count_bits = function (gfc, xr, gi, prev_noise) {\n var ix = gi.l3_enc;\n\n /* since quantize_xrpow uses table lookup, we need to check this first: */\n var w = (QuantizePVT.IXMAX_VAL) / qupvt.IPOW20(gi.global_gain);\n\n if (gi.xrpow_max > w)\n return QuantizePVT.LARGE_BITS;\n\n quantize_xrpow(xr, ix, qupvt.IPOW20(gi.global_gain), gi, prev_noise);\n\n if ((gfc.substep_shaping & 2) != 0) {\n var j = 0;\n /* 0.634521682242439 = 0.5946*2**(.5*0.1875) */\n var gain = gi.global_gain + gi.scalefac_scale;\n var roundfac = 0.634521682242439 / qupvt.IPOW20(gain);\n for (var sfb = 0; sfb < gi.sfbmax; sfb++) {\n var width = gi.width[sfb];\n assert(width >= 0);\n if (0 == gfc.pseudohalf[sfb]) {\n j += width;\n } else {\n var k;\n for (k = j, j += width; k < j; ++k) {\n ix[k] = (xr[k] >= roundfac) ? ix[k] : 0;\n }\n }\n }\n }\n return this.noquant_count_bits(gfc, gi, prev_noise);\n }\n\n /**\n * re-calculate the best scalefac_compress using scfsi the saved bits are\n * kept in the bit reservoir.\n */\n function recalc_divide_init(gfc, cod_info, ix, r01_bits, r01_div, r0_tbl, r1_tbl) {\n var bigv = cod_info.big_values;\n\n for (var r0 = 0; r0 <= 7 + 15; r0++) {\n r01_bits[r0] = QuantizePVT.LARGE_BITS;\n }\n\n for (var r0 = 0; r0 < 16; r0++) {\n var a1 = gfc.scalefac_band.l[r0 + 1];\n if (a1 >= bigv)\n break;\n var r0bits = 0;\n var bi = new Bits(r0bits);\n var r0t = choose_table(ix, 0, a1, bi);\n r0bits = bi.bits;\n\n for (var r1 = 0; r1 < 8; r1++) {\n var a2 = gfc.scalefac_band.l[r0 + r1 + 2];\n if (a2 >= bigv)\n break;\n var bits = r0bits;\n bi = new Bits(bits);\n var r1t = choose_table(ix, a1, a2, bi);\n bits = bi.bits;\n if (r01_bits[r0 + r1] > bits) {\n r01_bits[r0 + r1] = bits;\n r01_div[r0 + r1] = r0;\n r0_tbl[r0 + r1] = r0t;\n r1_tbl[r0 + r1] = r1t;\n }\n }\n }\n }\n\n function recalc_divide_sub(gfc, cod_info2, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl) {\n var bigv = cod_info2.big_values;\n\n for (var r2 = 2; r2 < Encoder.SBMAX_l + 1; r2++) {\n var a2 = gfc.scalefac_band.l[r2];\n if (a2 >= bigv)\n break;\n var bits = r01_bits[r2 - 2] + cod_info2.count1bits;\n if (gi.part2_3_length <= bits)\n break;\n\n var bi = new Bits(bits);\n var r2t = choose_table(ix, a2, bigv, bi);\n bits = bi.bits;\n if (gi.part2_3_length <= bits)\n continue;\n\n gi.assign(cod_info2);\n gi.part2_3_length = bits;\n gi.region0_count = r01_div[r2 - 2];\n gi.region1_count = r2 - 2 - r01_div[r2 - 2];\n gi.table_select[0] = r0_tbl[r2 - 2];\n gi.table_select[1] = r1_tbl[r2 - 2];\n gi.table_select[2] = r2t;\n }\n }\n\n this.best_huffman_divide = function (gfc, gi) {\n var cod_info2 = new GrInfo();\n var ix = gi.l3_enc;\n var r01_bits = new_int(7 + 15 + 1);\n var r01_div = new_int(7 + 15 + 1);\n var r0_tbl = new_int(7 + 15 + 1);\n var r1_tbl = new_int(7 + 15 + 1);\n\n /* SHORT BLOCK stuff fails for MPEG2 */\n if (gi.block_type == Encoder.SHORT_TYPE && gfc.mode_gr == 1)\n return;\n\n cod_info2.assign(gi);\n if (gi.block_type == Encoder.NORM_TYPE) {\n recalc_divide_init(gfc, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl);\n recalc_divide_sub(gfc, cod_info2, gi, ix, r01_bits, r01_div,\n r0_tbl, r1_tbl);\n }\n var i = cod_info2.big_values;\n if (i == 0 || (ix[i - 2] | ix[i - 1]) > 1)\n return;\n\n i = gi.count1 + 2;\n if (i > 576)\n return;\n\n /* Determines the number of bits to encode the quadruples. */\n cod_info2.assign(gi);\n cod_info2.count1 = i;\n var a1 = 0;\n var a2 = 0;\n\n assert(i <= 576);\n\n for (; i > cod_info2.big_values; i -= 4) {\n var p = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2\n + ix[i - 1];\n a1 += Tables.t32l[p];\n a2 += Tables.t33l[p];\n }\n cod_info2.big_values = i;\n\n cod_info2.count1table_select = 0;\n if (a1 > a2) {\n a1 = a2;\n cod_info2.count1table_select = 1;\n }\n\n cod_info2.count1bits = a1;\n\n if (cod_info2.block_type == Encoder.NORM_TYPE)\n recalc_divide_sub(gfc, cod_info2, gi, ix, r01_bits, r01_div,\n r0_tbl, r1_tbl);\n else {\n /* Count the number of bits necessary to code the bigvalues region. */\n cod_info2.part2_3_length = a1;\n a1 = gfc.scalefac_band.l[7 + 1];\n if (a1 > i) {\n a1 = i;\n }\n if (a1 > 0) {\n var bi = new Bits(cod_info2.part2_3_length);\n cod_info2.table_select[0] = choose_table(ix, 0, a1, bi);\n cod_info2.part2_3_length = bi.bits;\n }\n if (i > a1) {\n var bi = new Bits(cod_info2.part2_3_length);\n cod_info2.table_select[1] = choose_table(ix, a1, i, bi);\n cod_info2.part2_3_length = bi.bits;\n }\n if (gi.part2_3_length > cod_info2.part2_3_length)\n gi.assign(cod_info2);\n }\n }\n\n var slen1_n = [1, 1, 1, 1, 8, 2, 2, 2, 4, 4, 4, 8, 8, 8, 16, 16];\n var slen2_n = [1, 2, 4, 8, 1, 2, 4, 8, 2, 4, 8, 2, 4, 8, 4, 8];\n var slen1_tab = [0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4];\n var slen2_tab = [0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3];\n Takehiro.slen1_tab = slen1_tab;\n Takehiro.slen2_tab = slen2_tab;\n\n function scfsi_calc(ch, l3_side) {\n var sfb;\n var gi = l3_side.tt[1][ch];\n var g0 = l3_side.tt[0][ch];\n\n for (var i = 0; i < Tables.scfsi_band.length - 1; i++) {\n for (sfb = Tables.scfsi_band[i]; sfb < Tables.scfsi_band[i + 1]; sfb++) {\n if (g0.scalefac[sfb] != gi.scalefac[sfb]\n && gi.scalefac[sfb] >= 0)\n break;\n }\n if (sfb == Tables.scfsi_band[i + 1]) {\n for (sfb = Tables.scfsi_band[i]; sfb < Tables.scfsi_band[i + 1]; sfb++) {\n gi.scalefac[sfb] = -1;\n }\n l3_side.scfsi[ch][i] = 1;\n }\n }\n var s1 = 0;\n var c1 = 0;\n for (sfb = 0; sfb < 11; sfb++) {\n if (gi.scalefac[sfb] == -1)\n continue;\n c1++;\n if (s1 < gi.scalefac[sfb])\n s1 = gi.scalefac[sfb];\n }\n var s2 = 0;\n var c2 = 0;\n for (; sfb < Encoder.SBPSY_l; sfb++) {\n if (gi.scalefac[sfb] == -1)\n continue;\n c2++;\n if (s2 < gi.scalefac[sfb])\n s2 = gi.scalefac[sfb];\n }\n\n for (var i = 0; i < 16; i++) {\n if (s1 < slen1_n[i] && s2 < slen2_n[i]) {\n var c = slen1_tab[i] * c1 + slen2_tab[i] * c2;\n if (gi.part2_length > c) {\n gi.part2_length = c;\n gi.scalefac_compress = i;\n }\n }\n }\n }\n\n /**\n * Find the optimal way to store the scalefactors. Only call this routine\n * after final scalefactors have been chosen and the channel/granule will\n * not be re-encoded.\n */\n this.best_scalefac_store = function (gfc, gr, ch, l3_side) {\n /* use scalefac_scale if we can */\n var gi = l3_side.tt[gr][ch];\n var sfb, i, j, l;\n var recalc = 0;\n\n /*\n * remove scalefacs from bands with ix=0. This idea comes from the AAC\n * ISO docs. added mt 3/00\n */\n /* check if l3_enc=0 */\n j = 0;\n for (sfb = 0; sfb < gi.sfbmax; sfb++) {\n var width = gi.width[sfb];\n assert(width >= 0);\n j += width;\n for (l = -width; l < 0; l++) {\n if (gi.l3_enc[l + j] != 0)\n break;\n }\n if (l == 0)\n gi.scalefac[sfb] = recalc = -2;\n /* anything goes. */\n /*\n * only best_scalefac_store and calc_scfsi know--and only they\n * should know--about the magic number -2.\n */\n }\n\n if (0 == gi.scalefac_scale && 0 == gi.preflag) {\n var s = 0;\n for (sfb = 0; sfb < gi.sfbmax; sfb++)\n if (gi.scalefac[sfb] > 0)\n s |= gi.scalefac[sfb];\n\n if (0 == (s & 1) && s != 0) {\n for (sfb = 0; sfb < gi.sfbmax; sfb++)\n if (gi.scalefac[sfb] > 0)\n gi.scalefac[sfb] >>= 1;\n\n gi.scalefac_scale = recalc = 1;\n }\n }\n\n if (0 == gi.preflag && gi.block_type != Encoder.SHORT_TYPE\n && gfc.mode_gr == 2) {\n for (sfb = 11; sfb < Encoder.SBPSY_l; sfb++)\n if (gi.scalefac[sfb] < qupvt.pretab[sfb]\n && gi.scalefac[sfb] != -2)\n break;\n if (sfb == Encoder.SBPSY_l) {\n for (sfb = 11; sfb < Encoder.SBPSY_l; sfb++)\n if (gi.scalefac[sfb] > 0)\n gi.scalefac[sfb] -= qupvt.pretab[sfb];\n\n gi.preflag = recalc = 1;\n }\n }\n\n for (i = 0; i < 4; i++)\n l3_side.scfsi[ch][i] = 0;\n\n if (gfc.mode_gr == 2 && gr == 1\n && l3_side.tt[0][ch].block_type != Encoder.SHORT_TYPE\n && l3_side.tt[1][ch].block_type != Encoder.SHORT_TYPE) {\n scfsi_calc(ch, l3_side);\n recalc = 0;\n }\n for (sfb = 0; sfb < gi.sfbmax; sfb++) {\n if (gi.scalefac[sfb] == -2) {\n gi.scalefac[sfb] = 0;\n /* if anything goes, then 0 is a good choice */\n }\n }\n if (recalc != 0) {\n if (gfc.mode_gr == 2) {\n this.scale_bitcount(gi);\n } else {\n this.scale_bitcount_lsf(gfc, gi);\n }\n }\n }\n\n function all_scalefactors_not_negative(scalefac, n) {\n for (var i = 0; i < n; ++i) {\n if (scalefac[i] < 0)\n return false;\n }\n return true;\n }\n\n /**\n * number of bits used to encode scalefacs.\n *\n * 18*slen1_tab[i] + 18*slen2_tab[i]\n */\n var scale_short = [0, 18, 36, 54, 54, 36, 54, 72,\n 54, 72, 90, 72, 90, 108, 108, 126];\n\n /**\n * number of bits used to encode scalefacs.\n *\n * 17*slen1_tab[i] + 18*slen2_tab[i]\n */\n var scale_mixed = [0, 18, 36, 54, 51, 35, 53, 71,\n 52, 70, 88, 69, 87, 105, 104, 122];\n\n /**\n * number of bits used to encode scalefacs.\n *\n * 11*slen1_tab[i] + 10*slen2_tab[i]\n */\n var scale_long = [0, 10, 20, 30, 33, 21, 31, 41, 32, 42,\n 52, 43, 53, 63, 64, 74];\n\n /**\n * Also calculates the number of bits necessary to code the scalefactors.\n */\n this.scale_bitcount = function (cod_info) {\n var k, sfb, max_slen1 = 0, max_slen2 = 0;\n\n /* maximum values */\n var tab;\n var scalefac = cod_info.scalefac;\n\n assert(all_scalefactors_not_negative(scalefac, cod_info.sfbmax));\n\n if (cod_info.block_type == Encoder.SHORT_TYPE) {\n tab = scale_short;\n if (cod_info.mixed_block_flag != 0)\n tab = scale_mixed;\n } else { /* block_type == 1,2,or 3 */\n tab = scale_long;\n if (0 == cod_info.preflag) {\n for (sfb = 11; sfb < Encoder.SBPSY_l; sfb++)\n if (scalefac[sfb] < qupvt.pretab[sfb])\n break;\n\n if (sfb == Encoder.SBPSY_l) {\n cod_info.preflag = 1;\n for (sfb = 11; sfb < Encoder.SBPSY_l; sfb++)\n scalefac[sfb] -= qupvt.pretab[sfb];\n }\n }\n }\n\n for (sfb = 0; sfb < cod_info.sfbdivide; sfb++)\n if (max_slen1 < scalefac[sfb])\n max_slen1 = scalefac[sfb];\n\n for (; sfb < cod_info.sfbmax; sfb++)\n if (max_slen2 < scalefac[sfb])\n max_slen2 = scalefac[sfb];\n\n /*\n * from Takehiro TOMINAGA 10/99 loop over *all*\n * posible values of scalefac_compress to find the one which uses the\n * smallest number of bits. ISO would stop at first valid index\n */\n cod_info.part2_length = QuantizePVT.LARGE_BITS;\n for (k = 0; k < 16; k++) {\n if (max_slen1 < slen1_n[k] && max_slen2 < slen2_n[k]\n && cod_info.part2_length > tab[k]) {\n cod_info.part2_length = tab[k];\n cod_info.scalefac_compress = k;\n }\n }\n return cod_info.part2_length == QuantizePVT.LARGE_BITS;\n }\n\n /**\n * table of largest scalefactor values for MPEG2\n */\n var max_range_sfac_tab = [[15, 15, 7, 7],\n [15, 15, 7, 0], [7, 3, 0, 0], [15, 31, 31, 0],\n [7, 7, 7, 0], [3, 3, 0, 0]];\n\n /**\n * Also counts the number of bits to encode the scalefacs but for MPEG 2\n * Lower sampling frequencies (24, 22.05 and 16 kHz.)\n *\n * This is reverse-engineered from section 2.4.3.2 of the MPEG2 IS,\n * "Audio Decoding Layer III"\n */\n this.scale_bitcount_lsf = function (gfc, cod_info) {\n var table_number, row_in_table, partition, nr_sfb, window;\n var over;\n var i, sfb;\n var max_sfac = new_int(4);\n//var partition_table;\n var scalefac = cod_info.scalefac;\n\n /*\n * Set partition table. Note that should try to use table one, but do\n * not yet...\n */\n if (cod_info.preflag != 0)\n table_number = 2;\n else\n table_number = 0;\n\n for (i = 0; i < 4; i++)\n max_sfac[i] = 0;\n\n if (cod_info.block_type == Encoder.SHORT_TYPE) {\n row_in_table = 1;\n var partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table];\n for (sfb = 0, partition = 0; partition < 4; partition++) {\n nr_sfb = partition_table[partition] / 3;\n for (i = 0; i < nr_sfb; i++, sfb++)\n for (window = 0; window < 3; window++)\n if (scalefac[sfb * 3 + window] > max_sfac[partition])\n max_sfac[partition] = scalefac[sfb * 3 + window];\n }\n } else {\n row_in_table = 0;\n var partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table];\n for (sfb = 0, partition = 0; partition < 4; partition++) {\n nr_sfb = partition_table[partition];\n for (i = 0; i < nr_sfb; i++, sfb++)\n if (scalefac[sfb] > max_sfac[partition])\n max_sfac[partition] = scalefac[sfb];\n }\n }\n\n for (over = false, partition = 0; partition < 4; partition++) {\n if (max_sfac[partition] > max_range_sfac_tab[table_number][partition])\n over = true;\n }\n if (!over) {\n var slen1, slen2, slen3, slen4;\n\n cod_info.sfb_partition_table = qupvt.nr_of_sfb_block[table_number][row_in_table];\n for (partition = 0; partition < 4; partition++)\n cod_info.slen[partition] = log2tab[max_sfac[partition]];\n\n /* set scalefac_compress */\n slen1 = cod_info.slen[0];\n slen2 = cod_info.slen[1];\n slen3 = cod_info.slen[2];\n slen4 = cod_info.slen[3];\n\n switch (table_number) {\n case 0:\n cod_info.scalefac_compress = (((slen1 * 5) + slen2) << 4)\n + (slen3 << 2) + slen4;\n break;\n\n case 1:\n cod_info.scalefac_compress = 400 + (((slen1 * 5) + slen2) << 2)\n + slen3;\n break;\n\n case 2:\n cod_info.scalefac_compress = 500 + (slen1 * 3) + slen2;\n break;\n\n default:\n System.err.printf("intensity stereo not implemented yet\\n");\n break;\n }\n }\n if (!over) {\n assert(cod_info.sfb_partition_table != null);\n cod_info.part2_length = 0;\n for (partition = 0; partition < 4; partition++)\n cod_info.part2_length += cod_info.slen[partition]\n * cod_info.sfb_partition_table[partition];\n }\n return over;\n }\n\n /*\n * Since no bands have been over-amplified, we can set scalefac_compress and\n * slen[] for the formatter\n */\n var log2tab = [0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4,\n 4, 4, 4, 4];\n\n this.huffman_init = function (gfc) {\n for (var i = 2; i <= 576; i += 2) {\n var scfb_anz = 0, bv_index;\n while (gfc.scalefac_band.l[++scfb_anz] < i)\n ;\n\n bv_index = subdv_table[scfb_anz][0]; // .region0_count\n while (gfc.scalefac_band.l[bv_index + 1] > i)\n bv_index--;\n\n if (bv_index < 0) {\n /*\n * this is an indication that everything is going to be encoded\n * as region0: bigvalues < region0 < region1 so lets set\n * region0, region1 to some value larger than bigvalues\n */\n bv_index = subdv_table[scfb_anz][0]; // .region0_count\n }\n\n gfc.bv_scf[i - 2] = bv_index;\n\n bv_index = subdv_table[scfb_anz][1]; // .region1_count\n while (gfc.scalefac_band.l[bv_index + gfc.bv_scf[i - 2] + 2] > i)\n bv_index--;\n\n if (bv_index < 0) {\n bv_index = subdv_table[scfb_anz][1]; // .region1_count\n }\n\n gfc.bv_scf[i - 1] = bv_index;\n }\n }\n}\n\nmodule.exports = Takehiro;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMWdBSS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sYW1lanMvc3JjL2pzL1Rha2VoaXJvLmpzP2Q2MDAiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqXHRNUDMgaHVmZm1hbiB0YWJsZSBzZWxlY3RpbmcgYW5kIGJpdCBjb3VudGluZ1xuICpcbiAqXHRDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBUYWtlaGlybyBUT01JTkFHQVxuICpcdENvcHlyaWdodCAoYykgMjAwMi0yMDA1IEdhYnJpZWwgQm91dmlnbmVcbiAqXG4gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXJcbiAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXHQgU2VlIHRoZSBHTlVcbiAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlXG4gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCxcbiAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICovXG5cbi8qICRJZDogVGFrZWhpcm8uamF2YSx2IDEuMjYgMjAxMS8wNS8yNCAyMDo0ODowNiBrZW5jaGlzIEV4cCAkICovXG5cbi8vcGFja2FnZSBtcDM7XG5cbi8vaW1wb3J0IGphdmEudXRpbC5BcnJheXM7XG52YXIgY29tbW9uID0gcmVxdWlyZSgnLi9jb21tb24uanMnKTtcbnZhciBTeXN0ZW0gPSBjb21tb24uU3lzdGVtO1xudmFyIFZick1vZGUgPSBjb21tb24uVmJyTW9kZTtcbnZhciBGbG9hdCA9IGNvbW1vbi5GbG9hdDtcbnZhciBTaG9ydEJsb2NrID0gY29tbW9uLlNob3J0QmxvY2s7XG52YXIgVXRpbCA9IGNvbW1vbi5VdGlsO1xudmFyIEFycmF5cyA9IGNvbW1vbi5BcnJheXM7XG52YXIgbmV3X2FycmF5X24gPSBjb21tb24ubmV3X2FycmF5X247XG52YXIgbmV3X2J5dGUgPSBjb21tb24ubmV3X2J5dGU7XG52YXIgbmV3X2RvdWJsZSA9IGNvbW1vbi5uZXdfZG91YmxlO1xudmFyIG5ld19mbG9hdCA9IGNvbW1vbi5uZXdfZmxvYXQ7XG52YXIgbmV3X2Zsb2F0X24gPSBjb21tb24ubmV3X2Zsb2F0X247XG52YXIgbmV3X2ludCA9IGNvbW1vbi5uZXdfaW50O1xudmFyIG5ld19pbnRfbiA9IGNvbW1vbi5uZXdfaW50X247XG52YXIgYXNzZXJ0ID0gY29tbW9uLmFzc2VydDtcblxudmFyIEVuY29kZXIgPSByZXF1aXJlKCcuL0VuY29kZXIuanMnKTtcbnZhciBUYWJsZXMgPSByZXF1aXJlKCcuL1RhYmxlcy5qcycpO1xudmFyIEdySW5mbyA9IHJlcXVpcmUoJy4vR3JJbmZvLmpzJyk7XG52YXIgUXVhbnRpemVQVlQgPSByZXF1aXJlKCcuL1F1YW50aXplUFZULmpzJyk7XG5cblxuZnVuY3Rpb24gVGFrZWhpcm8oKSB7XG5cbiAgICB2YXIgcXVwdnQgPSBudWxsO1xuICAgIHRoaXMucXVwdnQgPSBudWxsO1xuXG4gICAgdGhpcy5zZXRNb2R1bGVzID0gZnVuY3Rpb24gKF9xdXB2dCkge1xuICAgICAgICB0aGlzLnF1cHZ0ID0gX3F1cHZ0O1xuICAgICAgICBxdXB2dCA9IF9xdXB2dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBCaXRzKGIpIHtcbiAgICAgICAgdGhpcy5iaXRzID0gMCB8IGI7XG4gICAgfVxuXG4gICAgdmFyIHN1YmR2X3RhYmxlID0gW1swLCAwXSwgLyogMCBiYW5kcyAqL1xuICAgICAgICBbMCwgMF0sIC8qIDEgYmFuZHMgKi9cbiAgICAgICAgWzAsIDBdLCAvKiAyIGJhbmRzICovXG4gICAgICAgIFswLCAwXSwgLyogMyBiYW5kcyAqL1xuICAgICAgICBbMCwgMF0sIC8qIDQgYmFuZHMgKi9cbiAgICAgICAgWzAsIDFdLCAvKiA1IGJhbmRzICovXG4gICAgICAgIFsxLCAxXSwgLyogNiBiYW5kcyAqL1xuICAgICAgICBbMSwgMV0sIC8qIDcgYmFuZHMgKi9cbiAgICAgICAgWzEsIDJdLCAvKiA4IGJhbmRzICovXG4gICAgICAgIFsyLCAyXSwgLyogOSBiYW5kcyAqL1xuICAgICAgICBbMiwgM10sIC8qIDEwIGJhbmRzICovXG4gICAgICAgIFsyLCAzXSwgLyogMTEgYmFuZHMgKi9cbiAgICAgICAgWzMsIDRdLCAvKiAxMiBiYW5kcyAqL1xuICAgICAgICBbMywgNF0sIC8qIDEzIGJhbmRzICovXG4gICAgICAgIFszLCA0XSwgLyogMTQgYmFuZHMgKi9cbiAgICAgICAgWzQsIDVdLCAvKiAxNSBiYW5kcyAqL1xuICAgICAgICBbNCwgNV0sIC8qIDE2IGJhbmRzICovXG4gICAgICAgIFs0LCA2XSwgLyogMTcgYmFuZHMgKi9cbiAgICAgICAgWzUsIDZdLCAvKiAxOCBiYW5kcyAqL1xuICAgICAgICBbNSwgNl0sIC8qIDE5IGJhbmRzICovXG4gICAgICAgIFs1LCA3XSwgLyogMjAgYmFuZHMgKi9cbiAgICAgICAgWzYsIDddLCAvKiAyMSBiYW5kcyAqL1xuICAgICAgICBbNiwgN10sIC8qIDIyIGJhbmRzICovXG4gICAgXTtcblxuICAgIC8qKlxuICAgICAqIG5vbmxpbmVhciBxdWFudGl6YXRpb24gb2YgeHIgTW9yZSBhY2N1cmF0ZSBmb3JtdWxhIHRoYW4gdGhlIElTTyBmb3JtdWxhLlxuICAgICAqIFRha2VzIGludG8gYWNjb3VudCB0aGUgZmFjdCB0aGF0IHdlIGFyZSBxdWFudGl6aW5nIHhyIC4gaXgsIGJ1dCB3ZSB3YW50XG4gICAgICogaXheNC8zIHRvIGJlIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHheNC8zLiAodGFraW5nIHRoZSBuZWFyZXN0IGludCB3b3VsZFxuICAgICAqIG1lYW4gaXggaXMgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8geHIsIHdoaWNoIGlzIGRpZmZlcmVudC4pXG4gICAgICpcbiAgICAgKiBGcm9tIFNlZ2hlciBCb2Vzc2Vua29vbCA8c2VnaGVyQGVhc3RzaXRlLm5sPiAxMS8xOTk5XG4gICAgICpcbiAgICAgKiAwOS8yMDAwOiBBU00gY29kZSByZW1vdmVkIGluIGZhdm9yIG9mIElFRUU3NTQgaGFjayBieSBUYWtlaGlybyBUb21pbmFnYS5cbiAgICAgKiBJZiB5b3UgbmVlZCB0aGUgQVNNIGNvZGUsIGNoZWNrIENWUyBjaXJjYSBBdWcgMjAwMC5cbiAgICAgKlxuICAgICAqIDAxLzIwMDQ6IE9wdGltaXphdGlvbnMgYnkgR2FicmllbCBCb3V2aWduZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHF1YW50aXplX2xpbmVzX3hycG93XzAxKGwsIGlzdGVwLCB4ciwgeHJQb3MsIGl4LCBpeFBvcykge1xuICAgICAgICB2YXIgY29tcGFyZXZhbDAgPSAoMS4wIC0gMC40MDU0KSAvIGlzdGVwO1xuXG4gICAgICAgIGFzc2VydChsID4gMCk7XG4gICAgICAgIGwgPSBsID4+IDE7XG4gICAgICAgIHdoaWxlICgobC0tKSAhPSAwKSB7XG4gICAgICAgICAgICBpeFtpeFBvcysrXSA9IChjb21wYXJldmFsMCA+IHhyW3hyUG9zKytdKSA/IDAgOiAxO1xuICAgICAgICAgICAgaXhbaXhQb3MrK10gPSAoY29tcGFyZXZhbDAgPiB4clt4clBvcysrXSkgPyAwIDogMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFhSUE9XX0ZUT0kgaXMgYSBtYWNybyB0byBjb252ZXJ0IGZsb2F0cyB0byBpbnRzLjxCUj5cbiAgICAgKiBpZiBYUlBPV19GVE9JKHgpID0gbmVhcmVzdF9pbnQoeCksIHRoZW4gUVVBTlRGQUMoeCk9YWRqNDNhc21beF08QlI+XG4gICAgICogUk9VTkRGQUM9IC0wLjA5NDY8QlI+XG4gICAgICpcbiAgICAgKiBpZiBYUlBPV19GVE9JKHgpID0gZmxvb3IoeCksIHRoZW4gUVVBTlRGQUMoeCk9YXNqNDNbeF08QlI+XG4gICAgICogUk9VTkRGQUM9MC40MDU0PEJSPlxuICAgICAqXG4gICAgICogTm90ZTogdXNpbmcgZmxvb3IoKSBvciAwfCBpcyBleHRyZW1lbHkgc2xvdy4gT24gbWFjaGluZXMgd2hlcmUgdGhlXG4gICAgICogVEFLRUhJUk9fSUVFRTc1NF9IQUNLIGNvZGUgYWJvdmUgZG9lcyBub3Qgd29yaywgaXQgaXMgd29ydGh3aWxlIHRvIHdyaXRlXG4gICAgICogc29tZSBBU00gZm9yIFhSUE9XX0ZUT0koKS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBxdWFudGl6ZV9saW5lc194cnBvdyhsLCBpc3RlcCwgeHIsIHhyUG9zLCBpeCwgaXhQb3MpIHtcbiAgICAgICAgYXNzZXJ0KGwgPiAwKTtcblxuICAgICAgICBsID0gbCA+PiAxO1xuICAgICAgICB2YXIgcmVtYWluaW5nID0gbCAlIDI7XG4gICAgICAgIGwgPSBsID4+IDE7XG4gICAgICAgIHdoaWxlIChsLS0gIT0gMCkge1xuICAgICAgICAgICAgdmFyIHgwLCB4MSwgeDIsIHgzO1xuICAgICAgICAgICAgdmFyIHJ4MCwgcngxLCByeDIsIHJ4MztcblxuICAgICAgICAgICAgeDAgPSB4clt4clBvcysrXSAqIGlzdGVwO1xuICAgICAgICAgICAgeDEgPSB4clt4clBvcysrXSAqIGlzdGVwO1xuICAgICAgICAgICAgcngwID0gMCB8IHgwO1xuICAgICAgICAgICAgeDIgPSB4clt4clBvcysrXSAqIGlzdGVwO1xuICAgICAgICAgICAgcngxID0gMCB8IHgxO1xuICAgICAgICAgICAgeDMgPSB4clt4clBvcysrXSAqIGlzdGVwO1xuICAgICAgICAgICAgcngyID0gMCB8IHgyO1xuICAgICAgICAgICAgeDAgKz0gcXVwdnQuYWRqNDNbcngwXTtcbiAgICAgICAgICAgIHJ4MyA9IDAgfCB4MztcbiAgICAgICAgICAgIHgxICs9IHF1cHZ0LmFkajQzW3J4MV07XG4gICAgICAgICAgICBpeFtpeFBvcysrXSA9IDAgfCB4MDtcbiAgICAgICAgICAgIHgyICs9IHF1cHZ0LmFkajQzW3J4Ml07XG4gICAgICAgICAgICBpeFtpeFBvcysrXSA9IDAgfCB4MTtcbiAgICAgICAgICAgIHgzICs9IHF1cHZ0LmFkajQzW3J4M107XG4gICAgICAgICAgICBpeFtpeFBvcysrXSA9IDAgfCB4MjtcbiAgICAgICAgICAgIGl4W2l4UG9zKytdID0gMCB8IHgzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZW1haW5pbmcgIT0gMCkge1xuICAgICAgICAgICAgdmFyIHgwLCB4MTtcbiAgICAgICAgICAgIHZhciByeDAsIHJ4MTtcblxuICAgICAgICAgICAgeDAgPSB4clt4clBvcysrXSAqIGlzdGVwO1xuICAgICAgICAgICAgeDEgPSB4clt4clBvcysrXSAqIGlzdGVwO1xuICAgICAgICAgICAgcngwID0gMCB8IHgwO1xuICAgICAgICAgICAgcngxID0gMCB8IHgxO1xuICAgICAgICAgICAgeDAgKz0gcXVwdnQuYWRqNDNbcngwXTtcbiAgICAgICAgICAgIHgxICs9IHF1cHZ0LmFkajQzW3J4MV07XG4gICAgICAgICAgICBpeFtpeFBvcysrXSA9IDAgfCB4MDtcbiAgICAgICAgICAgIGl4W2l4UG9zKytdID0gMCB8IHgxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVhbnRpemF0aW9uIGZ1bmN0aW9uIFRoaXMgZnVuY3Rpb24gd2lsbCBzZWxlY3Qgd2hpY2ggbGluZXMgdG8gcXVhbnRpemVcbiAgICAgKiBhbmQgY2FsbCB0aGUgcHJvcGVyIHF1YW50aXphdGlvbiBmdW5jdGlvblxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHF1YW50aXplX3hycG93KHhwLCBwaSwgaXN0ZXAsIGNvZEluZm8sIHByZXZOb2lzZSkge1xuICAgICAgICAvKiBxdWFudGl6ZSBvbiB4cl4oMy80KSBpbnN0ZWFkIG9mIHhyICovXG4gICAgICAgIHZhciBzZmI7XG4gICAgICAgIHZhciBzZmJtYXg7XG4gICAgICAgIHZhciBqID0gMDtcbiAgICAgICAgdmFyIHByZXZfZGF0YV91c2U7XG4gICAgICAgIHZhciBhY2N1bXVsYXRlID0gMDtcbiAgICAgICAgdmFyIGFjY3VtdWxhdGUwMSA9IDA7XG4gICAgICAgIHZhciB4cFBvcyA9IDA7XG4gICAgICAgIHZhciBpRGF0YSA9IHBpO1xuICAgICAgICB2YXIgaURhdGFQb3MgPSAwO1xuICAgICAgICB2YXIgYWNjX2lEYXRhID0gaURhdGE7XG4gICAgICAgIHZhciBhY2NfaURhdGFQb3MgPSAwO1xuICAgICAgICB2YXIgYWNjX3hwID0geHA7XG4gICAgICAgIHZhciBhY2NfeHBQb3MgPSAwO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFJldXNpbmcgcHJldmlvdXNseSBjb21wdXRlZCBkYXRhIGRvZXMgbm90IHNlZW1zIHRvIHdvcmsgaWYgZ2xvYmFsXG4gICAgICAgICAqIGdhaW4gaXMgY2hhbmdlZC4gRmluZGluZyB3aHkgaXQgYmVoYXZlcyB0aGlzIHdheSB3b3VsZCBhbGxvdyB0byB1c2UgYVxuICAgICAgICAgKiBjYWNoZSBvZiBwcmV2aW91c2x5IGNvbXB1dGVkIHZhbHVlcyAobGV0J3MgMTAgY2FjaGVkIHZhbHVlcyBwZXIgc2ZiKVxuICAgICAgICAgKiB0aGF0IHdvdWxkIHByb2JhYmx5IHByb3ZpZGUgYSBub3RpY2VhYmxlIHNwZWVkdXBcbiAgICAgICAgICovXG4gICAgICAgIHByZXZfZGF0YV91c2UgPSAocHJldk5vaXNlICE9IG51bGwgJiYgKGNvZEluZm8uZ2xvYmFsX2dhaW4gPT0gcHJldk5vaXNlLmdsb2JhbF9nYWluKSk7XG5cbiAgICAgICAgaWYgKGNvZEluZm8uYmxvY2tfdHlwZSA9PSBFbmNvZGVyLlNIT1JUX1RZUEUpXG4gICAgICAgICAgICBzZmJtYXggPSAzODtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgc2ZibWF4ID0gMjE7XG5cbiAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPD0gc2ZibWF4OyBzZmIrKykge1xuICAgICAgICAgICAgdmFyIHN0ZXAgPSAtMTtcblxuICAgICAgICAgICAgaWYgKHByZXZfZGF0YV91c2UgfHwgY29kSW5mby5ibG9ja190eXBlID09IEVuY29kZXIuTk9STV9UWVBFKSB7XG4gICAgICAgICAgICAgICAgc3RlcCA9IGNvZEluZm8uZ2xvYmFsX2dhaW5cbiAgICAgICAgICAgICAgICAgICAgLSAoKGNvZEluZm8uc2NhbGVmYWNbc2ZiXSArIChjb2RJbmZvLnByZWZsYWcgIT0gMCA/IHF1cHZ0LnByZXRhYltzZmJdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IDApKSA8PCAoY29kSW5mby5zY2FsZWZhY19zY2FsZSArIDEpKVxuICAgICAgICAgICAgICAgICAgICAtIGNvZEluZm8uc3ViYmxvY2tfZ2Fpbltjb2RJbmZvLndpbmRvd1tzZmJdXSAqIDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQoY29kSW5mby53aWR0aFtzZmJdID49IDApO1xuICAgICAgICAgICAgaWYgKHByZXZfZGF0YV91c2UgJiYgKHByZXZOb2lzZS5zdGVwW3NmYl0gPT0gc3RlcCkpIHtcbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAqIGRvIG5vdCByZWNvbXB1dGUgdGhpcyBwYXJ0LCBidXQgY29tcHV0ZSBhY2N1bXVsYXRlZCBsaW5lc1xuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGlmIChhY2N1bXVsYXRlICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVfbGluZXNfeHJwb3coYWNjdW11bGF0ZSwgaXN0ZXAsIGFjY194cCwgYWNjX3hwUG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjX2lEYXRhLCBhY2NfaURhdGFQb3MpO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFjY3VtdWxhdGUwMSAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHF1YW50aXplX2xpbmVzX3hycG93XzAxKGFjY3VtdWxhdGUwMSwgaXN0ZXAsIGFjY194cCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY194cFBvcywgYWNjX2lEYXRhLCBhY2NfaURhdGFQb3MpO1xuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlMDEgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7IC8qIHNob3VsZCBjb21wdXRlIHRoaXMgcGFydCAqL1xuICAgICAgICAgICAgICAgIHZhciBsID0gY29kSW5mby53aWR0aFtzZmJdO1xuXG4gICAgICAgICAgICAgICAgaWYgKChqICsgY29kSW5mby53aWR0aFtzZmJdKSA+IGNvZEluZm8ubWF4X25vbnplcm9fY29lZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgLyogZG8gbm90IGNvbXB1dGUgdXBwZXIgemVybyBwYXJ0ICovXG4gICAgICAgICAgICAgICAgICAgIHZhciB1c2VmdWxsc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgdXNlZnVsbHNpemUgPSBjb2RJbmZvLm1heF9ub256ZXJvX2NvZWZmIC0gaiArIDE7XG4gICAgICAgICAgICAgICAgICAgIEFycmF5cy5maWxsKHBpLCBjb2RJbmZvLm1heF9ub256ZXJvX2NvZWZmLCA1NzYsIDApO1xuICAgICAgICAgICAgICAgICAgICBsID0gdXNlZnVsbHNpemU7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGwgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8qIG5vIG5lZWQgdG8gY29tcHV0ZSBoaWdoZXIgc2ZiIHZhbHVlcyAqL1xuICAgICAgICAgICAgICAgICAgICBzZmIgPSBzZmJtYXggKyAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8qIGFjY3VtdWxhdGUgbGluZXMgdG8gcXVhbnRpemUgKi9cbiAgICAgICAgICAgICAgICBpZiAoMCA9PSBhY2N1bXVsYXRlICYmIDAgPT0gYWNjdW11bGF0ZTAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGFjY19pRGF0YSA9IGlEYXRhO1xuICAgICAgICAgICAgICAgICAgICBhY2NfaURhdGFQb3MgPSBpRGF0YVBvcztcbiAgICAgICAgICAgICAgICAgICAgYWNjX3hwID0geHA7XG4gICAgICAgICAgICAgICAgICAgIGFjY194cFBvcyA9IHhwUG9zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHJldk5vaXNlICE9IG51bGwgJiYgcHJldk5vaXNlLnNmYl9jb3VudDEgPiAwXG4gICAgICAgICAgICAgICAgICAgICYmIHNmYiA+PSBwcmV2Tm9pc2Uuc2ZiX2NvdW50MVxuICAgICAgICAgICAgICAgICAgICAmJiBwcmV2Tm9pc2Uuc3RlcFtzZmJdID4gMFxuICAgICAgICAgICAgICAgICAgICAmJiBzdGVwID49IHByZXZOb2lzZS5zdGVwW3NmYl0pIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYWNjdW11bGF0ZSAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZV9saW5lc194cnBvdyhhY2N1bXVsYXRlLCBpc3RlcCwgYWNjX3hwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY194cFBvcywgYWNjX2lEYXRhLCBhY2NfaURhdGFQb3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NfaURhdGEgPSBpRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY19pRGF0YVBvcyA9IGlEYXRhUG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjX3hwID0geHA7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NfeHBQb3MgPSB4cFBvcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlMDEgKz0gbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWNjdW11bGF0ZTAxICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXplX2xpbmVzX3hycG93XzAxKGFjY3VtdWxhdGUwMSwgaXN0ZXAsIGFjY194cCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NfeHBQb3MsIGFjY19pRGF0YSwgYWNjX2lEYXRhUG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGUwMSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NfaURhdGEgPSBpRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY19pRGF0YVBvcyA9IGlEYXRhUG9zO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjX3hwID0geHA7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NfeHBQb3MgPSB4cFBvcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlICs9IGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGwgPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgKiByaDogMjAwNDAyMTUgbWF5IGhhcHBlbiBkdWUgdG8gXCJwcmV2X2RhdGFfdXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICogb3B0aW1pemF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWNjdW11bGF0ZTAxICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXplX2xpbmVzX3hycG93XzAxKGFjY3VtdWxhdGUwMSwgaXN0ZXAsIGFjY194cCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NfeHBQb3MsIGFjY19pRGF0YSwgYWNjX2lEYXRhUG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGUwMSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY3VtdWxhdGUgIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemVfbGluZXNfeHJwb3coYWNjdW11bGF0ZSwgaXN0ZXAsIGFjY194cCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NfeHBQb3MsIGFjY19pRGF0YSwgYWNjX2lEYXRhUG9zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGUgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIC8qIGVuZHMgZm9yLWxvb3AgKi9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2ZiIDw9IHNmYm1heCkge1xuICAgICAgICAgICAgICAgIGlEYXRhUG9zICs9IGNvZEluZm8ud2lkdGhbc2ZiXTtcbiAgICAgICAgICAgICAgICB4cFBvcyArPSBjb2RJbmZvLndpZHRoW3NmYl07XG4gICAgICAgICAgICAgICAgaiArPSBjb2RJbmZvLndpZHRoW3NmYl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjY3VtdWxhdGUgIT0gMCkgeyAvKiBsYXN0IGRhdGEgcGFydCAqL1xuICAgICAgICAgICAgcXVhbnRpemVfbGluZXNfeHJwb3coYWNjdW11bGF0ZSwgaXN0ZXAsIGFjY194cCwgYWNjX3hwUG9zLFxuICAgICAgICAgICAgICAgIGFjY19pRGF0YSwgYWNjX2lEYXRhUG9zKTtcbiAgICAgICAgICAgIGFjY3VtdWxhdGUgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY2N1bXVsYXRlMDEgIT0gMCkgeyAvKiBsYXN0IGRhdGEgcGFydCAqL1xuICAgICAgICAgICAgcXVhbnRpemVfbGluZXNfeHJwb3dfMDEoYWNjdW11bGF0ZTAxLCBpc3RlcCwgYWNjX3hwLCBhY2NfeHBQb3MsXG4gICAgICAgICAgICAgICAgYWNjX2lEYXRhLCBhY2NfaURhdGFQb3MpO1xuICAgICAgICAgICAgYWNjdW11bGF0ZTAxID0gMDtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaXhfbWF4XG4gICAgICovXG4gICAgZnVuY3Rpb24gaXhfbWF4KGl4LCBpeFBvcywgZW5kUG9zKSB7XG4gICAgICAgIHZhciBtYXgxID0gMCwgbWF4MiA9IDA7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgdmFyIHgxID0gaXhbaXhQb3MrK107XG4gICAgICAgICAgICB2YXIgeDIgPSBpeFtpeFBvcysrXTtcbiAgICAgICAgICAgIGlmIChtYXgxIDwgeDEpXG4gICAgICAgICAgICAgICAgbWF4MSA9IHgxO1xuXG4gICAgICAgICAgICBpZiAobWF4MiA8IHgyKVxuICAgICAgICAgICAgICAgIG1heDIgPSB4MjtcbiAgICAgICAgfSB3aGlsZSAoaXhQb3MgPCBlbmRQb3MpO1xuICAgICAgICBpZiAobWF4MSA8IG1heDIpXG4gICAgICAgICAgICBtYXgxID0gbWF4MjtcbiAgICAgICAgcmV0dXJuIG1heDE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY291bnRfYml0X0VTQyhpeCwgaXhQb3MsIGVuZCwgdDEsIHQyLCBzKSB7XG4gICAgICAgIC8qIEVTQy10YWJsZSBpcyB1c2VkICovXG4gICAgICAgIHZhciBsaW5iaXRzID0gVGFibGVzLmh0W3QxXS54bGVuICogNjU1MzYgKyBUYWJsZXMuaHRbdDJdLnhsZW47XG4gICAgICAgIHZhciBzdW0gPSAwLCBzdW0yO1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHZhciB4ID0gaXhbaXhQb3MrK107XG4gICAgICAgICAgICB2YXIgeSA9IGl4W2l4UG9zKytdO1xuXG4gICAgICAgICAgICBpZiAoeCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHggPiAxNCkge1xuICAgICAgICAgICAgICAgICAgICB4ID0gMTU7XG4gICAgICAgICAgICAgICAgICAgIHN1bSArPSBsaW5iaXRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4ICo9IDE2O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoeSAhPSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHkgPiAxNCkge1xuICAgICAgICAgICAgICAgICAgICB5ID0gMTU7XG4gICAgICAgICAgICAgICAgICAgIHN1bSArPSBsaW5iaXRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4ICs9IHk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1bSArPSBUYWJsZXMubGFyZ2V0YmxbeF07XG4gICAgICAgIH0gd2hpbGUgKGl4UG9zIDwgZW5kKTtcblxuICAgICAgICBzdW0yID0gc3VtICYgMHhmZmZmO1xuICAgICAgICBzdW0gPj49IDE2O1xuXG4gICAgICAgIGlmIChzdW0gPiBzdW0yKSB7XG4gICAgICAgICAgICBzdW0gPSBzdW0yO1xuICAgICAgICAgICAgdDEgPSB0MjtcbiAgICAgICAgfVxuXG4gICAgICAgIHMuYml0cyArPSBzdW07XG4gICAgICAgIHJldHVybiB0MTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb3VudF9iaXRfbm9FU0MoaXgsIGl4UG9zLCBlbmQsIHMpIHtcbiAgICAgICAgLyogTm8gRVNDLXdvcmRzICovXG4gICAgICAgIHZhciBzdW0xID0gMDtcbiAgICAgICAgdmFyIGhsZW4xID0gVGFibGVzLmh0WzFdLmhsZW47XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgdmFyIHggPSBpeFtpeFBvcyArIDBdICogMiArIGl4W2l4UG9zICsgMV07XG4gICAgICAgICAgICBpeFBvcyArPSAyO1xuICAgICAgICAgICAgc3VtMSArPSBobGVuMVt4XTtcbiAgICAgICAgfSB3aGlsZSAoaXhQb3MgPCBlbmQpO1xuXG4gICAgICAgIHMuYml0cyArPSBzdW0xO1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb3VudF9iaXRfbm9FU0NfZnJvbTIoaXgsIGl4UG9zLCBlbmQsIHQxLCBzKSB7XG4gICAgICAgIC8qIE5vIEVTQy13b3JkcyAqL1xuICAgICAgICB2YXIgc3VtID0gMCwgc3VtMjtcbiAgICAgICAgdmFyIHhsZW4gPSBUYWJsZXMuaHRbdDFdLnhsZW47XG4gICAgICAgIHZhciBobGVuO1xuICAgICAgICBpZiAodDEgPT0gMilcbiAgICAgICAgICAgIGhsZW4gPSBUYWJsZXMudGFibGUyMztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaGxlbiA9IFRhYmxlcy50YWJsZTU2O1xuXG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHZhciB4ID0gaXhbaXhQb3MgKyAwXSAqIHhsZW4gKyBpeFtpeFBvcyArIDFdO1xuICAgICAgICAgICAgaXhQb3MgKz0gMjtcbiAgICAgICAgICAgIHN1bSArPSBobGVuW3hdO1xuICAgICAgICB9IHdoaWxlIChpeFBvcyA8IGVuZCk7XG5cbiAgICAgICAgc3VtMiA9IHN1bSAmIDB4ZmZmZjtcbiAgICAgICAgc3VtID4+PSAxNjtcblxuICAgICAgICBpZiAoc3VtID4gc3VtMikge1xuICAgICAgICAgICAgc3VtID0gc3VtMjtcbiAgICAgICAgICAgIHQxKys7XG4gICAgICAgIH1cblxuICAgICAgICBzLmJpdHMgKz0gc3VtO1xuICAgICAgICByZXR1cm4gdDE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY291bnRfYml0X25vRVNDX2Zyb20zKGl4LCBpeFBvcywgZW5kLCB0MSwgcykge1xuICAgICAgICAvKiBObyBFU0Mtd29yZHMgKi9cbiAgICAgICAgdmFyIHN1bTEgPSAwO1xuICAgICAgICB2YXIgc3VtMiA9IDA7XG4gICAgICAgIHZhciBzdW0zID0gMDtcbiAgICAgICAgdmFyIHhsZW4gPSBUYWJsZXMuaHRbdDFdLnhsZW47XG4gICAgICAgIHZhciBobGVuMSA9IFRhYmxlcy5odFt0MV0uaGxlbjtcbiAgICAgICAgdmFyIGhsZW4yID0gVGFibGVzLmh0W3QxICsgMV0uaGxlbjtcbiAgICAgICAgdmFyIGhsZW4zID0gVGFibGVzLmh0W3QxICsgMl0uaGxlbjtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICB2YXIgeCA9IGl4W2l4UG9zICsgMF0gKiB4bGVuICsgaXhbaXhQb3MgKyAxXTtcbiAgICAgICAgICAgIGl4UG9zICs9IDI7XG4gICAgICAgICAgICBzdW0xICs9IGhsZW4xW3hdO1xuICAgICAgICAgICAgc3VtMiArPSBobGVuMlt4XTtcbiAgICAgICAgICAgIHN1bTMgKz0gaGxlbjNbeF07XG4gICAgICAgIH0gd2hpbGUgKGl4UG9zIDwgZW5kKTtcbiAgICAgICAgdmFyIHQgPSB0MTtcbiAgICAgICAgaWYgKHN1bTEgPiBzdW0yKSB7XG4gICAgICAgICAgICBzdW0xID0gc3VtMjtcbiAgICAgICAgICAgIHQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VtMSA+IHN1bTMpIHtcbiAgICAgICAgICAgIHN1bTEgPSBzdW0zO1xuICAgICAgICAgICAgdCA9IHQxICsgMjtcbiAgICAgICAgfVxuICAgICAgICBzLmJpdHMgKz0gc3VtMTtcblxuICAgICAgICByZXR1cm4gdDtcbiAgICB9XG5cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAvKiBjaG9vc2UgdGFibGUgKi9cbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAgIHZhciBodWZfdGJsX25vRVNDID0gWzEsIDIsIDUsIDcsIDcsIDEwLCAxMCwgMTMsIDEzLFxuICAgICAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzXTtcblxuICAgIC8qKlxuICAgICAqIENob29zZSB0aGUgSHVmZm1hbiB0YWJsZSB0aGF0IHdpbGwgZW5jb2RlIGl4W2JlZ2luLi5lbmRdIHdpdGggdGhlIGZld2VzdFxuICAgICAqIGJpdHMuXG4gICAgICpcbiAgICAgKiBOb3RlOiBUaGlzIGNvZGUgY29udGFpbnMga25vd2xlZGdlIGFib3V0IHRoZSBzaXplcyBhbmQgY2hhcmFjdGVyaXN0aWNzIG9mXG4gICAgICogdGhlIEh1ZmZtYW4gdGFibGVzIGFzIGRlZmluZWQgaW4gdGhlIElTIChUYWJsZSBCLjcpLCBhbmQgd2lsbCBub3Qgd29ya1xuICAgICAqIHdpdGggYW55IGFyYml0cmFyeSB0YWJsZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2hvb3NlX3RhYmxlKGl4LCBpeFBvcywgZW5kUG9zLCBzKSB7XG4gICAgICAgIHZhciBtYXggPSBpeF9tYXgoaXgsIGl4UG9zLCBlbmRQb3MpO1xuXG4gICAgICAgIHN3aXRjaCAobWF4KSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1heDtcblxuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudF9iaXRfbm9FU0MoaXgsIGl4UG9zLCBlbmRQb3MsIHMpO1xuXG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50X2JpdF9ub0VTQ19mcm9tMihpeCwgaXhQb3MsIGVuZFBvcyxcbiAgICAgICAgICAgICAgICAgICAgaHVmX3RibF9ub0VTQ1ttYXggLSAxXSwgcyk7XG5cbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgICByZXR1cm4gY291bnRfYml0X25vRVNDX2Zyb20zKGl4LCBpeFBvcywgZW5kUG9zLFxuICAgICAgICAgICAgICAgICAgICBodWZfdGJsX25vRVNDW21heCAtIDFdLCBzKTtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvKiB0cnkgdGFibGVzIHdpdGggbGluYml0cyAqL1xuICAgICAgICAgICAgICAgIGlmIChtYXggPiBRdWFudGl6ZVBWVC5JWE1BWF9WQUwpIHtcbiAgICAgICAgICAgICAgICAgICAgcy5iaXRzID0gUXVhbnRpemVQVlQuTEFSR0VfQklUUztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYXggLT0gMTU7XG4gICAgICAgICAgICAgICAgdmFyIGNob2ljZTI7XG4gICAgICAgICAgICAgICAgZm9yIChjaG9pY2UyID0gMjQ7IGNob2ljZTIgPCAzMjsgY2hvaWNlMisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChUYWJsZXMuaHRbY2hvaWNlMl0ubGlubWF4ID49IG1heCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGNob2ljZTtcbiAgICAgICAgICAgICAgICBmb3IgKGNob2ljZSA9IGNob2ljZTIgLSA4OyBjaG9pY2UgPCAyNDsgY2hvaWNlKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFRhYmxlcy5odFtjaG9pY2VdLmxpbm1heCA+PSBtYXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudF9iaXRfRVNDKGl4LCBpeFBvcywgZW5kUG9zLCBjaG9pY2UsIGNob2ljZTIsIHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY291bnRfYml0XG4gICAgICovXG4gICAgdGhpcy5ub3F1YW50X2NvdW50X2JpdHMgPSBmdW5jdGlvbiAoZ2ZjLCBnaSwgcHJldl9ub2lzZSkge1xuICAgICAgICB2YXIgaXggPSBnaS5sM19lbmM7XG4gICAgICAgIHZhciBpID0gTWF0aC5taW4oNTc2LCAoKGdpLm1heF9ub256ZXJvX2NvZWZmICsgMikgPj4gMSkgPDwgMSk7XG5cbiAgICAgICAgaWYgKHByZXZfbm9pc2UgIT0gbnVsbClcbiAgICAgICAgICAgIHByZXZfbm9pc2Uuc2ZiX2NvdW50MSA9IDA7XG5cbiAgICAgICAgLyogRGV0ZXJtaW5lIGNvdW50MSByZWdpb24gKi9cbiAgICAgICAgZm9yICg7IGkgPiAxOyBpIC09IDIpXG4gICAgICAgICAgICBpZiAoKGl4W2kgLSAxXSB8IGl4W2kgLSAyXSkgIT0gMClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgZ2kuY291bnQxID0gaTtcblxuICAgICAgICAvKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgYml0cyB0byBlbmNvZGUgdGhlIHF1YWRydXBsZXMuICovXG4gICAgICAgIHZhciBhMSA9IDA7XG4gICAgICAgIHZhciBhMiA9IDA7XG4gICAgICAgIGZvciAoOyBpID4gMzsgaSAtPSA0KSB7XG4gICAgICAgICAgICB2YXIgcDtcbiAgICAgICAgICAgIC8qIGhhY2sgdG8gY2hlY2sgaWYgYWxsIHZhbHVlcyA8PSAxICovXG4gICAgICAgICAgICAvL3Rocm93IFwiVE9ETzogSEFDSyAgICAgICAgIGlmICgoKChsb25nKSBpeFtpIC0gMV0gfCAobG9uZykgaXhbaSAtIDJdIHwgKGxvbmcpIGl4W2kgLSAzXSB8IChsb25nKSBpeFtpIC0gNF0pICYgMHhmZmZmZmZmZkwpID4gMUwgICAgICAgIFwiXG4gICAgICAgICAgICAvL2lmICh0cnVlKSB7XG4gICAgICAgICAgICBpZiAoKChpeFtpIC0gMV0gfCBpeFtpIC0gMl0gfCBpeFtpIC0gM10gfCBpeFtpIC0gNF0pICYgMHg3ZmZmZmZmZikgPiAxKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwID0gKChpeFtpIC0gNF0gKiAyICsgaXhbaSAtIDNdKSAqIDIgKyBpeFtpIC0gMl0pICogMiArIGl4W2kgLSAxXTtcbiAgICAgICAgICAgIGExICs9IFRhYmxlcy50MzJsW3BdO1xuICAgICAgICAgICAgYTIgKz0gVGFibGVzLnQzM2xbcF07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJpdHMgPSBhMTtcbiAgICAgICAgZ2kuY291bnQxdGFibGVfc2VsZWN0ID0gMDtcbiAgICAgICAgaWYgKGExID4gYTIpIHtcbiAgICAgICAgICAgIGJpdHMgPSBhMjtcbiAgICAgICAgICAgIGdpLmNvdW50MXRhYmxlX3NlbGVjdCA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBnaS5jb3VudDFiaXRzID0gYml0cztcbiAgICAgICAgZ2kuYmlnX3ZhbHVlcyA9IGk7XG4gICAgICAgIGlmIChpID09IDApXG4gICAgICAgICAgICByZXR1cm4gYml0cztcblxuICAgICAgICBpZiAoZ2kuYmxvY2tfdHlwZSA9PSBFbmNvZGVyLlNIT1JUX1RZUEUpIHtcbiAgICAgICAgICAgIGExID0gMyAqIGdmYy5zY2FsZWZhY19iYW5kLnNbM107XG4gICAgICAgICAgICBpZiAoYTEgPiBnaS5iaWdfdmFsdWVzKVxuICAgICAgICAgICAgICAgIGExID0gZ2kuYmlnX3ZhbHVlcztcbiAgICAgICAgICAgIGEyID0gZ2kuYmlnX3ZhbHVlcztcblxuICAgICAgICB9IGVsc2UgaWYgKGdpLmJsb2NrX3R5cGUgPT0gRW5jb2Rlci5OT1JNX1RZUEUpIHtcbiAgICAgICAgICAgIGFzc2VydChpIDw9IDU3Nik7XG4gICAgICAgICAgICAvKiBidl9zY2YgaGFzIDU3NiBlbnRyaWVzICgwLi41NzUpICovXG4gICAgICAgICAgICBhMSA9IGdpLnJlZ2lvbjBfY291bnQgPSBnZmMuYnZfc2NmW2kgLSAyXTtcbiAgICAgICAgICAgIGEyID0gZ2kucmVnaW9uMV9jb3VudCA9IGdmYy5idl9zY2ZbaSAtIDFdO1xuXG4gICAgICAgICAgICBhc3NlcnQoYTEgKyBhMiArIDIgPCBFbmNvZGVyLlNCUFNZX2wpO1xuICAgICAgICAgICAgYTIgPSBnZmMuc2NhbGVmYWNfYmFuZC5sW2ExICsgYTIgKyAyXTtcbiAgICAgICAgICAgIGExID0gZ2ZjLnNjYWxlZmFjX2JhbmQubFthMSArIDFdO1xuICAgICAgICAgICAgaWYgKGEyIDwgaSkge1xuICAgICAgICAgICAgICAgIHZhciBiaSA9IG5ldyBCaXRzKGJpdHMpO1xuICAgICAgICAgICAgICAgIGdpLnRhYmxlX3NlbGVjdFsyXSA9IGNob29zZV90YWJsZShpeCwgYTIsIGksIGJpKTtcbiAgICAgICAgICAgICAgICBiaXRzID0gYmkuYml0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdpLnJlZ2lvbjBfY291bnQgPSA3O1xuICAgICAgICAgICAgLyogZ2kucmVnaW9uMV9jb3VudCA9IFNCUFNZX2wgLSA3IC0gMTsgKi9cbiAgICAgICAgICAgIGdpLnJlZ2lvbjFfY291bnQgPSBFbmNvZGVyLlNCTUFYX2wgLSAxIC0gNyAtIDE7XG4gICAgICAgICAgICBhMSA9IGdmYy5zY2FsZWZhY19iYW5kLmxbNyArIDFdO1xuICAgICAgICAgICAgYTIgPSBpO1xuICAgICAgICAgICAgaWYgKGExID4gYTIpIHtcbiAgICAgICAgICAgICAgICBhMSA9IGEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyogaGF2ZSB0byBhbGxvdyBmb3IgdGhlIGNhc2Ugd2hlbiBiaWd2YWx1ZXMgPCByZWdpb24wIDwgcmVnaW9uMSAqL1xuICAgICAgICAvKiAoYW5kIHJlZ2lvbjAsIHJlZ2lvbjEgYXJlIGlnbm9yZWQpICovXG4gICAgICAgIGExID0gTWF0aC5taW4oYTEsIGkpO1xuICAgICAgICBhMiA9IE1hdGgubWluKGEyLCBpKTtcblxuICAgICAgICBhc3NlcnQoYTEgPj0gMCk7XG4gICAgICAgIGFzc2VydChhMiA+PSAwKTtcblxuICAgICAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIGNvZGUgdGhlIGJpZ3ZhbHVlcyByZWdpb24uICovXG4gICAgICAgIGlmICgwIDwgYTEpIHtcbiAgICAgICAgICAgIHZhciBiaSA9IG5ldyBCaXRzKGJpdHMpO1xuICAgICAgICAgICAgZ2kudGFibGVfc2VsZWN0WzBdID0gY2hvb3NlX3RhYmxlKGl4LCAwLCBhMSwgYmkpO1xuICAgICAgICAgICAgYml0cyA9IGJpLmJpdHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGExIDwgYTIpIHtcbiAgICAgICAgICAgIHZhciBiaSA9IG5ldyBCaXRzKGJpdHMpO1xuICAgICAgICAgICAgZ2kudGFibGVfc2VsZWN0WzFdID0gY2hvb3NlX3RhYmxlKGl4LCBhMSwgYTIsIGJpKTtcbiAgICAgICAgICAgIGJpdHMgPSBiaS5iaXRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnZmMudXNlX2Jlc3RfaHVmZm1hbiA9PSAyKSB7XG4gICAgICAgICAgICBnaS5wYXJ0Ml8zX2xlbmd0aCA9IGJpdHM7XG4gICAgICAgICAgICBiZXN0X2h1ZmZtYW5fZGl2aWRlKGdmYywgZ2kpO1xuICAgICAgICAgICAgYml0cyA9IGdpLnBhcnQyXzNfbGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZXZfbm9pc2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGdpLmJsb2NrX3R5cGUgPT0gRW5jb2Rlci5OT1JNX1RZUEUpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2ZiID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoZ2ZjLnNjYWxlZmFjX2JhbmQubFtzZmJdIDwgZ2kuYmlnX3ZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBzZmIrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJldl9ub2lzZS5zZmJfY291bnQxID0gc2ZiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJpdHM7XG4gICAgfVxuXG4gICAgdGhpcy5jb3VudF9iaXRzID0gZnVuY3Rpb24gKGdmYywgeHIsIGdpLCBwcmV2X25vaXNlKSB7XG4gICAgICAgIHZhciBpeCA9IGdpLmwzX2VuYztcblxuICAgICAgICAvKiBzaW5jZSBxdWFudGl6ZV94cnBvdyB1c2VzIHRhYmxlIGxvb2t1cCwgd2UgbmVlZCB0byBjaGVjayB0aGlzIGZpcnN0OiAqL1xuICAgICAgICB2YXIgdyA9IChRdWFudGl6ZVBWVC5JWE1BWF9WQUwpIC8gcXVwdnQuSVBPVzIwKGdpLmdsb2JhbF9nYWluKTtcblxuICAgICAgICBpZiAoZ2kueHJwb3dfbWF4ID4gdylcbiAgICAgICAgICAgIHJldHVybiBRdWFudGl6ZVBWVC5MQVJHRV9CSVRTO1xuXG4gICAgICAgIHF1YW50aXplX3hycG93KHhyLCBpeCwgcXVwdnQuSVBPVzIwKGdpLmdsb2JhbF9nYWluKSwgZ2ksIHByZXZfbm9pc2UpO1xuXG4gICAgICAgIGlmICgoZ2ZjLnN1YnN0ZXBfc2hhcGluZyAmIDIpICE9IDApIHtcbiAgICAgICAgICAgIHZhciBqID0gMDtcbiAgICAgICAgICAgIC8qIDAuNjM0NTIxNjgyMjQyNDM5ID0gMC41OTQ2KjIqKiguNSowLjE4NzUpICovXG4gICAgICAgICAgICB2YXIgZ2FpbiA9IGdpLmdsb2JhbF9nYWluICsgZ2kuc2NhbGVmYWNfc2NhbGU7XG4gICAgICAgICAgICB2YXIgcm91bmRmYWMgPSAwLjYzNDUyMTY4MjI0MjQzOSAvIHF1cHZ0LklQT1cyMChnYWluKTtcbiAgICAgICAgICAgIGZvciAodmFyIHNmYiA9IDA7IHNmYiA8IGdpLnNmYm1heDsgc2ZiKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBnaS53aWR0aFtzZmJdO1xuICAgICAgICAgICAgICAgIGFzc2VydCh3aWR0aCA+PSAwKTtcbiAgICAgICAgICAgICAgICBpZiAoMCA9PSBnZmMucHNldWRvaGFsZltzZmJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGogKz0gd2lkdGg7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGs7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoayA9IGosIGogKz0gd2lkdGg7IGsgPCBqOyArK2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl4W2tdID0gKHhyW2tdID49IHJvdW5kZmFjKSA/IGl4W2tdIDogMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5ub3F1YW50X2NvdW50X2JpdHMoZ2ZjLCBnaSwgcHJldl9ub2lzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmUtY2FsY3VsYXRlIHRoZSBiZXN0IHNjYWxlZmFjX2NvbXByZXNzIHVzaW5nIHNjZnNpIHRoZSBzYXZlZCBiaXRzIGFyZVxuICAgICAqIGtlcHQgaW4gdGhlIGJpdCByZXNlcnZvaXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVjYWxjX2RpdmlkZV9pbml0KGdmYywgY29kX2luZm8sIGl4LCByMDFfYml0cywgcjAxX2RpdiwgcjBfdGJsLCByMV90YmwpIHtcbiAgICAgICAgdmFyIGJpZ3YgPSBjb2RfaW5mby5iaWdfdmFsdWVzO1xuXG4gICAgICAgIGZvciAodmFyIHIwID0gMDsgcjAgPD0gNyArIDE1OyByMCsrKSB7XG4gICAgICAgICAgICByMDFfYml0c1tyMF0gPSBRdWFudGl6ZVBWVC5MQVJHRV9CSVRTO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgcjAgPSAwOyByMCA8IDE2OyByMCsrKSB7XG4gICAgICAgICAgICB2YXIgYTEgPSBnZmMuc2NhbGVmYWNfYmFuZC5sW3IwICsgMV07XG4gICAgICAgICAgICBpZiAoYTEgPj0gYmlndilcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHZhciByMGJpdHMgPSAwO1xuICAgICAgICAgICAgdmFyIGJpID0gbmV3IEJpdHMocjBiaXRzKTtcbiAgICAgICAgICAgIHZhciByMHQgPSBjaG9vc2VfdGFibGUoaXgsIDAsIGExLCBiaSk7XG4gICAgICAgICAgICByMGJpdHMgPSBiaS5iaXRzO1xuXG4gICAgICAgICAgICBmb3IgKHZhciByMSA9IDA7IHIxIDwgODsgcjErKykge1xuICAgICAgICAgICAgICAgIHZhciBhMiA9IGdmYy5zY2FsZWZhY19iYW5kLmxbcjAgKyByMSArIDJdO1xuICAgICAgICAgICAgICAgIGlmIChhMiA+PSBiaWd2KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB2YXIgYml0cyA9IHIwYml0cztcbiAgICAgICAgICAgICAgICBiaSA9IG5ldyBCaXRzKGJpdHMpO1xuICAgICAgICAgICAgICAgIHZhciByMXQgPSBjaG9vc2VfdGFibGUoaXgsIGExLCBhMiwgYmkpO1xuICAgICAgICAgICAgICAgIGJpdHMgPSBiaS5iaXRzO1xuICAgICAgICAgICAgICAgIGlmIChyMDFfYml0c1tyMCArIHIxXSA+IGJpdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcjAxX2JpdHNbcjAgKyByMV0gPSBiaXRzO1xuICAgICAgICAgICAgICAgICAgICByMDFfZGl2W3IwICsgcjFdID0gcjA7XG4gICAgICAgICAgICAgICAgICAgIHIwX3RibFtyMCArIHIxXSA9IHIwdDtcbiAgICAgICAgICAgICAgICAgICAgcjFfdGJsW3IwICsgcjFdID0gcjF0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlY2FsY19kaXZpZGVfc3ViKGdmYywgY29kX2luZm8yLCBnaSwgaXgsIHIwMV9iaXRzLCByMDFfZGl2LCByMF90YmwsIHIxX3RibCkge1xuICAgICAgICB2YXIgYmlndiA9IGNvZF9pbmZvMi5iaWdfdmFsdWVzO1xuXG4gICAgICAgIGZvciAodmFyIHIyID0gMjsgcjIgPCBFbmNvZGVyLlNCTUFYX2wgKyAxOyByMisrKSB7XG4gICAgICAgICAgICB2YXIgYTIgPSBnZmMuc2NhbGVmYWNfYmFuZC5sW3IyXTtcbiAgICAgICAgICAgIGlmIChhMiA+PSBiaWd2KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdmFyIGJpdHMgPSByMDFfYml0c1tyMiAtIDJdICsgY29kX2luZm8yLmNvdW50MWJpdHM7XG4gICAgICAgICAgICBpZiAoZ2kucGFydDJfM19sZW5ndGggPD0gYml0cylcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgdmFyIGJpID0gbmV3IEJpdHMoYml0cyk7XG4gICAgICAgICAgICB2YXIgcjJ0ID0gY2hvb3NlX3RhYmxlKGl4LCBhMiwgYmlndiwgYmkpO1xuICAgICAgICAgICAgYml0cyA9IGJpLmJpdHM7XG4gICAgICAgICAgICBpZiAoZ2kucGFydDJfM19sZW5ndGggPD0gYml0cylcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcblxuICAgICAgICAgICAgZ2kuYXNzaWduKGNvZF9pbmZvMik7XG4gICAgICAgICAgICBnaS5wYXJ0Ml8zX2xlbmd0aCA9IGJpdHM7XG4gICAgICAgICAgICBnaS5yZWdpb24wX2NvdW50ID0gcjAxX2RpdltyMiAtIDJdO1xuICAgICAgICAgICAgZ2kucmVnaW9uMV9jb3VudCA9IHIyIC0gMiAtIHIwMV9kaXZbcjIgLSAyXTtcbiAgICAgICAgICAgIGdpLnRhYmxlX3NlbGVjdFswXSA9IHIwX3RibFtyMiAtIDJdO1xuICAgICAgICAgICAgZ2kudGFibGVfc2VsZWN0WzFdID0gcjFfdGJsW3IyIC0gMl07XG4gICAgICAgICAgICBnaS50YWJsZV9zZWxlY3RbMl0gPSByMnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmJlc3RfaHVmZm1hbl9kaXZpZGUgPSBmdW5jdGlvbiAoZ2ZjLCBnaSkge1xuICAgICAgICB2YXIgY29kX2luZm8yID0gbmV3IEdySW5mbygpO1xuICAgICAgICB2YXIgaXggPSBnaS5sM19lbmM7XG4gICAgICAgIHZhciByMDFfYml0cyA9IG5ld19pbnQoNyArIDE1ICsgMSk7XG4gICAgICAgIHZhciByMDFfZGl2ID0gbmV3X2ludCg3ICsgMTUgKyAxKTtcbiAgICAgICAgdmFyIHIwX3RibCA9IG5ld19pbnQoNyArIDE1ICsgMSk7XG4gICAgICAgIHZhciByMV90YmwgPSBuZXdfaW50KDcgKyAxNSArIDEpO1xuXG4gICAgICAgIC8qIFNIT1JUIEJMT0NLIHN0dWZmIGZhaWxzIGZvciBNUEVHMiAqL1xuICAgICAgICBpZiAoZ2kuYmxvY2tfdHlwZSA9PSBFbmNvZGVyLlNIT1JUX1RZUEUgJiYgZ2ZjLm1vZGVfZ3IgPT0gMSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb2RfaW5mbzIuYXNzaWduKGdpKTtcbiAgICAgICAgaWYgKGdpLmJsb2NrX3R5cGUgPT0gRW5jb2Rlci5OT1JNX1RZUEUpIHtcbiAgICAgICAgICAgIHJlY2FsY19kaXZpZGVfaW5pdChnZmMsIGdpLCBpeCwgcjAxX2JpdHMsIHIwMV9kaXYsIHIwX3RibCwgcjFfdGJsKTtcbiAgICAgICAgICAgIHJlY2FsY19kaXZpZGVfc3ViKGdmYywgY29kX2luZm8yLCBnaSwgaXgsIHIwMV9iaXRzLCByMDFfZGl2LFxuICAgICAgICAgICAgICAgIHIwX3RibCwgcjFfdGJsKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaSA9IGNvZF9pbmZvMi5iaWdfdmFsdWVzO1xuICAgICAgICBpZiAoaSA9PSAwIHx8IChpeFtpIC0gMl0gfCBpeFtpIC0gMV0pID4gMSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpID0gZ2kuY291bnQxICsgMjtcbiAgICAgICAgaWYgKGkgPiA1NzYpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLyogRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGJpdHMgdG8gZW5jb2RlIHRoZSBxdWFkcnVwbGVzLiAqL1xuICAgICAgICBjb2RfaW5mbzIuYXNzaWduKGdpKTtcbiAgICAgICAgY29kX2luZm8yLmNvdW50MSA9IGk7XG4gICAgICAgIHZhciBhMSA9IDA7XG4gICAgICAgIHZhciBhMiA9IDA7XG5cbiAgICAgICAgYXNzZXJ0KGkgPD0gNTc2KTtcblxuICAgICAgICBmb3IgKDsgaSA+IGNvZF9pbmZvMi5iaWdfdmFsdWVzOyBpIC09IDQpIHtcbiAgICAgICAgICAgIHZhciBwID0gKChpeFtpIC0gNF0gKiAyICsgaXhbaSAtIDNdKSAqIDIgKyBpeFtpIC0gMl0pICogMlxuICAgICAgICAgICAgICAgICsgaXhbaSAtIDFdO1xuICAgICAgICAgICAgYTEgKz0gVGFibGVzLnQzMmxbcF07XG4gICAgICAgICAgICBhMiArPSBUYWJsZXMudDMzbFtwXTtcbiAgICAgICAgfVxuICAgICAgICBjb2RfaW5mbzIuYmlnX3ZhbHVlcyA9IGk7XG5cbiAgICAgICAgY29kX2luZm8yLmNvdW50MXRhYmxlX3NlbGVjdCA9IDA7XG4gICAgICAgIGlmIChhMSA+IGEyKSB7XG4gICAgICAgICAgICBhMSA9IGEyO1xuICAgICAgICAgICAgY29kX2luZm8yLmNvdW50MXRhYmxlX3NlbGVjdCA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICBjb2RfaW5mbzIuY291bnQxYml0cyA9IGExO1xuXG4gICAgICAgIGlmIChjb2RfaW5mbzIuYmxvY2tfdHlwZSA9PSBFbmNvZGVyLk5PUk1fVFlQRSlcbiAgICAgICAgICAgIHJlY2FsY19kaXZpZGVfc3ViKGdmYywgY29kX2luZm8yLCBnaSwgaXgsIHIwMV9iaXRzLCByMDFfZGl2LFxuICAgICAgICAgICAgICAgIHIwX3RibCwgcjFfdGJsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIGNvZGUgdGhlIGJpZ3ZhbHVlcyByZWdpb24uICovXG4gICAgICAgICAgICBjb2RfaW5mbzIucGFydDJfM19sZW5ndGggPSBhMTtcbiAgICAgICAgICAgIGExID0gZ2ZjLnNjYWxlZmFjX2JhbmQubFs3ICsgMV07XG4gICAgICAgICAgICBpZiAoYTEgPiBpKSB7XG4gICAgICAgICAgICAgICAgYTEgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGExID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBiaSA9IG5ldyBCaXRzKGNvZF9pbmZvMi5wYXJ0Ml8zX2xlbmd0aCk7XG4gICAgICAgICAgICAgICAgY29kX2luZm8yLnRhYmxlX3NlbGVjdFswXSA9IGNob29zZV90YWJsZShpeCwgMCwgYTEsIGJpKTtcbiAgICAgICAgICAgICAgICBjb2RfaW5mbzIucGFydDJfM19sZW5ndGggPSBiaS5iaXRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgPiBhMSkge1xuICAgICAgICAgICAgICAgIHZhciBiaSA9IG5ldyBCaXRzKGNvZF9pbmZvMi5wYXJ0Ml8zX2xlbmd0aCk7XG4gICAgICAgICAgICAgICAgY29kX2luZm8yLnRhYmxlX3NlbGVjdFsxXSA9IGNob29zZV90YWJsZShpeCwgYTEsIGksIGJpKTtcbiAgICAgICAgICAgICAgICBjb2RfaW5mbzIucGFydDJfM19sZW5ndGggPSBiaS5iaXRzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdpLnBhcnQyXzNfbGVuZ3RoID4gY29kX2luZm8yLnBhcnQyXzNfbGVuZ3RoKVxuICAgICAgICAgICAgICAgIGdpLmFzc2lnbihjb2RfaW5mbzIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNsZW4xX24gPSBbMSwgMSwgMSwgMSwgOCwgMiwgMiwgMiwgNCwgNCwgNCwgOCwgOCwgOCwgMTYsIDE2XTtcbiAgICB2YXIgc2xlbjJfbiA9IFsxLCAyLCA0LCA4LCAxLCAyLCA0LCA4LCAyLCA0LCA4LCAyLCA0LCA4LCA0LCA4XTtcbiAgICB2YXIgc2xlbjFfdGFiID0gWzAsIDAsIDAsIDAsIDMsIDEsIDEsIDEsIDIsIDIsIDIsIDMsIDMsIDMsIDQsIDRdO1xuICAgIHZhciBzbGVuMl90YWIgPSBbMCwgMSwgMiwgMywgMCwgMSwgMiwgMywgMSwgMiwgMywgMSwgMiwgMywgMiwgM107XG4gICAgVGFrZWhpcm8uc2xlbjFfdGFiID0gc2xlbjFfdGFiO1xuICAgIFRha2VoaXJvLnNsZW4yX3RhYiA9IHNsZW4yX3RhYjtcblxuICAgIGZ1bmN0aW9uIHNjZnNpX2NhbGMoY2gsIGwzX3NpZGUpIHtcbiAgICAgICAgdmFyIHNmYjtcbiAgICAgICAgdmFyIGdpID0gbDNfc2lkZS50dFsxXVtjaF07XG4gICAgICAgIHZhciBnMCA9IGwzX3NpZGUudHRbMF1bY2hdO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgVGFibGVzLnNjZnNpX2JhbmQubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHNmYiA9IFRhYmxlcy5zY2ZzaV9iYW5kW2ldOyBzZmIgPCBUYWJsZXMuc2Nmc2lfYmFuZFtpICsgMV07IHNmYisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGcwLnNjYWxlZmFjW3NmYl0gIT0gZ2kuc2NhbGVmYWNbc2ZiXVxuICAgICAgICAgICAgICAgICAgICAmJiBnaS5zY2FsZWZhY1tzZmJdID49IDApXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNmYiA9PSBUYWJsZXMuc2Nmc2lfYmFuZFtpICsgMV0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKHNmYiA9IFRhYmxlcy5zY2ZzaV9iYW5kW2ldOyBzZmIgPCBUYWJsZXMuc2Nmc2lfYmFuZFtpICsgMV07IHNmYisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGdpLnNjYWxlZmFjW3NmYl0gPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbDNfc2lkZS5zY2ZzaVtjaF1baV0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBzMSA9IDA7XG4gICAgICAgIHZhciBjMSA9IDA7XG4gICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgMTE7IHNmYisrKSB7XG4gICAgICAgICAgICBpZiAoZ2kuc2NhbGVmYWNbc2ZiXSA9PSAtMSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGMxKys7XG4gICAgICAgICAgICBpZiAoczEgPCBnaS5zY2FsZWZhY1tzZmJdKVxuICAgICAgICAgICAgICAgIHMxID0gZ2kuc2NhbGVmYWNbc2ZiXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgczIgPSAwO1xuICAgICAgICB2YXIgYzIgPSAwO1xuICAgICAgICBmb3IgKDsgc2ZiIDwgRW5jb2Rlci5TQlBTWV9sOyBzZmIrKykge1xuICAgICAgICAgICAgaWYgKGdpLnNjYWxlZmFjW3NmYl0gPT0gLTEpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBjMisrO1xuICAgICAgICAgICAgaWYgKHMyIDwgZ2kuc2NhbGVmYWNbc2ZiXSlcbiAgICAgICAgICAgICAgICBzMiA9IGdpLnNjYWxlZmFjW3NmYl07XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgICAgICAgIGlmIChzMSA8IHNsZW4xX25baV0gJiYgczIgPCBzbGVuMl9uW2ldKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBzbGVuMV90YWJbaV0gKiBjMSArIHNsZW4yX3RhYltpXSAqIGMyO1xuICAgICAgICAgICAgICAgIGlmIChnaS5wYXJ0Ml9sZW5ndGggPiBjKSB7XG4gICAgICAgICAgICAgICAgICAgIGdpLnBhcnQyX2xlbmd0aCA9IGM7XG4gICAgICAgICAgICAgICAgICAgIGdpLnNjYWxlZmFjX2NvbXByZXNzID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSBvcHRpbWFsIHdheSB0byBzdG9yZSB0aGUgc2NhbGVmYWN0b3JzLiBPbmx5IGNhbGwgdGhpcyByb3V0aW5lXG4gICAgICogYWZ0ZXIgZmluYWwgc2NhbGVmYWN0b3JzIGhhdmUgYmVlbiBjaG9zZW4gYW5kIHRoZSBjaGFubmVsL2dyYW51bGUgd2lsbFxuICAgICAqIG5vdCBiZSByZS1lbmNvZGVkLlxuICAgICAqL1xuICAgIHRoaXMuYmVzdF9zY2FsZWZhY19zdG9yZSA9IGZ1bmN0aW9uIChnZmMsIGdyLCBjaCwgbDNfc2lkZSkge1xuICAgICAgICAvKiB1c2Ugc2NhbGVmYWNfc2NhbGUgaWYgd2UgY2FuICovXG4gICAgICAgIHZhciBnaSA9IGwzX3NpZGUudHRbZ3JdW2NoXTtcbiAgICAgICAgdmFyIHNmYiwgaSwgaiwgbDtcbiAgICAgICAgdmFyIHJlY2FsYyA9IDA7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogcmVtb3ZlIHNjYWxlZmFjcyBmcm9tIGJhbmRzIHdpdGggaXg9MC4gVGhpcyBpZGVhIGNvbWVzIGZyb20gdGhlIEFBQ1xuICAgICAgICAgKiBJU08gZG9jcy4gYWRkZWQgbXQgMy8wMFxuICAgICAgICAgKi9cbiAgICAgICAgLyogY2hlY2sgaWYgbDNfZW5jPTAgKi9cbiAgICAgICAgaiA9IDA7XG4gICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgZ2kuc2ZibWF4OyBzZmIrKykge1xuICAgICAgICAgICAgdmFyIHdpZHRoID0gZ2kud2lkdGhbc2ZiXTtcbiAgICAgICAgICAgIGFzc2VydCh3aWR0aCA+PSAwKTtcbiAgICAgICAgICAgIGogKz0gd2lkdGg7XG4gICAgICAgICAgICBmb3IgKGwgPSAtd2lkdGg7IGwgPCAwOyBsKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2kubDNfZW5jW2wgKyBqXSAhPSAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsID09IDApXG4gICAgICAgICAgICAgICAgZ2kuc2NhbGVmYWNbc2ZiXSA9IHJlY2FsYyA9IC0yO1xuICAgICAgICAgICAgLyogYW55dGhpbmcgZ29lcy4gKi9cbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBvbmx5IGJlc3Rfc2NhbGVmYWNfc3RvcmUgYW5kIGNhbGNfc2Nmc2kga25vdy0tYW5kIG9ubHkgdGhleVxuICAgICAgICAgICAgICogc2hvdWxkIGtub3ctLWFib3V0IHRoZSBtYWdpYyBudW1iZXIgLTIuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgwID09IGdpLnNjYWxlZmFjX3NjYWxlICYmIDAgPT0gZ2kucHJlZmxhZykge1xuICAgICAgICAgICAgdmFyIHMgPSAwO1xuICAgICAgICAgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBnaS5zZmJtYXg7IHNmYisrKVxuICAgICAgICAgICAgICAgIGlmIChnaS5zY2FsZWZhY1tzZmJdID4gMClcbiAgICAgICAgICAgICAgICAgICAgcyB8PSBnaS5zY2FsZWZhY1tzZmJdO1xuXG4gICAgICAgICAgICBpZiAoMCA9PSAocyAmIDEpICYmIHMgIT0gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgZ2kuc2ZibWF4OyBzZmIrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdpLnNjYWxlZmFjW3NmYl0gPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2kuc2NhbGVmYWNbc2ZiXSA+Pj0gMTtcblxuICAgICAgICAgICAgICAgIGdpLnNjYWxlZmFjX3NjYWxlID0gcmVjYWxjID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgwID09IGdpLnByZWZsYWcgJiYgZ2kuYmxvY2tfdHlwZSAhPSBFbmNvZGVyLlNIT1JUX1RZUEVcbiAgICAgICAgICAgICYmIGdmYy5tb2RlX2dyID09IDIpIHtcbiAgICAgICAgICAgIGZvciAoc2ZiID0gMTE7IHNmYiA8IEVuY29kZXIuU0JQU1lfbDsgc2ZiKyspXG4gICAgICAgICAgICAgICAgaWYgKGdpLnNjYWxlZmFjW3NmYl0gPCBxdXB2dC5wcmV0YWJbc2ZiXVxuICAgICAgICAgICAgICAgICAgICAmJiBnaS5zY2FsZWZhY1tzZmJdICE9IC0yKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChzZmIgPT0gRW5jb2Rlci5TQlBTWV9sKSB7XG4gICAgICAgICAgICAgICAgZm9yIChzZmIgPSAxMTsgc2ZiIDwgRW5jb2Rlci5TQlBTWV9sOyBzZmIrKylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdpLnNjYWxlZmFjW3NmYl0gPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgZ2kuc2NhbGVmYWNbc2ZiXSAtPSBxdXB2dC5wcmV0YWJbc2ZiXTtcblxuICAgICAgICAgICAgICAgIGdpLnByZWZsYWcgPSByZWNhbGMgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKylcbiAgICAgICAgICAgIGwzX3NpZGUuc2Nmc2lbY2hdW2ldID0gMDtcblxuICAgICAgICBpZiAoZ2ZjLm1vZGVfZ3IgPT0gMiAmJiBnciA9PSAxXG4gICAgICAgICAgICAmJiBsM19zaWRlLnR0WzBdW2NoXS5ibG9ja190eXBlICE9IEVuY29kZXIuU0hPUlRfVFlQRVxuICAgICAgICAgICAgJiYgbDNfc2lkZS50dFsxXVtjaF0uYmxvY2tfdHlwZSAhPSBFbmNvZGVyLlNIT1JUX1RZUEUpIHtcbiAgICAgICAgICAgIHNjZnNpX2NhbGMoY2gsIGwzX3NpZGUpO1xuICAgICAgICAgICAgcmVjYWxjID0gMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IGdpLnNmYm1heDsgc2ZiKyspIHtcbiAgICAgICAgICAgIGlmIChnaS5zY2FsZWZhY1tzZmJdID09IC0yKSB7XG4gICAgICAgICAgICAgICAgZ2kuc2NhbGVmYWNbc2ZiXSA9IDA7XG4gICAgICAgICAgICAgICAgLyogaWYgYW55dGhpbmcgZ29lcywgdGhlbiAwIGlzIGEgZ29vZCBjaG9pY2UgKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmVjYWxjICE9IDApIHtcbiAgICAgICAgICAgIGlmIChnZmMubW9kZV9nciA9PSAyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2FsZV9iaXRjb3VudChnaSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2NhbGVfYml0Y291bnRfbHNmKGdmYywgZ2kpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWxsX3NjYWxlZmFjdG9yc19ub3RfbmVnYXRpdmUoc2NhbGVmYWMsIG4pIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChzY2FsZWZhY1tpXSA8IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gZW5jb2RlIHNjYWxlZmFjcy5cbiAgICAgKlxuICAgICAqIDE4KnNsZW4xX3RhYltpXSArIDE4KnNsZW4yX3RhYltpXVxuICAgICAqL1xuICAgIHZhciBzY2FsZV9zaG9ydCA9IFswLCAxOCwgMzYsIDU0LCA1NCwgMzYsIDU0LCA3MixcbiAgICAgICAgNTQsIDcyLCA5MCwgNzIsIDkwLCAxMDgsIDEwOCwgMTI2XTtcblxuICAgIC8qKlxuICAgICAqIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gZW5jb2RlIHNjYWxlZmFjcy5cbiAgICAgKlxuICAgICAqIDE3KnNsZW4xX3RhYltpXSArIDE4KnNsZW4yX3RhYltpXVxuICAgICAqL1xuICAgIHZhciBzY2FsZV9taXhlZCA9IFswLCAxOCwgMzYsIDU0LCA1MSwgMzUsIDUzLCA3MSxcbiAgICAgICAgNTIsIDcwLCA4OCwgNjksIDg3LCAxMDUsIDEwNCwgMTIyXTtcblxuICAgIC8qKlxuICAgICAqIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gZW5jb2RlIHNjYWxlZmFjcy5cbiAgICAgKlxuICAgICAqIDExKnNsZW4xX3RhYltpXSArIDEwKnNsZW4yX3RhYltpXVxuICAgICAqL1xuICAgIHZhciBzY2FsZV9sb25nID0gWzAsIDEwLCAyMCwgMzAsIDMzLCAyMSwgMzEsIDQxLCAzMiwgNDIsXG4gICAgICAgIDUyLCA0MywgNTMsIDYzLCA2NCwgNzRdO1xuXG4gICAgLyoqXG4gICAgICogQWxzbyBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gY29kZSB0aGUgc2NhbGVmYWN0b3JzLlxuICAgICAqL1xuICAgIHRoaXMuc2NhbGVfYml0Y291bnQgPSBmdW5jdGlvbiAoY29kX2luZm8pIHtcbiAgICAgICAgdmFyIGssIHNmYiwgbWF4X3NsZW4xID0gMCwgbWF4X3NsZW4yID0gMDtcblxuICAgICAgICAvKiBtYXhpbXVtIHZhbHVlcyAqL1xuICAgICAgICB2YXIgdGFiO1xuICAgICAgICB2YXIgc2NhbGVmYWMgPSBjb2RfaW5mby5zY2FsZWZhYztcblxuICAgICAgICBhc3NlcnQoYWxsX3NjYWxlZmFjdG9yc19ub3RfbmVnYXRpdmUoc2NhbGVmYWMsIGNvZF9pbmZvLnNmYm1heCkpO1xuXG4gICAgICAgIGlmIChjb2RfaW5mby5ibG9ja190eXBlID09IEVuY29kZXIuU0hPUlRfVFlQRSkge1xuICAgICAgICAgICAgdGFiID0gc2NhbGVfc2hvcnQ7XG4gICAgICAgICAgICBpZiAoY29kX2luZm8ubWl4ZWRfYmxvY2tfZmxhZyAhPSAwKVxuICAgICAgICAgICAgICAgIHRhYiA9IHNjYWxlX21peGVkO1xuICAgICAgICB9IGVsc2UgeyAvKiBibG9ja190eXBlID09IDEsMixvciAzICovXG4gICAgICAgICAgICB0YWIgPSBzY2FsZV9sb25nO1xuICAgICAgICAgICAgaWYgKDAgPT0gY29kX2luZm8ucHJlZmxhZykge1xuICAgICAgICAgICAgICAgIGZvciAoc2ZiID0gMTE7IHNmYiA8IEVuY29kZXIuU0JQU1lfbDsgc2ZiKyspXG4gICAgICAgICAgICAgICAgICAgIGlmIChzY2FsZWZhY1tzZmJdIDwgcXVwdnQucHJldGFiW3NmYl0pXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGlmIChzZmIgPT0gRW5jb2Rlci5TQlBTWV9sKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvZF9pbmZvLnByZWZsYWcgPSAxO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHNmYiA9IDExOyBzZmIgPCBFbmNvZGVyLlNCUFNZX2w7IHNmYisrKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVmYWNbc2ZiXSAtPSBxdXB2dC5wcmV0YWJbc2ZiXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IGNvZF9pbmZvLnNmYmRpdmlkZTsgc2ZiKyspXG4gICAgICAgICAgICBpZiAobWF4X3NsZW4xIDwgc2NhbGVmYWNbc2ZiXSlcbiAgICAgICAgICAgICAgICBtYXhfc2xlbjEgPSBzY2FsZWZhY1tzZmJdO1xuXG4gICAgICAgIGZvciAoOyBzZmIgPCBjb2RfaW5mby5zZmJtYXg7IHNmYisrKVxuICAgICAgICAgICAgaWYgKG1heF9zbGVuMiA8IHNjYWxlZmFjW3NmYl0pXG4gICAgICAgICAgICAgICAgbWF4X3NsZW4yID0gc2NhbGVmYWNbc2ZiXTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBmcm9tIFRha2VoaXJvIFRPTUlOQUdBIDx0b21pbmFnYUBpc290ZXJuZXQub3JnPiAxMC85OSBsb29wIG92ZXIgKmFsbCpcbiAgICAgICAgICogcG9zaWJsZSB2YWx1ZXMgb2Ygc2NhbGVmYWNfY29tcHJlc3MgdG8gZmluZCB0aGUgb25lIHdoaWNoIHVzZXMgdGhlXG4gICAgICAgICAqIHNtYWxsZXN0IG51bWJlciBvZiBiaXRzLiBJU08gd291bGQgc3RvcCBhdCBmaXJzdCB2YWxpZCBpbmRleFxuICAgICAgICAgKi9cbiAgICAgICAgY29kX2luZm8ucGFydDJfbGVuZ3RoID0gUXVhbnRpemVQVlQuTEFSR0VfQklUUztcbiAgICAgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspIHtcbiAgICAgICAgICAgIGlmIChtYXhfc2xlbjEgPCBzbGVuMV9uW2tdICYmIG1heF9zbGVuMiA8IHNsZW4yX25ba11cbiAgICAgICAgICAgICAgICAmJiBjb2RfaW5mby5wYXJ0Ml9sZW5ndGggPiB0YWJba10pIHtcbiAgICAgICAgICAgICAgICBjb2RfaW5mby5wYXJ0Ml9sZW5ndGggPSB0YWJba107XG4gICAgICAgICAgICAgICAgY29kX2luZm8uc2NhbGVmYWNfY29tcHJlc3MgPSBrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2RfaW5mby5wYXJ0Ml9sZW5ndGggPT0gUXVhbnRpemVQVlQuTEFSR0VfQklUUztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0YWJsZSBvZiBsYXJnZXN0IHNjYWxlZmFjdG9yIHZhbHVlcyBmb3IgTVBFRzJcbiAgICAgKi9cbiAgICB2YXIgbWF4X3JhbmdlX3NmYWNfdGFiID0gW1sxNSwgMTUsIDcsIDddLFxuICAgICAgICBbMTUsIDE1LCA3LCAwXSwgWzcsIDMsIDAsIDBdLCBbMTUsIDMxLCAzMSwgMF0sXG4gICAgICAgIFs3LCA3LCA3LCAwXSwgWzMsIDMsIDAsIDBdXTtcblxuICAgIC8qKlxuICAgICAqIEFsc28gY291bnRzIHRoZSBudW1iZXIgb2YgYml0cyB0byBlbmNvZGUgdGhlIHNjYWxlZmFjcyBidXQgZm9yIE1QRUcgMlxuICAgICAqIExvd2VyIHNhbXBsaW5nIGZyZXF1ZW5jaWVzICgyNCwgMjIuMDUgYW5kIDE2IGtIei4pXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHJldmVyc2UtZW5naW5lZXJlZCBmcm9tIHNlY3Rpb24gMi40LjMuMiBvZiB0aGUgTVBFRzIgSVMsXG4gICAgICogXCJBdWRpbyBEZWNvZGluZyBMYXllciBJSUlcIlxuICAgICAqL1xuICAgIHRoaXMuc2NhbGVfYml0Y291bnRfbHNmID0gZnVuY3Rpb24gKGdmYywgY29kX2luZm8pIHtcbiAgICAgICAgdmFyIHRhYmxlX251bWJlciwgcm93X2luX3RhYmxlLCBwYXJ0aXRpb24sIG5yX3NmYiwgd2luZG93O1xuICAgICAgICB2YXIgb3ZlcjtcbiAgICAgICAgdmFyIGksIHNmYjtcbiAgICAgICAgdmFyIG1heF9zZmFjID0gbmV3X2ludCg0KTtcbi8vdmFyIHBhcnRpdGlvbl90YWJsZTtcbiAgICAgICAgdmFyIHNjYWxlZmFjID0gY29kX2luZm8uc2NhbGVmYWM7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogU2V0IHBhcnRpdGlvbiB0YWJsZS4gTm90ZSB0aGF0IHNob3VsZCB0cnkgdG8gdXNlIHRhYmxlIG9uZSwgYnV0IGRvXG4gICAgICAgICAqIG5vdCB5ZXQuLi5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChjb2RfaW5mby5wcmVmbGFnICE9IDApXG4gICAgICAgICAgICB0YWJsZV9udW1iZXIgPSAyO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0YWJsZV9udW1iZXIgPSAwO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspXG4gICAgICAgICAgICBtYXhfc2ZhY1tpXSA9IDA7XG5cbiAgICAgICAgaWYgKGNvZF9pbmZvLmJsb2NrX3R5cGUgPT0gRW5jb2Rlci5TSE9SVF9UWVBFKSB7XG4gICAgICAgICAgICByb3dfaW5fdGFibGUgPSAxO1xuICAgICAgICAgICAgdmFyIHBhcnRpdGlvbl90YWJsZSA9IHF1cHZ0Lm5yX29mX3NmYl9ibG9ja1t0YWJsZV9udW1iZXJdW3Jvd19pbl90YWJsZV07XG4gICAgICAgICAgICBmb3IgKHNmYiA9IDAsIHBhcnRpdGlvbiA9IDA7IHBhcnRpdGlvbiA8IDQ7IHBhcnRpdGlvbisrKSB7XG4gICAgICAgICAgICAgICAgbnJfc2ZiID0gcGFydGl0aW9uX3RhYmxlW3BhcnRpdGlvbl0gLyAzO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucl9zZmI7IGkrKywgc2ZiKyspXG4gICAgICAgICAgICAgICAgICAgIGZvciAod2luZG93ID0gMDsgd2luZG93IDwgMzsgd2luZG93KyspXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbGVmYWNbc2ZiICogMyArIHdpbmRvd10gPiBtYXhfc2ZhY1twYXJ0aXRpb25dKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zZmFjW3BhcnRpdGlvbl0gPSBzY2FsZWZhY1tzZmIgKiAzICsgd2luZG93XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd19pbl90YWJsZSA9IDA7XG4gICAgICAgICAgICB2YXIgcGFydGl0aW9uX3RhYmxlID0gcXVwdnQubnJfb2Zfc2ZiX2Jsb2NrW3RhYmxlX251bWJlcl1bcm93X2luX3RhYmxlXTtcbiAgICAgICAgICAgIGZvciAoc2ZiID0gMCwgcGFydGl0aW9uID0gMDsgcGFydGl0aW9uIDwgNDsgcGFydGl0aW9uKyspIHtcbiAgICAgICAgICAgICAgICBucl9zZmIgPSBwYXJ0aXRpb25fdGFibGVbcGFydGl0aW9uXTtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnJfc2ZiOyBpKyssIHNmYisrKVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2NhbGVmYWNbc2ZiXSA+IG1heF9zZmFjW3BhcnRpdGlvbl0pXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhfc2ZhY1twYXJ0aXRpb25dID0gc2NhbGVmYWNbc2ZiXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAob3ZlciA9IGZhbHNlLCBwYXJ0aXRpb24gPSAwOyBwYXJ0aXRpb24gPCA0OyBwYXJ0aXRpb24rKykge1xuICAgICAgICAgICAgaWYgKG1heF9zZmFjW3BhcnRpdGlvbl0gPiBtYXhfcmFuZ2Vfc2ZhY190YWJbdGFibGVfbnVtYmVyXVtwYXJ0aXRpb25dKVxuICAgICAgICAgICAgICAgIG92ZXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3Zlcikge1xuICAgICAgICAgICAgdmFyIHNsZW4xLCBzbGVuMiwgc2xlbjMsIHNsZW40O1xuXG4gICAgICAgICAgICBjb2RfaW5mby5zZmJfcGFydGl0aW9uX3RhYmxlID0gcXVwdnQubnJfb2Zfc2ZiX2Jsb2NrW3RhYmxlX251bWJlcl1bcm93X2luX3RhYmxlXTtcbiAgICAgICAgICAgIGZvciAocGFydGl0aW9uID0gMDsgcGFydGl0aW9uIDwgNDsgcGFydGl0aW9uKyspXG4gICAgICAgICAgICAgICAgY29kX2luZm8uc2xlbltwYXJ0aXRpb25dID0gbG9nMnRhYlttYXhfc2ZhY1twYXJ0aXRpb25dXTtcblxuICAgICAgICAgICAgLyogc2V0IHNjYWxlZmFjX2NvbXByZXNzICovXG4gICAgICAgICAgICBzbGVuMSA9IGNvZF9pbmZvLnNsZW5bMF07XG4gICAgICAgICAgICBzbGVuMiA9IGNvZF9pbmZvLnNsZW5bMV07XG4gICAgICAgICAgICBzbGVuMyA9IGNvZF9pbmZvLnNsZW5bMl07XG4gICAgICAgICAgICBzbGVuNCA9IGNvZF9pbmZvLnNsZW5bM107XG5cbiAgICAgICAgICAgIHN3aXRjaCAodGFibGVfbnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBjb2RfaW5mby5zY2FsZWZhY19jb21wcmVzcyA9ICgoKHNsZW4xICogNSkgKyBzbGVuMikgPDwgNClcbiAgICAgICAgICAgICAgICAgICAgICAgICsgKHNsZW4zIDw8IDIpICsgc2xlbjQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBjb2RfaW5mby5zY2FsZWZhY19jb21wcmVzcyA9IDQwMCArICgoKHNsZW4xICogNSkgKyBzbGVuMikgPDwgMilcbiAgICAgICAgICAgICAgICAgICAgICAgICsgc2xlbjM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBjb2RfaW5mby5zY2FsZWZhY19jb21wcmVzcyA9IDUwMCArIChzbGVuMSAqIDMpICsgc2xlbjI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGYoXCJpbnRlbnNpdHkgc3RlcmVvIG5vdCBpbXBsZW1lbnRlZCB5ZXRcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghb3Zlcikge1xuICAgICAgICAgICAgYXNzZXJ0KGNvZF9pbmZvLnNmYl9wYXJ0aXRpb25fdGFibGUgIT0gbnVsbCk7XG4gICAgICAgICAgICBjb2RfaW5mby5wYXJ0Ml9sZW5ndGggPSAwO1xuICAgICAgICAgICAgZm9yIChwYXJ0aXRpb24gPSAwOyBwYXJ0aXRpb24gPCA0OyBwYXJ0aXRpb24rKylcbiAgICAgICAgICAgICAgICBjb2RfaW5mby5wYXJ0Ml9sZW5ndGggKz0gY29kX2luZm8uc2xlbltwYXJ0aXRpb25dXG4gICAgICAgICAgICAgICAgICAgICogY29kX2luZm8uc2ZiX3BhcnRpdGlvbl90YWJsZVtwYXJ0aXRpb25dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdmVyO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogU2luY2Ugbm8gYmFuZHMgaGF2ZSBiZWVuIG92ZXItYW1wbGlmaWVkLCB3ZSBjYW4gc2V0IHNjYWxlZmFjX2NvbXByZXNzIGFuZFxuICAgICAqIHNsZW5bXSBmb3IgdGhlIGZvcm1hdHRlclxuICAgICAqL1xuICAgIHZhciBsb2cydGFiID0gWzAsIDEsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsXG4gICAgICAgIDQsIDQsIDQsIDRdO1xuXG4gICAgdGhpcy5odWZmbWFuX2luaXQgPSBmdW5jdGlvbiAoZ2ZjKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAyOyBpIDw9IDU3NjsgaSArPSAyKSB7XG4gICAgICAgICAgICB2YXIgc2NmYl9hbnogPSAwLCBidl9pbmRleDtcbiAgICAgICAgICAgIHdoaWxlIChnZmMuc2NhbGVmYWNfYmFuZC5sWysrc2NmYl9hbnpdIDwgaSlcbiAgICAgICAgICAgICAgICA7XG5cbiAgICAgICAgICAgIGJ2X2luZGV4ID0gc3ViZHZfdGFibGVbc2NmYl9hbnpdWzBdOyAvLyAucmVnaW9uMF9jb3VudFxuICAgICAgICAgICAgd2hpbGUgKGdmYy5zY2FsZWZhY19iYW5kLmxbYnZfaW5kZXggKyAxXSA+IGkpXG4gICAgICAgICAgICAgICAgYnZfaW5kZXgtLTtcblxuICAgICAgICAgICAgaWYgKGJ2X2luZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICogdGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRoYXQgZXZlcnl0aGluZyBpcyBnb2luZyB0byBiZSBlbmNvZGVkXG4gICAgICAgICAgICAgICAgICogYXMgcmVnaW9uMDogYmlndmFsdWVzIDwgcmVnaW9uMCA8IHJlZ2lvbjEgc28gbGV0cyBzZXRcbiAgICAgICAgICAgICAgICAgKiByZWdpb24wLCByZWdpb24xIHRvIHNvbWUgdmFsdWUgbGFyZ2VyIHRoYW4gYmlndmFsdWVzXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgYnZfaW5kZXggPSBzdWJkdl90YWJsZVtzY2ZiX2Fuel1bMF07IC8vIC5yZWdpb24wX2NvdW50XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdmYy5idl9zY2ZbaSAtIDJdID0gYnZfaW5kZXg7XG5cbiAgICAgICAgICAgIGJ2X2luZGV4ID0gc3ViZHZfdGFibGVbc2NmYl9hbnpdWzFdOyAvLyAucmVnaW9uMV9jb3VudFxuICAgICAgICAgICAgd2hpbGUgKGdmYy5zY2FsZWZhY19iYW5kLmxbYnZfaW5kZXggKyBnZmMuYnZfc2NmW2kgLSAyXSArIDJdID4gaSlcbiAgICAgICAgICAgICAgICBidl9pbmRleC0tO1xuXG4gICAgICAgICAgICBpZiAoYnZfaW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgYnZfaW5kZXggPSBzdWJkdl90YWJsZVtzY2ZiX2Fuel1bMV07IC8vIC5yZWdpb24xX2NvdW50XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdmYy5idl9zY2ZbaSAtIDFdID0gYnZfaW5kZXg7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gVGFrZWhpcm87XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9sYW1lanMvc3JjL2pzL1Rha2VoaXJvLmpzXG4vLyBtb2R1bGUgaWQgPSAxZ0FJXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1gAI\n')},"1kS7":function(module,exports){eval("exports.f = Object.getOwnPropertySymbols;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMWtTNy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanM/ZDY0NCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BzLmpzXG4vLyBtb2R1bGUgaWQgPSAxa1M3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1kS7\n")},"1oZe":function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nexports.default = function (ref) {\n return {\n methods: {\n focus: function focus() {\n this.$refs[ref].focus();\n }\n }\n };\n};\n\n;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMW9aZS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lbGVtZW50LXVpL2xpYi9taXhpbnMvZm9jdXMuanM/ZDY4NiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHJlZikge1xuICByZXR1cm4ge1xuICAgIG1ldGhvZHM6IHtcbiAgICAgIGZvY3VzOiBmdW5jdGlvbiBmb2N1cygpIHtcbiAgICAgICAgdGhpcy4kcmVmc1tyZWZdLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcblxuO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2VsZW1lbnQtdWkvbGliL21peGlucy9mb2N1cy5qc1xuLy8gbW9kdWxlIGlkID0gMW9aZVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1oZe\n")},"1xnL":function(module,exports,__webpack_require__){eval('//package mp3;\n\nvar III_psy_xmin = __webpack_require__("QG6P");\n\nfunction III_psy_ratio() {\n\tthis.thm = new III_psy_xmin();\n\tthis.en = new III_psy_xmin();\n}\n\nmodule.exports = III_psy_ratio;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMXhuTC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9sYW1lanMvc3JjL2pzL0lJSV9wc3lfcmF0aW8uanM/ZDcxOSJdLCJzb3VyY2VzQ29udGVudCI6WyIvL3BhY2thZ2UgbXAzO1xuXG52YXIgSUlJX3BzeV94bWluID0gcmVxdWlyZSgnLi9JSUlfcHN5X3htaW4uanMnKTtcblxuZnVuY3Rpb24gSUlJX3BzeV9yYXRpbygpIHtcblx0dGhpcy50aG0gPSBuZXcgSUlJX3BzeV94bWluKCk7XG5cdHRoaXMuZW4gPSBuZXcgSUlJX3BzeV94bWluKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gSUlJX3BzeV9yYXRpbztcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2xhbWVqcy9zcmMvanMvSUlJX3BzeV9yYXRpby5qc1xuLy8gbW9kdWxlIGlkID0gMXhuTFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1xnL\n')},"21It":function(module,exports,__webpack_require__){"use strict";eval("\n\nvar createError = __webpack_require__(\"FtD3\");\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjFJdC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9zZXR0bGUuanM/ZGI1MiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4vY3JlYXRlRXJyb3InKTtcblxuLyoqXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlc29sdmUgQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxuICogQHBhcmFtIHtvYmplY3R9IHJlc3BvbnNlIFRoZSByZXNwb25zZS5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICB2YXIgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIGlmICghcmVzcG9uc2Uuc3RhdHVzIHx8ICF2YWxpZGF0ZVN0YXR1cyB8fCB2YWxpZGF0ZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVqZWN0KGNyZWF0ZUVycm9yKFxuICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHJlc3BvbnNlLmNvbmZpZyxcbiAgICAgIG51bGwsXG4gICAgICByZXNwb25zZS5yZXF1ZXN0LFxuICAgICAgcmVzcG9uc2VcbiAgICApKTtcbiAgfVxufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3NldHRsZS5qc1xuLy8gbW9kdWxlIGlkID0gMjFJdFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///21It\n")},"2KxR":function(module,exports){eval("module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMkt4Ui5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4taW5zdGFuY2UuanM/ZDhhYyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hbi1pbnN0YW5jZS5qc1xuLy8gbW9kdWxlIGlkID0gMkt4UlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2KxR\n")},"2kvA":function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\nexports.isInContainer = exports.getScrollContainer = exports.isScroll = exports.getStyle = exports.once = exports.off = exports.on = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; /* istanbul ignore next */\n\nexports.hasClass = hasClass;\nexports.addClass = addClass;\nexports.removeClass = removeClass;\nexports.setStyle = setStyle;\n\nvar _vue = __webpack_require__(\"7+uW\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isServer = _vue2.default.prototype.$isServer;\nvar SPECIAL_CHARS_REGEXP = /([\\:\\-\\_]+(.))/g;\nvar MOZ_HACK_REGEXP = /^moz([A-Z])/;\nvar ieVersion = isServer ? 0 : Number(document.documentMode);\n\n/* istanbul ignore next */\nvar trim = function trim(string) {\n return (string || '').replace(/^[\\s\\uFEFF]+|[\\s\\uFEFF]+$/g, '');\n};\n/* istanbul ignore next */\nvar camelCase = function camelCase(name) {\n return name.replace(SPECIAL_CHARS_REGEXP, function (_, separator, letter, offset) {\n return offset ? letter.toUpperCase() : letter;\n }).replace(MOZ_HACK_REGEXP, 'Moz$1');\n};\n\n/* istanbul ignore next */\nvar on = exports.on = function () {\n if (!isServer && document.addEventListener) {\n return function (element, event, handler) {\n if (element && event && handler) {\n element.addEventListener(event, handler, false);\n }\n };\n } else {\n return function (element, event, handler) {\n if (element && event && handler) {\n element.attachEvent('on' + event, handler);\n }\n };\n }\n}();\n\n/* istanbul ignore next */\nvar off = exports.off = function () {\n if (!isServer && document.removeEventListener) {\n return function (element, event, handler) {\n if (element && event) {\n element.removeEventListener(event, handler, false);\n }\n };\n } else {\n return function (element, event, handler) {\n if (element && event) {\n element.detachEvent('on' + event, handler);\n }\n };\n }\n}();\n\n/* istanbul ignore next */\nvar once = exports.once = function once(el, event, fn) {\n var listener = function listener() {\n if (fn) {\n fn.apply(this, arguments);\n }\n off(el, event, listener);\n };\n on(el, event, listener);\n};\n\n/* istanbul ignore next */\nfunction hasClass(el, cls) {\n if (!el || !cls) return false;\n if (cls.indexOf(' ') !== -1) throw new Error('className should not contain space.');\n if (el.classList) {\n return el.classList.contains(cls);\n } else {\n return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1;\n }\n};\n\n/* istanbul ignore next */\nfunction addClass(el, cls) {\n if (!el) return;\n var curClass = el.className;\n var classes = (cls || '').split(' ');\n\n for (var i = 0, j = classes.length; i < j; i++) {\n var clsName = classes[i];\n if (!clsName) continue;\n\n if (el.classList) {\n el.classList.add(clsName);\n } else if (!hasClass(el, clsName)) {\n curClass += ' ' + clsName;\n }\n }\n if (!el.classList) {\n el.setAttribute('class', curClass);\n }\n};\n\n/* istanbul ignore next */\nfunction removeClass(el, cls) {\n if (!el || !cls) return;\n var classes = cls.split(' ');\n var curClass = ' ' + el.className + ' ';\n\n for (var i = 0, j = classes.length; i < j; i++) {\n var clsName = classes[i];\n if (!clsName) continue;\n\n if (el.classList) {\n el.classList.remove(clsName);\n } else if (hasClass(el, clsName)) {\n curClass = curClass.replace(' ' + clsName + ' ', ' ');\n }\n }\n if (!el.classList) {\n el.setAttribute('class', trim(curClass));\n }\n};\n\n/* istanbul ignore next */\nvar getStyle = exports.getStyle = ieVersion < 9 ? function (element, styleName) {\n if (isServer) return;\n if (!element || !styleName) return null;\n styleName = camelCase(styleName);\n if (styleName === 'float') {\n styleName = 'styleFloat';\n }\n try {\n switch (styleName) {\n case 'opacity':\n try {\n return element.filters.item('alpha').opacity / 100;\n } catch (e) {\n return 1.0;\n }\n default:\n return element.style[styleName] || element.currentStyle ? element.currentStyle[styleName] : null;\n }\n } catch (e) {\n return element.style[styleName];\n }\n} : function (element, styleName) {\n if (isServer) return;\n if (!element || !styleName) return null;\n styleName = camelCase(styleName);\n if (styleName === 'float') {\n styleName = 'cssFloat';\n }\n try {\n var computed = document.defaultView.getComputedStyle(element, '');\n return element.style[styleName] || computed ? computed[styleName] : null;\n } catch (e) {\n return element.style[styleName];\n }\n};\n\n/* istanbul ignore next */\nfunction setStyle(element, styleName, value) {\n if (!element || !styleName) return;\n\n if ((typeof styleName === 'undefined' ? 'undefined' : _typeof(styleName)) === 'object') {\n for (var prop in styleName) {\n if (styleName.hasOwnProperty(prop)) {\n setStyle(element, prop, styleName[prop]);\n }\n }\n } else {\n styleName = camelCase(styleName);\n if (styleName === 'opacity' && ieVersion < 9) {\n element.style.filter = isNaN(value) ? '' : 'alpha(opacity=' + value * 100 + ')';\n } else {\n element.style[styleName] = value;\n }\n }\n};\n\nvar isScroll = exports.isScroll = function isScroll(el, vertical) {\n if (isServer) return;\n\n var determinedDirection = vertical !== null && vertical !== undefined;\n var overflow = determinedDirection ? vertical ? getStyle(el, 'overflow-y') : getStyle(el, 'overflow-x') : getStyle(el, 'overflow');\n\n return overflow.match(/(scroll|auto|overlay)/);\n};\n\nvar getScrollContainer = exports.getScrollContainer = function getScrollContainer(el, vertical) {\n if (isServer) return;\n\n var parent = el;\n while (parent) {\n if ([window, document, document.documentElement].includes(parent)) {\n return window;\n }\n if (isScroll(parent, vertical)) {\n return parent;\n }\n parent = parent.parentNode;\n }\n\n return parent;\n};\n\nvar isInContainer = exports.isInContainer = function isInContainer(el, container) {\n if (isServer || !el || !container) return false;\n\n var elRect = el.getBoundingClientRect();\n var containerRect = void 0;\n\n if ([window, document, document.documentElement, null, undefined].includes(container)) {\n containerRect = {\n top: 0,\n right: window.innerWidth,\n bottom: window.innerHeight,\n left: 0\n };\n } else {\n containerRect = container.getBoundingClientRect();\n }\n\n return elRect.top < containerRect.bottom && elRect.bottom > containerRect.top && elRect.right > containerRect.left && elRect.left < containerRect.right;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMmt2QS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lbGVtZW50LXVpL2xpYi91dGlscy9kb20uanM/ZGE0YiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmlzSW5Db250YWluZXIgPSBleHBvcnRzLmdldFNjcm9sbENvbnRhaW5lciA9IGV4cG9ydHMuaXNTY3JvbGwgPSBleHBvcnRzLmdldFN0eWxlID0gZXhwb3J0cy5vbmNlID0gZXhwb3J0cy5vZmYgPSBleHBvcnRzLm9uID0gdW5kZWZpbmVkO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbmV4cG9ydHMuaGFzQ2xhc3MgPSBoYXNDbGFzcztcbmV4cG9ydHMuYWRkQ2xhc3MgPSBhZGRDbGFzcztcbmV4cG9ydHMucmVtb3ZlQ2xhc3MgPSByZW1vdmVDbGFzcztcbmV4cG9ydHMuc2V0U3R5bGUgPSBzZXRTdHlsZTtcblxudmFyIF92dWUgPSByZXF1aXJlKCd2dWUnKTtcblxudmFyIF92dWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdnVlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIGlzU2VydmVyID0gX3Z1ZTIuZGVmYXVsdC5wcm90b3R5cGUuJGlzU2VydmVyO1xudmFyIFNQRUNJQUxfQ0hBUlNfUkVHRVhQID0gLyhbXFw6XFwtXFxfXSsoLikpL2c7XG52YXIgTU9aX0hBQ0tfUkVHRVhQID0gL15tb3ooW0EtWl0pLztcbnZhciBpZVZlcnNpb24gPSBpc1NlcnZlciA/IDAgOiBOdW1iZXIoZG9jdW1lbnQuZG9jdW1lbnRNb2RlKTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnZhciB0cmltID0gZnVuY3Rpb24gdHJpbShzdHJpbmcpIHtcbiAgcmV0dXJuIChzdHJpbmcgfHwgJycpLnJlcGxhY2UoL15bXFxzXFx1RkVGRl0rfFtcXHNcXHVGRUZGXSskL2csICcnKTtcbn07XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIGNhbWVsQ2FzZSA9IGZ1bmN0aW9uIGNhbWVsQ2FzZShuYW1lKSB7XG4gIHJldHVybiBuYW1lLnJlcGxhY2UoU1BFQ0lBTF9DSEFSU19SRUdFWFAsIGZ1bmN0aW9uIChfLCBzZXBhcmF0b3IsIGxldHRlciwgb2Zmc2V0KSB7XG4gICAgcmV0dXJuIG9mZnNldCA/IGxldHRlci50b1VwcGVyQ2FzZSgpIDogbGV0dGVyO1xuICB9KS5yZXBsYWNlKE1PWl9IQUNLX1JFR0VYUCwgJ01veiQxJyk7XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIG9uID0gZXhwb3J0cy5vbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCFpc1NlcnZlciAmJiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbGVtZW50LCBldmVudCwgaGFuZGxlcikge1xuICAgICAgaWYgKGVsZW1lbnQgJiYgZXZlbnQgJiYgaGFuZGxlcikge1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIpIHtcbiAgICAgIGlmIChlbGVtZW50ICYmIGV2ZW50ICYmIGhhbmRsZXIpIHtcbiAgICAgICAgZWxlbWVudC5hdHRhY2hFdmVudCgnb24nICsgZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn0oKTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnZhciBvZmYgPSBleHBvcnRzLm9mZiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCFpc1NlcnZlciAmJiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbGVtZW50LCBldmVudCwgaGFuZGxlcikge1xuICAgICAgaWYgKGVsZW1lbnQgJiYgZXZlbnQpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyKSB7XG4gICAgICBpZiAoZWxlbWVudCAmJiBldmVudCkge1xuICAgICAgICBlbGVtZW50LmRldGFjaEV2ZW50KCdvbicgKyBldmVudCwgaGFuZGxlcik7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufSgpO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xudmFyIG9uY2UgPSBleHBvcnRzLm9uY2UgPSBmdW5jdGlvbiBvbmNlKGVsLCBldmVudCwgZm4pIHtcbiAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gbGlzdGVuZXIoKSB7XG4gICAgaWYgKGZuKSB7XG4gICAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgICBvZmYoZWwsIGV2ZW50LCBsaXN0ZW5lcik7XG4gIH07XG4gIG9uKGVsLCBldmVudCwgbGlzdGVuZXIpO1xufTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGhhc0NsYXNzKGVsLCBjbHMpIHtcbiAgaWYgKCFlbCB8fCAhY2xzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChjbHMuaW5kZXhPZignICcpICE9PSAtMSkgdGhyb3cgbmV3IEVycm9yKCdjbGFzc05hbWUgc2hvdWxkIG5vdCBjb250YWluIHNwYWNlLicpO1xuICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgcmV0dXJuIGVsLmNsYXNzTGlzdC5jb250YWlucyhjbHMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAoJyAnICsgZWwuY2xhc3NOYW1lICsgJyAnKS5pbmRleE9mKCcgJyArIGNscyArICcgJykgPiAtMTtcbiAgfVxufTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGFkZENsYXNzKGVsLCBjbHMpIHtcbiAgaWYgKCFlbCkgcmV0dXJuO1xuICB2YXIgY3VyQ2xhc3MgPSBlbC5jbGFzc05hbWU7XG4gIHZhciBjbGFzc2VzID0gKGNscyB8fCAnJykuc3BsaXQoJyAnKTtcblxuICBmb3IgKHZhciBpID0gMCwgaiA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgdmFyIGNsc05hbWUgPSBjbGFzc2VzW2ldO1xuICAgIGlmICghY2xzTmFtZSkgY29udGludWU7XG5cbiAgICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgICBlbC5jbGFzc0xpc3QuYWRkKGNsc05hbWUpO1xuICAgIH0gZWxzZSBpZiAoIWhhc0NsYXNzKGVsLCBjbHNOYW1lKSkge1xuICAgICAgY3VyQ2xhc3MgKz0gJyAnICsgY2xzTmFtZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFlbC5jbGFzc0xpc3QpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgY3VyQ2xhc3MpO1xuICB9XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWwsIGNscykge1xuICBpZiAoIWVsIHx8ICFjbHMpIHJldHVybjtcbiAgdmFyIGNsYXNzZXMgPSBjbHMuc3BsaXQoJyAnKTtcbiAgdmFyIGN1ckNsYXNzID0gJyAnICsgZWwuY2xhc3NOYW1lICsgJyAnO1xuXG4gIGZvciAodmFyIGkgPSAwLCBqID0gY2xhc3Nlcy5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICB2YXIgY2xzTmFtZSA9IGNsYXNzZXNbaV07XG4gICAgaWYgKCFjbHNOYW1lKSBjb250aW51ZTtcblxuICAgIGlmIChlbC5jbGFzc0xpc3QpIHtcbiAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoY2xzTmFtZSk7XG4gICAgfSBlbHNlIGlmIChoYXNDbGFzcyhlbCwgY2xzTmFtZSkpIHtcbiAgICAgIGN1ckNsYXNzID0gY3VyQ2xhc3MucmVwbGFjZSgnICcgKyBjbHNOYW1lICsgJyAnLCAnICcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWVsLmNsYXNzTGlzdCkge1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCB0cmltKGN1ckNsYXNzKSk7XG4gIH1cbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG52YXIgZ2V0U3R5bGUgPSBleHBvcnRzLmdldFN0eWxlID0gaWVWZXJzaW9uIDwgOSA/IGZ1bmN0aW9uIChlbGVtZW50LCBzdHlsZU5hbWUpIHtcbiAgaWYgKGlzU2VydmVyKSByZXR1cm47XG4gIGlmICghZWxlbWVudCB8fCAhc3R5bGVOYW1lKSByZXR1cm4gbnVsbDtcbiAgc3R5bGVOYW1lID0gY2FtZWxDYXNlKHN0eWxlTmFtZSk7XG4gIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcpIHtcbiAgICBzdHlsZU5hbWUgPSAnc3R5bGVGbG9hdCc7XG4gIH1cbiAgdHJ5IHtcbiAgICBzd2l0Y2ggKHN0eWxlTmFtZSkge1xuICAgICAgY2FzZSAnb3BhY2l0eSc6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZmlsdGVycy5pdGVtKCdhbHBoYScpLm9wYWNpdHkgLyAxMDA7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gMS4wO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZWxlbWVudC5zdHlsZVtzdHlsZU5hbWVdIHx8IGVsZW1lbnQuY3VycmVudFN0eWxlID8gZWxlbWVudC5jdXJyZW50U3R5bGVbc3R5bGVOYW1lXSA6IG51bGw7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuc3R5bGVbc3R5bGVOYW1lXTtcbiAgfVxufSA6IGZ1bmN0aW9uIChlbGVtZW50LCBzdHlsZU5hbWUpIHtcbiAgaWYgKGlzU2VydmVyKSByZXR1cm47XG4gIGlmICghZWxlbWVudCB8fCAhc3R5bGVOYW1lKSByZXR1cm4gbnVsbDtcbiAgc3R5bGVOYW1lID0gY2FtZWxDYXNlKHN0eWxlTmFtZSk7XG4gIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcpIHtcbiAgICBzdHlsZU5hbWUgPSAnY3NzRmxvYXQnO1xuICB9XG4gIHRyeSB7XG4gICAgdmFyIGNvbXB1dGVkID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCAnJyk7XG4gICAgcmV0dXJuIGVsZW1lbnQuc3R5bGVbc3R5bGVOYW1lXSB8fCBjb21wdXRlZCA/IGNvbXB1dGVkW3N0eWxlTmFtZV0gOiBudWxsO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuc3R5bGVbc3R5bGVOYW1lXTtcbiAgfVxufTtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIHNldFN0eWxlKGVsZW1lbnQsIHN0eWxlTmFtZSwgdmFsdWUpIHtcbiAgaWYgKCFlbGVtZW50IHx8ICFzdHlsZU5hbWUpIHJldHVybjtcblxuICBpZiAoKHR5cGVvZiBzdHlsZU5hbWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHN0eWxlTmFtZSkpID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAodmFyIHByb3AgaW4gc3R5bGVOYW1lKSB7XG4gICAgICBpZiAoc3R5bGVOYW1lLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgIHNldFN0eWxlKGVsZW1lbnQsIHByb3AsIHN0eWxlTmFtZVtwcm9wXSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0eWxlTmFtZSA9IGNhbWVsQ2FzZShzdHlsZU5hbWUpO1xuICAgIGlmIChzdHlsZU5hbWUgPT09ICdvcGFjaXR5JyAmJiBpZVZlcnNpb24gPCA5KSB7XG4gICAgICBlbGVtZW50LnN0eWxlLmZpbHRlciA9IGlzTmFOKHZhbHVlKSA/ICcnIDogJ2FscGhhKG9wYWNpdHk9JyArIHZhbHVlICogMTAwICsgJyknO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50LnN0eWxlW3N0eWxlTmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBpc1Njcm9sbCA9IGV4cG9ydHMuaXNTY3JvbGwgPSBmdW5jdGlvbiBpc1Njcm9sbChlbCwgdmVydGljYWwpIHtcbiAgaWYgKGlzU2VydmVyKSByZXR1cm47XG5cbiAgdmFyIGRldGVybWluZWREaXJlY3Rpb24gPSB2ZXJ0aWNhbCAhPT0gbnVsbCAmJiB2ZXJ0aWNhbCAhPT0gdW5kZWZpbmVkO1xuICB2YXIgb3ZlcmZsb3cgPSBkZXRlcm1pbmVkRGlyZWN0aW9uID8gdmVydGljYWwgPyBnZXRTdHlsZShlbCwgJ292ZXJmbG93LXknKSA6IGdldFN0eWxlKGVsLCAnb3ZlcmZsb3cteCcpIDogZ2V0U3R5bGUoZWwsICdvdmVyZmxvdycpO1xuXG4gIHJldHVybiBvdmVyZmxvdy5tYXRjaCgvKHNjcm9sbHxhdXRvfG92ZXJsYXkpLyk7XG59O1xuXG52YXIgZ2V0U2Nyb2xsQ29udGFpbmVyID0gZXhwb3J0cy5nZXRTY3JvbGxDb250YWluZXIgPSBmdW5jdGlvbiBnZXRTY3JvbGxDb250YWluZXIoZWwsIHZlcnRpY2FsKSB7XG4gIGlmIChpc1NlcnZlcikgcmV0dXJuO1xuXG4gIHZhciBwYXJlbnQgPSBlbDtcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGlmIChbd2luZG93LCBkb2N1bWVudCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XS5pbmNsdWRlcyhwYXJlbnQpKSB7XG4gICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBpZiAoaXNTY3JvbGwocGFyZW50LCB2ZXJ0aWNhbCkpIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xuICB9XG5cbiAgcmV0dXJuIHBhcmVudDtcbn07XG5cbnZhciBpc0luQ29udGFpbmVyID0gZXhwb3J0cy5pc0luQ29udGFpbmVyID0gZnVuY3Rpb24gaXNJbkNvbnRhaW5lcihlbCwgY29udGFpbmVyKSB7XG4gIGlmIChpc1NlcnZlciB8fCAhZWwgfHwgIWNvbnRhaW5lcikgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBlbFJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIGNvbnRhaW5lclJlY3QgPSB2b2lkIDA7XG5cbiAgaWYgKFt3aW5kb3csIGRvY3VtZW50LCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIG51bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXMoY29udGFpbmVyKSkge1xuICAgIGNvbnRhaW5lclJlY3QgPSB7XG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBib3R0b206IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgIGxlZnQ6IDBcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lclJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIH1cblxuICByZXR1cm4gZWxSZWN0LnRvcCA8IGNvbnRhaW5lclJlY3QuYm90dG9tICYmIGVsUmVjdC5ib3R0b20gPiBjb250YWluZXJSZWN0LnRvcCAmJiBlbFJlY3QucmlnaHQgPiBjb250YWluZXJSZWN0LmxlZnQgJiYgZWxSZWN0LmxlZnQgPCBjb250YWluZXJSZWN0LnJpZ2h0O1xufTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9lbGVtZW50LXVpL2xpYi91dGlscy9kb20uanNcbi8vIG1vZHVsZSBpZCA9IDJrdkFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2kvA\n")},"3Eo+":function(module,exports){eval("var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiM0VvKy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdWlkLmpzP2RjNGEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlkID0gMDtcbnZhciBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdWlkLmpzXG4vLyBtb2R1bGUgaWQgPSAzRW8rXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3Eo+\n")},"3a40":function(module,exports){eval("/*\n * Released under BSD License\n * Copyright (c) 2014-2021 hizzgdev@163.com\n * \n * Project Home:\n * https://github.com/hizzgdev/jsmind/\n */\n\n(function ($w) {\n 'use strict';\n\n var __name__ = 'jsMind';\n var jsMind = $w[__name__];\n if (!jsMind) { return; }\n if (typeof jsMind.screenshot != 'undefined') { return; }\n\n var $d = $w.document;\n var $c = function (tag) { return $d.createElement(tag); };\n\n var css = function (cstyle, property_name) {\n return cstyle.getPropertyValue(property_name);\n };\n var is_visible = function (cstyle) {\n var visibility = css(cstyle, 'visibility');\n var display = css(cstyle, 'display');\n return (visibility !== 'hidden' && display !== 'none');\n };\n var jcanvas = {};\n jcanvas.rect = function (ctx, x, y, w, h, r) {\n if (w < 2 * r) r = w / 2;\n if (h < 2 * r) r = h / 2;\n ctx.moveTo(x + r, y);\n ctx.arcTo(x + w, y, x + w, y + h, r);\n ctx.arcTo(x + w, y + h, x, y + h, r);\n ctx.arcTo(x, y + h, x, y, r);\n ctx.arcTo(x, y, x + w, y, r);\n };\n\n jcanvas.text_multiline = function (ctx, text, x, y, w, h, lineheight) {\n var line = '';\n var text_len = text.length;\n var chars = text.split('');\n var test_line = null;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n for (var i = 0; i < text_len; i++) {\n test_line = line + chars[i];\n if (ctx.measureText(test_line).width > w && i > 0) {\n ctx.fillText(line, x, y);\n line = chars[i];\n y += lineheight;\n } else {\n line = test_line;\n }\n }\n ctx.fillText(line, x, y);\n };\n\n jcanvas.text_ellipsis = function (ctx, text, x, y, w, h) {\n var center_y = y + h / 2;\n var text = jcanvas.fittingString(ctx, text, w);\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, x, center_y, w);\n };\n\n jcanvas.fittingString = function (ctx, text, max_width) {\n var width = ctx.measureText(text).width;\n var ellipsis = '…';\n var ellipsis_width = ctx.measureText(ellipsis).width;\n if (width <= max_width || width <= ellipsis_width) {\n return text;\n } else {\n var len = text.length;\n while (width >= max_width - ellipsis_width && len-- > 0) {\n text = text.substring(0, len);\n width = ctx.measureText(text).width;\n }\n return text + ellipsis;\n }\n };\n\n jcanvas.image = function (ctx, url, x, y, w, h, r, rotation, callback) {\n var img = new Image();\n img.onload = function () {\n ctx.save();\n ctx.translate(x, y);\n ctx.save();\n ctx.beginPath();\n jcanvas.rect(ctx, 0, 0, w, h, r);\n ctx.closePath();\n ctx.clip();\n ctx.translate(w / 2, h / 2);\n ctx.rotate(rotation * Math.PI / 180);\n ctx.drawImage(img, -w / 2, -h / 2);\n ctx.restore();\n ctx.restore();\n !!callback && callback();\n }\n img.src = url;\n };\n\n jsMind.screenshot = function (jm) {\n this.jm = jm;\n this.canvas_elem = null;\n this.canvas_ctx = null;\n this._inited = false;\n };\n\n jsMind.screenshot.prototype = {\n init: function () {\n if (this._inited) { return; }\n console.log('init');\n var c = $c('canvas');\n var ctx = c.getContext('2d');\n\n this.canvas_elem = c;\n this.canvas_ctx = ctx;\n this.jm.view.e_panel.appendChild(c);\n this._inited = true;\n this.resize();\n },\n\n shoot: function (callback) {\n this.init();\n this._draw(function () {\n !!callback && callback();\n this.clean();\n }.bind(this));\n this._watermark();\n },\n\n shootDownload: function () {\n this.shoot(function () {\n this._download();\n }.bind(this));\n },\n\n shootAsDataURL: function (callback) {\n this.shoot(function () {\n !!callback && callback(this.canvas_elem.toDataURL());\n }.bind(this));\n },\n\n resize: function () {\n if (this._inited) {\n this.canvas_elem.width = this.jm.view.size.w;\n this.canvas_elem.height = this.jm.view.size.h;\n }\n },\n\n clean: function () {\n var c = this.canvas_elem;\n this.canvas_ctx.clearRect(0, 0, c.width, c.height);\n },\n\n _draw: function (callback) {\n var ctx = this.canvas_ctx;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'top';\n this._draw_lines(function () {\n this._draw_nodes(callback);\n }.bind(this));\n },\n\n _watermark: function () {\n var c = this.canvas_elem;\n var ctx = this.canvas_ctx;\n ctx.textAlign = 'right';\n ctx.textBaseline = 'bottom';\n ctx.fillStyle = '#000';\n ctx.font = '11px Verdana,Arial,Helvetica,sans-serif';\n ctx.fillText('hizzgdev.github.io/jsmind', c.width - 5.5, c.height - 2.5);\n ctx.textAlign = 'left';\n ctx.fillText($w.location, 5.5, c.height - 2.5);\n },\n\n _draw_lines: function (callback) {\n this.jm.view.graph.copy_to(this.canvas_ctx, callback);\n },\n\n _draw_nodes: function (callback) {\n var nodes = this.jm.mind.nodes;\n var node;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n this._draw_node(node);\n }\n\n function check_nodes_ready() {\n console.log('check_node_ready' + new Date());\n var allOk = true;\n for (var nodeid in nodes) {\n node = nodes[nodeid];\n allOk = allOk & node.ready;\n }\n\n if (!allOk) {\n $w.setTimeout(check_nodes_ready, 200);\n } else {\n $w.setTimeout(callback, 200);\n }\n }\n check_nodes_ready();\n },\n\n _draw_node: function (node) {\n var ctx = this.canvas_ctx;\n var view_data = node._data.view;\n var node_element = view_data.element;\n var ncs = getComputedStyle(node_element);\n if (!is_visible(ncs)) {\n node.ready = true;\n return;\n }\n\n var bgcolor = css(ncs, 'background-color');\n var round_radius = parseInt(css(ncs, 'border-top-left-radius'));\n var color = css(ncs, 'color');\n var padding_left = parseInt(css(ncs, 'padding-left'));\n var padding_right = parseInt(css(ncs, 'padding-right'));\n var padding_top = parseInt(css(ncs, 'padding-top'));\n var padding_bottom = parseInt(css(ncs, 'padding-bottom'));\n var text_overflow = css(ncs, 'text-overflow');\n var font = css(ncs, 'font-style') + ' ' +\n css(ncs, 'font-variant') + ' ' +\n css(ncs, 'font-weight') + ' ' +\n css(ncs, 'font-size') + '/' + css(ncs, 'line-height') + ' ' +\n css(ncs, 'font-family');\n\n var rb = {\n x: view_data.abs_x,\n y: view_data.abs_y,\n w: view_data.width + 1,\n h: view_data.height + 1\n };\n var tb = {\n x: rb.x + padding_left,\n y: rb.y + padding_top,\n w: rb.w - padding_left - padding_right,\n h: rb.h - padding_top - padding_bottom\n };\n\n ctx.font = font;\n ctx.fillStyle = bgcolor;\n ctx.beginPath();\n jcanvas.rect(ctx, rb.x, rb.y, rb.w, rb.h, round_radius);\n ctx.closePath();\n ctx.fill();\n\n ctx.fillStyle = color;\n if ('background-image' in node.data) {\n var backgroundUrl = css(ncs, 'background-image').slice(5, -2);\n node.ready = false;\n var rotation = 0;\n if ('background-rotation' in node.data) {\n rotation = node.data['background-rotation'];\n }\n jcanvas.image(ctx, backgroundUrl, rb.x, rb.y, rb.w, rb.h, round_radius, rotation,\n function () {\n node.ready = true;\n });\n }\n if (!!node.topic) {\n if (text_overflow === 'ellipsis') {\n jcanvas.text_ellipsis(ctx, node.topic, tb.x, tb.y, tb.w, tb.h);\n } else {\n var line_height = parseInt(css(ncs, 'line-height'));\n jcanvas.text_multiline(ctx, node.topic, tb.x, tb.y, tb.w, tb.h, line_height);\n }\n }\n if (!!view_data.expander) {\n this._draw_expander(view_data.expander);\n }\n if (!('background-image' in node.data)) {\n node.ready = true;\n }\n },\n\n _draw_expander: function (expander) {\n var ctx = this.canvas_ctx;\n var ncs = getComputedStyle(expander);\n if (!is_visible(ncs)) { return; }\n\n var style_left = css(ncs, 'left');\n var style_top = css(ncs, 'top');\n var font = css(ncs, 'font');\n var left = parseInt(style_left);\n var top = parseInt(style_top);\n var is_plus = expander.innerHTML === '+';\n\n ctx.lineWidth = 1;\n\n ctx.beginPath();\n ctx.arc(left + 7, top + 7, 5, 0, Math.PI * 2, true);\n ctx.moveTo(left + 10, top + 7);\n ctx.lineTo(left + 4, top + 7);\n if (is_plus) {\n ctx.moveTo(left + 7, top + 4);\n ctx.lineTo(left + 7, top + 10);\n }\n ctx.closePath();\n ctx.stroke();\n },\n\n _download: function () {\n var c = this.canvas_elem;\n var name = this.jm.mind.name + '.png';\n\n if (navigator.msSaveBlob && (!!c.msToBlob)) {\n var blob = c.msToBlob();\n navigator.msSaveBlob(blob, name);\n } else {\n var bloburl = this.canvas_elem.toDataURL();\n var anchor = $c('a');\n if ('download' in anchor) {\n anchor.style.visibility = 'hidden';\n anchor.href = bloburl;\n anchor.download = name;\n $d.body.appendChild(anchor);\n var evt = $d.createEvent('MouseEvents');\n evt.initEvent('click', true, true);\n anchor.dispatchEvent(evt);\n $d.body.removeChild(anchor);\n } else {\n location.href = bloburl;\n }\n }\n },\n\n jm_event_handle: function (type, data) {\n if (type === jsMind.event_type.resize) {\n this.resize();\n }\n }\n };\n\n var screenshot_plugin = new jsMind.plugin('screenshot', function (jm) {\n var jss = new jsMind.screenshot(jm);\n jm.screenshot = jss;\n jm.shoot = function () {\n jss.shoot();\n };\n jm.add_event_listener(function (type, data) {\n jss.jm_event_handle.call(jss, type, data);\n });\n });\n\n jsMind.register_plugin(screenshot_plugin);\n\n})(window);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiM2E0MC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9qc21pbmQvanMvanNtaW5kLnNjcmVlbnNob3QuanM/ZGRhZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUmVsZWFzZWQgdW5kZXIgQlNEIExpY2Vuc2VcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDIxIGhpenpnZGV2QDE2My5jb21cbiAqIFxuICogUHJvamVjdCBIb21lOlxuICogICBodHRwczovL2dpdGh1Yi5jb20vaGl6emdkZXYvanNtaW5kL1xuICovXG5cbihmdW5jdGlvbiAoJHcpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgX19uYW1lX18gPSAnanNNaW5kJztcbiAgICB2YXIganNNaW5kID0gJHdbX19uYW1lX19dO1xuICAgIGlmICghanNNaW5kKSB7IHJldHVybjsgfVxuICAgIGlmICh0eXBlb2YganNNaW5kLnNjcmVlbnNob3QgIT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuOyB9XG5cbiAgICB2YXIgJGQgPSAkdy5kb2N1bWVudDtcbiAgICB2YXIgJGMgPSBmdW5jdGlvbiAodGFnKSB7IHJldHVybiAkZC5jcmVhdGVFbGVtZW50KHRhZyk7IH07XG5cbiAgICB2YXIgY3NzID0gZnVuY3Rpb24gKGNzdHlsZSwgcHJvcGVydHlfbmFtZSkge1xuICAgICAgICByZXR1cm4gY3N0eWxlLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHlfbmFtZSk7XG4gICAgfTtcbiAgICB2YXIgaXNfdmlzaWJsZSA9IGZ1bmN0aW9uIChjc3R5bGUpIHtcbiAgICAgICAgdmFyIHZpc2liaWxpdHkgPSBjc3MoY3N0eWxlLCAndmlzaWJpbGl0eScpO1xuICAgICAgICB2YXIgZGlzcGxheSA9IGNzcyhjc3R5bGUsICdkaXNwbGF5Jyk7XG4gICAgICAgIHJldHVybiAodmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicgJiYgZGlzcGxheSAhPT0gJ25vbmUnKTtcbiAgICB9O1xuICAgIHZhciBqY2FudmFzID0ge307XG4gICAgamNhbnZhcy5yZWN0ID0gZnVuY3Rpb24gKGN0eCwgeCwgeSwgdywgaCwgcikge1xuICAgICAgICBpZiAodyA8IDIgKiByKSByID0gdyAvIDI7XG4gICAgICAgIGlmIChoIDwgMiAqIHIpIHIgPSBoIC8gMjtcbiAgICAgICAgY3R4Lm1vdmVUbyh4ICsgciwgeSk7XG4gICAgICAgIGN0eC5hcmNUbyh4ICsgdywgeSwgeCArIHcsIHkgKyBoLCByKTtcbiAgICAgICAgY3R4LmFyY1RvKHggKyB3LCB5ICsgaCwgeCwgeSArIGgsIHIpO1xuICAgICAgICBjdHguYXJjVG8oeCwgeSArIGgsIHgsIHksIHIpO1xuICAgICAgICBjdHguYXJjVG8oeCwgeSwgeCArIHcsIHksIHIpO1xuICAgIH07XG5cbiAgICBqY2FudmFzLnRleHRfbXVsdGlsaW5lID0gZnVuY3Rpb24gKGN0eCwgdGV4dCwgeCwgeSwgdywgaCwgbGluZWhlaWdodCkge1xuICAgICAgICB2YXIgbGluZSA9ICcnO1xuICAgICAgICB2YXIgdGV4dF9sZW4gPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgdmFyIGNoYXJzID0gdGV4dC5zcGxpdCgnJyk7XG4gICAgICAgIHZhciB0ZXN0X2xpbmUgPSBudWxsO1xuICAgICAgICBjdHgudGV4dEFsaWduID0gJ2xlZnQnO1xuICAgICAgICBjdHgudGV4dEJhc2VsaW5lID0gJ3RvcCc7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dF9sZW47IGkrKykge1xuICAgICAgICAgICAgdGVzdF9saW5lID0gbGluZSArIGNoYXJzW2ldO1xuICAgICAgICAgICAgaWYgKGN0eC5tZWFzdXJlVGV4dCh0ZXN0X2xpbmUpLndpZHRoID4gdyAmJiBpID4gMCkge1xuICAgICAgICAgICAgICAgIGN0eC5maWxsVGV4dChsaW5lLCB4LCB5KTtcbiAgICAgICAgICAgICAgICBsaW5lID0gY2hhcnNbaV07XG4gICAgICAgICAgICAgICAgeSArPSBsaW5laGVpZ2h0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsaW5lID0gdGVzdF9saW5lO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN0eC5maWxsVGV4dChsaW5lLCB4LCB5KTtcbiAgICB9O1xuXG4gICAgamNhbnZhcy50ZXh0X2VsbGlwc2lzID0gZnVuY3Rpb24gKGN0eCwgdGV4dCwgeCwgeSwgdywgaCkge1xuICAgICAgICB2YXIgY2VudGVyX3kgPSB5ICsgaCAvIDI7XG4gICAgICAgIHZhciB0ZXh0ID0gamNhbnZhcy5maXR0aW5nU3RyaW5nKGN0eCwgdGV4dCwgdyk7XG4gICAgICAgIGN0eC50ZXh0QWxpZ24gPSAnbGVmdCc7XG4gICAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcbiAgICAgICAgY3R4LmZpbGxUZXh0KHRleHQsIHgsIGNlbnRlcl95LCB3KTtcbiAgICB9O1xuXG4gICAgamNhbnZhcy5maXR0aW5nU3RyaW5nID0gZnVuY3Rpb24gKGN0eCwgdGV4dCwgbWF4X3dpZHRoKSB7XG4gICAgICAgIHZhciB3aWR0aCA9IGN0eC5tZWFzdXJlVGV4dCh0ZXh0KS53aWR0aDtcbiAgICAgICAgdmFyIGVsbGlwc2lzID0gJ+KApic7XG4gICAgICAgIHZhciBlbGxpcHNpc193aWR0aCA9IGN0eC5tZWFzdXJlVGV4dChlbGxpcHNpcykud2lkdGg7XG4gICAgICAgIGlmICh3aWR0aCA8PSBtYXhfd2lkdGggfHwgd2lkdGggPD0gZWxsaXBzaXNfd2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGxlbiA9IHRleHQubGVuZ3RoO1xuICAgICAgICAgICAgd2hpbGUgKHdpZHRoID49IG1heF93aWR0aCAtIGVsbGlwc2lzX3dpZHRoICYmIGxlbi0tID4gMCkge1xuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBsZW4pO1xuICAgICAgICAgICAgICAgIHdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KHRleHQpLndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRleHQgKyBlbGxpcHNpcztcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBqY2FudmFzLmltYWdlID0gZnVuY3Rpb24gKGN0eCwgdXJsLCB4LCB5LCB3LCBoLCByLCByb3RhdGlvbiwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY3R4LnNhdmUoKTtcbiAgICAgICAgICAgIGN0eC50cmFuc2xhdGUoeCwgeSk7XG4gICAgICAgICAgICBjdHguc2F2ZSgpO1xuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgamNhbnZhcy5yZWN0KGN0eCwgMCwgMCwgdywgaCwgcik7XG4gICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICBjdHguY2xpcCgpO1xuICAgICAgICAgICAgY3R4LnRyYW5zbGF0ZSh3IC8gMiwgaCAvIDIpO1xuICAgICAgICAgICAgY3R4LnJvdGF0ZShyb3RhdGlvbiAqIE1hdGguUEkgLyAxODApO1xuICAgICAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIC13IC8gMiwgLWggLyAyKTtcbiAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7XG4gICAgICAgICAgICBjdHgucmVzdG9yZSgpO1xuICAgICAgICAgICAgISFjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIGltZy5zcmMgPSB1cmw7XG4gICAgfTtcblxuICAgIGpzTWluZC5zY3JlZW5zaG90ID0gZnVuY3Rpb24gKGptKSB7XG4gICAgICAgIHRoaXMuam0gPSBqbTtcbiAgICAgICAgdGhpcy5jYW52YXNfZWxlbSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FudmFzX2N0eCA9IG51bGw7XG4gICAgICAgIHRoaXMuX2luaXRlZCA9IGZhbHNlO1xuICAgIH07XG5cbiAgICBqc01pbmQuc2NyZWVuc2hvdC5wcm90b3R5cGUgPSB7XG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9pbml0ZWQpIHsgcmV0dXJuOyB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnaW5pdCcpO1xuICAgICAgICAgICAgdmFyIGMgPSAkYygnY2FudmFzJyk7XG4gICAgICAgICAgICB2YXIgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgICAgICAgICB0aGlzLmNhbnZhc19lbGVtID0gYztcbiAgICAgICAgICAgIHRoaXMuY2FudmFzX2N0eCA9IGN0eDtcbiAgICAgICAgICAgIHRoaXMuam0udmlldy5lX3BhbmVsLmFwcGVuZENoaWxkKGMpO1xuICAgICAgICAgICAgdGhpcy5faW5pdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucmVzaXplKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2hvb3Q6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICB0aGlzLl9kcmF3KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAhIWNhbGxiYWNrICYmIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhbigpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMuX3dhdGVybWFyaygpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNob290RG93bmxvYWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvb3QoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Rvd25sb2FkKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNob290QXNEYXRhVVJMOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuc2hvb3QoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICEhY2FsbGJhY2sgJiYgY2FsbGJhY2sodGhpcy5jYW52YXNfZWxlbS50b0RhdGFVUkwoKSk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlc2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2luaXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzX2VsZW0ud2lkdGggPSB0aGlzLmptLnZpZXcuc2l6ZS53O1xuICAgICAgICAgICAgICAgIHRoaXMuY2FudmFzX2VsZW0uaGVpZ2h0ID0gdGhpcy5qbS52aWV3LnNpemUuaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBjbGVhbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGMgPSB0aGlzLmNhbnZhc19lbGVtO1xuICAgICAgICAgICAgdGhpcy5jYW52YXNfY3R4LmNsZWFyUmVjdCgwLCAwLCBjLndpZHRoLCBjLmhlaWdodCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2RyYXc6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgdmFyIGN0eCA9IHRoaXMuY2FudmFzX2N0eDtcbiAgICAgICAgICAgIGN0eC50ZXh0QWxpZ24gPSAnbGVmdCc7XG4gICAgICAgICAgICBjdHgudGV4dEJhc2VsaW5lID0gJ3RvcCc7XG4gICAgICAgICAgICB0aGlzLl9kcmF3X2xpbmVzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kcmF3X25vZGVzKGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX3dhdGVybWFyazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGMgPSB0aGlzLmNhbnZhc19lbGVtO1xuICAgICAgICAgICAgdmFyIGN0eCA9IHRoaXMuY2FudmFzX2N0eDtcbiAgICAgICAgICAgIGN0eC50ZXh0QWxpZ24gPSAncmlnaHQnO1xuICAgICAgICAgICAgY3R4LnRleHRCYXNlbGluZSA9ICdib3R0b20nO1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjMDAwJztcbiAgICAgICAgICAgIGN0eC5mb250ID0gJzExcHggVmVyZGFuYSxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZic7XG4gICAgICAgICAgICBjdHguZmlsbFRleHQoJ2hpenpnZGV2LmdpdGh1Yi5pby9qc21pbmQnLCBjLndpZHRoIC0gNS41LCBjLmhlaWdodCAtIDIuNSk7XG4gICAgICAgICAgICBjdHgudGV4dEFsaWduID0gJ2xlZnQnO1xuICAgICAgICAgICAgY3R4LmZpbGxUZXh0KCR3LmxvY2F0aW9uLCA1LjUsIGMuaGVpZ2h0IC0gMi41KTtcbiAgICAgICAgfSxcblxuICAgICAgICBfZHJhd19saW5lczogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB0aGlzLmptLnZpZXcuZ3JhcGguY29weV90byh0aGlzLmNhbnZhc19jdHgsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfZHJhd19ub2RlczogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLmptLm1pbmQubm9kZXM7XG4gICAgICAgICAgICB2YXIgbm9kZTtcbiAgICAgICAgICAgIGZvciAodmFyIG5vZGVpZCBpbiBub2Rlcykge1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2Rlc1tub2RlaWRdO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdfbm9kZShub2RlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tfbm9kZXNfcmVhZHkoKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2NoZWNrX25vZGVfcmVhZHknICsgbmV3IERhdGUoKSk7XG4gICAgICAgICAgICAgICAgdmFyIGFsbE9rID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBub2RlaWQgaW4gbm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGVzW25vZGVpZF07XG4gICAgICAgICAgICAgICAgICAgIGFsbE9rID0gYWxsT2sgJiBub2RlLnJlYWR5O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghYWxsT2spIHtcbiAgICAgICAgICAgICAgICAgICAgJHcuc2V0VGltZW91dChjaGVja19ub2Rlc19yZWFkeSwgMjAwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCAyMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoZWNrX25vZGVzX3JlYWR5KCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2RyYXdfbm9kZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIHZhciBjdHggPSB0aGlzLmNhbnZhc19jdHg7XG4gICAgICAgICAgICB2YXIgdmlld19kYXRhID0gbm9kZS5fZGF0YS52aWV3O1xuICAgICAgICAgICAgdmFyIG5vZGVfZWxlbWVudCA9IHZpZXdfZGF0YS5lbGVtZW50O1xuICAgICAgICAgICAgdmFyIG5jcyA9IGdldENvbXB1dGVkU3R5bGUobm9kZV9lbGVtZW50KTtcbiAgICAgICAgICAgIGlmICghaXNfdmlzaWJsZShuY3MpKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYmdjb2xvciA9IGNzcyhuY3MsICdiYWNrZ3JvdW5kLWNvbG9yJyk7XG4gICAgICAgICAgICB2YXIgcm91bmRfcmFkaXVzID0gcGFyc2VJbnQoY3NzKG5jcywgJ2JvcmRlci10b3AtbGVmdC1yYWRpdXMnKSk7XG4gICAgICAgICAgICB2YXIgY29sb3IgPSBjc3MobmNzLCAnY29sb3InKTtcbiAgICAgICAgICAgIHZhciBwYWRkaW5nX2xlZnQgPSBwYXJzZUludChjc3MobmNzLCAncGFkZGluZy1sZWZ0JykpO1xuICAgICAgICAgICAgdmFyIHBhZGRpbmdfcmlnaHQgPSBwYXJzZUludChjc3MobmNzLCAncGFkZGluZy1yaWdodCcpKTtcbiAgICAgICAgICAgIHZhciBwYWRkaW5nX3RvcCA9IHBhcnNlSW50KGNzcyhuY3MsICdwYWRkaW5nLXRvcCcpKTtcbiAgICAgICAgICAgIHZhciBwYWRkaW5nX2JvdHRvbSA9IHBhcnNlSW50KGNzcyhuY3MsICdwYWRkaW5nLWJvdHRvbScpKTtcbiAgICAgICAgICAgIHZhciB0ZXh0X292ZXJmbG93ID0gY3NzKG5jcywgJ3RleHQtb3ZlcmZsb3cnKTtcbiAgICAgICAgICAgIHZhciBmb250ID0gY3NzKG5jcywgJ2ZvbnQtc3R5bGUnKSArICcgJyArXG4gICAgICAgICAgICAgICAgY3NzKG5jcywgJ2ZvbnQtdmFyaWFudCcpICsgJyAnICtcbiAgICAgICAgICAgICAgICBjc3MobmNzLCAnZm9udC13ZWlnaHQnKSArICcgJyArXG4gICAgICAgICAgICAgICAgY3NzKG5jcywgJ2ZvbnQtc2l6ZScpICsgJy8nICsgY3NzKG5jcywgJ2xpbmUtaGVpZ2h0JykgKyAnICcgK1xuICAgICAgICAgICAgICAgIGNzcyhuY3MsICdmb250LWZhbWlseScpO1xuXG4gICAgICAgICAgICB2YXIgcmIgPSB7XG4gICAgICAgICAgICAgICAgeDogdmlld19kYXRhLmFic194LFxuICAgICAgICAgICAgICAgIHk6IHZpZXdfZGF0YS5hYnNfeSxcbiAgICAgICAgICAgICAgICB3OiB2aWV3X2RhdGEud2lkdGggKyAxLFxuICAgICAgICAgICAgICAgIGg6IHZpZXdfZGF0YS5oZWlnaHQgKyAxXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHRiID0ge1xuICAgICAgICAgICAgICAgIHg6IHJiLnggKyBwYWRkaW5nX2xlZnQsXG4gICAgICAgICAgICAgICAgeTogcmIueSArIHBhZGRpbmdfdG9wLFxuICAgICAgICAgICAgICAgIHc6IHJiLncgLSBwYWRkaW5nX2xlZnQgLSBwYWRkaW5nX3JpZ2h0LFxuICAgICAgICAgICAgICAgIGg6IHJiLmggLSBwYWRkaW5nX3RvcCAtIHBhZGRpbmdfYm90dG9tXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjdHguZm9udCA9IGZvbnQ7XG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gYmdjb2xvcjtcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGpjYW52YXMucmVjdChjdHgsIHJiLngsIHJiLnksIHJiLncsIHJiLmgsIHJvdW5kX3JhZGl1cyk7XG4gICAgICAgICAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgICAgICAgICBjdHguZmlsbCgpO1xuXG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sb3I7XG4gICAgICAgICAgICBpZiAoJ2JhY2tncm91bmQtaW1hZ2UnIGluIG5vZGUuZGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBiYWNrZ3JvdW5kVXJsID0gY3NzKG5jcywgJ2JhY2tncm91bmQtaW1hZ2UnKS5zbGljZSg1LCAtMik7XG4gICAgICAgICAgICAgICAgbm9kZS5yZWFkeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHZhciByb3RhdGlvbiA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKCdiYWNrZ3JvdW5kLXJvdGF0aW9uJyBpbiBub2RlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcm90YXRpb24gPSBub2RlLmRhdGFbJ2JhY2tncm91bmQtcm90YXRpb24nXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgamNhbnZhcy5pbWFnZShjdHgsIGJhY2tncm91bmRVcmwsIHJiLngsIHJiLnksIHJiLncsIHJiLmgsIHJvdW5kX3JhZGl1cywgcm90YXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghIW5vZGUudG9waWMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dF9vdmVyZmxvdyA9PT0gJ2VsbGlwc2lzJykge1xuICAgICAgICAgICAgICAgICAgICBqY2FudmFzLnRleHRfZWxsaXBzaXMoY3R4LCBub2RlLnRvcGljLCB0Yi54LCB0Yi55LCB0Yi53LCB0Yi5oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGluZV9oZWlnaHQgPSBwYXJzZUludChjc3MobmNzLCAnbGluZS1oZWlnaHQnKSk7XG4gICAgICAgICAgICAgICAgICAgIGpjYW52YXMudGV4dF9tdWx0aWxpbmUoY3R4LCBub2RlLnRvcGljLCB0Yi54LCB0Yi55LCB0Yi53LCB0Yi5oLCBsaW5lX2hlaWdodCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEhdmlld19kYXRhLmV4cGFuZGVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd19leHBhbmRlcih2aWV3X2RhdGEuZXhwYW5kZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEoJ2JhY2tncm91bmQtaW1hZ2UnIGluIG5vZGUuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfZHJhd19leHBhbmRlcjogZnVuY3Rpb24gKGV4cGFuZGVyKSB7XG4gICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5jYW52YXNfY3R4O1xuICAgICAgICAgICAgdmFyIG5jcyA9IGdldENvbXB1dGVkU3R5bGUoZXhwYW5kZXIpO1xuICAgICAgICAgICAgaWYgKCFpc192aXNpYmxlKG5jcykpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgIHZhciBzdHlsZV9sZWZ0ID0gY3NzKG5jcywgJ2xlZnQnKTtcbiAgICAgICAgICAgIHZhciBzdHlsZV90b3AgPSBjc3MobmNzLCAndG9wJyk7XG4gICAgICAgICAgICB2YXIgZm9udCA9IGNzcyhuY3MsICdmb250Jyk7XG4gICAgICAgICAgICB2YXIgbGVmdCA9IHBhcnNlSW50KHN0eWxlX2xlZnQpO1xuICAgICAgICAgICAgdmFyIHRvcCA9IHBhcnNlSW50KHN0eWxlX3RvcCk7XG4gICAgICAgICAgICB2YXIgaXNfcGx1cyA9IGV4cGFuZGVyLmlubmVySFRNTCA9PT0gJysnO1xuXG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gMTtcblxuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgY3R4LmFyYyhsZWZ0ICsgNywgdG9wICsgNywgNSwgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuICAgICAgICAgICAgY3R4Lm1vdmVUbyhsZWZ0ICsgMTAsIHRvcCArIDcpO1xuICAgICAgICAgICAgY3R4LmxpbmVUbyhsZWZ0ICsgNCwgdG9wICsgNyk7XG4gICAgICAgICAgICBpZiAoaXNfcGx1cykge1xuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8obGVmdCArIDcsIHRvcCArIDQpO1xuICAgICAgICAgICAgICAgIGN0eC5saW5lVG8obGVmdCArIDcsIHRvcCArIDEwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfZG93bmxvYWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjID0gdGhpcy5jYW52YXNfZWxlbTtcbiAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5qbS5taW5kLm5hbWUgKyAnLnBuZyc7XG5cbiAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlQmxvYiAmJiAoISFjLm1zVG9CbG9iKSkge1xuICAgICAgICAgICAgICAgIHZhciBibG9iID0gYy5tc1RvQmxvYigpO1xuICAgICAgICAgICAgICAgIG5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIG5hbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgYmxvYnVybCA9IHRoaXMuY2FudmFzX2VsZW0udG9EYXRhVVJMKCk7XG4gICAgICAgICAgICAgICAgdmFyIGFuY2hvciA9ICRjKCdhJyk7XG4gICAgICAgICAgICAgICAgaWYgKCdkb3dubG9hZCcgaW4gYW5jaG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvci5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvci5ocmVmID0gYmxvYnVybDtcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9yLmRvd25sb2FkID0gbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgJGQuYm9keS5hcHBlbmRDaGlsZChhbmNob3IpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gJGQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnRzJyk7XG4gICAgICAgICAgICAgICAgICAgIGV2dC5pbml0RXZlbnQoJ2NsaWNrJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGFuY2hvci5kaXNwYXRjaEV2ZW50KGV2dCk7XG4gICAgICAgICAgICAgICAgICAgICRkLmJvZHkucmVtb3ZlQ2hpbGQoYW5jaG9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gYmxvYnVybDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgam1fZXZlbnRfaGFuZGxlOiBmdW5jdGlvbiAodHlwZSwgZGF0YSkge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IGpzTWluZC5ldmVudF90eXBlLnJlc2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIHNjcmVlbnNob3RfcGx1Z2luID0gbmV3IGpzTWluZC5wbHVnaW4oJ3NjcmVlbnNob3QnLCBmdW5jdGlvbiAoam0pIHtcbiAgICAgICAgdmFyIGpzcyA9IG5ldyBqc01pbmQuc2NyZWVuc2hvdChqbSk7XG4gICAgICAgIGptLnNjcmVlbnNob3QgPSBqc3M7XG4gICAgICAgIGptLnNob290ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAganNzLnNob290KCk7XG4gICAgICAgIH07XG4gICAgICAgIGptLmFkZF9ldmVudF9saXN0ZW5lcihmdW5jdGlvbiAodHlwZSwgZGF0YSkge1xuICAgICAgICAgICAganNzLmptX2V2ZW50X2hhbmRsZS5jYWxsKGpzcywgdHlwZSwgZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAganNNaW5kLnJlZ2lzdGVyX3BsdWdpbihzY3JlZW5zaG90X3BsdWdpbik7XG5cbn0pKHdpbmRvdyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9qc21pbmQvanMvanNtaW5kLnNjcmVlbnNob3QuanNcbi8vIG1vZHVsZSBpZCA9IDNhNDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3a40\n")},"3fo+":function(module,exports,__webpack_require__){eval('module.exports = __webpack_require__("YAhB");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiM2ZvKy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ub3JtYWxpemUtd2hlZWwvaW5kZXguanM/ZGRmYSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vc3JjL25vcm1hbGl6ZVdoZWVsLmpzJyk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9ub3JtYWxpemUtd2hlZWwvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IDNmbytcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3fo+\n')},"3fs2":function(module,exports,__webpack_require__){eval('var classof = __webpack_require__("RY/4");\nvar ITERATOR = __webpack_require__("dSzd")(\'iterator\');\nvar Iterators = __webpack_require__("/bQp");\nmodule.exports = __webpack_require__("FeBl").getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it[\'@@iterator\']\n || Iterators[classof(it)];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiM2ZzMi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanM/ZGRmYiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBJdGVyYXRvcnNbY2xhc3NvZihpdCldO1xufTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qc1xuLy8gbW9kdWxlIGlkID0gM2ZzMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3fs2\n')},"4mcu":function(module,exports){eval("module.exports = function () { /* empty */ };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNG1jdS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzP2UyNjciXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzXG4vLyBtb2R1bGUgaWQgPSA0bWN1XG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4mcu\n")},"52gC":function(module,exports){eval('// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError("Can\'t call method on " + it);\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTJnQy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVmaW5lZC5qcz9lNzY4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVmaW5lZC5qc1xuLy8gbW9kdWxlIGlkID0gNTJnQ1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///52gC\n')},"5PlU":function(module,exports,__webpack_require__){eval('var classof = __webpack_require__("RY/4");\nvar ITERATOR = __webpack_require__("dSzd")(\'iterator\');\nvar Iterators = __webpack_require__("/bQp");\nmodule.exports = __webpack_require__("FeBl").isIterable = function (it) {\n var O = Object(it);\n return O[ITERATOR] !== undefined\n || \'@@iterator\' in O\n // eslint-disable-next-line no-prototype-builtins\n || Iterators.hasOwnProperty(classof(O));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNVBsVS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmlzLWl0ZXJhYmxlLmpzP2U0ZjkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29yZScpLmlzSXRlcmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8gPSBPYmplY3QoaXQpO1xuICByZXR1cm4gT1tJVEVSQVRPUl0gIT09IHVuZGVmaW5lZFxuICAgIHx8ICdAQGl0ZXJhdG9yJyBpbiBPXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgIHx8IEl0ZXJhdG9ycy5oYXNPd25Qcm9wZXJ0eShjbGFzc29mKE8pKTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmlzLWl0ZXJhYmxlLmpzXG4vLyBtb2R1bGUgaWQgPSA1UGxVXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5PlU\n')},"5QVw":function(module,exports,__webpack_require__){eval('module.exports = { "default": __webpack_require__("BwfY"), __esModule: true };//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNVFWdy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvc3ltYm9sLmpzP2U1MDUiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbFwiKSwgX19lc01vZHVsZTogdHJ1ZSB9O1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9zeW1ib2wuanNcbi8vIG1vZHVsZSBpZCA9IDVRVndcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5QVw\n')},"5VQ+":function(module,exports,__webpack_require__){"use strict";eval('\n\nvar utils = __webpack_require__("cGG2");\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNVZRKy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lLmpzP2U1NTQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlck5hbWUoaGVhZGVycywgbm9ybWFsaXplZE5hbWUpIHtcbiAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLCBmdW5jdGlvbiBwcm9jZXNzSGVhZGVyKHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKG5hbWUgIT09IG5vcm1hbGl6ZWROYW1lICYmIG5hbWUudG9VcHBlckNhc2UoKSA9PT0gbm9ybWFsaXplZE5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgaGVhZGVyc1tub3JtYWxpemVkTmFtZV0gPSB2YWx1ZTtcbiAgICAgIGRlbGV0ZSBoZWFkZXJzW25hbWVdO1xuICAgIH1cbiAgfSk7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZS5qc1xuLy8gbW9kdWxlIGlkID0gNVZRK1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5VQ+\n')},"6Twh":function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nexports.default = function () {\n if (_vue2.default.prototype.$isServer) return 0;\n if (scrollBarWidth !== undefined) return scrollBarWidth;\n\n var outer = document.createElement('div');\n outer.className = 'el-scrollbar__wrap';\n outer.style.visibility = 'hidden';\n outer.style.width = '100px';\n outer.style.position = 'absolute';\n outer.style.top = '-9999px';\n document.body.appendChild(outer);\n\n var widthNoScroll = outer.offsetWidth;\n outer.style.overflow = 'scroll';\n\n var inner = document.createElement('div');\n inner.style.width = '100%';\n outer.appendChild(inner);\n\n var widthWithScroll = inner.offsetWidth;\n outer.parentNode.removeChild(outer);\n scrollBarWidth = widthNoScroll - widthWithScroll;\n\n return scrollBarWidth;\n};\n\nvar _vue = __webpack_require__(\"7+uW\");\n\nvar _vue2 = _interopRequireDefault(_vue);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar scrollBarWidth = void 0;\n\n;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNlR3aC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9lbGVtZW50LXVpL2xpYi91dGlscy9zY3JvbGxiYXItd2lkdGguanM/ZTkzYyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKF92dWUyLmRlZmF1bHQucHJvdG90eXBlLiRpc1NlcnZlcikgcmV0dXJuIDA7XG4gIGlmIChzY3JvbGxCYXJXaWR0aCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gc2Nyb2xsQmFyV2lkdGg7XG5cbiAgdmFyIG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG91dGVyLmNsYXNzTmFtZSA9ICdlbC1zY3JvbGxiYXJfX3dyYXAnO1xuICBvdXRlci5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gIG91dGVyLnN0eWxlLndpZHRoID0gJzEwMHB4JztcbiAgb3V0ZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICBvdXRlci5zdHlsZS50b3AgPSAnLTk5OTlweCc7XG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3V0ZXIpO1xuXG4gIHZhciB3aWR0aE5vU2Nyb2xsID0gb3V0ZXIub2Zmc2V0V2lkdGg7XG4gIG91dGVyLnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7XG5cbiAgdmFyIGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGlubmVyLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICBvdXRlci5hcHBlbmRDaGlsZChpbm5lcik7XG5cbiAgdmFyIHdpZHRoV2l0aFNjcm9sbCA9IGlubmVyLm9mZnNldFdpZHRoO1xuICBvdXRlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG91dGVyKTtcbiAgc2Nyb2xsQmFyV2lkdGggPSB3aWR0aE5vU2Nyb2xsIC0gd2lkdGhXaXRoU2Nyb2xsO1xuXG4gIHJldHVybiBzY3JvbGxCYXJXaWR0aDtcbn07XG5cbnZhciBfdnVlID0gcmVxdWlyZSgndnVlJyk7XG5cbnZhciBfdnVlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Z1ZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBzY3JvbGxCYXJXaWR0aCA9IHZvaWQgMDtcblxuO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2VsZW1lbnQtdWkvbGliL3V0aWxzL3Njcm9sbGJhci13aWR0aC5qc1xuLy8gbW9kdWxlIGlkID0gNlR3aFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6Twh\n")},"7+uW":function(module,__webpack_exports__,__webpack_require__){"use strict";eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* WEBPACK VAR INJECTION */(function(global) {/*!\n * Vue.js v2.6.14\n * (c) 2014-2021 Evan You\n * Released under the MIT License.\n */\n/* */\n\nvar emptyObject = Object.freeze({});\n\n// These helpers produce better VM code in JS engines due to their\n// explicitness and function inlining.\nfunction isUndef (v) {\n return v === undefined || v === null\n}\n\nfunction isDef (v) {\n return v !== undefined && v !== null\n}\n\nfunction isTrue (v) {\n return v === true\n}\n\nfunction isFalse (v) {\n return v === false\n}\n\n/**\n * Check if value is primitive.\n */\nfunction isPrimitive (value) {\n return (\n typeof value === 'string' ||\n typeof value === 'number' ||\n // $flow-disable-line\n typeof value === 'symbol' ||\n typeof value === 'boolean'\n )\n}\n\n/**\n * Quick object check - this is primarily used to tell\n * Objects from primitive values when we know the value\n * is a JSON-compliant type.\n */\nfunction isObject (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\n/**\n * Get the raw type string of a value, e.g., [object Object].\n */\nvar _toString = Object.prototype.toString;\n\nfunction toRawType (value) {\n return _toString.call(value).slice(8, -1)\n}\n\n/**\n * Strict object type check. Only returns true\n * for plain JavaScript objects.\n */\nfunction isPlainObject (obj) {\n return _toString.call(obj) === '[object Object]'\n}\n\nfunction isRegExp (v) {\n return _toString.call(v) === '[object RegExp]'\n}\n\n/**\n * Check if val is a valid array index.\n */\nfunction isValidArrayIndex (val) {\n var n = parseFloat(String(val));\n return n >= 0 && Math.floor(n) === n && isFinite(val)\n}\n\nfunction isPromise (val) {\n return (\n isDef(val) &&\n typeof val.then === 'function' &&\n typeof val.catch === 'function'\n )\n}\n\n/**\n * Convert a value to a string that is actually rendered.\n */\nfunction toString (val) {\n return val == null\n ? ''\n : Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)\n ? JSON.stringify(val, null, 2)\n : String(val)\n}\n\n/**\n * Convert an input value to a number for persistence.\n * If the conversion fails, return original string.\n */\nfunction toNumber (val) {\n var n = parseFloat(val);\n return isNaN(n) ? val : n\n}\n\n/**\n * Make a map and return a function for checking if a key\n * is in that map.\n */\nfunction makeMap (\n str,\n expectsLowerCase\n) {\n var map = Object.create(null);\n var list = str.split(',');\n for (var i = 0; i < list.length; i++) {\n map[list[i]] = true;\n }\n return expectsLowerCase\n ? function (val) { return map[val.toLowerCase()]; }\n : function (val) { return map[val]; }\n}\n\n/**\n * Check if a tag is a built-in tag.\n */\nvar isBuiltInTag = makeMap('slot,component', true);\n\n/**\n * Check if an attribute is a reserved attribute.\n */\nvar isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');\n\n/**\n * Remove an item from an array.\n */\nfunction remove (arr, item) {\n if (arr.length) {\n var index = arr.indexOf(item);\n if (index > -1) {\n return arr.splice(index, 1)\n }\n }\n}\n\n/**\n * Check whether an object has the property.\n */\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction hasOwn (obj, key) {\n return hasOwnProperty.call(obj, key)\n}\n\n/**\n * Create a cached version of a pure function.\n */\nfunction cached (fn) {\n var cache = Object.create(null);\n return (function cachedFn (str) {\n var hit = cache[str];\n return hit || (cache[str] = fn(str))\n })\n}\n\n/**\n * Camelize a hyphen-delimited string.\n */\nvar camelizeRE = /-(\\w)/g;\nvar camelize = cached(function (str) {\n return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })\n});\n\n/**\n * Capitalize a string.\n */\nvar capitalize = cached(function (str) {\n return str.charAt(0).toUpperCase() + str.slice(1)\n});\n\n/**\n * Hyphenate a camelCase string.\n */\nvar hyphenateRE = /\\B([A-Z])/g;\nvar hyphenate = cached(function (str) {\n return str.replace(hyphenateRE, '-$1').toLowerCase()\n});\n\n/**\n * Simple bind polyfill for environments that do not support it,\n * e.g., PhantomJS 1.x. Technically, we don't need this anymore\n * since native bind is now performant enough in most browsers.\n * But removing it would mean breaking code that was able to run in\n * PhantomJS 1.x, so this must be kept for backward compatibility.\n */\n\n/* istanbul ignore next */\nfunction polyfillBind (fn, ctx) {\n function boundFn (a) {\n var l = arguments.length;\n return l\n ? l > 1\n ? fn.apply(ctx, arguments)\n : fn.call(ctx, a)\n : fn.call(ctx)\n }\n\n boundFn._length = fn.length;\n return boundFn\n}\n\nfunction nativeBind (fn, ctx) {\n return fn.bind(ctx)\n}\n\nvar bind = Function.prototype.bind\n ? nativeBind\n : polyfillBind;\n\n/**\n * Convert an Array-like object to a real Array.\n */\nfunction toArray (list, start) {\n start = start || 0;\n var i = list.length - start;\n var ret = new Array(i);\n while (i--) {\n ret[i] = list[i + start];\n }\n return ret\n}\n\n/**\n * Mix properties into target object.\n */\nfunction extend (to, _from) {\n for (var key in _from) {\n to[key] = _from[key];\n }\n return to\n}\n\n/**\n * Merge an Array of Objects into a single Object.\n */\nfunction toObject (arr) {\n var res = {};\n for (var i = 0; i < arr.length; i++) {\n if (arr[i]) {\n extend(res, arr[i]);\n }\n }\n return res\n}\n\n/* eslint-disable no-unused-vars */\n\n/**\n * Perform no operation.\n * Stubbing args to make Flow happy without leaving useless transpiled code\n * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).\n */\nfunction noop (a, b, c) {}\n\n/**\n * Always return false.\n */\nvar no = function (a, b, c) { return false; };\n\n/* eslint-enable no-unused-vars */\n\n/**\n * Return the same value.\n */\nvar identity = function (_) { return _; };\n\n/**\n * Generate a string containing static keys from compiler modules.\n */\nfunction genStaticKeys (modules) {\n return modules.reduce(function (keys, m) {\n return keys.concat(m.staticKeys || [])\n }, []).join(',')\n}\n\n/**\n * Check if two values are loosely equal - that is,\n * if they are plain objects, do they have the same shape?\n */\nfunction looseEqual (a, b) {\n if (a === b) { return true }\n var isObjectA = isObject(a);\n var isObjectB = isObject(b);\n if (isObjectA && isObjectB) {\n try {\n var isArrayA = Array.isArray(a);\n var isArrayB = Array.isArray(b);\n if (isArrayA && isArrayB) {\n return a.length === b.length && a.every(function (e, i) {\n return looseEqual(e, b[i])\n })\n } else if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime()\n } else if (!isArrayA && !isArrayB) {\n var keysA = Object.keys(a);\n var keysB = Object.keys(b);\n return keysA.length === keysB.length && keysA.every(function (key) {\n return looseEqual(a[key], b[key])\n })\n } else {\n /* istanbul ignore next */\n return false\n }\n } catch (e) {\n /* istanbul ignore next */\n return false\n }\n } else if (!isObjectA && !isObjectB) {\n return String(a) === String(b)\n } else {\n return false\n }\n}\n\n/**\n * Return the first index at which a loosely equal value can be\n * found in the array (if value is a plain object, the array must\n * contain an object of the same shape), or -1 if it is not present.\n */\nfunction looseIndexOf (arr, val) {\n for (var i = 0; i < arr.length; i++) {\n if (looseEqual(arr[i], val)) { return i }\n }\n return -1\n}\n\n/**\n * Ensure a function is called only once.\n */\nfunction once (fn) {\n var called = false;\n return function () {\n if (!called) {\n called = true;\n fn.apply(this, arguments);\n }\n }\n}\n\nvar SSR_ATTR = 'data-server-rendered';\n\nvar ASSET_TYPES = [\n 'component',\n 'directive',\n 'filter'\n];\n\nvar LIFECYCLE_HOOKS = [\n 'beforeCreate',\n 'created',\n 'beforeMount',\n 'mounted',\n 'beforeUpdate',\n 'updated',\n 'beforeDestroy',\n 'destroyed',\n 'activated',\n 'deactivated',\n 'errorCaptured',\n 'serverPrefetch'\n];\n\n/* */\n\n\n\nvar config = ({\n /**\n * Option merge strategies (used in core/util/options)\n */\n // $flow-disable-line\n optionMergeStrategies: Object.create(null),\n\n /**\n * Whether to suppress warnings.\n */\n silent: false,\n\n /**\n * Show production mode tip message on boot?\n */\n productionTip: \"production\" !== 'production',\n\n /**\n * Whether to enable devtools\n */\n devtools: \"production\" !== 'production',\n\n /**\n * Whether to record perf\n */\n performance: false,\n\n /**\n * Error handler for watcher errors\n */\n errorHandler: null,\n\n /**\n * Warn handler for watcher warns\n */\n warnHandler: null,\n\n /**\n * Ignore certain custom elements\n */\n ignoredElements: [],\n\n /**\n * Custom user key aliases for v-on\n */\n // $flow-disable-line\n keyCodes: Object.create(null),\n\n /**\n * Check if a tag is reserved so that it cannot be registered as a\n * component. This is platform-dependent and may be overwritten.\n */\n isReservedTag: no,\n\n /**\n * Check if an attribute is reserved so that it cannot be used as a component\n * prop. This is platform-dependent and may be overwritten.\n */\n isReservedAttr: no,\n\n /**\n * Check if a tag is an unknown element.\n * Platform-dependent.\n */\n isUnknownElement: no,\n\n /**\n * Get the namespace of an element\n */\n getTagNamespace: noop,\n\n /**\n * Parse the real tag name for the specific platform.\n */\n parsePlatformTagName: identity,\n\n /**\n * Check if an attribute must be bound using property, e.g. value\n * Platform-dependent.\n */\n mustUseProp: no,\n\n /**\n * Perform updates asynchronously. Intended to be used by Vue Test Utils\n * This will significantly reduce performance if set to false.\n */\n async: true,\n\n /**\n * Exposed for legacy reasons\n */\n _lifecycleHooks: LIFECYCLE_HOOKS\n});\n\n/* */\n\n/**\n * unicode letters used for parsing html tags, component names and property paths.\n * using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname\n * skipping \\u10000-\\uEFFFF due to it freezing up PhantomJS\n */\nvar unicodeRegExp = /a-zA-Z\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD/;\n\n/**\n * Check if a string starts with $ or _\n */\nfunction isReserved (str) {\n var c = (str + '').charCodeAt(0);\n return c === 0x24 || c === 0x5F\n}\n\n/**\n * Define a property.\n */\nfunction def (obj, key, val, enumerable) {\n Object.defineProperty(obj, key, {\n value: val,\n enumerable: !!enumerable,\n writable: true,\n configurable: true\n });\n}\n\n/**\n * Parse simple path.\n */\nvar bailRE = new RegExp((\"[^\" + (unicodeRegExp.source) + \".$_\\\\d]\"));\nfunction parsePath (path) {\n if (bailRE.test(path)) {\n return\n }\n var segments = path.split('.');\n return function (obj) {\n for (var i = 0; i < segments.length; i++) {\n if (!obj) { return }\n obj = obj[segments[i]];\n }\n return obj\n }\n}\n\n/* */\n\n// can we use __proto__?\nvar hasProto = '__proto__' in {};\n\n// Browser environment sniffing\nvar inBrowser = typeof window !== 'undefined';\nvar inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;\nvar weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();\nvar UA = inBrowser && window.navigator.userAgent.toLowerCase();\nvar isIE = UA && /msie|trident/.test(UA);\nvar isIE9 = UA && UA.indexOf('msie 9.0') > 0;\nvar isEdge = UA && UA.indexOf('edge/') > 0;\nvar isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');\nvar isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');\nvar isChrome = UA && /chrome\\/\\d+/.test(UA) && !isEdge;\nvar isPhantomJS = UA && /phantomjs/.test(UA);\nvar isFF = UA && UA.match(/firefox\\/(\\d+)/);\n\n// Firefox has a \"watch\" function on Object.prototype...\nvar nativeWatch = ({}).watch;\n\nvar supportsPassive = false;\nif (inBrowser) {\n try {\n var opts = {};\n Object.defineProperty(opts, 'passive', ({\n get: function get () {\n /* istanbul ignore next */\n supportsPassive = true;\n }\n })); // https://github.com/facebook/flow/issues/285\n window.addEventListener('test-passive', null, opts);\n } catch (e) {}\n}\n\n// this needs to be lazy-evaled because vue may be required before\n// vue-server-renderer can set VUE_ENV\nvar _isServer;\nvar isServerRendering = function () {\n if (_isServer === undefined) {\n /* istanbul ignore if */\n if (!inBrowser && !inWeex && typeof global !== 'undefined') {\n // detect presence of vue-server-renderer and avoid\n // Webpack shimming the process\n _isServer = global['process'] && global['process'].env.VUE_ENV === 'server';\n } else {\n _isServer = false;\n }\n }\n return _isServer\n};\n\n// detect devtools\nvar devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\n/* istanbul ignore next */\nfunction isNative (Ctor) {\n return typeof Ctor === 'function' && /native code/.test(Ctor.toString())\n}\n\nvar hasSymbol =\n typeof Symbol !== 'undefined' && isNative(Symbol) &&\n typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);\n\nvar _Set;\n/* istanbul ignore if */ // $flow-disable-line\nif (typeof Set !== 'undefined' && isNative(Set)) {\n // use native Set when available.\n _Set = Set;\n} else {\n // a non-standard Set polyfill that only works with primitive keys.\n _Set = /*@__PURE__*/(function () {\n function Set () {\n this.set = Object.create(null);\n }\n Set.prototype.has = function has (key) {\n return this.set[key] === true\n };\n Set.prototype.add = function add (key) {\n this.set[key] = true;\n };\n Set.prototype.clear = function clear () {\n this.set = Object.create(null);\n };\n\n return Set;\n }());\n}\n\n/* */\n\nvar warn = noop;\nvar tip = noop;\nvar generateComponentTrace = (noop); // work around flow check\nvar formatComponentName = (noop);\n\nif (false) {\n var hasConsole = typeof console !== 'undefined';\n var classifyRE = /(?:^|[-_])(\\w)/g;\n var classify = function (str) { return str\n .replace(classifyRE, function (c) { return c.toUpperCase(); })\n .replace(/[-_]/g, ''); };\n\n warn = function (msg, vm) {\n var trace = vm ? generateComponentTrace(vm) : '';\n\n if (config.warnHandler) {\n config.warnHandler.call(null, msg, vm, trace);\n } else if (hasConsole && (!config.silent)) {\n console.error((\"[Vue warn]: \" + msg + trace));\n }\n };\n\n tip = function (msg, vm) {\n if (hasConsole && (!config.silent)) {\n console.warn(\"[Vue tip]: \" + msg + (\n vm ? generateComponentTrace(vm) : ''\n ));\n }\n };\n\n formatComponentName = function (vm, includeFile) {\n if (vm.$root === vm) {\n return ''\n }\n var options = typeof vm === 'function' && vm.cid != null\n ? vm.options\n : vm._isVue\n ? vm.$options || vm.constructor.options\n : vm;\n var name = options.name || options._componentTag;\n var file = options.__file;\n if (!name && file) {\n var match = file.match(/([^/\\\\]+)\\.vue$/);\n name = match && match[1];\n }\n\n return (\n (name ? (\"<\" + (classify(name)) + \">\") : \"\") +\n (file && includeFile !== false ? (\" at \" + file) : '')\n )\n };\n\n var repeat = function (str, n) {\n var res = '';\n while (n) {\n if (n % 2 === 1) { res += str; }\n if (n > 1) { str += str; }\n n >>= 1;\n }\n return res\n };\n\n generateComponentTrace = function (vm) {\n if (vm._isVue && vm.$parent) {\n var tree = [];\n var currentRecursiveSequence = 0;\n while (vm) {\n if (tree.length > 0) {\n var last = tree[tree.length - 1];\n if (last.constructor === vm.constructor) {\n currentRecursiveSequence++;\n vm = vm.$parent;\n continue\n } else if (currentRecursiveSequence > 0) {\n tree[tree.length - 1] = [last, currentRecursiveSequence];\n currentRecursiveSequence = 0;\n }\n }\n tree.push(vm);\n vm = vm.$parent;\n }\n return '\\n\\nfound in\\n\\n' + tree\n .map(function (vm, i) { return (\"\" + (i === 0 ? '---\x3e ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)\n ? ((formatComponentName(vm[0])) + \"... (\" + (vm[1]) + \" recursive calls)\")\n : formatComponentName(vm))); })\n .join('\\n')\n } else {\n return (\"\\n\\n(found in \" + (formatComponentName(vm)) + \")\")\n }\n };\n}\n\n/* */\n\nvar uid = 0;\n\n/**\n * A dep is an observable that can have multiple\n * directives subscribing to it.\n */\nvar Dep = function Dep () {\n this.id = uid++;\n this.subs = [];\n};\n\nDep.prototype.addSub = function addSub (sub) {\n this.subs.push(sub);\n};\n\nDep.prototype.removeSub = function removeSub (sub) {\n remove(this.subs, sub);\n};\n\nDep.prototype.depend = function depend () {\n if (Dep.target) {\n Dep.target.addDep(this);\n }\n};\n\nDep.prototype.notify = function notify () {\n // stabilize the subscriber list first\n var subs = this.subs.slice();\n if (false) {\n // subs aren't sorted in scheduler if not running async\n // we need to sort them now to make sure they fire in correct\n // order\n subs.sort(function (a, b) { return a.id - b.id; });\n }\n for (var i = 0, l = subs.length; i < l; i++) {\n subs[i].update();\n }\n};\n\n// The current target watcher being evaluated.\n// This is globally unique because only one watcher\n// can be evaluated at a time.\nDep.target = null;\nvar targetStack = [];\n\nfunction pushTarget (target) {\n targetStack.push(target);\n Dep.target = target;\n}\n\nfunction popTarget () {\n targetStack.pop();\n Dep.target = targetStack[targetStack.length - 1];\n}\n\n/* */\n\nvar VNode = function VNode (\n tag,\n data,\n children,\n text,\n elm,\n context,\n componentOptions,\n asyncFactory\n) {\n this.tag = tag;\n this.data = data;\n this.children = children;\n this.text = text;\n this.elm = elm;\n this.ns = undefined;\n this.context = context;\n this.fnContext = undefined;\n this.fnOptions = undefined;\n this.fnScopeId = undefined;\n this.key = data && data.key;\n this.componentOptions = componentOptions;\n this.componentInstance = undefined;\n this.parent = undefined;\n this.raw = false;\n this.isStatic = false;\n this.isRootInsert = true;\n this.isComment = false;\n this.isCloned = false;\n this.isOnce = false;\n this.asyncFactory = asyncFactory;\n this.asyncMeta = undefined;\n this.isAsyncPlaceholder = false;\n};\n\nvar prototypeAccessors = { child: { configurable: true } };\n\n// DEPRECATED: alias for componentInstance for backwards compat.\n/* istanbul ignore next */\nprototypeAccessors.child.get = function () {\n return this.componentInstance\n};\n\nObject.defineProperties( VNode.prototype, prototypeAccessors );\n\nvar createEmptyVNode = function (text) {\n if ( text === void 0 ) text = '';\n\n var node = new VNode();\n node.text = text;\n node.isComment = true;\n return node\n};\n\nfunction createTextVNode (val) {\n return new VNode(undefined, undefined, undefined, String(val))\n}\n\n// optimized shallow clone\n// used for static nodes and slot nodes because they may be reused across\n// multiple renders, cloning them avoids errors when DOM manipulations rely\n// on their elm reference.\nfunction cloneVNode (vnode) {\n var cloned = new VNode(\n vnode.tag,\n vnode.data,\n // #7975\n // clone children array to avoid mutating original in case of cloning\n // a child.\n vnode.children && vnode.children.slice(),\n vnode.text,\n vnode.elm,\n vnode.context,\n vnode.componentOptions,\n vnode.asyncFactory\n );\n cloned.ns = vnode.ns;\n cloned.isStatic = vnode.isStatic;\n cloned.key = vnode.key;\n cloned.isComment = vnode.isComment;\n cloned.fnContext = vnode.fnContext;\n cloned.fnOptions = vnode.fnOptions;\n cloned.fnScopeId = vnode.fnScopeId;\n cloned.asyncMeta = vnode.asyncMeta;\n cloned.isCloned = true;\n return cloned\n}\n\n/*\n * not type checking this file because flow doesn't play well with\n * dynamically accessing methods on Array prototype\n */\n\nvar arrayProto = Array.prototype;\nvar arrayMethods = Object.create(arrayProto);\n\nvar methodsToPatch = [\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'splice',\n 'sort',\n 'reverse'\n];\n\n/**\n * Intercept mutating methods and emit events\n */\nmethodsToPatch.forEach(function (method) {\n // cache original method\n var original = arrayProto[method];\n def(arrayMethods, method, function mutator () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n var result = original.apply(this, args);\n var ob = this.__ob__;\n var inserted;\n switch (method) {\n case 'push':\n case 'unshift':\n inserted = args;\n break\n case 'splice':\n inserted = args.slice(2);\n break\n }\n if (inserted) { ob.observeArray(inserted); }\n // notify change\n ob.dep.notify();\n return result\n });\n});\n\n/* */\n\nvar arrayKeys = Object.getOwnPropertyNames(arrayMethods);\n\n/**\n * In some cases we may want to disable observation inside a component's\n * update computation.\n */\nvar shouldObserve = true;\n\nfunction toggleObserving (value) {\n shouldObserve = value;\n}\n\n/**\n * Observer class that is attached to each observed\n * object. Once attached, the observer converts the target\n * object's property keys into getter/setters that\n * collect dependencies and dispatch updates.\n */\nvar Observer = function Observer (value) {\n this.value = value;\n this.dep = new Dep();\n this.vmCount = 0;\n def(value, '__ob__', this);\n if (Array.isArray(value)) {\n if (hasProto) {\n protoAugment(value, arrayMethods);\n } else {\n copyAugment(value, arrayMethods, arrayKeys);\n }\n this.observeArray(value);\n } else {\n this.walk(value);\n }\n};\n\n/**\n * Walk through all properties and convert them into\n * getter/setters. This method should only be called when\n * value type is Object.\n */\nObserver.prototype.walk = function walk (obj) {\n var keys = Object.keys(obj);\n for (var i = 0; i < keys.length; i++) {\n defineReactive$$1(obj, keys[i]);\n }\n};\n\n/**\n * Observe a list of Array items.\n */\nObserver.prototype.observeArray = function observeArray (items) {\n for (var i = 0, l = items.length; i < l; i++) {\n observe(items[i]);\n }\n};\n\n// helpers\n\n/**\n * Augment a target Object or Array by intercepting\n * the prototype chain using __proto__\n */\nfunction protoAugment (target, src) {\n /* eslint-disable no-proto */\n target.__proto__ = src;\n /* eslint-enable no-proto */\n}\n\n/**\n * Augment a target Object or Array by defining\n * hidden properties.\n */\n/* istanbul ignore next */\nfunction copyAugment (target, src, keys) {\n for (var i = 0, l = keys.length; i < l; i++) {\n var key = keys[i];\n def(target, key, src[key]);\n }\n}\n\n/**\n * Attempt to create an observer instance for a value,\n * returns the new observer if successfully observed,\n * or the existing observer if the value already has one.\n */\nfunction observe (value, asRootData) {\n if (!isObject(value) || value instanceof VNode) {\n return\n }\n var ob;\n if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {\n ob = value.__ob__;\n } else if (\n shouldObserve &&\n !isServerRendering() &&\n (Array.isArray(value) || isPlainObject(value)) &&\n Object.isExtensible(value) &&\n !value._isVue\n ) {\n ob = new Observer(value);\n }\n if (asRootData && ob) {\n ob.vmCount++;\n }\n return ob\n}\n\n/**\n * Define a reactive property on an Object.\n */\nfunction defineReactive$$1 (\n obj,\n key,\n val,\n customSetter,\n shallow\n) {\n var dep = new Dep();\n\n var property = Object.getOwnPropertyDescriptor(obj, key);\n if (property && property.configurable === false) {\n return\n }\n\n // cater for pre-defined getter/setters\n var getter = property && property.get;\n var setter = property && property.set;\n if ((!getter || setter) && arguments.length === 2) {\n val = obj[key];\n }\n\n var childOb = !shallow && observe(val);\n Object.defineProperty(obj, key, {\n enumerable: true,\n configurable: true,\n get: function reactiveGetter () {\n var value = getter ? getter.call(obj) : val;\n if (Dep.target) {\n dep.depend();\n if (childOb) {\n childOb.dep.depend();\n if (Array.isArray(value)) {\n dependArray(value);\n }\n }\n }\n return value\n },\n set: function reactiveSetter (newVal) {\n var value = getter ? getter.call(obj) : val;\n /* eslint-disable no-self-compare */\n if (newVal === value || (newVal !== newVal && value !== value)) {\n return\n }\n /* eslint-enable no-self-compare */\n if (false) {\n customSetter();\n }\n // #7981: for accessor properties without setter\n if (getter && !setter) { return }\n if (setter) {\n setter.call(obj, newVal);\n } else {\n val = newVal;\n }\n childOb = !shallow && observe(newVal);\n dep.notify();\n }\n });\n}\n\n/**\n * Set a property on an object. Adds the new property and\n * triggers change notification if the property doesn't\n * already exist.\n */\nfunction set (target, key, val) {\n if (false\n ) {\n warn((\"Cannot set reactive property on undefined, null, or primitive value: \" + ((target))));\n }\n if (Array.isArray(target) && isValidArrayIndex(key)) {\n target.length = Math.max(target.length, key);\n target.splice(key, 1, val);\n return val\n }\n if (key in target && !(key in Object.prototype)) {\n target[key] = val;\n return val\n }\n var ob = (target).__ob__;\n if (target._isVue || (ob && ob.vmCount)) {\n \"production\" !== 'production' && warn(\n 'Avoid adding reactive properties to a Vue instance or its root $data ' +\n 'at runtime - declare it upfront in the data option.'\n );\n return val\n }\n if (!ob) {\n target[key] = val;\n return val\n }\n defineReactive$$1(ob.value, key, val);\n ob.dep.notify();\n return val\n}\n\n/**\n * Delete a property and trigger change if necessary.\n */\nfunction del (target, key) {\n if (false\n ) {\n warn((\"Cannot delete reactive property on undefined, null, or primitive value: \" + ((target))));\n }\n if (Array.isArray(target) && isValidArrayIndex(key)) {\n target.splice(key, 1);\n return\n }\n var ob = (target).__ob__;\n if (target._isVue || (ob && ob.vmCount)) {\n \"production\" !== 'production' && warn(\n 'Avoid deleting properties on a Vue instance or its root $data ' +\n '- just set it to null.'\n );\n return\n }\n if (!hasOwn(target, key)) {\n return\n }\n delete target[key];\n if (!ob) {\n return\n }\n ob.dep.notify();\n}\n\n/**\n * Collect dependencies on array elements when the array is touched, since\n * we cannot intercept array element access like property getters.\n */\nfunction dependArray (value) {\n for (var e = (void 0), i = 0, l = value.length; i < l; i++) {\n e = value[i];\n e && e.__ob__ && e.__ob__.dep.depend();\n if (Array.isArray(e)) {\n dependArray(e);\n }\n }\n}\n\n/* */\n\n/**\n * Option overwriting strategies are functions that handle\n * how to merge a parent option value and a child option\n * value into the final value.\n */\nvar strats = config.optionMergeStrategies;\n\n/**\n * Options with restrictions\n */\nif (false) {\n strats.el = strats.propsData = function (parent, child, vm, key) {\n if (!vm) {\n warn(\n \"option \\\"\" + key + \"\\\" can only be used during instance \" +\n 'creation with the `new` keyword.'\n );\n }\n return defaultStrat(parent, child)\n };\n}\n\n/**\n * Helper that recursively merges two data objects together.\n */\nfunction mergeData (to, from) {\n if (!from) { return to }\n var key, toVal, fromVal;\n\n var keys = hasSymbol\n ? Reflect.ownKeys(from)\n : Object.keys(from);\n\n for (var i = 0; i < keys.length; i++) {\n key = keys[i];\n // in case the object is already observed...\n if (key === '__ob__') { continue }\n toVal = to[key];\n fromVal = from[key];\n if (!hasOwn(to, key)) {\n set(to, key, fromVal);\n } else if (\n toVal !== fromVal &&\n isPlainObject(toVal) &&\n isPlainObject(fromVal)\n ) {\n mergeData(toVal, fromVal);\n }\n }\n return to\n}\n\n/**\n * Data\n */\nfunction mergeDataOrFn (\n parentVal,\n childVal,\n vm\n) {\n if (!vm) {\n // in a Vue.extend merge, both should be functions\n if (!childVal) {\n return parentVal\n }\n if (!parentVal) {\n return childVal\n }\n // when parentVal & childVal are both present,\n // we need to return a function that returns the\n // merged result of both functions... no need to\n // check if parentVal is a function here because\n // it has to be a function to pass previous merges.\n return function mergedDataFn () {\n return mergeData(\n typeof childVal === 'function' ? childVal.call(this, this) : childVal,\n typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal\n )\n }\n } else {\n return function mergedInstanceDataFn () {\n // instance merge\n var instanceData = typeof childVal === 'function'\n ? childVal.call(vm, vm)\n : childVal;\n var defaultData = typeof parentVal === 'function'\n ? parentVal.call(vm, vm)\n : parentVal;\n if (instanceData) {\n return mergeData(instanceData, defaultData)\n } else {\n return defaultData\n }\n }\n }\n}\n\nstrats.data = function (\n parentVal,\n childVal,\n vm\n) {\n if (!vm) {\n if (childVal && typeof childVal !== 'function') {\n \"production\" !== 'production' && warn(\n 'The \"data\" option should be a function ' +\n 'that returns a per-instance value in component ' +\n 'definitions.',\n vm\n );\n\n return parentVal\n }\n return mergeDataOrFn(parentVal, childVal)\n }\n\n return mergeDataOrFn(parentVal, childVal, vm)\n};\n\n/**\n * Hooks and props are merged as arrays.\n */\nfunction mergeHook (\n parentVal,\n childVal\n) {\n var res = childVal\n ? parentVal\n ? parentVal.concat(childVal)\n : Array.isArray(childVal)\n ? childVal\n : [childVal]\n : parentVal;\n return res\n ? dedupeHooks(res)\n : res\n}\n\nfunction dedupeHooks (hooks) {\n var res = [];\n for (var i = 0; i < hooks.length; i++) {\n if (res.indexOf(hooks[i]) === -1) {\n res.push(hooks[i]);\n }\n }\n return res\n}\n\nLIFECYCLE_HOOKS.forEach(function (hook) {\n strats[hook] = mergeHook;\n});\n\n/**\n * Assets\n *\n * When a vm is present (instance creation), we need to do\n * a three-way merge between constructor options, instance\n * options and parent options.\n */\nfunction mergeAssets (\n parentVal,\n childVal,\n vm,\n key\n) {\n var res = Object.create(parentVal || null);\n if (childVal) {\n \"production\" !== 'production' && assertObjectType(key, childVal, vm);\n return extend(res, childVal)\n } else {\n return res\n }\n}\n\nASSET_TYPES.forEach(function (type) {\n strats[type + 's'] = mergeAssets;\n});\n\n/**\n * Watchers.\n *\n * Watchers hashes should not overwrite one\n * another, so we merge them as arrays.\n */\nstrats.watch = function (\n parentVal,\n childVal,\n vm,\n key\n) {\n // work around Firefox's Object.prototype.watch...\n if (parentVal === nativeWatch) { parentVal = undefined; }\n if (childVal === nativeWatch) { childVal = undefined; }\n /* istanbul ignore if */\n if (!childVal) { return Object.create(parentVal || null) }\n if (false) {\n assertObjectType(key, childVal, vm);\n }\n if (!parentVal) { return childVal }\n var ret = {};\n extend(ret, parentVal);\n for (var key$1 in childVal) {\n var parent = ret[key$1];\n var child = childVal[key$1];\n if (parent && !Array.isArray(parent)) {\n parent = [parent];\n }\n ret[key$1] = parent\n ? parent.concat(child)\n : Array.isArray(child) ? child : [child];\n }\n return ret\n};\n\n/**\n * Other object hashes.\n */\nstrats.props =\nstrats.methods =\nstrats.inject =\nstrats.computed = function (\n parentVal,\n childVal,\n vm,\n key\n) {\n if (childVal && \"production\" !== 'production') {\n assertObjectType(key, childVal, vm);\n }\n if (!parentVal) { return childVal }\n var ret = Object.create(null);\n extend(ret, parentVal);\n if (childVal) { extend(ret, childVal); }\n return ret\n};\nstrats.provide = mergeDataOrFn;\n\n/**\n * Default strategy.\n */\nvar defaultStrat = function (parentVal, childVal) {\n return childVal === undefined\n ? parentVal\n : childVal\n};\n\n/**\n * Validate component names\n */\nfunction checkComponents (options) {\n for (var key in options.components) {\n validateComponentName(key);\n }\n}\n\nfunction validateComponentName (name) {\n if (!new RegExp((\"^[a-zA-Z][\\\\-\\\\.0-9_\" + (unicodeRegExp.source) + \"]*$\")).test(name)) {\n warn(\n 'Invalid component name: \"' + name + '\". Component names ' +\n 'should conform to valid custom element name in html5 specification.'\n );\n }\n if (isBuiltInTag(name) || config.isReservedTag(name)) {\n warn(\n 'Do not use built-in or reserved HTML elements as component ' +\n 'id: ' + name\n );\n }\n}\n\n/**\n * Ensure all props option syntax are normalized into the\n * Object-based format.\n */\nfunction normalizeProps (options, vm) {\n var props = options.props;\n if (!props) { return }\n var res = {};\n var i, val, name;\n if (Array.isArray(props)) {\n i = props.length;\n while (i--) {\n val = props[i];\n if (typeof val === 'string') {\n name = camelize(val);\n res[name] = { type: null };\n } else if (false) {\n warn('props must be strings when using array syntax.');\n }\n }\n } else if (isPlainObject(props)) {\n for (var key in props) {\n val = props[key];\n name = camelize(key);\n res[name] = isPlainObject(val)\n ? val\n : { type: val };\n }\n } else if (false) {\n warn(\n \"Invalid value for option \\\"props\\\": expected an Array or an Object, \" +\n \"but got \" + (toRawType(props)) + \".\",\n vm\n );\n }\n options.props = res;\n}\n\n/**\n * Normalize all injections into Object-based format\n */\nfunction normalizeInject (options, vm) {\n var inject = options.inject;\n if (!inject) { return }\n var normalized = options.inject = {};\n if (Array.isArray(inject)) {\n for (var i = 0; i < inject.length; i++) {\n normalized[inject[i]] = { from: inject[i] };\n }\n } else if (isPlainObject(inject)) {\n for (var key in inject) {\n var val = inject[key];\n normalized[key] = isPlainObject(val)\n ? extend({ from: key }, val)\n : { from: val };\n }\n } else if (false) {\n warn(\n \"Invalid value for option \\\"inject\\\": expected an Array or an Object, \" +\n \"but got \" + (toRawType(inject)) + \".\",\n vm\n );\n }\n}\n\n/**\n * Normalize raw function directives into object format.\n */\nfunction normalizeDirectives (options) {\n var dirs = options.directives;\n if (dirs) {\n for (var key in dirs) {\n var def$$1 = dirs[key];\n if (typeof def$$1 === 'function') {\n dirs[key] = { bind: def$$1, update: def$$1 };\n }\n }\n }\n}\n\nfunction assertObjectType (name, value, vm) {\n if (!isPlainObject(value)) {\n warn(\n \"Invalid value for option \\\"\" + name + \"\\\": expected an Object, \" +\n \"but got \" + (toRawType(value)) + \".\",\n vm\n );\n }\n}\n\n/**\n * Merge two option objects into a new one.\n * Core utility used in both instantiation and inheritance.\n */\nfunction mergeOptions (\n parent,\n child,\n vm\n) {\n if (false) {\n checkComponents(child);\n }\n\n if (typeof child === 'function') {\n child = child.options;\n }\n\n normalizeProps(child, vm);\n normalizeInject(child, vm);\n normalizeDirectives(child);\n\n // Apply extends and mixins on the child options,\n // but only if it is a raw options object that isn't\n // the result of another mergeOptions call.\n // Only merged options has the _base property.\n if (!child._base) {\n if (child.extends) {\n parent = mergeOptions(parent, child.extends, vm);\n }\n if (child.mixins) {\n for (var i = 0, l = child.mixins.length; i < l; i++) {\n parent = mergeOptions(parent, child.mixins[i], vm);\n }\n }\n }\n\n var options = {};\n var key;\n for (key in parent) {\n mergeField(key);\n }\n for (key in child) {\n if (!hasOwn(parent, key)) {\n mergeField(key);\n }\n }\n function mergeField (key) {\n var strat = strats[key] || defaultStrat;\n options[key] = strat(parent[key], child[key], vm, key);\n }\n return options\n}\n\n/**\n * Resolve an asset.\n * This function is used because child instances need access\n * to assets defined in its ancestor chain.\n */\nfunction resolveAsset (\n options,\n type,\n id,\n warnMissing\n) {\n /* istanbul ignore if */\n if (typeof id !== 'string') {\n return\n }\n var assets = options[type];\n // check local registration variations first\n if (hasOwn(assets, id)) { return assets[id] }\n var camelizedId = camelize(id);\n if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }\n var PascalCaseId = capitalize(camelizedId);\n if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }\n // fallback to prototype chain\n var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];\n if (false) {\n warn(\n 'Failed to resolve ' + type.slice(0, -1) + ': ' + id,\n options\n );\n }\n return res\n}\n\n/* */\n\n\n\nfunction validateProp (\n key,\n propOptions,\n propsData,\n vm\n) {\n var prop = propOptions[key];\n var absent = !hasOwn(propsData, key);\n var value = propsData[key];\n // boolean casting\n var booleanIndex = getTypeIndex(Boolean, prop.type);\n if (booleanIndex > -1) {\n if (absent && !hasOwn(prop, 'default')) {\n value = false;\n } else if (value === '' || value === hyphenate(key)) {\n // only cast empty string / same name to boolean if\n // boolean has higher priority\n var stringIndex = getTypeIndex(String, prop.type);\n if (stringIndex < 0 || booleanIndex < stringIndex) {\n value = true;\n }\n }\n }\n // check default value\n if (value === undefined) {\n value = getPropDefaultValue(vm, prop, key);\n // since the default value is a fresh copy,\n // make sure to observe it.\n var prevShouldObserve = shouldObserve;\n toggleObserving(true);\n observe(value);\n toggleObserving(prevShouldObserve);\n }\n if (\n false\n ) {\n assertProp(prop, key, value, vm, absent);\n }\n return value\n}\n\n/**\n * Get the default value of a prop.\n */\nfunction getPropDefaultValue (vm, prop, key) {\n // no default, return undefined\n if (!hasOwn(prop, 'default')) {\n return undefined\n }\n var def = prop.default;\n // warn against non-factory defaults for Object & Array\n if (false) {\n warn(\n 'Invalid default value for prop \"' + key + '\": ' +\n 'Props with type Object/Array must use a factory function ' +\n 'to return the default value.',\n vm\n );\n }\n // the raw prop value was also undefined from previous render,\n // return previous default value to avoid unnecessary watcher trigger\n if (vm && vm.$options.propsData &&\n vm.$options.propsData[key] === undefined &&\n vm._props[key] !== undefined\n ) {\n return vm._props[key]\n }\n // call factory function for non-Function types\n // a value is Function if its prototype is function even across different execution context\n return typeof def === 'function' && getType(prop.type) !== 'Function'\n ? def.call(vm)\n : def\n}\n\n/**\n * Assert whether a prop is valid.\n */\nfunction assertProp (\n prop,\n name,\n value,\n vm,\n absent\n) {\n if (prop.required && absent) {\n warn(\n 'Missing required prop: \"' + name + '\"',\n vm\n );\n return\n }\n if (value == null && !prop.required) {\n return\n }\n var type = prop.type;\n var valid = !type || type === true;\n var expectedTypes = [];\n if (type) {\n if (!Array.isArray(type)) {\n type = [type];\n }\n for (var i = 0; i < type.length && !valid; i++) {\n var assertedType = assertType(value, type[i], vm);\n expectedTypes.push(assertedType.expectedType || '');\n valid = assertedType.valid;\n }\n }\n\n var haveExpectedTypes = expectedTypes.some(function (t) { return t; });\n if (!valid && haveExpectedTypes) {\n warn(\n getInvalidTypeMessage(name, value, expectedTypes),\n vm\n );\n return\n }\n var validator = prop.validator;\n if (validator) {\n if (!validator(value)) {\n warn(\n 'Invalid prop: custom validator check failed for prop \"' + name + '\".',\n vm\n );\n }\n }\n}\n\nvar simpleCheckRE = /^(String|Number|Boolean|Function|Symbol|BigInt)$/;\n\nfunction assertType (value, type, vm) {\n var valid;\n var expectedType = getType(type);\n if (simpleCheckRE.test(expectedType)) {\n var t = typeof value;\n valid = t === expectedType.toLowerCase();\n // for primitive wrapper objects\n if (!valid && t === 'object') {\n valid = value instanceof type;\n }\n } else if (expectedType === 'Object') {\n valid = isPlainObject(value);\n } else if (expectedType === 'Array') {\n valid = Array.isArray(value);\n } else {\n try {\n valid = value instanceof type;\n } catch (e) {\n warn('Invalid prop type: \"' + String(type) + '\" is not a constructor', vm);\n valid = false;\n }\n }\n return {\n valid: valid,\n expectedType: expectedType\n }\n}\n\nvar functionTypeCheckRE = /^\\s*function (\\w+)/;\n\n/**\n * Use function string name to check built-in types,\n * because a simple equality check will fail when running\n * across different vms / iframes.\n */\nfunction getType (fn) {\n var match = fn && fn.toString().match(functionTypeCheckRE);\n return match ? match[1] : ''\n}\n\nfunction isSameType (a, b) {\n return getType(a) === getType(b)\n}\n\nfunction getTypeIndex (type, expectedTypes) {\n if (!Array.isArray(expectedTypes)) {\n return isSameType(expectedTypes, type) ? 0 : -1\n }\n for (var i = 0, len = expectedTypes.length; i < len; i++) {\n if (isSameType(expectedTypes[i], type)) {\n return i\n }\n }\n return -1\n}\n\nfunction getInvalidTypeMessage (name, value, expectedTypes) {\n var message = \"Invalid prop: type check failed for prop \\\"\" + name + \"\\\".\" +\n \" Expected \" + (expectedTypes.map(capitalize).join(', '));\n var expectedType = expectedTypes[0];\n var receivedType = toRawType(value);\n // check if we need to specify expected value\n if (\n expectedTypes.length === 1 &&\n isExplicable(expectedType) &&\n isExplicable(typeof value) &&\n !isBoolean(expectedType, receivedType)\n ) {\n message += \" with value \" + (styleValue(value, expectedType));\n }\n message += \", got \" + receivedType + \" \";\n // check if we need to specify received value\n if (isExplicable(receivedType)) {\n message += \"with value \" + (styleValue(value, receivedType)) + \".\";\n }\n return message\n}\n\nfunction styleValue (value, type) {\n if (type === 'String') {\n return (\"\\\"\" + value + \"\\\"\")\n } else if (type === 'Number') {\n return (\"\" + (Number(value)))\n } else {\n return (\"\" + value)\n }\n}\n\nvar EXPLICABLE_TYPES = ['string', 'number', 'boolean'];\nfunction isExplicable (value) {\n return EXPLICABLE_TYPES.some(function (elem) { return value.toLowerCase() === elem; })\n}\n\nfunction isBoolean () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; })\n}\n\n/* */\n\nfunction handleError (err, vm, info) {\n // Deactivate deps tracking while processing error handler to avoid possible infinite rendering.\n // See: https://github.com/vuejs/vuex/issues/1505\n pushTarget();\n try {\n if (vm) {\n var cur = vm;\n while ((cur = cur.$parent)) {\n var hooks = cur.$options.errorCaptured;\n if (hooks) {\n for (var i = 0; i < hooks.length; i++) {\n try {\n var capture = hooks[i].call(cur, err, vm, info) === false;\n if (capture) { return }\n } catch (e) {\n globalHandleError(e, cur, 'errorCaptured hook');\n }\n }\n }\n }\n }\n globalHandleError(err, vm, info);\n } finally {\n popTarget();\n }\n}\n\nfunction invokeWithErrorHandling (\n handler,\n context,\n args,\n vm,\n info\n) {\n var res;\n try {\n res = args ? handler.apply(context, args) : handler.call(context);\n if (res && !res._isVue && isPromise(res) && !res._handled) {\n res.catch(function (e) { return handleError(e, vm, info + \" (Promise/async)\"); });\n // issue #9511\n // avoid catch triggering multiple times when nested calls\n res._handled = true;\n }\n } catch (e) {\n handleError(e, vm, info);\n }\n return res\n}\n\nfunction globalHandleError (err, vm, info) {\n if (config.errorHandler) {\n try {\n return config.errorHandler.call(null, err, vm, info)\n } catch (e) {\n // if the user intentionally throws the original error in the handler,\n // do not log it twice\n if (e !== err) {\n logError(e, null, 'config.errorHandler');\n }\n }\n }\n logError(err, vm, info);\n}\n\nfunction logError (err, vm, info) {\n if (false) {\n warn((\"Error in \" + info + \": \\\"\" + (err.toString()) + \"\\\"\"), vm);\n }\n /* istanbul ignore else */\n if ((inBrowser || inWeex) && typeof console !== 'undefined') {\n console.error(err);\n } else {\n throw err\n }\n}\n\n/* */\n\nvar isUsingMicroTask = false;\n\nvar callbacks = [];\nvar pending = false;\n\nfunction flushCallbacks () {\n pending = false;\n var copies = callbacks.slice(0);\n callbacks.length = 0;\n for (var i = 0; i < copies.length; i++) {\n copies[i]();\n }\n}\n\n// Here we have async deferring wrappers using microtasks.\n// In 2.5 we used (macro) tasks (in combination with microtasks).\n// However, it has subtle problems when state is changed right before repaint\n// (e.g. #6813, out-in transitions).\n// Also, using (macro) tasks in event handler would cause some weird behaviors\n// that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).\n// So we now use microtasks everywhere, again.\n// A major drawback of this tradeoff is that there are some scenarios\n// where microtasks have too high a priority and fire in between supposedly\n// sequential events (e.g. #4521, #6690, which have workarounds)\n// or even between bubbling of the same event (#6566).\nvar timerFunc;\n\n// The nextTick behavior leverages the microtask queue, which can be accessed\n// via either native Promise.then or MutationObserver.\n// MutationObserver has wider support, however it is seriously bugged in\n// UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It\n// completely stops working after triggering a few times... so, if native\n// Promise is available, we will use it:\n/* istanbul ignore next, $flow-disable-line */\nif (typeof Promise !== 'undefined' && isNative(Promise)) {\n var p = Promise.resolve();\n timerFunc = function () {\n p.then(flushCallbacks);\n // In problematic UIWebViews, Promise.then doesn't completely break, but\n // it can get stuck in a weird state where callbacks are pushed into the\n // microtask queue but the queue isn't being flushed, until the browser\n // needs to do some other work, e.g. handle a timer. Therefore we can\n // \"force\" the microtask queue to be flushed by adding an empty timer.\n if (isIOS) { setTimeout(noop); }\n };\n isUsingMicroTask = true;\n} else if (!isIE && typeof MutationObserver !== 'undefined' && (\n isNative(MutationObserver) ||\n // PhantomJS and iOS 7.x\n MutationObserver.toString() === '[object MutationObserverConstructor]'\n)) {\n // Use MutationObserver where native Promise is not available,\n // e.g. PhantomJS, iOS7, Android 4.4\n // (#6466 MutationObserver is unreliable in IE11)\n var counter = 1;\n var observer = new MutationObserver(flushCallbacks);\n var textNode = document.createTextNode(String(counter));\n observer.observe(textNode, {\n characterData: true\n });\n timerFunc = function () {\n counter = (counter + 1) % 2;\n textNode.data = String(counter);\n };\n isUsingMicroTask = true;\n} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {\n // Fallback to setImmediate.\n // Technically it leverages the (macro) task queue,\n // but it is still a better choice than setTimeout.\n timerFunc = function () {\n setImmediate(flushCallbacks);\n };\n} else {\n // Fallback to setTimeout.\n timerFunc = function () {\n setTimeout(flushCallbacks, 0);\n };\n}\n\nfunction nextTick (cb, ctx) {\n var _resolve;\n callbacks.push(function () {\n if (cb) {\n try {\n cb.call(ctx);\n } catch (e) {\n handleError(e, ctx, 'nextTick');\n }\n } else if (_resolve) {\n _resolve(ctx);\n }\n });\n if (!pending) {\n pending = true;\n timerFunc();\n }\n // $flow-disable-line\n if (!cb && typeof Promise !== 'undefined') {\n return new Promise(function (resolve) {\n _resolve = resolve;\n })\n }\n}\n\n/* */\n\nvar mark;\nvar measure;\n\nif (false) {\n var perf = inBrowser && window.performance;\n /* istanbul ignore if */\n if (\n perf &&\n perf.mark &&\n perf.measure &&\n perf.clearMarks &&\n perf.clearMeasures\n ) {\n mark = function (tag) { return perf.mark(tag); };\n measure = function (name, startTag, endTag) {\n perf.measure(name, startTag, endTag);\n perf.clearMarks(startTag);\n perf.clearMarks(endTag);\n // perf.clearMeasures(name)\n };\n }\n}\n\n/* not type checking this file because flow doesn't play well with Proxy */\n\nvar initProxy;\n\nif (false) {\n var allowedGlobals = makeMap(\n 'Infinity,undefined,NaN,isFinite,isNaN,' +\n 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +\n 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,' +\n 'require' // for Webpack/Browserify\n );\n\n var warnNonPresent = function (target, key) {\n warn(\n \"Property or method \\\"\" + key + \"\\\" is not defined on the instance but \" +\n 'referenced during render. Make sure that this property is reactive, ' +\n 'either in the data option, or for class-based components, by ' +\n 'initializing the property. ' +\n 'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',\n target\n );\n };\n\n var warnReservedPrefix = function (target, key) {\n warn(\n \"Property \\\"\" + key + \"\\\" must be accessed with \\\"$data.\" + key + \"\\\" because \" +\n 'properties starting with \"$\" or \"_\" are not proxied in the Vue instance to ' +\n 'prevent conflicts with Vue internals. ' +\n 'See: https://vuejs.org/v2/api/#data',\n target\n );\n };\n\n var hasProxy =\n typeof Proxy !== 'undefined' && isNative(Proxy);\n\n if (hasProxy) {\n var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');\n config.keyCodes = new Proxy(config.keyCodes, {\n set: function set (target, key, value) {\n if (isBuiltInModifier(key)) {\n warn((\"Avoid overwriting built-in modifier in config.keyCodes: .\" + key));\n return false\n } else {\n target[key] = value;\n return true\n }\n }\n });\n }\n\n var hasHandler = {\n has: function has (target, key) {\n var has = key in target;\n var isAllowed = allowedGlobals(key) ||\n (typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data));\n if (!has && !isAllowed) {\n if (key in target.$data) { warnReservedPrefix(target, key); }\n else { warnNonPresent(target, key); }\n }\n return has || !isAllowed\n }\n };\n\n var getHandler = {\n get: function get (target, key) {\n if (typeof key === 'string' && !(key in target)) {\n if (key in target.$data) { warnReservedPrefix(target, key); }\n else { warnNonPresent(target, key); }\n }\n return target[key]\n }\n };\n\n initProxy = function initProxy (vm) {\n if (hasProxy) {\n // determine which proxy handler to use\n var options = vm.$options;\n var handlers = options.render && options.render._withStripped\n ? getHandler\n : hasHandler;\n vm._renderProxy = new Proxy(vm, handlers);\n } else {\n vm._renderProxy = vm;\n }\n };\n}\n\n/* */\n\nvar seenObjects = new _Set();\n\n/**\n * Recursively traverse an object to evoke all converted\n * getters, so that every nested property inside the object\n * is collected as a \"deep\" dependency.\n */\nfunction traverse (val) {\n _traverse(val, seenObjects);\n seenObjects.clear();\n}\n\nfunction _traverse (val, seen) {\n var i, keys;\n var isA = Array.isArray(val);\n if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {\n return\n }\n if (val.__ob__) {\n var depId = val.__ob__.dep.id;\n if (seen.has(depId)) {\n return\n }\n seen.add(depId);\n }\n if (isA) {\n i = val.length;\n while (i--) { _traverse(val[i], seen); }\n } else {\n keys = Object.keys(val);\n i = keys.length;\n while (i--) { _traverse(val[keys[i]], seen); }\n }\n}\n\n/* */\n\nvar normalizeEvent = cached(function (name) {\n var passive = name.charAt(0) === '&';\n name = passive ? name.slice(1) : name;\n var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first\n name = once$$1 ? name.slice(1) : name;\n var capture = name.charAt(0) === '!';\n name = capture ? name.slice(1) : name;\n return {\n name: name,\n once: once$$1,\n capture: capture,\n passive: passive\n }\n});\n\nfunction createFnInvoker (fns, vm) {\n function invoker () {\n var arguments$1 = arguments;\n\n var fns = invoker.fns;\n if (Array.isArray(fns)) {\n var cloned = fns.slice();\n for (var i = 0; i < cloned.length; i++) {\n invokeWithErrorHandling(cloned[i], null, arguments$1, vm, \"v-on handler\");\n }\n } else {\n // return handler return value for single handlers\n return invokeWithErrorHandling(fns, null, arguments, vm, \"v-on handler\")\n }\n }\n invoker.fns = fns;\n return invoker\n}\n\nfunction updateListeners (\n on,\n oldOn,\n add,\n remove$$1,\n createOnceHandler,\n vm\n) {\n var name, def$$1, cur, old, event;\n for (name in on) {\n def$$1 = cur = on[name];\n old = oldOn[name];\n event = normalizeEvent(name);\n if (isUndef(cur)) {\n \"production\" !== 'production' && warn(\n \"Invalid handler for event \\\"\" + (event.name) + \"\\\": got \" + String(cur),\n vm\n );\n } else if (isUndef(old)) {\n if (isUndef(cur.fns)) {\n cur = on[name] = createFnInvoker(cur, vm);\n }\n if (isTrue(event.once)) {\n cur = on[name] = createOnceHandler(event.name, cur, event.capture);\n }\n add(event.name, cur, event.capture, event.passive, event.params);\n } else if (cur !== old) {\n old.fns = cur;\n on[name] = old;\n }\n }\n for (name in oldOn) {\n if (isUndef(on[name])) {\n event = normalizeEvent(name);\n remove$$1(event.name, oldOn[name], event.capture);\n }\n }\n}\n\n/* */\n\nfunction mergeVNodeHook (def, hookKey, hook) {\n if (def instanceof VNode) {\n def = def.data.hook || (def.data.hook = {});\n }\n var invoker;\n var oldHook = def[hookKey];\n\n function wrappedHook () {\n hook.apply(this, arguments);\n // important: remove merged hook to ensure it's called only once\n // and prevent memory leak\n remove(invoker.fns, wrappedHook);\n }\n\n if (isUndef(oldHook)) {\n // no existing hook\n invoker = createFnInvoker([wrappedHook]);\n } else {\n /* istanbul ignore if */\n if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {\n // already a merged invoker\n invoker = oldHook;\n invoker.fns.push(wrappedHook);\n } else {\n // existing plain hook\n invoker = createFnInvoker([oldHook, wrappedHook]);\n }\n }\n\n invoker.merged = true;\n def[hookKey] = invoker;\n}\n\n/* */\n\nfunction extractPropsFromVNodeData (\n data,\n Ctor,\n tag\n) {\n // we are only extracting raw values here.\n // validation and default values are handled in the child\n // component itself.\n var propOptions = Ctor.options.props;\n if (isUndef(propOptions)) {\n return\n }\n var res = {};\n var attrs = data.attrs;\n var props = data.props;\n if (isDef(attrs) || isDef(props)) {\n for (var key in propOptions) {\n var altKey = hyphenate(key);\n if (false) {\n var keyInLowerCase = key.toLowerCase();\n if (\n key !== keyInLowerCase &&\n attrs && hasOwn(attrs, keyInLowerCase)\n ) {\n tip(\n \"Prop \\\"\" + keyInLowerCase + \"\\\" is passed to component \" +\n (formatComponentName(tag || Ctor)) + \", but the declared prop name is\" +\n \" \\\"\" + key + \"\\\". \" +\n \"Note that HTML attributes are case-insensitive and camelCased \" +\n \"props need to use their kebab-case equivalents when using in-DOM \" +\n \"templates. You should probably use \\\"\" + altKey + \"\\\" instead of \\\"\" + key + \"\\\".\"\n );\n }\n }\n checkProp(res, props, key, altKey, true) ||\n checkProp(res, attrs, key, altKey, false);\n }\n }\n return res\n}\n\nfunction checkProp (\n res,\n hash,\n key,\n altKey,\n preserve\n) {\n if (isDef(hash)) {\n if (hasOwn(hash, key)) {\n res[key] = hash[key];\n if (!preserve) {\n delete hash[key];\n }\n return true\n } else if (hasOwn(hash, altKey)) {\n res[key] = hash[altKey];\n if (!preserve) {\n delete hash[altKey];\n }\n return true\n }\n }\n return false\n}\n\n/* */\n\n// The template compiler attempts to minimize the need for normalization by\n// statically analyzing the template at compile time.\n//\n// For plain HTML markup, normalization can be completely skipped because the\n// generated render function is guaranteed to return Array. There are\n// two cases where extra normalization is needed:\n\n// 1. When the children contains components - because a functional component\n// may return an Array instead of a single root. In this case, just a simple\n// normalization is needed - if any child is an Array, we flatten the whole\n// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep\n// because functional components already normalize their own children.\nfunction simpleNormalizeChildren (children) {\n for (var i = 0; i < children.length; i++) {\n if (Array.isArray(children[i])) {\n return Array.prototype.concat.apply([], children)\n }\n }\n return children\n}\n\n// 2. When the children contains constructs that always generated nested Arrays,\n// e.g.