"use strict"; /* * ATTENTION: An "eval-source-map" devtool has been used. * This devtool is neither made for production nor for readable output files. * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) * or disable the default devtool with "devtool: false". * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). */ exports.id = "vendor-chunks/@twa-dev"; exports.ids = ["vendor-chunks/@twa-dev"]; exports.modules = { /***/ "(ssr)/./node_modules/@twa-dev/sdk/dist/index.js": /*!*************************************************!*\ !*** ./node_modules/@twa-dev/sdk/dist/index.js ***! \*************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nvar sdk_1 = __webpack_require__(/*! ./sdk */ \"(ssr)/./node_modules/@twa-dev/sdk/dist/sdk.js\");\nexports[\"default\"] = sdk_1.WebApp;\n//# sourceMappingURL=index.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHR3YS1kZXYvc2RrL2Rpc3QvaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsWUFBWSxtQkFBTyxDQUFDLDREQUFPO0FBQzNCLGtCQUFlO0FBQ2YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9jYW1wZmlyZS1pZC8uL25vZGVfbW9kdWxlcy9AdHdhLWRldi9zZGsvZGlzdC9pbmRleC5qcz80NzkzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHNka18xID0gcmVxdWlyZShcIi4vc2RrXCIpO1xuZXhwb3J0cy5kZWZhdWx0ID0gc2RrXzEuV2ViQXBwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@twa-dev/sdk/dist/index.js\n"); /***/ }), /***/ "(ssr)/./node_modules/@twa-dev/sdk/dist/sdk.js": /*!***********************************************!*\ !*** ./node_modules/@twa-dev/sdk/dist/sdk.js ***! \***********************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { eval("\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.WebApp = void 0;\n__webpack_require__(/*! ./telegram-web-apps */ \"(ssr)/./node_modules/@twa-dev/sdk/dist/telegram-web-apps.js\");\nvar telegramWindow = window;\nexports.WebApp = telegramWindow.Telegram.WebApp;\n//# sourceMappingURL=sdk.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHR3YS1kZXYvc2RrL2Rpc3Qvc2RrLmpzIiwibWFwcGluZ3MiOiJBQUFhO0FBQ2IsOENBQTZDLEVBQUUsYUFBYSxFQUFDO0FBQzdELGNBQWM7QUFDZCxtQkFBTyxDQUFDLHdGQUFxQjtBQUM3QjtBQUNBLGNBQWM7QUFDZCIsInNvdXJjZXMiOlsid2VicGFjazovL2NhbXBmaXJlLWlkLy4vbm9kZV9tb2R1bGVzL0B0d2EtZGV2L3Nkay9kaXN0L3Nkay5qcz85MDJhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5XZWJBcHAgPSB2b2lkIDA7XG5yZXF1aXJlKFwiLi90ZWxlZ3JhbS13ZWItYXBwc1wiKTtcbnZhciB0ZWxlZ3JhbVdpbmRvdyA9IHdpbmRvdztcbmV4cG9ydHMuV2ViQXBwID0gdGVsZWdyYW1XaW5kb3cuVGVsZWdyYW0uV2ViQXBwO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2RrLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@twa-dev/sdk/dist/sdk.js\n"); /***/ }), /***/ "(ssr)/./node_modules/@twa-dev/sdk/dist/telegram-web-apps.js": /*!*************************************************************!*\ !*** ./node_modules/@twa-dev/sdk/dist/telegram-web-apps.js ***! \*************************************************************/ /***/ (() => { eval("\n// WebView\n(function () {\n var eventHandlers = {};\n var locationHash = '';\n try {\n locationHash = location.hash.toString();\n }\n catch (e) { }\n var initParams = urlParseHashParams(locationHash);\n var storedParams = sessionStorageGet('initParams');\n if (storedParams) {\n for (var key in storedParams) {\n if (typeof initParams[key] === 'undefined') {\n initParams[key] = storedParams[key];\n }\n }\n }\n sessionStorageSet('initParams', initParams);\n var isIframe = false, iFrameStyle;\n try {\n isIframe = (window.parent != null && window != window.parent);\n if (isIframe) {\n window.addEventListener('message', function (event) {\n if (event.source !== window.parent)\n return;\n try {\n var dataParsed = JSON.parse(event.data);\n }\n catch (e) {\n return;\n }\n if (!dataParsed || !dataParsed.eventType) {\n return;\n }\n if (dataParsed.eventType == 'set_custom_style') {\n iFrameStyle.innerHTML = dataParsed.eventData;\n }\n else {\n receiveEvent(dataParsed.eventType, dataParsed.eventData);\n }\n });\n iFrameStyle = document.createElement('style');\n document.head.appendChild(iFrameStyle);\n try {\n window.parent.postMessage(JSON.stringify({ eventType: 'iframe_ready' }), '*');\n }\n catch (e) { }\n }\n }\n catch (e) { }\n function urlSafeDecode(urlencoded) {\n try {\n urlencoded = urlencoded.replace(/\\+/g, '%20');\n return decodeURIComponent(urlencoded);\n }\n catch (e) {\n return urlencoded;\n }\n }\n function urlParseHashParams(locationHash) {\n locationHash = locationHash.replace(/^#/, '');\n var params = {};\n if (!locationHash.length) {\n return params;\n }\n if (locationHash.indexOf('=') < 0 && locationHash.indexOf('?') < 0) {\n params._path = urlSafeDecode(locationHash);\n return params;\n }\n var qIndex = locationHash.indexOf('?');\n if (qIndex >= 0) {\n var pathParam = locationHash.substr(0, qIndex);\n params._path = urlSafeDecode(pathParam);\n locationHash = locationHash.substr(qIndex + 1);\n }\n var query_params = urlParseQueryString(locationHash);\n for (var k in query_params) {\n params[k] = query_params[k];\n }\n return params;\n }\n function urlParseQueryString(queryString) {\n var params = {};\n if (!queryString.length) {\n return params;\n }\n var queryStringParams = queryString.split('&');\n var i, param, paramName, paramValue;\n for (i = 0; i < queryStringParams.length; i++) {\n param = queryStringParams[i].split('=');\n paramName = urlSafeDecode(param[0]);\n paramValue = param[1] == null ? null : urlSafeDecode(param[1]);\n params[paramName] = paramValue;\n }\n return params;\n }\n // Telegram apps will implement this logic to add service params (e.g. tgShareScoreUrl) to game URL\n function urlAppendHashParams(url, addHash) {\n // url looks like 'https://game.com/path?query=1#hash'\n // addHash looks like 'tgShareScoreUrl=' + encodeURIComponent('tgb://share_game_score?hash=very_long_hash123')\n var ind = url.indexOf('#');\n if (ind < 0) {\n // https://game.com/path -> https://game.com/path#tgShareScoreUrl=etc\n return url + '#' + addHash;\n }\n var curHash = url.substr(ind + 1);\n if (curHash.indexOf('=') >= 0 || curHash.indexOf('?') >= 0) {\n // https://game.com/#hash=1 -> https://game.com/#hash=1&tgShareScoreUrl=etc\n // https://game.com/#path?query -> https://game.com/#path?query&tgShareScoreUrl=etc\n return url + '&' + addHash;\n }\n // https://game.com/#hash -> https://game.com/#hash?tgShareScoreUrl=etc\n if (curHash.length > 0) {\n return url + '?' + addHash;\n }\n // https://game.com/# -> https://game.com/#tgShareScoreUrl=etc\n return url + addHash;\n }\n function postEvent(eventType, callback, eventData) {\n if (!callback) {\n callback = function () { };\n }\n if (eventData === undefined) {\n eventData = '';\n }\n console.log('[Telegram.WebView] > postEvent', eventType, eventData);\n if (window.TelegramWebviewProxy !== undefined) {\n TelegramWebviewProxy.postEvent(eventType, JSON.stringify(eventData));\n callback();\n }\n else if (window.external && 'notify' in window.external) {\n window.external.notify(JSON.stringify({ eventType: eventType, eventData: eventData }));\n callback();\n }\n else if (isIframe) {\n try {\n var trustedTarget = 'https://web.telegram.org';\n // For now we don't restrict target, for testing purposes\n trustedTarget = '*';\n window.parent.postMessage(JSON.stringify({ eventType: eventType, eventData: eventData }), trustedTarget);\n callback();\n }\n catch (e) {\n callback(e);\n }\n }\n else {\n callback({ notAvailable: true });\n }\n }\n ;\n function receiveEvent(eventType, eventData) {\n console.log('[Telegram.WebView] < receiveEvent', eventType, eventData);\n callEventCallbacks(eventType, function (callback) {\n callback(eventType, eventData);\n });\n }\n function callEventCallbacks(eventType, func) {\n var curEventHandlers = eventHandlers[eventType];\n if (curEventHandlers === undefined ||\n !curEventHandlers.length) {\n return;\n }\n for (var i = 0; i < curEventHandlers.length; i++) {\n try {\n func(curEventHandlers[i]);\n }\n catch (e) { }\n }\n }\n function onEvent(eventType, callback) {\n if (eventHandlers[eventType] === undefined) {\n eventHandlers[eventType] = [];\n }\n var index = eventHandlers[eventType].indexOf(callback);\n if (index === -1) {\n eventHandlers[eventType].push(callback);\n }\n }\n ;\n function offEvent(eventType, callback) {\n if (eventHandlers[eventType] === undefined) {\n return;\n }\n var index = eventHandlers[eventType].indexOf(callback);\n if (index === -1) {\n return;\n }\n eventHandlers[eventType].splice(index, 1);\n }\n ;\n function openProtoUrl(url) {\n if (!url.match(/^(web\\+)?tgb?:\\/\\/./)) {\n return false;\n }\n var useIframe = navigator.userAgent.match(/iOS|iPhone OS|iPhone|iPod|iPad/i) ? true : false;\n if (useIframe) {\n var iframeContEl = document.getElementById('tgme_frame_cont') || document.body;\n var iframeEl = document.createElement('iframe');\n iframeContEl.appendChild(iframeEl);\n var pageHidden = false;\n var enableHidden = function () {\n pageHidden = true;\n };\n window.addEventListener('pagehide', enableHidden, false);\n window.addEventListener('blur', enableHidden, false);\n if (iframeEl !== null) {\n iframeEl.src = url;\n }\n setTimeout(function () {\n if (!pageHidden) {\n window.location = url;\n }\n window.removeEventListener('pagehide', enableHidden, false);\n window.removeEventListener('blur', enableHidden, false);\n }, 2000);\n }\n else {\n window.location = url;\n }\n return true;\n }\n function sessionStorageSet(key, value) {\n try {\n window.sessionStorage.setItem('__telegram__' + key, JSON.stringify(value));\n return true;\n }\n catch (e) { }\n return false;\n }\n function sessionStorageGet(key) {\n try {\n return JSON.parse(window.sessionStorage.getItem('__telegram__' + key));\n }\n catch (e) { }\n return null;\n }\n if (!window.Telegram) {\n window.Telegram = {};\n }\n window.Telegram.WebView = {\n initParams: initParams,\n isIframe: isIframe,\n onEvent: onEvent,\n offEvent: offEvent,\n postEvent: postEvent,\n receiveEvent: receiveEvent,\n callEventCallbacks: callEventCallbacks\n };\n window.Telegram.Utils = {\n urlSafeDecode: urlSafeDecode,\n urlParseQueryString: urlParseQueryString,\n urlParseHashParams: urlParseHashParams,\n urlAppendHashParams: urlAppendHashParams,\n sessionStorageSet: sessionStorageSet,\n sessionStorageGet: sessionStorageGet\n };\n // For Windows Phone app\n window.TelegramGameProxy_receiveEvent = receiveEvent;\n // App backward compatibility\n window.TelegramGameProxy = {\n receiveEvent: receiveEvent\n };\n})();\n// WebApp\n(function () {\n var Utils = window.Telegram.Utils;\n var WebView = window.Telegram.WebView;\n var initParams = WebView.initParams;\n var isIframe = WebView.isIframe;\n var WebApp = {};\n var webAppInitData = '', webAppInitDataUnsafe = {};\n var themeParams = {}, colorScheme = 'light';\n var webAppVersion = '6.0';\n var webAppPlatform = 'unknown';\n if (initParams.tgWebAppData && initParams.tgWebAppData.length) {\n webAppInitData = initParams.tgWebAppData;\n webAppInitDataUnsafe = Utils.urlParseQueryString(webAppInitData);\n for (var key in webAppInitDataUnsafe) {\n var val = webAppInitDataUnsafe[key];\n try {\n if (val.substr(0, 1) == '{' && val.substr(-1) == '}' ||\n val.substr(0, 1) == '[' && val.substr(-1) == ']') {\n webAppInitDataUnsafe[key] = JSON.parse(val);\n }\n }\n catch (e) { }\n }\n }\n if (initParams.tgWebAppThemeParams && initParams.tgWebAppThemeParams.length) {\n var themeParamsRaw = initParams.tgWebAppThemeParams;\n try {\n var theme_params = JSON.parse(themeParamsRaw);\n if (theme_params) {\n setThemeParams(theme_params);\n }\n }\n catch (e) { }\n }\n var theme_params = Utils.sessionStorageGet('themeParams');\n if (theme_params) {\n setThemeParams(theme_params);\n }\n if (initParams.tgWebAppVersion) {\n webAppVersion = initParams.tgWebAppVersion;\n }\n if (initParams.tgWebAppPlatform) {\n webAppPlatform = initParams.tgWebAppPlatform;\n }\n function onThemeChanged(eventType, eventData) {\n if (eventData.theme_params) {\n setThemeParams(eventData.theme_params);\n window.Telegram.WebApp.MainButton.setParams({});\n updateBackgroundColor();\n receiveWebViewEvent('themeChanged');\n }\n }\n var lastWindowHeight = window.innerHeight;\n function onViewportChanged(eventType, eventData) {\n if (eventData.height) {\n window.removeEventListener('resize', onWindowResize);\n setViewportHeight(eventData);\n }\n }\n function onWindowResize(e) {\n if (lastWindowHeight != window.innerHeight) {\n lastWindowHeight = window.innerHeight;\n receiveWebViewEvent('viewportChanged', {\n isStateStable: true\n });\n }\n }\n function linkHandler(e) {\n if (e.metaKey || e.ctrlKey)\n return;\n var el = e.target;\n while (el.tagName != 'A' && el.parentNode) {\n el = el.parentNode;\n }\n if (el.tagName == 'A' &&\n el.target != '_blank' &&\n (el.protocol == 'http:' || el.protocol == 'https:') &&\n el.hostname == 't.me') {\n WebApp.openTgLink(el.href);\n e.preventDefault();\n }\n }\n function strTrim(str) {\n return str.toString().replace(/^\\s+|\\s+$/g, '');\n }\n function receiveWebViewEvent(eventType) {\n var args = Array.prototype.slice.call(arguments);\n eventType = args.shift();\n WebView.callEventCallbacks('webview:' + eventType, function (callback) {\n callback.apply(WebApp, args);\n });\n }\n function onWebViewEvent(eventType, callback) {\n WebView.onEvent('webview:' + eventType, callback);\n }\n ;\n function offWebViewEvent(eventType, callback) {\n WebView.offEvent('webview:' + eventType, callback);\n }\n ;\n function setCssProperty(name, value) {\n var root = document.documentElement;\n if (root && root.style && root.style.setProperty) {\n root.style.setProperty('--tg-' + name, value);\n }\n }\n function setThemeParams(theme_params) {\n // temp iOS fix\n if (theme_params.bg_color == '#1c1c1d' &&\n theme_params.bg_color == theme_params.secondary_bg_color) {\n theme_params.secondary_bg_color = '#2c2c2e';\n }\n var color;\n for (var key in theme_params) {\n if (color = parseColorToHex(theme_params[key])) {\n themeParams[key] = color;\n if (key == 'bg_color') {\n colorScheme = isColorDark(color) ? 'dark' : 'light';\n setCssProperty('color-scheme', colorScheme);\n }\n key = 'theme-' + key.split('_').join('-');\n setCssProperty(key, color);\n }\n }\n Utils.sessionStorageSet('themeParams', themeParams);\n }\n var webAppCallbacks = {};\n function generateCallbackId(len) {\n var tries = 100;\n while (--tries) {\n var id = '', chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', chars_len = chars.length;\n for (var i = 0; i < len; i++) {\n id += chars[Math.floor(Math.random() * chars_len)];\n }\n if (!webAppCallbacks[id]) {\n webAppCallbacks[id] = {};\n return id;\n }\n }\n throw Error('WebAppCallbackIdGenerateFailed');\n }\n var viewportHeight = false, viewportStableHeight = false, isExpanded = true;\n function setViewportHeight(data) {\n if (typeof data !== 'undefined') {\n isExpanded = !!data.is_expanded;\n viewportHeight = data.height;\n if (data.is_state_stable) {\n viewportStableHeight = data.height;\n }\n receiveWebViewEvent('viewportChanged', {\n isStateStable: !!data.is_state_stable\n });\n }\n var height, stable_height;\n if (viewportHeight !== false) {\n height = (viewportHeight - mainButtonHeight) + 'px';\n }\n else {\n height = mainButtonHeight ? 'calc(100vh - ' + mainButtonHeight + 'px)' : '100vh';\n }\n if (viewportStableHeight !== false) {\n stable_height = (viewportStableHeight - mainButtonHeight) + 'px';\n }\n else {\n stable_height = mainButtonHeight ? 'calc(100vh - ' + mainButtonHeight + 'px)' : '100vh';\n }\n setCssProperty('viewport-height', height);\n setCssProperty('viewport-stable-height', stable_height);\n }\n var isClosingConfirmationEnabled = false;\n function setClosingConfirmation(need_confirmation) {\n if (!versionAtLeast('6.2')) {\n console.warn('[Telegram.WebApp] Closing confirmation is not supported in version ' + webAppVersion);\n return;\n }\n isClosingConfirmationEnabled = !!need_confirmation;\n WebView.postEvent('web_app_setup_closing_behavior', false, { need_confirmation: isClosingConfirmationEnabled });\n }\n var headerColorKey = 'bg_color', headerColor = null;\n function getHeaderColor() {\n if (headerColorKey == 'secondary_bg_color') {\n return themeParams.secondary_bg_color;\n }\n else if (headerColorKey == 'bg_color') {\n return themeParams.bg_color;\n }\n return headerColor;\n }\n function setHeaderColor(color) {\n if (!versionAtLeast('6.1')) {\n console.warn('[Telegram.WebApp] Header color is not supported in version ' + webAppVersion);\n return;\n }\n if (!versionAtLeast('6.9')) {\n if (themeParams.bg_color &&\n themeParams.bg_color == color) {\n color = 'bg_color';\n }\n else if (themeParams.secondary_bg_color &&\n themeParams.secondary_bg_color == color) {\n color = 'secondary_bg_color';\n }\n }\n var head_color = null, color_key = null;\n if (color == 'bg_color' || color == 'secondary_bg_color') {\n color_key = color;\n }\n else if (versionAtLeast('6.9')) {\n head_color = parseColorToHex(color);\n if (!head_color) {\n console.error('[Telegram.WebApp] Header color format is invalid', color);\n throw Error('WebAppHeaderColorInvalid');\n }\n }\n if (!versionAtLeast('6.9') &&\n color_key != 'bg_color' &&\n color_key != 'secondary_bg_color') {\n console.error('[Telegram.WebApp] Header color key should be one of Telegram.WebApp.themeParams.bg_color, Telegram.WebApp.themeParams.secondary_bg_color, \\'bg_color\\', \\'secondary_bg_color\\'', color);\n throw Error('WebAppHeaderColorKeyInvalid');\n }\n headerColorKey = color_key;\n headerColor = head_color;\n updateHeaderColor();\n }\n var appHeaderColorKey = null, appHeaderColor = null;\n function updateHeaderColor() {\n if (appHeaderColorKey != headerColorKey ||\n appHeaderColor != headerColor) {\n appHeaderColorKey = headerColorKey;\n appHeaderColor = headerColor;\n if (appHeaderColor) {\n WebView.postEvent('web_app_set_header_color', false, { color: headerColor });\n }\n else {\n WebView.postEvent('web_app_set_header_color', false, { color_key: headerColorKey });\n }\n }\n }\n var backgroundColor = 'bg_color';\n function getBackgroundColor() {\n if (backgroundColor == 'secondary_bg_color') {\n return themeParams.secondary_bg_color;\n }\n else if (backgroundColor == 'bg_color') {\n return themeParams.bg_color;\n }\n return backgroundColor;\n }\n function setBackgroundColor(color) {\n if (!versionAtLeast('6.1')) {\n console.warn('[Telegram.WebApp] Background color is not supported in version ' + webAppVersion);\n return;\n }\n var bg_color;\n if (color == 'bg_color' || color == 'secondary_bg_color') {\n bg_color = color;\n }\n else {\n bg_color = parseColorToHex(color);\n if (!bg_color) {\n console.error('[Telegram.WebApp] Background color format is invalid', color);\n throw Error('WebAppBackgroundColorInvalid');\n }\n }\n backgroundColor = bg_color;\n updateBackgroundColor();\n }\n var appBackgroundColor = null;\n function updateBackgroundColor() {\n var color = getBackgroundColor();\n if (appBackgroundColor != color) {\n appBackgroundColor = color;\n WebView.postEvent('web_app_set_background_color', false, { color: color });\n }\n }\n function parseColorToHex(color) {\n color += '';\n var match;\n if (match = /^\\s*#([0-9a-f]{6})\\s*$/i.exec(color)) {\n return '#' + match[1].toLowerCase();\n }\n else if (match = /^\\s*#([0-9a-f])([0-9a-f])([0-9a-f])\\s*$/i.exec(color)) {\n return ('#' + match[1] + match[1] + match[2] + match[2] + match[3] + match[3]).toLowerCase();\n }\n else if (match = /^\\s*rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+\\.{0,1}\\d*))?\\)\\s*$/.exec(color)) {\n var r = parseInt(match[1]), g = parseInt(match[2]), b = parseInt(match[3]);\n r = (r < 16 ? '0' : '') + r.toString(16);\n g = (g < 16 ? '0' : '') + g.toString(16);\n b = (b < 16 ? '0' : '') + b.toString(16);\n return '#' + r + g + b;\n }\n return false;\n }\n function isColorDark(rgb) {\n rgb = rgb.replace(/[\\s#]/g, '');\n if (rgb.length == 3) {\n rgb = rgb[0] + rgb[0] + rgb[1] + rgb[1] + rgb[2] + rgb[2];\n }\n var r = parseInt(rgb.substr(0, 2), 16);\n var g = parseInt(rgb.substr(2, 2), 16);\n var b = parseInt(rgb.substr(4, 2), 16);\n var hsp = Math.sqrt(0.299 * (r * r) + 0.587 * (g * g) + 0.114 * (b * b));\n return hsp < 120;\n }\n function versionCompare(v1, v2) {\n if (typeof v1 !== 'string')\n v1 = '';\n if (typeof v2 !== 'string')\n v2 = '';\n v1 = v1.replace(/^\\s+|\\s+$/g, '').split('.');\n v2 = v2.replace(/^\\s+|\\s+$/g, '').split('.');\n var a = Math.max(v1.length, v2.length), i, p1, p2;\n for (i = 0; i < a; i++) {\n p1 = parseInt(v1[i]) || 0;\n p2 = parseInt(v2[i]) || 0;\n if (p1 == p2)\n continue;\n if (p1 > p2)\n return 1;\n return -1;\n }\n return 0;\n }\n function versionAtLeast(ver) {\n return versionCompare(webAppVersion, ver) >= 0;\n }\n function byteLength(str) {\n if (window.Blob) {\n try {\n return new Blob([str]).size;\n }\n catch (e) { }\n }\n var s = str.length;\n for (var i = str.length - 1; i >= 0; i--) {\n var code = str.charCodeAt(i);\n if (code > 0x7f && code <= 0x7ff)\n s++;\n else if (code > 0x7ff && code <= 0xffff)\n s += 2;\n if (code >= 0xdc00 && code <= 0xdfff)\n i--;\n }\n return s;\n }\n var BackButton = (function () {\n var isVisible = false;\n var backButton = {};\n Object.defineProperty(backButton, 'isVisible', {\n set: function (val) { setParams({ is_visible: val }); },\n get: function () { return isVisible; },\n enumerable: true\n });\n var curButtonState = null;\n WebView.onEvent('back_button_pressed', onBackButtonPressed);\n function onBackButtonPressed() {\n receiveWebViewEvent('backButtonClicked');\n }\n function buttonParams() {\n return { is_visible: isVisible };\n }\n function buttonState(btn_params) {\n if (typeof btn_params === 'undefined') {\n btn_params = buttonParams();\n }\n return JSON.stringify(btn_params);\n }\n function buttonCheckVersion() {\n if (!versionAtLeast('6.1')) {\n console.warn('[Telegram.WebApp] BackButton is not supported in version ' + webAppVersion);\n return false;\n }\n return true;\n }\n function updateButton() {\n var btn_params = buttonParams();\n var btn_state = buttonState(btn_params);\n if (curButtonState === btn_state) {\n return;\n }\n curButtonState = btn_state;\n WebView.postEvent('web_app_setup_back_button', false, btn_params);\n }\n function setParams(params) {\n if (!buttonCheckVersion()) {\n return backButton;\n }\n if (typeof params.is_visible !== 'undefined') {\n isVisible = !!params.is_visible;\n }\n updateButton();\n return backButton;\n }\n backButton.onClick = function (callback) {\n if (buttonCheckVersion()) {\n onWebViewEvent('backButtonClicked', callback);\n }\n return backButton;\n };\n backButton.offClick = function (callback) {\n if (buttonCheckVersion()) {\n offWebViewEvent('backButtonClicked', callback);\n }\n return backButton;\n };\n backButton.show = function () {\n return setParams({ is_visible: true });\n };\n backButton.hide = function () {\n return setParams({ is_visible: false });\n };\n return backButton;\n })();\n var mainButtonHeight = 0;\n var MainButton = (function () {\n var isVisible = false;\n var isActive = true;\n var isProgressVisible = false;\n var buttonText = 'CONTINUE';\n var buttonColor = false;\n var buttonTextColor = false;\n var mainButton = {};\n Object.defineProperty(mainButton, 'text', {\n set: function (val) { mainButton.setParams({ text: val }); },\n get: function () { return buttonText; },\n enumerable: true\n });\n Object.defineProperty(mainButton, 'color', {\n set: function (val) { mainButton.setParams({ color: val }); },\n get: function () { return buttonColor || themeParams.button_color || '#2481cc'; },\n enumerable: true\n });\n Object.defineProperty(mainButton, 'textColor', {\n set: function (val) { mainButton.setParams({ text_color: val }); },\n get: function () { return buttonTextColor || themeParams.button_text_color || '#ffffff'; },\n enumerable: true\n });\n Object.defineProperty(mainButton, 'isVisible', {\n set: function (val) { mainButton.setParams({ is_visible: val }); },\n get: function () { return isVisible; },\n enumerable: true\n });\n Object.defineProperty(mainButton, 'isProgressVisible', {\n get: function () { return isProgressVisible; },\n enumerable: true\n });\n Object.defineProperty(mainButton, 'isActive', {\n set: function (val) { mainButton.setParams({ is_active: val }); },\n get: function () { return isActive; },\n enumerable: true\n });\n var curButtonState = null;\n WebView.onEvent('main_button_pressed', onMainButtonPressed);\n var debugBtn = null, debugBtnStyle = {};\n if (initParams.tgWebAppDebug) {\n debugBtn = document.createElement('tg-main-button');\n debugBtnStyle = {\n font: '600 14px/18px sans-serif',\n display: 'none',\n width: '100%',\n height: '48px',\n borderRadius: '0',\n background: 'no-repeat right center',\n position: 'fixed',\n left: '0',\n right: '0',\n bottom: '0',\n margin: '0',\n padding: '15px 20px',\n textAlign: 'center',\n boxSizing: 'border-box',\n zIndex: '10000'\n };\n for (var k in debugBtnStyle) {\n debugBtn.style[k] = debugBtnStyle[k];\n }\n document.addEventListener('DOMContentLoaded', function onDomLoaded(event) {\n document.removeEventListener('DOMContentLoaded', onDomLoaded);\n document.body.appendChild(debugBtn);\n debugBtn.addEventListener('click', onMainButtonPressed, false);\n });\n }\n function onMainButtonPressed() {\n if (isActive) {\n receiveWebViewEvent('mainButtonClicked');\n }\n }\n function buttonParams() {\n var color = mainButton.color;\n var text_color = mainButton.textColor;\n return isVisible ? {\n is_visible: true,\n is_active: isActive,\n is_progress_visible: isProgressVisible,\n text: buttonText,\n color: color,\n text_color: text_color\n } : { is_visible: false };\n }\n function buttonState(btn_params) {\n if (typeof btn_params === 'undefined') {\n btn_params = buttonParams();\n }\n return JSON.stringify(btn_params);\n }\n function updateButton() {\n var btn_params = buttonParams();\n var btn_state = buttonState(btn_params);\n if (curButtonState === btn_state) {\n return;\n }\n curButtonState = btn_state;\n WebView.postEvent('web_app_setup_main_button', false, btn_params);\n if (initParams.tgWebAppDebug) {\n updateDebugButton(btn_params);\n }\n }\n function updateDebugButton(btn_params) {\n if (btn_params.is_visible) {\n debugBtn.style.display = 'block';\n mainButtonHeight = 48;\n debugBtn.style.opacity = btn_params.is_active ? '1' : '0.8';\n debugBtn.style.cursor = btn_params.is_active ? 'pointer' : 'auto';\n debugBtn.disabled = !btn_params.is_active;\n debugBtn.innerText = btn_params.text;\n debugBtn.style.backgroundImage = btn_params.is_progress_visible ? \"url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20viewport%3D%220%200%2048%2048%22%20width%3D%2248px%22%20height%3D%2248px%22%3E%3Ccircle%20cx%3D%2250%25%22%20cy%3D%2250%25%22%20stroke%3D%22%23fff%22%20stroke-width%3D%222.25%22%20stroke-linecap%3D%22round%22%20fill%3D%22none%22%20stroke-dashoffset%3D%22106%22%20r%3D%229%22%20stroke-dasharray%3D%2256.52%22%20rotate%3D%22-90%22%3E%3Canimate%20attributeName%3D%22stroke-dashoffset%22%20attributeType%3D%22XML%22%20dur%3D%22360s%22%20from%3D%220%22%20to%3D%2212500%22%20repeatCount%3D%22indefinite%22%3E%3C%2Fanimate%3E%3CanimateTransform%20attributeName%3D%22transform%22%20attributeType%3D%22XML%22%20type%3D%22rotate%22%20dur%3D%221s%22%20from%3D%22-90%2024%2024%22%20to%3D%22630%2024%2024%22%20repeatCount%3D%22indefinite%22%3E%3C%2FanimateTransform%3E%3C%2Fcircle%3E%3C%2Fsvg%3E')\" : 'none';\n debugBtn.style.backgroundColor = btn_params.color;\n debugBtn.style.color = btn_params.text_color;\n }\n else {\n debugBtn.style.display = 'none';\n mainButtonHeight = 0;\n }\n if (document.documentElement) {\n document.documentElement.style.boxSizing = 'border-box';\n document.documentElement.style.paddingBottom = mainButtonHeight + 'px';\n }\n setViewportHeight();\n }\n function setParams(params) {\n if (typeof params.text !== 'undefined') {\n var text = strTrim(params.text);\n if (!text.length) {\n console.error('[Telegram.WebApp] Main button text is required', params.text);\n throw Error('WebAppMainButtonParamInvalid');\n }\n if (text.length > 64) {\n console.error('[Telegram.WebApp] Main button text is too long', text);\n throw Error('WebAppMainButtonParamInvalid');\n }\n buttonText = text;\n }\n if (typeof params.color !== 'undefined') {\n if (params.color === false ||\n params.color === null) {\n buttonColor = false;\n }\n else {\n var color = parseColorToHex(params.color);\n if (!color) {\n console.error('[Telegram.WebApp] Main button color format is invalid', params.color);\n throw Error('WebAppMainButtonParamInvalid');\n }\n buttonColor = color;\n }\n }\n if (typeof params.text_color !== 'undefined') {\n if (params.text_color === false ||\n params.text_color === null) {\n buttonTextColor = false;\n }\n else {\n var text_color = parseColorToHex(params.text_color);\n if (!text_color) {\n console.error('[Telegram.WebApp] Main button text color format is invalid', params.text_color);\n throw Error('WebAppMainButtonParamInvalid');\n }\n buttonTextColor = text_color;\n }\n }\n if (typeof params.is_visible !== 'undefined') {\n if (params.is_visible &&\n !mainButton.text.length) {\n console.error('[Telegram.WebApp] Main button text is required');\n throw Error('WebAppMainButtonParamInvalid');\n }\n isVisible = !!params.is_visible;\n }\n if (typeof params.is_active !== 'undefined') {\n isActive = !!params.is_active;\n }\n updateButton();\n return mainButton;\n }\n mainButton.setText = function (text) {\n return mainButton.setParams({ text: text });\n };\n mainButton.onClick = function (callback) {\n onWebViewEvent('mainButtonClicked', callback);\n return mainButton;\n };\n mainButton.offClick = function (callback) {\n offWebViewEvent('mainButtonClicked', callback);\n return mainButton;\n };\n mainButton.show = function () {\n return mainButton.setParams({ is_visible: true });\n };\n mainButton.hide = function () {\n return mainButton.setParams({ is_visible: false });\n };\n mainButton.enable = function () {\n return mainButton.setParams({ is_active: true });\n };\n mainButton.disable = function () {\n return mainButton.setParams({ is_active: false });\n };\n mainButton.showProgress = function (leaveActive) {\n isActive = !!leaveActive;\n isProgressVisible = true;\n updateButton();\n return mainButton;\n };\n mainButton.hideProgress = function () {\n if (!mainButton.isActive) {\n isActive = true;\n }\n isProgressVisible = false;\n updateButton();\n return mainButton;\n };\n mainButton.setParams = setParams;\n return mainButton;\n })();\n function onSettingsButtonPressed() {\n receiveWebViewEvent('settingsButtonClicked');\n }\n WebView.onEvent('settings_button_pressed', onSettingsButtonPressed);\n var HapticFeedback = (function () {\n var hapticFeedback = {};\n function triggerFeedback(params) {\n if (!versionAtLeast('6.1')) {\n console.warn('[Telegram.WebApp] HapticFeedback is not supported in version ' + webAppVersion);\n return hapticFeedback;\n }\n if (params.type == 'impact') {\n if (params.impact_style != 'light' &&\n params.impact_style != 'medium' &&\n params.impact_style != 'heavy' &&\n params.impact_style != 'rigid' &&\n params.impact_style != 'soft') {\n console.error('[Telegram.WebApp] Haptic impact style is invalid', params.impact_style);\n throw Error('WebAppHapticImpactStyleInvalid');\n }\n }\n else if (params.type == 'notification') {\n if (params.notification_type != 'error' &&\n params.notification_type != 'success' &&\n params.notification_type != 'warning') {\n console.error('[Telegram.WebApp] Haptic notification type is invalid', params.notification_type);\n throw Error('WebAppHapticNotificationTypeInvalid');\n }\n }\n else if (params.type == 'selection_change') {\n // no params needed\n }\n else {\n console.error('[Telegram.WebApp] Haptic feedback type is invalid', params.type);\n throw Error('WebAppHapticFeedbackTypeInvalid');\n }\n WebView.postEvent('web_app_trigger_haptic_feedback', false, params);\n return hapticFeedback;\n }\n hapticFeedback.impactOccurred = function (style) {\n return triggerFeedback({ type: 'impact', impact_style: style });\n };\n hapticFeedback.notificationOccurred = function (type) {\n return triggerFeedback({ type: 'notification', notification_type: type });\n };\n hapticFeedback.selectionChanged = function () {\n return triggerFeedback({ type: 'selection_change' });\n };\n return hapticFeedback;\n })();\n var CloudStorage = (function () {\n var cloudStorage = {};\n function invokeStorageMethod(method, params, callback) {\n if (!versionAtLeast('6.9')) {\n console.error('[Telegram.WebApp] CloudStorage is not supported in version ' + webAppVersion);\n throw Error('WebAppMethodUnsupported');\n }\n invokeCustomMethod(method, params, callback);\n return cloudStorage;\n }\n cloudStorage.setItem = function (key, value, callback) {\n return invokeStorageMethod('saveStorageValue', { key: key, value: value }, callback);\n };\n cloudStorage.getItem = function (key, callback) {\n return cloudStorage.getItems([key], callback ? function (err, res) {\n if (err)\n callback(err);\n else\n callback(null, res[key]);\n } : null);\n };\n cloudStorage.getItems = function (keys, callback) {\n return invokeStorageMethod('getStorageValues', { keys: keys }, callback);\n };\n cloudStorage.removeItem = function (key, callback) {\n return cloudStorage.removeItems([key], callback);\n };\n cloudStorage.removeItems = function (keys, callback) {\n return invokeStorageMethod('deleteStorageValues', { keys: keys }, callback);\n };\n cloudStorage.getKeys = function (callback) {\n return invokeStorageMethod('getStorageKeys', {}, callback);\n };\n return cloudStorage;\n })();\n var webAppInvoices = {};\n function onInvoiceClosed(eventType, eventData) {\n if (eventData.slug && webAppInvoices[eventData.slug]) {\n var invoiceData = webAppInvoices[eventData.slug];\n delete webAppInvoices[eventData.slug];\n if (invoiceData.callback) {\n invoiceData.callback(eventData.status);\n }\n receiveWebViewEvent('invoiceClosed', {\n url: invoiceData.url,\n status: eventData.status\n });\n }\n }\n var webAppPopupOpened = false;\n function onPopupClosed(eventType, eventData) {\n if (webAppPopupOpened) {\n var popupData = webAppPopupOpened;\n webAppPopupOpened = false;\n var button_id = null;\n if (typeof eventData.button_id !== 'undefined') {\n button_id = eventData.button_id;\n }\n if (popupData.callback) {\n popupData.callback(button_id);\n }\n receiveWebViewEvent('popupClosed', {\n button_id: button_id\n });\n }\n }\n var webAppScanQrPopupOpened = false;\n function onQrTextReceived(eventType, eventData) {\n if (webAppScanQrPopupOpened) {\n var popupData = webAppScanQrPopupOpened;\n var data = null;\n if (typeof eventData.data !== 'undefined') {\n data = eventData.data;\n }\n if (popupData.callback) {\n if (popupData.callback(data)) {\n webAppScanQrPopupOpened = false;\n WebView.postEvent('web_app_close_scan_qr_popup', false);\n }\n }\n receiveWebViewEvent('qrTextReceived', {\n data: data\n });\n }\n }\n function onScanQrPopupClosed(eventType, eventData) {\n webAppScanQrPopupOpened = false;\n }\n function onClipboardTextReceived(eventType, eventData) {\n if (eventData.req_id && webAppCallbacks[eventData.req_id]) {\n var requestData = webAppCallbacks[eventData.req_id];\n delete webAppCallbacks[eventData.req_id];\n var data = null;\n if (typeof eventData.data !== 'undefined') {\n data = eventData.data;\n }\n if (requestData.callback) {\n requestData.callback(data);\n }\n receiveWebViewEvent('clipboardTextReceived', {\n data: data\n });\n }\n }\n var WebAppWriteAccessRequested = false;\n function onWriteAccessRequested(eventType, eventData) {\n if (WebAppWriteAccessRequested) {\n var requestData = WebAppWriteAccessRequested;\n WebAppWriteAccessRequested = false;\n if (requestData.callback) {\n requestData.callback(eventData.status == 'allowed');\n }\n receiveWebViewEvent('writeAccessRequested', {\n status: eventData.status\n });\n }\n }\n var WebAppContactRequested = false;\n function onPhoneRequested(eventType, eventData) {\n if (WebAppContactRequested) {\n var requestData = WebAppContactRequested;\n WebAppContactRequested = false;\n if (requestData.callback) {\n requestData.callback(eventData.status == 'sent');\n }\n receiveWebViewEvent('contactRequested', {\n status: eventData.status\n });\n }\n }\n function onCustomMethodInvoked(eventType, eventData) {\n if (eventData.req_id && webAppCallbacks[eventData.req_id]) {\n var requestData = webAppCallbacks[eventData.req_id];\n delete webAppCallbacks[eventData.req_id];\n var res = null, err = null;\n if (typeof eventData.result !== 'undefined') {\n res = eventData.result;\n }\n if (typeof eventData.error !== 'undefined') {\n err = eventData.error;\n }\n if (requestData.callback) {\n requestData.callback(err, res);\n }\n }\n }\n function invokeCustomMethod(method, params, callback) {\n if (!versionAtLeast('6.9')) {\n console.error('[Telegram.WebApp] Method invokeCustomMethod is not supported in version ' + webAppVersion);\n throw Error('WebAppMethodUnsupported');\n }\n var req_id = generateCallbackId(16);\n var req_params = { req_id: req_id, method: method, params: params || {} };\n webAppCallbacks[req_id] = {\n callback: callback\n };\n WebView.postEvent('web_app_invoke_custom_method', false, req_params);\n }\n ;\n if (!window.Telegram) {\n window.Telegram = {};\n }\n Object.defineProperty(WebApp, 'initData', {\n get: function () { return webAppInitData; },\n enumerable: true\n });\n Object.defineProperty(WebApp, 'initDataUnsafe', {\n get: function () { return webAppInitDataUnsafe; },\n enumerable: true\n });\n Object.defineProperty(WebApp, 'version', {\n get: function () { return webAppVersion; },\n enumerable: true\n });\n Object.defineProperty(WebApp, 'platform', {\n get: function () { return webAppPlatform; },\n enumerable: true\n });\n Object.defineProperty(WebApp, 'colorScheme', {\n get: function () { return colorScheme; },\n enumerable: true\n });\n Object.defineProperty(WebApp, 'themeParams', {\n get: function () { return themeParams; },\n enumerable: true\n });\n Object.defineProperty(WebApp, 'isExpanded', {\n get: function () { return isExpanded; },\n enumerable: true\n });\n Object.defineProperty(WebApp, 'viewportHeight', {\n get: function () { return (viewportHeight === false ? window.innerHeight : viewportHeight) - mainButtonHeight; },\n enumerable: true\n });\n Object.defineProperty(WebApp, 'viewportStableHeight', {\n get: function () { return (viewportStableHeight === false ? window.innerHeight : viewportStableHeight) - mainButtonHeight; },\n enumerable: true\n });\n Object.defineProperty(WebApp, 'isClosingConfirmationEnabled', {\n set: function (val) { setClosingConfirmation(val); },\n get: function () { return isClosingConfirmationEnabled; },\n enumerable: true\n });\n Object.defineProperty(WebApp, 'headerColor', {\n set: function (val) { setHeaderColor(val); },\n get: function () { return getHeaderColor(); },\n enumerable: true\n });\n Object.defineProperty(WebApp, 'backgroundColor', {\n set: function (val) { setBackgroundColor(val); },\n get: function () { return getBackgroundColor(); },\n enumerable: true\n });\n Object.defineProperty(WebApp, 'BackButton', {\n value: BackButton,\n enumerable: true\n });\n Object.defineProperty(WebApp, 'MainButton', {\n value: MainButton,\n enumerable: true\n });\n Object.defineProperty(WebApp, 'HapticFeedback', {\n value: HapticFeedback,\n enumerable: true\n });\n Object.defineProperty(WebApp, 'CloudStorage', {\n value: CloudStorage,\n enumerable: true\n });\n WebApp.setHeaderColor = function (color_key) {\n WebApp.headerColor = color_key;\n };\n WebApp.setBackgroundColor = function (color) {\n WebApp.backgroundColor = color;\n };\n WebApp.enableClosingConfirmation = function () {\n WebApp.isClosingConfirmationEnabled = true;\n };\n WebApp.disableClosingConfirmation = function () {\n WebApp.isClosingConfirmationEnabled = false;\n };\n WebApp.isVersionAtLeast = function (ver) {\n return versionAtLeast(ver);\n };\n WebApp.onEvent = function (eventType, callback) {\n onWebViewEvent(eventType, callback);\n };\n WebApp.offEvent = function (eventType, callback) {\n offWebViewEvent(eventType, callback);\n };\n WebApp.sendData = function (data) {\n if (!data || !data.length) {\n console.error('[Telegram.WebApp] Data is required', data);\n throw Error('WebAppDataInvalid');\n }\n if (byteLength(data) > 4096) {\n console.error('[Telegram.WebApp] Data is too long', data);\n throw Error('WebAppDataInvalid');\n }\n WebView.postEvent('web_app_data_send', false, { data: data });\n };\n WebApp.switchInlineQuery = function (query, choose_chat_types) {\n if (!versionAtLeast('6.6')) {\n console.error('[Telegram.WebApp] Method switchInlineQuery is not supported in version ' + webAppVersion);\n throw Error('WebAppMethodUnsupported');\n }\n if (!initParams.tgWebAppBotInline) {\n console.error('[Telegram.WebApp] Inline mode is disabled for this bot. Read more about inline mode: https://core.telegram.org/bots/inline');\n throw Error('WebAppInlineModeDisabled');\n }\n query = query || '';\n if (query.length > 256) {\n console.error('[Telegram.WebApp] Inline query is too long', query);\n throw Error('WebAppInlineQueryInvalid');\n }\n var chat_types = [];\n if (choose_chat_types) {\n if (!Array.isArray(choose_chat_types)) {\n console.error('[Telegram.WebApp] Choose chat types should be an array', choose_chat_types);\n throw Error('WebAppInlineChooseChatTypesInvalid');\n }\n var good_types = { users: 1, bots: 1, groups: 1, channels: 1 };\n for (var i = 0; i < choose_chat_types.length; i++) {\n var chat_type = choose_chat_types[i];\n if (!good_types[chat_type]) {\n console.error('[Telegram.WebApp] Choose chat type is invalid', chat_type);\n throw Error('WebAppInlineChooseChatTypeInvalid');\n }\n if (good_types[chat_type] != 2) {\n good_types[chat_type] = 2;\n chat_types.push(chat_type);\n }\n }\n }\n WebView.postEvent('web_app_switch_inline_query', false, { query: query, chat_types: chat_types });\n };\n WebApp.openLink = function (url, options) {\n var a = document.createElement('A');\n a.href = url;\n if (a.protocol != 'http:' &&\n a.protocol != 'https:') {\n console.error('[Telegram.WebApp] Url protocol is not supported', url);\n throw Error('WebAppTgUrlInvalid');\n }\n var url = a.href;\n options = options || {};\n if (versionAtLeast('6.1')) {\n WebView.postEvent('web_app_open_link', false, { url: url, try_instant_view: versionAtLeast('6.4') && !!options.try_instant_view });\n }\n else {\n window.open(url, '_blank');\n }\n };\n WebApp.openTelegramLink = function (url) {\n var a = document.createElement('A');\n a.href = url;\n if (a.protocol != 'http:' &&\n a.protocol != 'https:') {\n console.error('[Telegram.WebApp] Url protocol is not supported', url);\n throw Error('WebAppTgUrlInvalid');\n }\n if (a.hostname != 't.me') {\n console.error('[Telegram.WebApp] Url host is not supported', url);\n throw Error('WebAppTgUrlInvalid');\n }\n var path_full = a.pathname + a.search;\n if (isIframe || versionAtLeast('6.1')) {\n WebView.postEvent('web_app_open_tg_link', false, { path_full: path_full });\n }\n else {\n location.href = 'https://t.me' + path_full;\n }\n };\n WebApp.openInvoice = function (url, callback) {\n var a = document.createElement('A'), match, slug;\n a.href = url;\n if (a.protocol != 'http:' &&\n a.protocol != 'https:' ||\n a.hostname != 't.me' ||\n !(match = a.pathname.match(/^\\/(\\$|invoice\\/)([A-Za-z0-9\\-_=]+)$/)) ||\n !(slug = match[2])) {\n console.error('[Telegram.WebApp] Invoice url is invalid', url);\n throw Error('WebAppInvoiceUrlInvalid');\n }\n if (!versionAtLeast('6.1')) {\n console.error('[Telegram.WebApp] Method openInvoice is not supported in version ' + webAppVersion);\n throw Error('WebAppMethodUnsupported');\n }\n if (webAppInvoices[slug]) {\n console.error('[Telegram.WebApp] Invoice is already opened');\n throw Error('WebAppInvoiceOpened');\n }\n webAppInvoices[slug] = {\n url: url,\n callback: callback\n };\n WebView.postEvent('web_app_open_invoice', false, { slug: slug });\n };\n WebApp.showPopup = function (params, callback) {\n if (!versionAtLeast('6.2')) {\n console.error('[Telegram.WebApp] Method showPopup is not supported in version ' + webAppVersion);\n throw Error('WebAppMethodUnsupported');\n }\n if (webAppPopupOpened) {\n console.error('[Telegram.WebApp] Popup is already opened');\n throw Error('WebAppPopupOpened');\n }\n var title = '';\n var message = '';\n var buttons = [];\n var popup_buttons = {};\n var popup_params = {};\n if (typeof params.title !== 'undefined') {\n title = strTrim(params.title);\n if (title.length > 64) {\n console.error('[Telegram.WebApp] Popup title is too long', title);\n throw Error('WebAppPopupParamInvalid');\n }\n if (title.length > 0) {\n popup_params.title = title;\n }\n }\n if (typeof params.message !== 'undefined') {\n message = strTrim(params.message);\n }\n if (!message.length) {\n console.error('[Telegram.WebApp] Popup message is required', params.message);\n throw Error('WebAppPopupParamInvalid');\n }\n if (message.length > 256) {\n console.error('[Telegram.WebApp] Popup message is too long', message);\n throw Error('WebAppPopupParamInvalid');\n }\n popup_params.message = message;\n if (typeof params.buttons !== 'undefined') {\n if (!Array.isArray(params.buttons)) {\n console.error('[Telegram.WebApp] Popup buttons should be an array', params.buttons);\n throw Error('WebAppPopupParamInvalid');\n }\n for (var i = 0; i < params.buttons.length; i++) {\n var button = params.buttons[i];\n var btn = {};\n var id = '';\n if (typeof button.id !== 'undefined') {\n id = button.id.toString();\n if (id.length > 64) {\n console.error('[Telegram.WebApp] Popup button id is too long', id);\n throw Error('WebAppPopupParamInvalid');\n }\n }\n btn.id = id;\n var button_type = button.type;\n if (typeof button_type === 'undefined') {\n button_type = 'default';\n }\n btn.type = button_type;\n if (button_type == 'ok' ||\n button_type == 'close' ||\n button_type == 'cancel') {\n // no params needed\n }\n else if (button_type == 'default' ||\n button_type == 'destructive') {\n var text = '';\n if (typeof button.text !== 'undefined') {\n text = strTrim(button.text);\n }\n if (!text.length) {\n console.error('[Telegram.WebApp] Popup button text is required for type ' + button_type, button.text);\n throw Error('WebAppPopupParamInvalid');\n }\n if (text.length > 64) {\n console.error('[Telegram.WebApp] Popup button text is too long', text);\n throw Error('WebAppPopupParamInvalid');\n }\n btn.text = text;\n }\n else {\n console.error('[Telegram.WebApp] Popup button type is invalid', button_type);\n throw Error('WebAppPopupParamInvalid');\n }\n buttons.push(btn);\n }\n }\n else {\n buttons.push({ id: '', type: 'close' });\n }\n if (buttons.length < 1) {\n console.error('[Telegram.WebApp] Popup should have at least one button');\n throw Error('WebAppPopupParamInvalid');\n }\n if (buttons.length > 3) {\n console.error('[Telegram.WebApp] Popup should not have more than 3 buttons');\n throw Error('WebAppPopupParamInvalid');\n }\n popup_params.buttons = buttons;\n webAppPopupOpened = {\n callback: callback\n };\n WebView.postEvent('web_app_open_popup', false, popup_params);\n };\n WebApp.showAlert = function (message, callback) {\n WebApp.showPopup({\n message: message\n }, callback ? function () { callback(); } : null);\n };\n WebApp.showConfirm = function (message, callback) {\n WebApp.showPopup({\n message: message,\n buttons: [\n { type: 'ok', id: 'ok' },\n { type: 'cancel' }\n ]\n }, callback ? function (button_id) {\n callback(button_id == 'ok');\n } : null);\n };\n WebApp.showScanQrPopup = function (params, callback) {\n if (!versionAtLeast('6.4')) {\n console.error('[Telegram.WebApp] Method showScanQrPopup is not supported in version ' + webAppVersion);\n throw Error('WebAppMethodUnsupported');\n }\n if (webAppScanQrPopupOpened) {\n console.error('[Telegram.WebApp] Popup is already opened');\n throw Error('WebAppScanQrPopupOpened');\n }\n var text = '';\n var popup_params = {};\n if (typeof params.text !== 'undefined') {\n text = strTrim(params.text);\n if (text.length > 64) {\n console.error('[Telegram.WebApp] Scan QR popup text is too long', text);\n throw Error('WebAppScanQrPopupParamInvalid');\n }\n if (text.length > 0) {\n popup_params.text = text;\n }\n }\n webAppScanQrPopupOpened = {\n callback: callback\n };\n WebView.postEvent('web_app_open_scan_qr_popup', false, popup_params);\n };\n WebApp.closeScanQrPopup = function () {\n if (!versionAtLeast('6.4')) {\n console.error('[Telegram.WebApp] Method closeScanQrPopup is not supported in version ' + webAppVersion);\n throw Error('WebAppMethodUnsupported');\n }\n webAppScanQrPopupOpened = false;\n WebView.postEvent('web_app_close_scan_qr_popup', false);\n };\n WebApp.readTextFromClipboard = function (callback) {\n if (!versionAtLeast('6.4')) {\n console.error('[Telegram.WebApp] Method readTextFromClipboard is not supported in version ' + webAppVersion);\n throw Error('WebAppMethodUnsupported');\n }\n var req_id = generateCallbackId(16);\n var req_params = { req_id: req_id };\n webAppCallbacks[req_id] = {\n callback: callback\n };\n WebView.postEvent('web_app_read_text_from_clipboard', false, req_params);\n };\n WebApp.requestWriteAccess = function (callback) {\n if (!versionAtLeast('6.9')) {\n console.error('[Telegram.WebApp] Method requestWriteAccess is not supported in version ' + webAppVersion);\n throw Error('WebAppMethodUnsupported');\n }\n if (WebAppWriteAccessRequested) {\n console.error('[Telegram.WebApp] Write access is already requested');\n throw Error('WebAppWriteAccessRequested');\n }\n WebAppWriteAccessRequested = {\n callback: callback\n };\n WebView.postEvent('web_app_request_write_access');\n };\n WebApp.requestContact = function (callback) {\n if (!versionAtLeast('6.9')) {\n console.error('[Telegram.WebApp] Method requestContact is not supported in version ' + webAppVersion);\n throw Error('WebAppMethodUnsupported');\n }\n if (WebAppContactRequested) {\n console.error('[Telegram.WebApp] Contact is already requested');\n throw Error('WebAppContactRequested');\n }\n WebAppContactRequested = {\n callback: callback\n };\n WebView.postEvent('web_app_request_phone');\n };\n WebApp.invokeCustomMethod = function (method, params, callback) {\n invokeCustomMethod(method, params, callback);\n };\n WebApp.ready = function () {\n WebView.postEvent('web_app_ready');\n };\n WebApp.expand = function () {\n WebView.postEvent('web_app_expand');\n };\n WebApp.close = function () {\n WebView.postEvent('web_app_close');\n };\n window.Telegram.WebApp = WebApp;\n updateHeaderColor();\n updateBackgroundColor();\n setViewportHeight();\n window.addEventListener('resize', onWindowResize);\n if (isIframe) {\n document.addEventListener('click', linkHandler);\n }\n WebView.onEvent('theme_changed', onThemeChanged);\n WebView.onEvent('viewport_changed', onViewportChanged);\n WebView.onEvent('invoice_closed', onInvoiceClosed);\n WebView.onEvent('popup_closed', onPopupClosed);\n WebView.onEvent('qr_text_received', onQrTextReceived);\n WebView.onEvent('scan_qr_popup_closed', onScanQrPopupClosed);\n WebView.onEvent('clipboard_text_received', onClipboardTextReceived);\n WebView.onEvent('write_access_requested', onWriteAccessRequested);\n WebView.onEvent('phone_requested', onPhoneRequested);\n WebView.onEvent('custom_method_invoked', onCustomMethodInvoked);\n WebView.postEvent('web_app_request_theme');\n WebView.postEvent('web_app_request_viewport');\n})();\n//# sourceMappingURL=telegram-web-apps.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvQHR3YS1kZXYvc2RrL2Rpc3QvdGVsZWdyYW0td2ViLWFwcHMuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsMkJBQTJCO0FBQ3RGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDhCQUE4QjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsNENBQTRDO0FBQ2hHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJELDRDQUE0QztBQUN2RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixvQkFBb0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsNkJBQTZCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyx5QkFBeUI7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFNBQVM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUVBQXFFLGlEQUFpRDtBQUN0SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsSUFBSTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxZQUFZO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLGtCQUFrQjtBQUM1RDtBQUNBO0FBQ0EsMENBQTBDLG1CQUFtQjtBQUM3RDtBQUNBO0FBQ0EsMENBQTBDLGlCQUFpQjtBQUMzRDtBQUNBO0FBQ0EsMENBQTBDLGtCQUFrQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QSw0QkFBNEIsMkJBQTJCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQix1QkFBdUI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUywyQkFBMkIsY0FBYztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHNCQUFzQjtBQUN4QyxrQkFBa0I7QUFDbEI7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vY2FtcGZpcmUtaWQvLi9ub2RlX21vZHVsZXMvQHR3YS1kZXYvc2RrL2Rpc3QvdGVsZWdyYW0td2ViLWFwcHMuanM/OGI2OSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8vIFdlYlZpZXdcbihmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV2ZW50SGFuZGxlcnMgPSB7fTtcbiAgICB2YXIgbG9jYXRpb25IYXNoID0gJyc7XG4gICAgdHJ5IHtcbiAgICAgICAgbG9jYXRpb25IYXNoID0gbG9jYXRpb24uaGFzaC50b1N0cmluZygpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkgeyB9XG4gICAgdmFyIGluaXRQYXJhbXMgPSB1cmxQYXJzZUhhc2hQYXJhbXMobG9jYXRpb25IYXNoKTtcbiAgICB2YXIgc3RvcmVkUGFyYW1zID0gc2Vzc2lvblN0b3JhZ2VHZXQoJ2luaXRQYXJhbXMnKTtcbiAgICBpZiAoc3RvcmVkUGFyYW1zKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzdG9yZWRQYXJhbXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaW5pdFBhcmFtc1trZXldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGluaXRQYXJhbXNba2V5XSA9IHN0b3JlZFBhcmFtc1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNlc3Npb25TdG9yYWdlU2V0KCdpbml0UGFyYW1zJywgaW5pdFBhcmFtcyk7XG4gICAgdmFyIGlzSWZyYW1lID0gZmFsc2UsIGlGcmFtZVN0eWxlO1xuICAgIHRyeSB7XG4gICAgICAgIGlzSWZyYW1lID0gKHdpbmRvdy5wYXJlbnQgIT0gbnVsbCAmJiB3aW5kb3cgIT0gd2luZG93LnBhcmVudCk7XG4gICAgICAgIGlmIChpc0lmcmFtZSkge1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlICE9PSB3aW5kb3cucGFyZW50KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFQYXJzZWQgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZGF0YVBhcnNlZCB8fCAhZGF0YVBhcnNlZC5ldmVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGF0YVBhcnNlZC5ldmVudFR5cGUgPT0gJ3NldF9jdXN0b21fc3R5bGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlGcmFtZVN0eWxlLmlubmVySFRNTCA9IGRhdGFQYXJzZWQuZXZlbnREYXRhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZUV2ZW50KGRhdGFQYXJzZWQuZXZlbnRUeXBlLCBkYXRhUGFyc2VkLmV2ZW50RGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpRnJhbWVTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGlGcmFtZVN0eWxlKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeSh7IGV2ZW50VHlwZTogJ2lmcmFtZV9yZWFkeScgfSksICcqJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkgeyB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHsgfVxuICAgIGZ1bmN0aW9uIHVybFNhZmVEZWNvZGUodXJsZW5jb2RlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdXJsZW5jb2RlZCA9IHVybGVuY29kZWQucmVwbGFjZSgvXFwrL2csICclMjAnKTtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodXJsZW5jb2RlZCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmxlbmNvZGVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVybFBhcnNlSGFzaFBhcmFtcyhsb2NhdGlvbkhhc2gpIHtcbiAgICAgICAgbG9jYXRpb25IYXNoID0gbG9jYXRpb25IYXNoLnJlcGxhY2UoL14jLywgJycpO1xuICAgICAgICB2YXIgcGFyYW1zID0ge307XG4gICAgICAgIGlmICghbG9jYXRpb25IYXNoLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYXRpb25IYXNoLmluZGV4T2YoJz0nKSA8IDAgJiYgbG9jYXRpb25IYXNoLmluZGV4T2YoJz8nKSA8IDApIHtcbiAgICAgICAgICAgIHBhcmFtcy5fcGF0aCA9IHVybFNhZmVEZWNvZGUobG9jYXRpb25IYXNoKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHFJbmRleCA9IGxvY2F0aW9uSGFzaC5pbmRleE9mKCc/Jyk7XG4gICAgICAgIGlmIChxSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdmFyIHBhdGhQYXJhbSA9IGxvY2F0aW9uSGFzaC5zdWJzdHIoMCwgcUluZGV4KTtcbiAgICAgICAgICAgIHBhcmFtcy5fcGF0aCA9IHVybFNhZmVEZWNvZGUocGF0aFBhcmFtKTtcbiAgICAgICAgICAgIGxvY2F0aW9uSGFzaCA9IGxvY2F0aW9uSGFzaC5zdWJzdHIocUluZGV4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHF1ZXJ5X3BhcmFtcyA9IHVybFBhcnNlUXVlcnlTdHJpbmcobG9jYXRpb25IYXNoKTtcbiAgICAgICAgZm9yICh2YXIgayBpbiBxdWVyeV9wYXJhbXMpIHtcbiAgICAgICAgICAgIHBhcmFtc1trXSA9IHF1ZXJ5X3BhcmFtc1trXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cmxQYXJzZVF1ZXJ5U3RyaW5nKHF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSB7fTtcbiAgICAgICAgaWYgKCFxdWVyeVN0cmluZy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHF1ZXJ5U3RyaW5nUGFyYW1zID0gcXVlcnlTdHJpbmcuc3BsaXQoJyYnKTtcbiAgICAgICAgdmFyIGksIHBhcmFtLCBwYXJhbU5hbWUsIHBhcmFtVmFsdWU7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBxdWVyeVN0cmluZ1BhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGFyYW0gPSBxdWVyeVN0cmluZ1BhcmFtc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICAgICAgcGFyYW1OYW1lID0gdXJsU2FmZURlY29kZShwYXJhbVswXSk7XG4gICAgICAgICAgICBwYXJhbVZhbHVlID0gcGFyYW1bMV0gPT0gbnVsbCA/IG51bGwgOiB1cmxTYWZlRGVjb2RlKHBhcmFtWzFdKTtcbiAgICAgICAgICAgIHBhcmFtc1twYXJhbU5hbWVdID0gcGFyYW1WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICAvLyBUZWxlZ3JhbSBhcHBzIHdpbGwgaW1wbGVtZW50IHRoaXMgbG9naWMgdG8gYWRkIHNlcnZpY2UgcGFyYW1zIChlLmcuIHRnU2hhcmVTY29yZVVybCkgdG8gZ2FtZSBVUkxcbiAgICBmdW5jdGlvbiB1cmxBcHBlbmRIYXNoUGFyYW1zKHVybCwgYWRkSGFzaCkge1xuICAgICAgICAvLyB1cmwgbG9va3MgbGlrZSAnaHR0cHM6Ly9nYW1lLmNvbS9wYXRoP3F1ZXJ5PTEjaGFzaCdcbiAgICAgICAgLy8gYWRkSGFzaCBsb29rcyBsaWtlICd0Z1NoYXJlU2NvcmVVcmw9JyArIGVuY29kZVVSSUNvbXBvbmVudCgndGdiOi8vc2hhcmVfZ2FtZV9zY29yZT9oYXNoPXZlcnlfbG9uZ19oYXNoMTIzJylcbiAgICAgICAgdmFyIGluZCA9IHVybC5pbmRleE9mKCcjJyk7XG4gICAgICAgIGlmIChpbmQgPCAwKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL2dhbWUuY29tL3BhdGggLT4gaHR0cHM6Ly9nYW1lLmNvbS9wYXRoI3RnU2hhcmVTY29yZVVybD1ldGNcbiAgICAgICAgICAgIHJldHVybiB1cmwgKyAnIycgKyBhZGRIYXNoO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjdXJIYXNoID0gdXJsLnN1YnN0cihpbmQgKyAxKTtcbiAgICAgICAgaWYgKGN1ckhhc2guaW5kZXhPZignPScpID49IDAgfHwgY3VySGFzaC5pbmRleE9mKCc/JykgPj0gMCkge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9nYW1lLmNvbS8jaGFzaD0xIC0+IGh0dHBzOi8vZ2FtZS5jb20vI2hhc2g9MSZ0Z1NoYXJlU2NvcmVVcmw9ZXRjXG4gICAgICAgICAgICAvLyBodHRwczovL2dhbWUuY29tLyNwYXRoP3F1ZXJ5IC0+IGh0dHBzOi8vZ2FtZS5jb20vI3BhdGg/cXVlcnkmdGdTaGFyZVNjb3JlVXJsPWV0Y1xuICAgICAgICAgICAgcmV0dXJuIHVybCArICcmJyArIGFkZEhhc2g7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaHR0cHM6Ly9nYW1lLmNvbS8jaGFzaCAtPiBodHRwczovL2dhbWUuY29tLyNoYXNoP3RnU2hhcmVTY29yZVVybD1ldGNcbiAgICAgICAgaWYgKGN1ckhhc2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVybCArICc/JyArIGFkZEhhc2g7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaHR0cHM6Ly9nYW1lLmNvbS8jIC0+IGh0dHBzOi8vZ2FtZS5jb20vI3RnU2hhcmVTY29yZVVybD1ldGNcbiAgICAgICAgcmV0dXJuIHVybCArIGFkZEhhc2g7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvc3RFdmVudChldmVudFR5cGUsIGNhbGxiYWNrLCBldmVudERhdGEpIHtcbiAgICAgICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50RGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBldmVudERhdGEgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygnW1RlbGVncmFtLldlYlZpZXddID4gcG9zdEV2ZW50JywgZXZlbnRUeXBlLCBldmVudERhdGEpO1xuICAgICAgICBpZiAod2luZG93LlRlbGVncmFtV2Vidmlld1Byb3h5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIFRlbGVncmFtV2Vidmlld1Byb3h5LnBvc3RFdmVudChldmVudFR5cGUsIEpTT04uc3RyaW5naWZ5KGV2ZW50RGF0YSkpO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3aW5kb3cuZXh0ZXJuYWwgJiYgJ25vdGlmeScgaW4gd2luZG93LmV4dGVybmFsKSB7XG4gICAgICAgICAgICB3aW5kb3cuZXh0ZXJuYWwubm90aWZ5KEpTT04uc3RyaW5naWZ5KHsgZXZlbnRUeXBlOiBldmVudFR5cGUsIGV2ZW50RGF0YTogZXZlbnREYXRhIH0pKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNJZnJhbWUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIHRydXN0ZWRUYXJnZXQgPSAnaHR0cHM6Ly93ZWIudGVsZWdyYW0ub3JnJztcbiAgICAgICAgICAgICAgICAvLyBGb3Igbm93IHdlIGRvbid0IHJlc3RyaWN0IHRhcmdldCwgZm9yIHRlc3RpbmcgcHVycG9zZXNcbiAgICAgICAgICAgICAgICB0cnVzdGVkVGFyZ2V0ID0gJyonO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoeyBldmVudFR5cGU6IGV2ZW50VHlwZSwgZXZlbnREYXRhOiBldmVudERhdGEgfSksIHRydXN0ZWRUYXJnZXQpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2soeyBub3RBdmFpbGFibGU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgO1xuICAgIGZ1bmN0aW9uIHJlY2VpdmVFdmVudChldmVudFR5cGUsIGV2ZW50RGF0YSkge1xuICAgICAgICBjb25zb2xlLmxvZygnW1RlbGVncmFtLldlYlZpZXddIDwgcmVjZWl2ZUV2ZW50JywgZXZlbnRUeXBlLCBldmVudERhdGEpO1xuICAgICAgICBjYWxsRXZlbnRDYWxsYmFja3MoZXZlbnRUeXBlLCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50VHlwZSwgZXZlbnREYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbGxFdmVudENhbGxiYWNrcyhldmVudFR5cGUsIGZ1bmMpIHtcbiAgICAgICAgdmFyIGN1ckV2ZW50SGFuZGxlcnMgPSBldmVudEhhbmRsZXJzW2V2ZW50VHlwZV07XG4gICAgICAgIGlmIChjdXJFdmVudEhhbmRsZXJzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICFjdXJFdmVudEhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VyRXZlbnRIYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmdW5jKGN1ckV2ZW50SGFuZGxlcnNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uRXZlbnQoZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoZXZlbnRIYW5kbGVyc1tldmVudFR5cGVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGV2ZW50SGFuZGxlcnNbZXZlbnRUeXBlXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IGV2ZW50SGFuZGxlcnNbZXZlbnRUeXBlXS5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgZXZlbnRIYW5kbGVyc1tldmVudFR5cGVdLnB1c2goY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIDtcbiAgICBmdW5jdGlvbiBvZmZFdmVudChldmVudFR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChldmVudEhhbmRsZXJzW2V2ZW50VHlwZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpbmRleCA9IGV2ZW50SGFuZGxlcnNbZXZlbnRUeXBlXS5pbmRleE9mKGNhbGxiYWNrKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50SGFuZGxlcnNbZXZlbnRUeXBlXS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICA7XG4gICAgZnVuY3Rpb24gb3BlblByb3RvVXJsKHVybCkge1xuICAgICAgICBpZiAoIXVybC5tYXRjaCgvXih3ZWJcXCspP3RnYj86XFwvXFwvLi8pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVzZUlmcmFtZSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lPU3xpUGhvbmUgT1N8aVBob25lfGlQb2R8aVBhZC9pKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgaWYgKHVzZUlmcmFtZSkge1xuICAgICAgICAgICAgdmFyIGlmcmFtZUNvbnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0Z21lX2ZyYW1lX2NvbnQnKSB8fCBkb2N1bWVudC5ib2R5O1xuICAgICAgICAgICAgdmFyIGlmcmFtZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICAgICAgICBpZnJhbWVDb250RWwuYXBwZW5kQ2hpbGQoaWZyYW1lRWwpO1xuICAgICAgICAgICAgdmFyIHBhZ2VIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciBlbmFibGVIaWRkZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcGFnZUhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgZW5hYmxlSGlkZGVuLCBmYWxzZSk7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGVuYWJsZUhpZGRlbiwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGlmcmFtZUVsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lRWwuc3JjID0gdXJsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWdlSGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IHVybDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgZW5hYmxlSGlkZGVuLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCBlbmFibGVIaWRkZW4sIGZhbHNlKTtcbiAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gdXJsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXNzaW9uU3RvcmFnZVNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnX190ZWxlZ3JhbV9fJyArIGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7IH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXNzaW9uU3RvcmFnZUdldChrZXkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdfX3RlbGVncmFtX18nICsga2V5KSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKCF3aW5kb3cuVGVsZWdyYW0pIHtcbiAgICAgICAgd2luZG93LlRlbGVncmFtID0ge307XG4gICAgfVxuICAgIHdpbmRvdy5UZWxlZ3JhbS5XZWJWaWV3ID0ge1xuICAgICAgICBpbml0UGFyYW1zOiBpbml0UGFyYW1zLFxuICAgICAgICBpc0lmcmFtZTogaXNJZnJhbWUsXG4gICAgICAgIG9uRXZlbnQ6IG9uRXZlbnQsXG4gICAgICAgIG9mZkV2ZW50OiBvZmZFdmVudCxcbiAgICAgICAgcG9zdEV2ZW50OiBwb3N0RXZlbnQsXG4gICAgICAgIHJlY2VpdmVFdmVudDogcmVjZWl2ZUV2ZW50LFxuICAgICAgICBjYWxsRXZlbnRDYWxsYmFja3M6IGNhbGxFdmVudENhbGxiYWNrc1xuICAgIH07XG4gICAgd2luZG93LlRlbGVncmFtLlV0aWxzID0ge1xuICAgICAgICB1cmxTYWZlRGVjb2RlOiB1cmxTYWZlRGVjb2RlLFxuICAgICAgICB1cmxQYXJzZVF1ZXJ5U3RyaW5nOiB1cmxQYXJzZVF1ZXJ5U3RyaW5nLFxuICAgICAgICB1cmxQYXJzZUhhc2hQYXJhbXM6IHVybFBhcnNlSGFzaFBhcmFtcyxcbiAgICAgICAgdXJsQXBwZW5kSGFzaFBhcmFtczogdXJsQXBwZW5kSGFzaFBhcmFtcyxcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2VTZXQ6IHNlc3Npb25TdG9yYWdlU2V0LFxuICAgICAgICBzZXNzaW9uU3RvcmFnZUdldDogc2Vzc2lvblN0b3JhZ2VHZXRcbiAgICB9O1xuICAgIC8vIEZvciBXaW5kb3dzIFBob25lIGFwcFxuICAgIHdpbmRvdy5UZWxlZ3JhbUdhbWVQcm94eV9yZWNlaXZlRXZlbnQgPSByZWNlaXZlRXZlbnQ7XG4gICAgLy8gQXBwIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICB3aW5kb3cuVGVsZWdyYW1HYW1lUHJveHkgPSB7XG4gICAgICAgIHJlY2VpdmVFdmVudDogcmVjZWl2ZUV2ZW50XG4gICAgfTtcbn0pKCk7XG4vLyBXZWJBcHBcbihmdW5jdGlvbiAoKSB7XG4gICAgdmFyIFV0aWxzID0gd2luZG93LlRlbGVncmFtLlV0aWxzO1xuICAgIHZhciBXZWJWaWV3ID0gd2luZG93LlRlbGVncmFtLldlYlZpZXc7XG4gICAgdmFyIGluaXRQYXJhbXMgPSBXZWJWaWV3LmluaXRQYXJhbXM7XG4gICAgdmFyIGlzSWZyYW1lID0gV2ViVmlldy5pc0lmcmFtZTtcbiAgICB2YXIgV2ViQXBwID0ge307XG4gICAgdmFyIHdlYkFwcEluaXREYXRhID0gJycsIHdlYkFwcEluaXREYXRhVW5zYWZlID0ge307XG4gICAgdmFyIHRoZW1lUGFyYW1zID0ge30sIGNvbG9yU2NoZW1lID0gJ2xpZ2h0JztcbiAgICB2YXIgd2ViQXBwVmVyc2lvbiA9ICc2LjAnO1xuICAgIHZhciB3ZWJBcHBQbGF0Zm9ybSA9ICd1bmtub3duJztcbiAgICBpZiAoaW5pdFBhcmFtcy50Z1dlYkFwcERhdGEgJiYgaW5pdFBhcmFtcy50Z1dlYkFwcERhdGEubGVuZ3RoKSB7XG4gICAgICAgIHdlYkFwcEluaXREYXRhID0gaW5pdFBhcmFtcy50Z1dlYkFwcERhdGE7XG4gICAgICAgIHdlYkFwcEluaXREYXRhVW5zYWZlID0gVXRpbHMudXJsUGFyc2VRdWVyeVN0cmluZyh3ZWJBcHBJbml0RGF0YSk7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB3ZWJBcHBJbml0RGF0YVVuc2FmZSkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHdlYkFwcEluaXREYXRhVW5zYWZlW2tleV07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICh2YWwuc3Vic3RyKDAsIDEpID09ICd7JyAmJiB2YWwuc3Vic3RyKC0xKSA9PSAnfScgfHxcbiAgICAgICAgICAgICAgICAgICAgdmFsLnN1YnN0cigwLCAxKSA9PSAnWycgJiYgdmFsLnN1YnN0cigtMSkgPT0gJ10nKSB7XG4gICAgICAgICAgICAgICAgICAgIHdlYkFwcEluaXREYXRhVW5zYWZlW2tleV0gPSBKU09OLnBhcnNlKHZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpbml0UGFyYW1zLnRnV2ViQXBwVGhlbWVQYXJhbXMgJiYgaW5pdFBhcmFtcy50Z1dlYkFwcFRoZW1lUGFyYW1zLmxlbmd0aCkge1xuICAgICAgICB2YXIgdGhlbWVQYXJhbXNSYXcgPSBpbml0UGFyYW1zLnRnV2ViQXBwVGhlbWVQYXJhbXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgdGhlbWVfcGFyYW1zID0gSlNPTi5wYXJzZSh0aGVtZVBhcmFtc1Jhdyk7XG4gICAgICAgICAgICBpZiAodGhlbWVfcGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgc2V0VGhlbWVQYXJhbXModGhlbWVfcGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkgeyB9XG4gICAgfVxuICAgIHZhciB0aGVtZV9wYXJhbXMgPSBVdGlscy5zZXNzaW9uU3RvcmFnZUdldCgndGhlbWVQYXJhbXMnKTtcbiAgICBpZiAodGhlbWVfcGFyYW1zKSB7XG4gICAgICAgIHNldFRoZW1lUGFyYW1zKHRoZW1lX3BhcmFtcyk7XG4gICAgfVxuICAgIGlmIChpbml0UGFyYW1zLnRnV2ViQXBwVmVyc2lvbikge1xuICAgICAgICB3ZWJBcHBWZXJzaW9uID0gaW5pdFBhcmFtcy50Z1dlYkFwcFZlcnNpb247XG4gICAgfVxuICAgIGlmIChpbml0UGFyYW1zLnRnV2ViQXBwUGxhdGZvcm0pIHtcbiAgICAgICAgd2ViQXBwUGxhdGZvcm0gPSBpbml0UGFyYW1zLnRnV2ViQXBwUGxhdGZvcm07XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uVGhlbWVDaGFuZ2VkKGV2ZW50VHlwZSwgZXZlbnREYXRhKSB7XG4gICAgICAgIGlmIChldmVudERhdGEudGhlbWVfcGFyYW1zKSB7XG4gICAgICAgICAgICBzZXRUaGVtZVBhcmFtcyhldmVudERhdGEudGhlbWVfcGFyYW1zKTtcbiAgICAgICAgICAgIHdpbmRvdy5UZWxlZ3JhbS5XZWJBcHAuTWFpbkJ1dHRvbi5zZXRQYXJhbXMoe30pO1xuICAgICAgICAgICAgdXBkYXRlQmFja2dyb3VuZENvbG9yKCk7XG4gICAgICAgICAgICByZWNlaXZlV2ViVmlld0V2ZW50KCd0aGVtZUNoYW5nZWQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgbGFzdFdpbmRvd0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBmdW5jdGlvbiBvblZpZXdwb3J0Q2hhbmdlZChldmVudFR5cGUsIGV2ZW50RGF0YSkge1xuICAgICAgICBpZiAoZXZlbnREYXRhLmhlaWdodCkge1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uV2luZG93UmVzaXplKTtcbiAgICAgICAgICAgIHNldFZpZXdwb3J0SGVpZ2h0KGV2ZW50RGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gb25XaW5kb3dSZXNpemUoZSkge1xuICAgICAgICBpZiAobGFzdFdpbmRvd0hlaWdodCAhPSB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgICAgIGxhc3RXaW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgICAgICAgICByZWNlaXZlV2ViVmlld0V2ZW50KCd2aWV3cG9ydENoYW5nZWQnLCB7XG4gICAgICAgICAgICAgICAgaXNTdGF0ZVN0YWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbGlua0hhbmRsZXIoZSkge1xuICAgICAgICBpZiAoZS5tZXRhS2V5IHx8IGUuY3RybEtleSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGVsID0gZS50YXJnZXQ7XG4gICAgICAgIHdoaWxlIChlbC50YWdOYW1lICE9ICdBJyAmJiBlbC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBlbCA9IGVsLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsLnRhZ05hbWUgPT0gJ0EnICYmXG4gICAgICAgICAgICBlbC50YXJnZXQgIT0gJ19ibGFuaycgJiZcbiAgICAgICAgICAgIChlbC5wcm90b2NvbCA9PSAnaHR0cDonIHx8IGVsLnByb3RvY29sID09ICdodHRwczonKSAmJlxuICAgICAgICAgICAgZWwuaG9zdG5hbWUgPT0gJ3QubWUnKSB7XG4gICAgICAgICAgICBXZWJBcHAub3BlblRnTGluayhlbC5ocmVmKTtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdHJUcmltKHN0cikge1xuICAgICAgICByZXR1cm4gc3RyLnRvU3RyaW5nKCkucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWNlaXZlV2ViVmlld0V2ZW50KGV2ZW50VHlwZSkge1xuICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgIGV2ZW50VHlwZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgV2ViVmlldy5jYWxsRXZlbnRDYWxsYmFja3MoJ3dlYnZpZXc6JyArIGV2ZW50VHlwZSwgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseShXZWJBcHAsIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb25XZWJWaWV3RXZlbnQoZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuICAgICAgICBXZWJWaWV3Lm9uRXZlbnQoJ3dlYnZpZXc6JyArIGV2ZW50VHlwZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgICA7XG4gICAgZnVuY3Rpb24gb2ZmV2ViVmlld0V2ZW50KGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcbiAgICAgICAgV2ViVmlldy5vZmZFdmVudCgnd2VidmlldzonICsgZXZlbnRUeXBlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIDtcbiAgICBmdW5jdGlvbiBzZXRDc3NQcm9wZXJ0eShuYW1lLCB2YWx1ZSkge1xuICAgICAgICB2YXIgcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgaWYgKHJvb3QgJiYgcm9vdC5zdHlsZSAmJiByb290LnN0eWxlLnNldFByb3BlcnR5KSB7XG4gICAgICAgICAgICByb290LnN0eWxlLnNldFByb3BlcnR5KCctLXRnLScgKyBuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0VGhlbWVQYXJhbXModGhlbWVfcGFyYW1zKSB7XG4gICAgICAgIC8vIHRlbXAgaU9TIGZpeFxuICAgICAgICBpZiAodGhlbWVfcGFyYW1zLmJnX2NvbG9yID09ICcjMWMxYzFkJyAmJlxuICAgICAgICAgICAgdGhlbWVfcGFyYW1zLmJnX2NvbG9yID09IHRoZW1lX3BhcmFtcy5zZWNvbmRhcnlfYmdfY29sb3IpIHtcbiAgICAgICAgICAgIHRoZW1lX3BhcmFtcy5zZWNvbmRhcnlfYmdfY29sb3IgPSAnIzJjMmMyZSc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvbG9yO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhlbWVfcGFyYW1zKSB7XG4gICAgICAgICAgICBpZiAoY29sb3IgPSBwYXJzZUNvbG9yVG9IZXgodGhlbWVfcGFyYW1zW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgdGhlbWVQYXJhbXNba2V5XSA9IGNvbG9yO1xuICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gJ2JnX2NvbG9yJykge1xuICAgICAgICAgICAgICAgICAgICBjb2xvclNjaGVtZSA9IGlzQ29sb3JEYXJrKGNvbG9yKSA/ICdkYXJrJyA6ICdsaWdodCc7XG4gICAgICAgICAgICAgICAgICAgIHNldENzc1Byb3BlcnR5KCdjb2xvci1zY2hlbWUnLCBjb2xvclNjaGVtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGtleSA9ICd0aGVtZS0nICsga2V5LnNwbGl0KCdfJykuam9pbignLScpO1xuICAgICAgICAgICAgICAgIHNldENzc1Byb3BlcnR5KGtleSwgY29sb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFV0aWxzLnNlc3Npb25TdG9yYWdlU2V0KCd0aGVtZVBhcmFtcycsIHRoZW1lUGFyYW1zKTtcbiAgICB9XG4gICAgdmFyIHdlYkFwcENhbGxiYWNrcyA9IHt9O1xuICAgIGZ1bmN0aW9uIGdlbmVyYXRlQ2FsbGJhY2tJZChsZW4pIHtcbiAgICAgICAgdmFyIHRyaWVzID0gMTAwO1xuICAgICAgICB3aGlsZSAoLS10cmllcykge1xuICAgICAgICAgICAgdmFyIGlkID0gJycsIGNoYXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5JywgY2hhcnNfbGVuID0gY2hhcnMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlkICs9IGNoYXJzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzX2xlbildO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF3ZWJBcHBDYWxsYmFja3NbaWRdKSB7XG4gICAgICAgICAgICAgICAgd2ViQXBwQ2FsbGJhY2tzW2lkXSA9IHt9O1xuICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwQ2FsbGJhY2tJZEdlbmVyYXRlRmFpbGVkJyk7XG4gICAgfVxuICAgIHZhciB2aWV3cG9ydEhlaWdodCA9IGZhbHNlLCB2aWV3cG9ydFN0YWJsZUhlaWdodCA9IGZhbHNlLCBpc0V4cGFuZGVkID0gdHJ1ZTtcbiAgICBmdW5jdGlvbiBzZXRWaWV3cG9ydEhlaWdodChkYXRhKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlzRXhwYW5kZWQgPSAhIWRhdGEuaXNfZXhwYW5kZWQ7XG4gICAgICAgICAgICB2aWV3cG9ydEhlaWdodCA9IGRhdGEuaGVpZ2h0O1xuICAgICAgICAgICAgaWYgKGRhdGEuaXNfc3RhdGVfc3RhYmxlKSB7XG4gICAgICAgICAgICAgICAgdmlld3BvcnRTdGFibGVIZWlnaHQgPSBkYXRhLmhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY2VpdmVXZWJWaWV3RXZlbnQoJ3ZpZXdwb3J0Q2hhbmdlZCcsIHtcbiAgICAgICAgICAgICAgICBpc1N0YXRlU3RhYmxlOiAhIWRhdGEuaXNfc3RhdGVfc3RhYmxlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaGVpZ2h0LCBzdGFibGVfaGVpZ2h0O1xuICAgICAgICBpZiAodmlld3BvcnRIZWlnaHQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBoZWlnaHQgPSAodmlld3BvcnRIZWlnaHQgLSBtYWluQnV0dG9uSGVpZ2h0KSArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoZWlnaHQgPSBtYWluQnV0dG9uSGVpZ2h0ID8gJ2NhbGMoMTAwdmggLSAnICsgbWFpbkJ1dHRvbkhlaWdodCArICdweCknIDogJzEwMHZoJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlld3BvcnRTdGFibGVIZWlnaHQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBzdGFibGVfaGVpZ2h0ID0gKHZpZXdwb3J0U3RhYmxlSGVpZ2h0IC0gbWFpbkJ1dHRvbkhlaWdodCkgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RhYmxlX2hlaWdodCA9IG1haW5CdXR0b25IZWlnaHQgPyAnY2FsYygxMDB2aCAtICcgKyBtYWluQnV0dG9uSGVpZ2h0ICsgJ3B4KScgOiAnMTAwdmgnO1xuICAgICAgICB9XG4gICAgICAgIHNldENzc1Byb3BlcnR5KCd2aWV3cG9ydC1oZWlnaHQnLCBoZWlnaHQpO1xuICAgICAgICBzZXRDc3NQcm9wZXJ0eSgndmlld3BvcnQtc3RhYmxlLWhlaWdodCcsIHN0YWJsZV9oZWlnaHQpO1xuICAgIH1cbiAgICB2YXIgaXNDbG9zaW5nQ29uZmlybWF0aW9uRW5hYmxlZCA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIHNldENsb3NpbmdDb25maXJtYXRpb24obmVlZF9jb25maXJtYXRpb24pIHtcbiAgICAgICAgaWYgKCF2ZXJzaW9uQXRMZWFzdCgnNi4yJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignW1RlbGVncmFtLldlYkFwcF0gQ2xvc2luZyBjb25maXJtYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB2ZXJzaW9uICcgKyB3ZWJBcHBWZXJzaW9uKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpc0Nsb3NpbmdDb25maXJtYXRpb25FbmFibGVkID0gISFuZWVkX2NvbmZpcm1hdGlvbjtcbiAgICAgICAgV2ViVmlldy5wb3N0RXZlbnQoJ3dlYl9hcHBfc2V0dXBfY2xvc2luZ19iZWhhdmlvcicsIGZhbHNlLCB7IG5lZWRfY29uZmlybWF0aW9uOiBpc0Nsb3NpbmdDb25maXJtYXRpb25FbmFibGVkIH0pO1xuICAgIH1cbiAgICB2YXIgaGVhZGVyQ29sb3JLZXkgPSAnYmdfY29sb3InLCBoZWFkZXJDb2xvciA9IG51bGw7XG4gICAgZnVuY3Rpb24gZ2V0SGVhZGVyQ29sb3IoKSB7XG4gICAgICAgIGlmIChoZWFkZXJDb2xvcktleSA9PSAnc2Vjb25kYXJ5X2JnX2NvbG9yJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoZW1lUGFyYW1zLnNlY29uZGFyeV9iZ19jb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChoZWFkZXJDb2xvcktleSA9PSAnYmdfY29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhlbWVQYXJhbXMuYmdfY29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYWRlckNvbG9yO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRIZWFkZXJDb2xvcihjb2xvcikge1xuICAgICAgICBpZiAoIXZlcnNpb25BdExlYXN0KCc2LjEnKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbVGVsZWdyYW0uV2ViQXBwXSBIZWFkZXIgY29sb3IgaXMgbm90IHN1cHBvcnRlZCBpbiB2ZXJzaW9uICcgKyB3ZWJBcHBWZXJzaW9uKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZlcnNpb25BdExlYXN0KCc2LjknKSkge1xuICAgICAgICAgICAgaWYgKHRoZW1lUGFyYW1zLmJnX2NvbG9yICYmXG4gICAgICAgICAgICAgICAgdGhlbWVQYXJhbXMuYmdfY29sb3IgPT0gY29sb3IpIHtcbiAgICAgICAgICAgICAgICBjb2xvciA9ICdiZ19jb2xvcic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGVtZVBhcmFtcy5zZWNvbmRhcnlfYmdfY29sb3IgJiZcbiAgICAgICAgICAgICAgICB0aGVtZVBhcmFtcy5zZWNvbmRhcnlfYmdfY29sb3IgPT0gY29sb3IpIHtcbiAgICAgICAgICAgICAgICBjb2xvciA9ICdzZWNvbmRhcnlfYmdfY29sb3InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBoZWFkX2NvbG9yID0gbnVsbCwgY29sb3Jfa2V5ID0gbnVsbDtcbiAgICAgICAgaWYgKGNvbG9yID09ICdiZ19jb2xvcicgfHwgY29sb3IgPT0gJ3NlY29uZGFyeV9iZ19jb2xvcicpIHtcbiAgICAgICAgICAgIGNvbG9yX2tleSA9IGNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZlcnNpb25BdExlYXN0KCc2LjknKSkge1xuICAgICAgICAgICAgaGVhZF9jb2xvciA9IHBhcnNlQ29sb3JUb0hleChjb2xvcik7XG4gICAgICAgICAgICBpZiAoIWhlYWRfY29sb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBIZWFkZXIgY29sb3IgZm9ybWF0IGlzIGludmFsaWQnLCBjb2xvcik7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1dlYkFwcEhlYWRlckNvbG9ySW52YWxpZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghdmVyc2lvbkF0TGVhc3QoJzYuOScpICYmXG4gICAgICAgICAgICBjb2xvcl9rZXkgIT0gJ2JnX2NvbG9yJyAmJlxuICAgICAgICAgICAgY29sb3Jfa2V5ICE9ICdzZWNvbmRhcnlfYmdfY29sb3InKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBIZWFkZXIgY29sb3Iga2V5IHNob3VsZCBiZSBvbmUgb2YgVGVsZWdyYW0uV2ViQXBwLnRoZW1lUGFyYW1zLmJnX2NvbG9yLCBUZWxlZ3JhbS5XZWJBcHAudGhlbWVQYXJhbXMuc2Vjb25kYXJ5X2JnX2NvbG9yLCBcXCdiZ19jb2xvclxcJywgXFwnc2Vjb25kYXJ5X2JnX2NvbG9yXFwnJywgY29sb3IpO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1dlYkFwcEhlYWRlckNvbG9yS2V5SW52YWxpZCcpO1xuICAgICAgICB9XG4gICAgICAgIGhlYWRlckNvbG9yS2V5ID0gY29sb3Jfa2V5O1xuICAgICAgICBoZWFkZXJDb2xvciA9IGhlYWRfY29sb3I7XG4gICAgICAgIHVwZGF0ZUhlYWRlckNvbG9yKCk7XG4gICAgfVxuICAgIHZhciBhcHBIZWFkZXJDb2xvcktleSA9IG51bGwsIGFwcEhlYWRlckNvbG9yID0gbnVsbDtcbiAgICBmdW5jdGlvbiB1cGRhdGVIZWFkZXJDb2xvcigpIHtcbiAgICAgICAgaWYgKGFwcEhlYWRlckNvbG9yS2V5ICE9IGhlYWRlckNvbG9yS2V5IHx8XG4gICAgICAgICAgICBhcHBIZWFkZXJDb2xvciAhPSBoZWFkZXJDb2xvcikge1xuICAgICAgICAgICAgYXBwSGVhZGVyQ29sb3JLZXkgPSBoZWFkZXJDb2xvcktleTtcbiAgICAgICAgICAgIGFwcEhlYWRlckNvbG9yID0gaGVhZGVyQ29sb3I7XG4gICAgICAgICAgICBpZiAoYXBwSGVhZGVyQ29sb3IpIHtcbiAgICAgICAgICAgICAgICBXZWJWaWV3LnBvc3RFdmVudCgnd2ViX2FwcF9zZXRfaGVhZGVyX2NvbG9yJywgZmFsc2UsIHsgY29sb3I6IGhlYWRlckNvbG9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgV2ViVmlldy5wb3N0RXZlbnQoJ3dlYl9hcHBfc2V0X2hlYWRlcl9jb2xvcicsIGZhbHNlLCB7IGNvbG9yX2tleTogaGVhZGVyQ29sb3JLZXkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIGJhY2tncm91bmRDb2xvciA9ICdiZ19jb2xvcic7XG4gICAgZnVuY3Rpb24gZ2V0QmFja2dyb3VuZENvbG9yKCkge1xuICAgICAgICBpZiAoYmFja2dyb3VuZENvbG9yID09ICdzZWNvbmRhcnlfYmdfY29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhlbWVQYXJhbXMuc2Vjb25kYXJ5X2JnX2NvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJhY2tncm91bmRDb2xvciA9PSAnYmdfY29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhlbWVQYXJhbXMuYmdfY29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJhY2tncm91bmRDb2xvcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKSB7XG4gICAgICAgIGlmICghdmVyc2lvbkF0TGVhc3QoJzYuMScpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tUZWxlZ3JhbS5XZWJBcHBdIEJhY2tncm91bmQgY29sb3IgaXMgbm90IHN1cHBvcnRlZCBpbiB2ZXJzaW9uICcgKyB3ZWJBcHBWZXJzaW9uKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmdfY29sb3I7XG4gICAgICAgIGlmIChjb2xvciA9PSAnYmdfY29sb3InIHx8IGNvbG9yID09ICdzZWNvbmRhcnlfYmdfY29sb3InKSB7XG4gICAgICAgICAgICBiZ19jb2xvciA9IGNvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYmdfY29sb3IgPSBwYXJzZUNvbG9yVG9IZXgoY29sb3IpO1xuICAgICAgICAgICAgaWYgKCFiZ19jb2xvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIEJhY2tncm91bmQgY29sb3IgZm9ybWF0IGlzIGludmFsaWQnLCBjb2xvcik7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1dlYkFwcEJhY2tncm91bmRDb2xvckludmFsaWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSBiZ19jb2xvcjtcbiAgICAgICAgdXBkYXRlQmFja2dyb3VuZENvbG9yKCk7XG4gICAgfVxuICAgIHZhciBhcHBCYWNrZ3JvdW5kQ29sb3IgPSBudWxsO1xuICAgIGZ1bmN0aW9uIHVwZGF0ZUJhY2tncm91bmRDb2xvcigpIHtcbiAgICAgICAgdmFyIGNvbG9yID0gZ2V0QmFja2dyb3VuZENvbG9yKCk7XG4gICAgICAgIGlmIChhcHBCYWNrZ3JvdW5kQ29sb3IgIT0gY29sb3IpIHtcbiAgICAgICAgICAgIGFwcEJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICAgICAgICAgICAgV2ViVmlldy5wb3N0RXZlbnQoJ3dlYl9hcHBfc2V0X2JhY2tncm91bmRfY29sb3InLCBmYWxzZSwgeyBjb2xvcjogY29sb3IgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcGFyc2VDb2xvclRvSGV4KGNvbG9yKSB7XG4gICAgICAgIGNvbG9yICs9ICcnO1xuICAgICAgICB2YXIgbWF0Y2g7XG4gICAgICAgIGlmIChtYXRjaCA9IC9eXFxzKiMoWzAtOWEtZl17Nn0pXFxzKiQvaS5leGVjKGNvbG9yKSkge1xuICAgICAgICAgICAgcmV0dXJuICcjJyArIG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSAvXlxccyojKFswLTlhLWZdKShbMC05YS1mXSkoWzAtOWEtZl0pXFxzKiQvaS5leGVjKGNvbG9yKSkge1xuICAgICAgICAgICAgcmV0dXJuICgnIycgKyBtYXRjaFsxXSArIG1hdGNoWzFdICsgbWF0Y2hbMl0gKyBtYXRjaFsyXSArIG1hdGNoWzNdICsgbWF0Y2hbM10pLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWF0Y2ggPSAvXlxccypyZ2JhP1xcKChcXGQrKSxcXHMqKFxcZCspLFxccyooXFxkKykoPzosXFxzKihcXGQrXFwuezAsMX1cXGQqKSk/XFwpXFxzKiQvLmV4ZWMoY29sb3IpKSB7XG4gICAgICAgICAgICB2YXIgciA9IHBhcnNlSW50KG1hdGNoWzFdKSwgZyA9IHBhcnNlSW50KG1hdGNoWzJdKSwgYiA9IHBhcnNlSW50KG1hdGNoWzNdKTtcbiAgICAgICAgICAgIHIgPSAociA8IDE2ID8gJzAnIDogJycpICsgci50b1N0cmluZygxNik7XG4gICAgICAgICAgICBnID0gKGcgPCAxNiA/ICcwJyA6ICcnKSArIGcudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgYiA9IChiIDwgMTYgPyAnMCcgOiAnJykgKyBiLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIHJldHVybiAnIycgKyByICsgZyArIGI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0NvbG9yRGFyayhyZ2IpIHtcbiAgICAgICAgcmdiID0gcmdiLnJlcGxhY2UoL1tcXHMjXS9nLCAnJyk7XG4gICAgICAgIGlmIChyZ2IubGVuZ3RoID09IDMpIHtcbiAgICAgICAgICAgIHJnYiA9IHJnYlswXSArIHJnYlswXSArIHJnYlsxXSArIHJnYlsxXSArIHJnYlsyXSArIHJnYlsyXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgciA9IHBhcnNlSW50KHJnYi5zdWJzdHIoMCwgMiksIDE2KTtcbiAgICAgICAgdmFyIGcgPSBwYXJzZUludChyZ2Iuc3Vic3RyKDIsIDIpLCAxNik7XG4gICAgICAgIHZhciBiID0gcGFyc2VJbnQocmdiLnN1YnN0cig0LCAyKSwgMTYpO1xuICAgICAgICB2YXIgaHNwID0gTWF0aC5zcXJ0KDAuMjk5ICogKHIgKiByKSArIDAuNTg3ICogKGcgKiBnKSArIDAuMTE0ICogKGIgKiBiKSk7XG4gICAgICAgIHJldHVybiBoc3AgPCAxMjA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZlcnNpb25Db21wYXJlKHYxLCB2Mikge1xuICAgICAgICBpZiAodHlwZW9mIHYxICE9PSAnc3RyaW5nJylcbiAgICAgICAgICAgIHYxID0gJyc7XG4gICAgICAgIGlmICh0eXBlb2YgdjIgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgdjIgPSAnJztcbiAgICAgICAgdjEgPSB2MS5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJykuc3BsaXQoJy4nKTtcbiAgICAgICAgdjIgPSB2Mi5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJykuc3BsaXQoJy4nKTtcbiAgICAgICAgdmFyIGEgPSBNYXRoLm1heCh2MS5sZW5ndGgsIHYyLmxlbmd0aCksIGksIHAxLCBwMjtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGE7IGkrKykge1xuICAgICAgICAgICAgcDEgPSBwYXJzZUludCh2MVtpXSkgfHwgMDtcbiAgICAgICAgICAgIHAyID0gcGFyc2VJbnQodjJbaV0pIHx8IDA7XG4gICAgICAgICAgICBpZiAocDEgPT0gcDIpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAocDEgPiBwMilcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmVyc2lvbkF0TGVhc3QodmVyKSB7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uQ29tcGFyZSh3ZWJBcHBWZXJzaW9uLCB2ZXIpID49IDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJ5dGVMZW5ndGgoc3RyKSB7XG4gICAgICAgIGlmICh3aW5kb3cuQmxvYikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJsb2IoW3N0cl0pLnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkgeyB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHMgPSBzdHIubGVuZ3RoO1xuICAgICAgICBmb3IgKHZhciBpID0gc3RyLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICB2YXIgY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKGNvZGUgPiAweDdmICYmIGNvZGUgPD0gMHg3ZmYpXG4gICAgICAgICAgICAgICAgcysrO1xuICAgICAgICAgICAgZWxzZSBpZiAoY29kZSA+IDB4N2ZmICYmIGNvZGUgPD0gMHhmZmZmKVxuICAgICAgICAgICAgICAgIHMgKz0gMjtcbiAgICAgICAgICAgIGlmIChjb2RlID49IDB4ZGMwMCAmJiBjb2RlIDw9IDB4ZGZmZilcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuICAgIHZhciBCYWNrQnV0dG9uID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlzVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB2YXIgYmFja0J1dHRvbiA9IHt9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYmFja0J1dHRvbiwgJ2lzVmlzaWJsZScsIHtcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkgeyBzZXRQYXJhbXMoeyBpc192aXNpYmxlOiB2YWwgfSk7IH0sXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGlzVmlzaWJsZTsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBjdXJCdXR0b25TdGF0ZSA9IG51bGw7XG4gICAgICAgIFdlYlZpZXcub25FdmVudCgnYmFja19idXR0b25fcHJlc3NlZCcsIG9uQmFja0J1dHRvblByZXNzZWQpO1xuICAgICAgICBmdW5jdGlvbiBvbkJhY2tCdXR0b25QcmVzc2VkKCkge1xuICAgICAgICAgICAgcmVjZWl2ZVdlYlZpZXdFdmVudCgnYmFja0J1dHRvbkNsaWNrZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBidXR0b25QYXJhbXMoKSB7XG4gICAgICAgICAgICByZXR1cm4geyBpc192aXNpYmxlOiBpc1Zpc2libGUgfTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBidXR0b25TdGF0ZShidG5fcGFyYW1zKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGJ0bl9wYXJhbXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgYnRuX3BhcmFtcyA9IGJ1dHRvblBhcmFtcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGJ0bl9wYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGJ1dHRvbkNoZWNrVmVyc2lvbigpIHtcbiAgICAgICAgICAgIGlmICghdmVyc2lvbkF0TGVhc3QoJzYuMScpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdbVGVsZWdyYW0uV2ViQXBwXSBCYWNrQnV0dG9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdmVyc2lvbiAnICsgd2ViQXBwVmVyc2lvbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQnV0dG9uKCkge1xuICAgICAgICAgICAgdmFyIGJ0bl9wYXJhbXMgPSBidXR0b25QYXJhbXMoKTtcbiAgICAgICAgICAgIHZhciBidG5fc3RhdGUgPSBidXR0b25TdGF0ZShidG5fcGFyYW1zKTtcbiAgICAgICAgICAgIGlmIChjdXJCdXR0b25TdGF0ZSA9PT0gYnRuX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyQnV0dG9uU3RhdGUgPSBidG5fc3RhdGU7XG4gICAgICAgICAgICBXZWJWaWV3LnBvc3RFdmVudCgnd2ViX2FwcF9zZXR1cF9iYWNrX2J1dHRvbicsIGZhbHNlLCBidG5fcGFyYW1zKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBzZXRQYXJhbXMocGFyYW1zKSB7XG4gICAgICAgICAgICBpZiAoIWJ1dHRvbkNoZWNrVmVyc2lvbigpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJhY2tCdXR0b247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtcy5pc192aXNpYmxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlzVmlzaWJsZSA9ICEhcGFyYW1zLmlzX3Zpc2libGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGVCdXR0b24oKTtcbiAgICAgICAgICAgIHJldHVybiBiYWNrQnV0dG9uO1xuICAgICAgICB9XG4gICAgICAgIGJhY2tCdXR0b24ub25DbGljayA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKGJ1dHRvbkNoZWNrVmVyc2lvbigpKSB7XG4gICAgICAgICAgICAgICAgb25XZWJWaWV3RXZlbnQoJ2JhY2tCdXR0b25DbGlja2VkJywgY2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJhY2tCdXR0b247XG4gICAgICAgIH07XG4gICAgICAgIGJhY2tCdXR0b24ub2ZmQ2xpY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGlmIChidXR0b25DaGVja1ZlcnNpb24oKSkge1xuICAgICAgICAgICAgICAgIG9mZldlYlZpZXdFdmVudCgnYmFja0J1dHRvbkNsaWNrZWQnLCBjYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYmFja0J1dHRvbjtcbiAgICAgICAgfTtcbiAgICAgICAgYmFja0J1dHRvbi5zaG93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtcyh7IGlzX3Zpc2libGU6IHRydWUgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGJhY2tCdXR0b24uaGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbXMoeyBpc192aXNpYmxlOiBmYWxzZSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGJhY2tCdXR0b247XG4gICAgfSkoKTtcbiAgICB2YXIgbWFpbkJ1dHRvbkhlaWdodCA9IDA7XG4gICAgdmFyIE1haW5CdXR0b24gPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHZhciBpc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgIHZhciBpc1Byb2dyZXNzVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB2YXIgYnV0dG9uVGV4dCA9ICdDT05USU5VRSc7XG4gICAgICAgIHZhciBidXR0b25Db2xvciA9IGZhbHNlO1xuICAgICAgICB2YXIgYnV0dG9uVGV4dENvbG9yID0gZmFsc2U7XG4gICAgICAgIHZhciBtYWluQnV0dG9uID0ge307XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWluQnV0dG9uLCAndGV4dCcsIHtcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkgeyBtYWluQnV0dG9uLnNldFBhcmFtcyh7IHRleHQ6IHZhbCB9KTsgfSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gYnV0dG9uVGV4dDsgfSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWluQnV0dG9uLCAnY29sb3InLCB7XG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHsgbWFpbkJ1dHRvbi5zZXRQYXJhbXMoeyBjb2xvcjogdmFsIH0pOyB9LFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBidXR0b25Db2xvciB8fCB0aGVtZVBhcmFtcy5idXR0b25fY29sb3IgfHwgJyMyNDgxY2MnOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1haW5CdXR0b24sICd0ZXh0Q29sb3InLCB7XG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHsgbWFpbkJ1dHRvbi5zZXRQYXJhbXMoeyB0ZXh0X2NvbG9yOiB2YWwgfSk7IH0sXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGJ1dHRvblRleHRDb2xvciB8fCB0aGVtZVBhcmFtcy5idXR0b25fdGV4dF9jb2xvciB8fCAnI2ZmZmZmZic7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobWFpbkJ1dHRvbiwgJ2lzVmlzaWJsZScsIHtcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbCkgeyBtYWluQnV0dG9uLnNldFBhcmFtcyh7IGlzX3Zpc2libGU6IHZhbCB9KTsgfSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gaXNWaXNpYmxlOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1haW5CdXR0b24sICdpc1Byb2dyZXNzVmlzaWJsZScsIHtcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gaXNQcm9ncmVzc1Zpc2libGU7IH0sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobWFpbkJ1dHRvbiwgJ2lzQWN0aXZlJywge1xuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7IG1haW5CdXR0b24uc2V0UGFyYW1zKHsgaXNfYWN0aXZlOiB2YWwgfSk7IH0sXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGlzQWN0aXZlOyB9LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGN1ckJ1dHRvblN0YXRlID0gbnVsbDtcbiAgICAgICAgV2ViVmlldy5vbkV2ZW50KCdtYWluX2J1dHRvbl9wcmVzc2VkJywgb25NYWluQnV0dG9uUHJlc3NlZCk7XG4gICAgICAgIHZhciBkZWJ1Z0J0biA9IG51bGwsIGRlYnVnQnRuU3R5bGUgPSB7fTtcbiAgICAgICAgaWYgKGluaXRQYXJhbXMudGdXZWJBcHBEZWJ1Zykge1xuICAgICAgICAgICAgZGVidWdCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Zy1tYWluLWJ1dHRvbicpO1xuICAgICAgICAgICAgZGVidWdCdG5TdHlsZSA9IHtcbiAgICAgICAgICAgICAgICBmb250OiAnNjAwIDE0cHgvMThweCBzYW5zLXNlcmlmJyxcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnbm9uZScsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICc0OHB4JyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcwJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAnbm8tcmVwZWF0IHJpZ2h0IGNlbnRlcicsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAnMCcsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgICAgICAgICAgbWFyZ2luOiAnMCcsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzE1cHggMjBweCcsXG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgICAgICAgICAgICB6SW5kZXg6ICcxMDAwMCdcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIGRlYnVnQnRuU3R5bGUpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0J0bi5zdHlsZVtrXSA9IGRlYnVnQnRuU3R5bGVba107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gb25Eb21Mb2FkZWQoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgb25Eb21Mb2FkZWQpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGVidWdCdG4pO1xuICAgICAgICAgICAgICAgIGRlYnVnQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25NYWluQnV0dG9uUHJlc3NlZCwgZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gb25NYWluQnV0dG9uUHJlc3NlZCgpIHtcbiAgICAgICAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVXZWJWaWV3RXZlbnQoJ21haW5CdXR0b25DbGlja2VkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gYnV0dG9uUGFyYW1zKCkge1xuICAgICAgICAgICAgdmFyIGNvbG9yID0gbWFpbkJ1dHRvbi5jb2xvcjtcbiAgICAgICAgICAgIHZhciB0ZXh0X2NvbG9yID0gbWFpbkJ1dHRvbi50ZXh0Q29sb3I7XG4gICAgICAgICAgICByZXR1cm4gaXNWaXNpYmxlID8ge1xuICAgICAgICAgICAgICAgIGlzX3Zpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNfYWN0aXZlOiBpc0FjdGl2ZSxcbiAgICAgICAgICAgICAgICBpc19wcm9ncmVzc192aXNpYmxlOiBpc1Byb2dyZXNzVmlzaWJsZSxcbiAgICAgICAgICAgICAgICB0ZXh0OiBidXR0b25UZXh0LFxuICAgICAgICAgICAgICAgIGNvbG9yOiBjb2xvcixcbiAgICAgICAgICAgICAgICB0ZXh0X2NvbG9yOiB0ZXh0X2NvbG9yXG4gICAgICAgICAgICB9IDogeyBpc192aXNpYmxlOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGJ1dHRvblN0YXRlKGJ0bl9wYXJhbXMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYnRuX3BhcmFtcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBidG5fcGFyYW1zID0gYnV0dG9uUGFyYW1zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYnRuX3BhcmFtcyk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gdXBkYXRlQnV0dG9uKCkge1xuICAgICAgICAgICAgdmFyIGJ0bl9wYXJhbXMgPSBidXR0b25QYXJhbXMoKTtcbiAgICAgICAgICAgIHZhciBidG5fc3RhdGUgPSBidXR0b25TdGF0ZShidG5fcGFyYW1zKTtcbiAgICAgICAgICAgIGlmIChjdXJCdXR0b25TdGF0ZSA9PT0gYnRuX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VyQnV0dG9uU3RhdGUgPSBidG5fc3RhdGU7XG4gICAgICAgICAgICBXZWJWaWV3LnBvc3RFdmVudCgnd2ViX2FwcF9zZXR1cF9tYWluX2J1dHRvbicsIGZhbHNlLCBidG5fcGFyYW1zKTtcbiAgICAgICAgICAgIGlmIChpbml0UGFyYW1zLnRnV2ViQXBwRGVidWcpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVEZWJ1Z0J1dHRvbihidG5fcGFyYW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiB1cGRhdGVEZWJ1Z0J1dHRvbihidG5fcGFyYW1zKSB7XG4gICAgICAgICAgICBpZiAoYnRuX3BhcmFtcy5pc192aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgZGVidWdCdG4uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgbWFpbkJ1dHRvbkhlaWdodCA9IDQ4O1xuICAgICAgICAgICAgICAgIGRlYnVnQnRuLnN0eWxlLm9wYWNpdHkgPSBidG5fcGFyYW1zLmlzX2FjdGl2ZSA/ICcxJyA6ICcwLjgnO1xuICAgICAgICAgICAgICAgIGRlYnVnQnRuLnN0eWxlLmN1cnNvciA9IGJ0bl9wYXJhbXMuaXNfYWN0aXZlID8gJ3BvaW50ZXInIDogJ2F1dG8nO1xuICAgICAgICAgICAgICAgIGRlYnVnQnRuLmRpc2FibGVkID0gIWJ0bl9wYXJhbXMuaXNfYWN0aXZlO1xuICAgICAgICAgICAgICAgIGRlYnVnQnRuLmlubmVyVGV4dCA9IGJ0bl9wYXJhbXMudGV4dDtcbiAgICAgICAgICAgICAgICBkZWJ1Z0J0bi5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBidG5fcGFyYW1zLmlzX3Byb2dyZXNzX3Zpc2libGUgPyBcInVybCgnZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyUyMHhtbG5zJTNEJTIyaHR0cCUzQSUyRiUyRnd3dy53My5vcmclMkYyMDAwJTJGc3ZnJTIyJTIweG1sbnMlM0F4bGluayUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhsaW5rJTIyJTIwdmlld3BvcnQlM0QlMjIwJTIwMCUyMDQ4JTIwNDglMjIlMjB3aWR0aCUzRCUyMjQ4cHglMjIlMjBoZWlnaHQlM0QlMjI0OHB4JTIyJTNFJTNDY2lyY2xlJTIwY3glM0QlMjI1MCUyNSUyMiUyMGN5JTNEJTIyNTAlMjUlMjIlMjBzdHJva2UlM0QlMjIlMjNmZmYlMjIlMjBzdHJva2Utd2lkdGglM0QlMjIyLjI1JTIyJTIwc3Ryb2tlLWxpbmVjYXAlM0QlMjJyb3VuZCUyMiUyMGZpbGwlM0QlMjJub25lJTIyJTIwc3Ryb2tlLWRhc2hvZmZzZXQlM0QlMjIxMDYlMjIlMjByJTNEJTIyOSUyMiUyMHN0cm9rZS1kYXNoYXJyYXklM0QlMjI1Ni41MiUyMiUyMHJvdGF0ZSUzRCUyMi05MCUyMiUzRSUzQ2FuaW1hdGUlMjBhdHRyaWJ1dGVOYW1lJTNEJTIyc3Ryb2tlLWRhc2hvZmZzZXQlMjIlMjBhdHRyaWJ1dGVUeXBlJTNEJTIyWE1MJTIyJTIwZHVyJTNEJTIyMzYwcyUyMiUyMGZyb20lM0QlMjIwJTIyJTIwdG8lM0QlMjIxMjUwMCUyMiUyMHJlcGVhdENvdW50JTNEJTIyaW5kZWZpbml0ZSUyMiUzRSUzQyUyRmFuaW1hdGUlM0UlM0NhbmltYXRlVHJhbnNmb3JtJTIwYXR0cmlidXRlTmFtZSUzRCUyMnRyYW5zZm9ybSUyMiUyMGF0dHJpYnV0ZVR5cGUlM0QlMjJYTUwlMjIlMjB0eXBlJTNEJTIycm90YXRlJTIyJTIwZHVyJTNEJTIyMXMlMjIlMjBmcm9tJTNEJTIyLTkwJTIwMjQlMjAyNCUyMiUyMHRvJTNEJTIyNjMwJTIwMjQlMjAyNCUyMiUyMHJlcGVhdENvdW50JTNEJTIyaW5kZWZpbml0ZSUyMiUzRSUzQyUyRmFuaW1hdGVUcmFuc2Zvcm0lM0UlM0MlMkZjaXJjbGUlM0UlM0MlMkZzdmclM0UnKVwiIDogJ25vbmUnO1xuICAgICAgICAgICAgICAgIGRlYnVnQnRuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJ0bl9wYXJhbXMuY29sb3I7XG4gICAgICAgICAgICAgICAgZGVidWdCdG4uc3R5bGUuY29sb3IgPSBidG5fcGFyYW1zLnRleHRfY29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0J0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgIG1haW5CdXR0b25IZWlnaHQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5ib3hTaXppbmcgPSAnYm9yZGVyLWJveCc7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnBhZGRpbmdCb3R0b20gPSBtYWluQnV0dG9uSGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldFZpZXdwb3J0SGVpZ2h0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2V0UGFyYW1zKHBhcmFtcykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMudGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IHN0clRyaW0ocGFyYW1zLnRleHQpO1xuICAgICAgICAgICAgICAgIGlmICghdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVncmFtLldlYkFwcF0gTWFpbiBidXR0b24gdGV4dCBpcyByZXF1aXJlZCcsIHBhcmFtcy50ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1dlYkFwcE1haW5CdXR0b25QYXJhbUludmFsaWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRleHQubGVuZ3RoID4gNjQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVncmFtLldlYkFwcF0gTWFpbiBidXR0b24gdGV4dCBpcyB0b28gbG9uZycsIHRleHQpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwTWFpbkJ1dHRvblBhcmFtSW52YWxpZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidXR0b25UZXh0ID0gdGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW1zLmNvbG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuY29sb3IgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jb2xvciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBidXR0b25Db2xvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbG9yID0gcGFyc2VDb2xvclRvSGV4KHBhcmFtcy5jb2xvcik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29sb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIE1haW4gYnV0dG9uIGNvbG9yIGZvcm1hdCBpcyBpbnZhbGlkJywgcGFyYW1zLmNvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBNYWluQnV0dG9uUGFyYW1JbnZhbGlkJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ29sb3IgPSBjb2xvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtcy50ZXh0X2NvbG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMudGV4dF9jb2xvciA9PT0gZmFsc2UgfHxcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnRleHRfY29sb3IgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uVGV4dENvbG9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dF9jb2xvciA9IHBhcnNlQ29sb3JUb0hleChwYXJhbXMudGV4dF9jb2xvcik7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGV4dF9jb2xvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVncmFtLldlYkFwcF0gTWFpbiBidXR0b24gdGV4dCBjb2xvciBmb3JtYXQgaXMgaW52YWxpZCcsIHBhcmFtcy50ZXh0X2NvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBNYWluQnV0dG9uUGFyYW1JbnZhbGlkJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uVGV4dENvbG9yID0gdGV4dF9jb2xvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtcy5pc192aXNpYmxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuaXNfdmlzaWJsZSAmJlxuICAgICAgICAgICAgICAgICAgICAhbWFpbkJ1dHRvbi50ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBNYWluIGJ1dHRvbiB0ZXh0IGlzIHJlcXVpcmVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBNYWluQnV0dG9uUGFyYW1JbnZhbGlkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlzVmlzaWJsZSA9ICEhcGFyYW1zLmlzX3Zpc2libGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtcy5pc19hY3RpdmUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaXNBY3RpdmUgPSAhIXBhcmFtcy5pc19hY3RpdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGVCdXR0b24oKTtcbiAgICAgICAgICAgIHJldHVybiBtYWluQnV0dG9uO1xuICAgICAgICB9XG4gICAgICAgIG1haW5CdXR0b24uc2V0VGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gbWFpbkJ1dHRvbi5zZXRQYXJhbXMoeyB0ZXh0OiB0ZXh0IH0pO1xuICAgICAgICB9O1xuICAgICAgICBtYWluQnV0dG9uLm9uQ2xpY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgIG9uV2ViVmlld0V2ZW50KCdtYWluQnV0dG9uQ2xpY2tlZCcsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIHJldHVybiBtYWluQnV0dG9uO1xuICAgICAgICB9O1xuICAgICAgICBtYWluQnV0dG9uLm9mZkNsaWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICBvZmZXZWJWaWV3RXZlbnQoJ21haW5CdXR0b25DbGlja2VkJywgY2FsbGJhY2spO1xuICAgICAgICAgICAgcmV0dXJuIG1haW5CdXR0b247XG4gICAgICAgIH07XG4gICAgICAgIG1haW5CdXR0b24uc2hvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWluQnV0dG9uLnNldFBhcmFtcyh7IGlzX3Zpc2libGU6IHRydWUgfSk7XG4gICAgICAgIH07XG4gICAgICAgIG1haW5CdXR0b24uaGlkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWluQnV0dG9uLnNldFBhcmFtcyh7IGlzX3Zpc2libGU6IGZhbHNlIH0pO1xuICAgICAgICB9O1xuICAgICAgICBtYWluQnV0dG9uLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWluQnV0dG9uLnNldFBhcmFtcyh7IGlzX2FjdGl2ZTogdHJ1ZSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgbWFpbkJ1dHRvbi5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG1haW5CdXR0b24uc2V0UGFyYW1zKHsgaXNfYWN0aXZlOiBmYWxzZSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgbWFpbkJ1dHRvbi5zaG93UHJvZ3Jlc3MgPSBmdW5jdGlvbiAobGVhdmVBY3RpdmUpIHtcbiAgICAgICAgICAgIGlzQWN0aXZlID0gISFsZWF2ZUFjdGl2ZTtcbiAgICAgICAgICAgIGlzUHJvZ3Jlc3NWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHVwZGF0ZUJ1dHRvbigpO1xuICAgICAgICAgICAgcmV0dXJuIG1haW5CdXR0b247XG4gICAgICAgIH07XG4gICAgICAgIG1haW5CdXR0b24uaGlkZVByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFtYWluQnV0dG9uLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgaXNBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNQcm9ncmVzc1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHVwZGF0ZUJ1dHRvbigpO1xuICAgICAgICAgICAgcmV0dXJuIG1haW5CdXR0b247XG4gICAgICAgIH07XG4gICAgICAgIG1haW5CdXR0b24uc2V0UGFyYW1zID0gc2V0UGFyYW1zO1xuICAgICAgICByZXR1cm4gbWFpbkJ1dHRvbjtcbiAgICB9KSgpO1xuICAgIGZ1bmN0aW9uIG9uU2V0dGluZ3NCdXR0b25QcmVzc2VkKCkge1xuICAgICAgICByZWNlaXZlV2ViVmlld0V2ZW50KCdzZXR0aW5nc0J1dHRvbkNsaWNrZWQnKTtcbiAgICB9XG4gICAgV2ViVmlldy5vbkV2ZW50KCdzZXR0aW5nc19idXR0b25fcHJlc3NlZCcsIG9uU2V0dGluZ3NCdXR0b25QcmVzc2VkKTtcbiAgICB2YXIgSGFwdGljRmVlZGJhY2sgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaGFwdGljRmVlZGJhY2sgPSB7fTtcbiAgICAgICAgZnVuY3Rpb24gdHJpZ2dlckZlZWRiYWNrKHBhcmFtcykge1xuICAgICAgICAgICAgaWYgKCF2ZXJzaW9uQXRMZWFzdCgnNi4xJykpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tUZWxlZ3JhbS5XZWJBcHBdIEhhcHRpY0ZlZWRiYWNrIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdmVyc2lvbiAnICsgd2ViQXBwVmVyc2lvbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhcHRpY0ZlZWRiYWNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhcmFtcy50eXBlID09ICdpbXBhY3QnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5pbXBhY3Rfc3R5bGUgIT0gJ2xpZ2h0JyAmJlxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuaW1wYWN0X3N0eWxlICE9ICdtZWRpdW0nICYmXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5pbXBhY3Rfc3R5bGUgIT0gJ2hlYXZ5JyAmJlxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuaW1wYWN0X3N0eWxlICE9ICdyaWdpZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmltcGFjdF9zdHlsZSAhPSAnc29mdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVncmFtLldlYkFwcF0gSGFwdGljIGltcGFjdCBzdHlsZSBpcyBpbnZhbGlkJywgcGFyYW1zLmltcGFjdF9zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBIYXB0aWNJbXBhY3RTdHlsZUludmFsaWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYXJhbXMudHlwZSA9PSAnbm90aWZpY2F0aW9uJykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMubm90aWZpY2F0aW9uX3R5cGUgIT0gJ2Vycm9yJyAmJlxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMubm90aWZpY2F0aW9uX3R5cGUgIT0gJ3N1Y2Nlc3MnICYmXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5ub3RpZmljYXRpb25fdHlwZSAhPSAnd2FybmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVncmFtLldlYkFwcF0gSGFwdGljIG5vdGlmaWNhdGlvbiB0eXBlIGlzIGludmFsaWQnLCBwYXJhbXMubm90aWZpY2F0aW9uX3R5cGUpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwSGFwdGljTm90aWZpY2F0aW9uVHlwZUludmFsaWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwYXJhbXMudHlwZSA9PSAnc2VsZWN0aW9uX2NoYW5nZScpIHtcbiAgICAgICAgICAgICAgICAvLyBubyBwYXJhbXMgbmVlZGVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBIYXB0aWMgZmVlZGJhY2sgdHlwZSBpcyBpbnZhbGlkJywgcGFyYW1zLnR5cGUpO1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBIYXB0aWNGZWVkYmFja1R5cGVJbnZhbGlkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBXZWJWaWV3LnBvc3RFdmVudCgnd2ViX2FwcF90cmlnZ2VyX2hhcHRpY19mZWVkYmFjaycsIGZhbHNlLCBwYXJhbXMpO1xuICAgICAgICAgICAgcmV0dXJuIGhhcHRpY0ZlZWRiYWNrO1xuICAgICAgICB9XG4gICAgICAgIGhhcHRpY0ZlZWRiYWNrLmltcGFjdE9jY3VycmVkID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJpZ2dlckZlZWRiYWNrKHsgdHlwZTogJ2ltcGFjdCcsIGltcGFjdF9zdHlsZTogc3R5bGUgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGhhcHRpY0ZlZWRiYWNrLm5vdGlmaWNhdGlvbk9jY3VycmVkID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmlnZ2VyRmVlZGJhY2soeyB0eXBlOiAnbm90aWZpY2F0aW9uJywgbm90aWZpY2F0aW9uX3R5cGU6IHR5cGUgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGhhcHRpY0ZlZWRiYWNrLnNlbGVjdGlvbkNoYW5nZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJpZ2dlckZlZWRiYWNrKHsgdHlwZTogJ3NlbGVjdGlvbl9jaGFuZ2UnIH0pO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaGFwdGljRmVlZGJhY2s7XG4gICAgfSkoKTtcbiAgICB2YXIgQ2xvdWRTdG9yYWdlID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNsb3VkU3RvcmFnZSA9IHt9O1xuICAgICAgICBmdW5jdGlvbiBpbnZva2VTdG9yYWdlTWV0aG9kKG1ldGhvZCwgcGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgaWYgKCF2ZXJzaW9uQXRMZWFzdCgnNi45JykpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBDbG91ZFN0b3JhZ2UgaXMgbm90IHN1cHBvcnRlZCBpbiB2ZXJzaW9uICcgKyB3ZWJBcHBWZXJzaW9uKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwTWV0aG9kVW5zdXBwb3J0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludm9rZUN1c3RvbU1ldGhvZChtZXRob2QsIHBhcmFtcywgY2FsbGJhY2spO1xuICAgICAgICAgICAgcmV0dXJuIGNsb3VkU3RvcmFnZTtcbiAgICAgICAgfVxuICAgICAgICBjbG91ZFN0b3JhZ2Uuc2V0SXRlbSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIGludm9rZVN0b3JhZ2VNZXRob2QoJ3NhdmVTdG9yYWdlVmFsdWUnLCB7IGtleToga2V5LCB2YWx1ZTogdmFsdWUgfSwgY2FsbGJhY2spO1xuICAgICAgICB9O1xuICAgICAgICBjbG91ZFN0b3JhZ2UuZ2V0SXRlbSA9IGZ1bmN0aW9uIChrZXksIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvdWRTdG9yYWdlLmdldEl0ZW1zKFtrZXldLCBjYWxsYmFjayA/IGZ1bmN0aW9uIChlcnIsIHJlcykge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXNba2V5XSk7XG4gICAgICAgICAgICB9IDogbnVsbCk7XG4gICAgICAgIH07XG4gICAgICAgIGNsb3VkU3RvcmFnZS5nZXRJdGVtcyA9IGZ1bmN0aW9uIChrZXlzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIGludm9rZVN0b3JhZ2VNZXRob2QoJ2dldFN0b3JhZ2VWYWx1ZXMnLCB7IGtleXM6IGtleXMgfSwgY2FsbGJhY2spO1xuICAgICAgICB9O1xuICAgICAgICBjbG91ZFN0b3JhZ2UucmVtb3ZlSXRlbSA9IGZ1bmN0aW9uIChrZXksIGNhbGxiYWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gY2xvdWRTdG9yYWdlLnJlbW92ZUl0ZW1zKFtrZXldLCBjYWxsYmFjayk7XG4gICAgICAgIH07XG4gICAgICAgIGNsb3VkU3RvcmFnZS5yZW1vdmVJdGVtcyA9IGZ1bmN0aW9uIChrZXlzLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIGludm9rZVN0b3JhZ2VNZXRob2QoJ2RlbGV0ZVN0b3JhZ2VWYWx1ZXMnLCB7IGtleXM6IGtleXMgfSwgY2FsbGJhY2spO1xuICAgICAgICB9O1xuICAgICAgICBjbG91ZFN0b3JhZ2UuZ2V0S2V5cyA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIGludm9rZVN0b3JhZ2VNZXRob2QoJ2dldFN0b3JhZ2VLZXlzJywge30sIGNhbGxiYWNrKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGNsb3VkU3RvcmFnZTtcbiAgICB9KSgpO1xuICAgIHZhciB3ZWJBcHBJbnZvaWNlcyA9IHt9O1xuICAgIGZ1bmN0aW9uIG9uSW52b2ljZUNsb3NlZChldmVudFR5cGUsIGV2ZW50RGF0YSkge1xuICAgICAgICBpZiAoZXZlbnREYXRhLnNsdWcgJiYgd2ViQXBwSW52b2ljZXNbZXZlbnREYXRhLnNsdWddKSB7XG4gICAgICAgICAgICB2YXIgaW52b2ljZURhdGEgPSB3ZWJBcHBJbnZvaWNlc1tldmVudERhdGEuc2x1Z107XG4gICAgICAgICAgICBkZWxldGUgd2ViQXBwSW52b2ljZXNbZXZlbnREYXRhLnNsdWddO1xuICAgICAgICAgICAgaWYgKGludm9pY2VEYXRhLmNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaW52b2ljZURhdGEuY2FsbGJhY2soZXZlbnREYXRhLnN0YXR1cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWNlaXZlV2ViVmlld0V2ZW50KCdpbnZvaWNlQ2xvc2VkJywge1xuICAgICAgICAgICAgICAgIHVybDogaW52b2ljZURhdGEudXJsLFxuICAgICAgICAgICAgICAgIHN0YXR1czogZXZlbnREYXRhLnN0YXR1c1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIHdlYkFwcFBvcHVwT3BlbmVkID0gZmFsc2U7XG4gICAgZnVuY3Rpb24gb25Qb3B1cENsb3NlZChldmVudFR5cGUsIGV2ZW50RGF0YSkge1xuICAgICAgICBpZiAod2ViQXBwUG9wdXBPcGVuZWQpIHtcbiAgICAgICAgICAgIHZhciBwb3B1cERhdGEgPSB3ZWJBcHBQb3B1cE9wZW5lZDtcbiAgICAgICAgICAgIHdlYkFwcFBvcHVwT3BlbmVkID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgYnV0dG9uX2lkID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnREYXRhLmJ1dHRvbl9pZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBidXR0b25faWQgPSBldmVudERhdGEuYnV0dG9uX2lkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBvcHVwRGF0YS5jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHBvcHVwRGF0YS5jYWxsYmFjayhidXR0b25faWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVjZWl2ZVdlYlZpZXdFdmVudCgncG9wdXBDbG9zZWQnLCB7XG4gICAgICAgICAgICAgICAgYnV0dG9uX2lkOiBidXR0b25faWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciB3ZWJBcHBTY2FuUXJQb3B1cE9wZW5lZCA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIG9uUXJUZXh0UmVjZWl2ZWQoZXZlbnRUeXBlLCBldmVudERhdGEpIHtcbiAgICAgICAgaWYgKHdlYkFwcFNjYW5RclBvcHVwT3BlbmVkKSB7XG4gICAgICAgICAgICB2YXIgcG9wdXBEYXRhID0gd2ViQXBwU2NhblFyUG9wdXBPcGVuZWQ7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IG51bGw7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50RGF0YS5kYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBldmVudERhdGEuZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwb3B1cERhdGEuY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBpZiAocG9wdXBEYXRhLmNhbGxiYWNrKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdlYkFwcFNjYW5RclBvcHVwT3BlbmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIFdlYlZpZXcucG9zdEV2ZW50KCd3ZWJfYXBwX2Nsb3NlX3NjYW5fcXJfcG9wdXAnLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVjZWl2ZVdlYlZpZXdFdmVudCgncXJUZXh0UmVjZWl2ZWQnLCB7XG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gb25TY2FuUXJQb3B1cENsb3NlZChldmVudFR5cGUsIGV2ZW50RGF0YSkge1xuICAgICAgICB3ZWJBcHBTY2FuUXJQb3B1cE9wZW5lZCA9IGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBvbkNsaXBib2FyZFRleHRSZWNlaXZlZChldmVudFR5cGUsIGV2ZW50RGF0YSkge1xuICAgICAgICBpZiAoZXZlbnREYXRhLnJlcV9pZCAmJiB3ZWJBcHBDYWxsYmFja3NbZXZlbnREYXRhLnJlcV9pZF0pIHtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0RGF0YSA9IHdlYkFwcENhbGxiYWNrc1tldmVudERhdGEucmVxX2lkXTtcbiAgICAgICAgICAgIGRlbGV0ZSB3ZWJBcHBDYWxsYmFja3NbZXZlbnREYXRhLnJlcV9pZF07XG4gICAgICAgICAgICB2YXIgZGF0YSA9IG51bGw7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50RGF0YS5kYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBldmVudERhdGEuZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0RGF0YS5jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHJlcXVlc3REYXRhLmNhbGxiYWNrKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVjZWl2ZVdlYlZpZXdFdmVudCgnY2xpcGJvYXJkVGV4dFJlY2VpdmVkJywge1xuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBXZWJBcHBXcml0ZUFjY2Vzc1JlcXVlc3RlZCA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIG9uV3JpdGVBY2Nlc3NSZXF1ZXN0ZWQoZXZlbnRUeXBlLCBldmVudERhdGEpIHtcbiAgICAgICAgaWYgKFdlYkFwcFdyaXRlQWNjZXNzUmVxdWVzdGVkKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdERhdGEgPSBXZWJBcHBXcml0ZUFjY2Vzc1JlcXVlc3RlZDtcbiAgICAgICAgICAgIFdlYkFwcFdyaXRlQWNjZXNzUmVxdWVzdGVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocmVxdWVzdERhdGEuY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0RGF0YS5jYWxsYmFjayhldmVudERhdGEuc3RhdHVzID09ICdhbGxvd2VkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWNlaXZlV2ViVmlld0V2ZW50KCd3cml0ZUFjY2Vzc1JlcXVlc3RlZCcsIHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IGV2ZW50RGF0YS5zdGF0dXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBXZWJBcHBDb250YWN0UmVxdWVzdGVkID0gZmFsc2U7XG4gICAgZnVuY3Rpb24gb25QaG9uZVJlcXVlc3RlZChldmVudFR5cGUsIGV2ZW50RGF0YSkge1xuICAgICAgICBpZiAoV2ViQXBwQ29udGFjdFJlcXVlc3RlZCkge1xuICAgICAgICAgICAgdmFyIHJlcXVlc3REYXRhID0gV2ViQXBwQ29udGFjdFJlcXVlc3RlZDtcbiAgICAgICAgICAgIFdlYkFwcENvbnRhY3RSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0RGF0YS5jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHJlcXVlc3REYXRhLmNhbGxiYWNrKGV2ZW50RGF0YS5zdGF0dXMgPT0gJ3NlbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY2VpdmVXZWJWaWV3RXZlbnQoJ2NvbnRhY3RSZXF1ZXN0ZWQnLCB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBldmVudERhdGEuc3RhdHVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBvbkN1c3RvbU1ldGhvZEludm9rZWQoZXZlbnRUeXBlLCBldmVudERhdGEpIHtcbiAgICAgICAgaWYgKGV2ZW50RGF0YS5yZXFfaWQgJiYgd2ViQXBwQ2FsbGJhY2tzW2V2ZW50RGF0YS5yZXFfaWRdKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdERhdGEgPSB3ZWJBcHBDYWxsYmFja3NbZXZlbnREYXRhLnJlcV9pZF07XG4gICAgICAgICAgICBkZWxldGUgd2ViQXBwQ2FsbGJhY2tzW2V2ZW50RGF0YS5yZXFfaWRdO1xuICAgICAgICAgICAgdmFyIHJlcyA9IG51bGwsIGVyciA9IG51bGw7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50RGF0YS5yZXN1bHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVzID0gZXZlbnREYXRhLnJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnREYXRhLmVycm9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGVyciA9IGV2ZW50RGF0YS5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0RGF0YS5jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHJlcXVlc3REYXRhLmNhbGxiYWNrKGVyciwgcmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpbnZva2VDdXN0b21NZXRob2QobWV0aG9kLCBwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdmVyc2lvbkF0TGVhc3QoJzYuOScpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBNZXRob2QgaW52b2tlQ3VzdG9tTWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdmVyc2lvbiAnICsgd2ViQXBwVmVyc2lvbik7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwTWV0aG9kVW5zdXBwb3J0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVxX2lkID0gZ2VuZXJhdGVDYWxsYmFja0lkKDE2KTtcbiAgICAgICAgdmFyIHJlcV9wYXJhbXMgPSB7IHJlcV9pZDogcmVxX2lkLCBtZXRob2Q6IG1ldGhvZCwgcGFyYW1zOiBwYXJhbXMgfHwge30gfTtcbiAgICAgICAgd2ViQXBwQ2FsbGJhY2tzW3JlcV9pZF0gPSB7XG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICAgICAgfTtcbiAgICAgICAgV2ViVmlldy5wb3N0RXZlbnQoJ3dlYl9hcHBfaW52b2tlX2N1c3RvbV9tZXRob2QnLCBmYWxzZSwgcmVxX3BhcmFtcyk7XG4gICAgfVxuICAgIDtcbiAgICBpZiAoIXdpbmRvdy5UZWxlZ3JhbSkge1xuICAgICAgICB3aW5kb3cuVGVsZWdyYW0gPSB7fTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYkFwcCwgJ2luaXREYXRhJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHdlYkFwcEluaXREYXRhOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYkFwcCwgJ2luaXREYXRhVW5zYWZlJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHdlYkFwcEluaXREYXRhVW5zYWZlOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYkFwcCwgJ3ZlcnNpb24nLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gd2ViQXBwVmVyc2lvbjsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJBcHAsICdwbGF0Zm9ybScsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB3ZWJBcHBQbGF0Zm9ybTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJBcHAsICdjb2xvclNjaGVtZScsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb2xvclNjaGVtZTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJBcHAsICd0aGVtZVBhcmFtcycsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGVtZVBhcmFtczsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXZWJBcHAsICdpc0V4cGFuZGVkJywge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGlzRXhwYW5kZWQ7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViQXBwLCAndmlld3BvcnRIZWlnaHQnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHZpZXdwb3J0SGVpZ2h0ID09PSBmYWxzZSA/IHdpbmRvdy5pbm5lckhlaWdodCA6IHZpZXdwb3J0SGVpZ2h0KSAtIG1haW5CdXR0b25IZWlnaHQ7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViQXBwLCAndmlld3BvcnRTdGFibGVIZWlnaHQnLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gKHZpZXdwb3J0U3RhYmxlSGVpZ2h0ID09PSBmYWxzZSA/IHdpbmRvdy5pbm5lckhlaWdodCA6IHZpZXdwb3J0U3RhYmxlSGVpZ2h0KSAtIG1haW5CdXR0b25IZWlnaHQ7IH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViQXBwLCAnaXNDbG9zaW5nQ29uZmlybWF0aW9uRW5hYmxlZCcsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7IHNldENsb3NpbmdDb25maXJtYXRpb24odmFsKTsgfSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBpc0Nsb3NpbmdDb25maXJtYXRpb25FbmFibGVkOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYkFwcCwgJ2hlYWRlckNvbG9yJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWwpIHsgc2V0SGVhZGVyQ29sb3IodmFsKTsgfSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBnZXRIZWFkZXJDb2xvcigpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYkFwcCwgJ2JhY2tncm91bmRDb2xvcicsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsKSB7IHNldEJhY2tncm91bmRDb2xvcih2YWwpOyB9LFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdldEJhY2tncm91bmRDb2xvcigpOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYkFwcCwgJ0JhY2tCdXR0b24nLCB7XG4gICAgICAgIHZhbHVlOiBCYWNrQnV0dG9uLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYkFwcCwgJ01haW5CdXR0b24nLCB7XG4gICAgICAgIHZhbHVlOiBNYWluQnV0dG9uLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdlYkFwcCwgJ0hhcHRpY0ZlZWRiYWNrJywge1xuICAgICAgICB2YWx1ZTogSGFwdGljRmVlZGJhY2ssXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoV2ViQXBwLCAnQ2xvdWRTdG9yYWdlJywge1xuICAgICAgICB2YWx1ZTogQ2xvdWRTdG9yYWdlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgV2ViQXBwLnNldEhlYWRlckNvbG9yID0gZnVuY3Rpb24gKGNvbG9yX2tleSkge1xuICAgICAgICBXZWJBcHAuaGVhZGVyQ29sb3IgPSBjb2xvcl9rZXk7XG4gICAgfTtcbiAgICBXZWJBcHAuc2V0QmFja2dyb3VuZENvbG9yID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIFdlYkFwcC5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjtcbiAgICB9O1xuICAgIFdlYkFwcC5lbmFibGVDbG9zaW5nQ29uZmlybWF0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBXZWJBcHAuaXNDbG9zaW5nQ29uZmlybWF0aW9uRW5hYmxlZCA9IHRydWU7XG4gICAgfTtcbiAgICBXZWJBcHAuZGlzYWJsZUNsb3NpbmdDb25maXJtYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFdlYkFwcC5pc0Nsb3NpbmdDb25maXJtYXRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgfTtcbiAgICBXZWJBcHAuaXNWZXJzaW9uQXRMZWFzdCA9IGZ1bmN0aW9uICh2ZXIpIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb25BdExlYXN0KHZlcik7XG4gICAgfTtcbiAgICBXZWJBcHAub25FdmVudCA9IGZ1bmN0aW9uIChldmVudFR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIG9uV2ViVmlld0V2ZW50KGV2ZW50VHlwZSwgY2FsbGJhY2spO1xuICAgIH07XG4gICAgV2ViQXBwLm9mZkV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcbiAgICAgICAgb2ZmV2ViVmlld0V2ZW50KGV2ZW50VHlwZSwgY2FsbGJhY2spO1xuICAgIH07XG4gICAgV2ViQXBwLnNlbmREYXRhID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKCFkYXRhIHx8ICFkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVncmFtLldlYkFwcF0gRGF0YSBpcyByZXF1aXJlZCcsIGRhdGEpO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1dlYkFwcERhdGFJbnZhbGlkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ5dGVMZW5ndGgoZGF0YSkgPiA0MDk2KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBEYXRhIGlzIHRvbyBsb25nJywgZGF0YSk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwRGF0YUludmFsaWQnKTtcbiAgICAgICAgfVxuICAgICAgICBXZWJWaWV3LnBvc3RFdmVudCgnd2ViX2FwcF9kYXRhX3NlbmQnLCBmYWxzZSwgeyBkYXRhOiBkYXRhIH0pO1xuICAgIH07XG4gICAgV2ViQXBwLnN3aXRjaElubGluZVF1ZXJ5ID0gZnVuY3Rpb24gKHF1ZXJ5LCBjaG9vc2VfY2hhdF90eXBlcykge1xuICAgICAgICBpZiAoIXZlcnNpb25BdExlYXN0KCc2LjYnKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVncmFtLldlYkFwcF0gTWV0aG9kIHN3aXRjaElubGluZVF1ZXJ5IGlzIG5vdCBzdXBwb3J0ZWQgaW4gdmVyc2lvbiAnICsgd2ViQXBwVmVyc2lvbik7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwTWV0aG9kVW5zdXBwb3J0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWluaXRQYXJhbXMudGdXZWJBcHBCb3RJbmxpbmUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIElubGluZSBtb2RlIGlzIGRpc2FibGVkIGZvciB0aGlzIGJvdC4gUmVhZCBtb3JlIGFib3V0IGlubGluZSBtb2RlOiBodHRwczovL2NvcmUudGVsZWdyYW0ub3JnL2JvdHMvaW5saW5lJyk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwSW5saW5lTW9kZURpc2FibGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcXVlcnkgPSBxdWVyeSB8fCAnJztcbiAgICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+IDI1Nikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVncmFtLldlYkFwcF0gSW5saW5lIHF1ZXJ5IGlzIHRvbyBsb25nJywgcXVlcnkpO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1dlYkFwcElubGluZVF1ZXJ5SW52YWxpZCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjaGF0X3R5cGVzID0gW107XG4gICAgICAgIGlmIChjaG9vc2VfY2hhdF90eXBlcykge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNob29zZV9jaGF0X3R5cGVzKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIENob29zZSBjaGF0IHR5cGVzIHNob3VsZCBiZSBhbiBhcnJheScsIGNob29zZV9jaGF0X3R5cGVzKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwSW5saW5lQ2hvb3NlQ2hhdFR5cGVzSW52YWxpZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGdvb2RfdHlwZXMgPSB7IHVzZXJzOiAxLCBib3RzOiAxLCBncm91cHM6IDEsIGNoYW5uZWxzOiAxIH07XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNob29zZV9jaGF0X3R5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoYXRfdHlwZSA9IGNob29zZV9jaGF0X3R5cGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghZ29vZF90eXBlc1tjaGF0X3R5cGVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIENob29zZSBjaGF0IHR5cGUgaXMgaW52YWxpZCcsIGNoYXRfdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBJbmxpbmVDaG9vc2VDaGF0VHlwZUludmFsaWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGdvb2RfdHlwZXNbY2hhdF90eXBlXSAhPSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGdvb2RfdHlwZXNbY2hhdF90eXBlXSA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGNoYXRfdHlwZXMucHVzaChjaGF0X3R5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBXZWJWaWV3LnBvc3RFdmVudCgnd2ViX2FwcF9zd2l0Y2hfaW5saW5lX3F1ZXJ5JywgZmFsc2UsIHsgcXVlcnk6IHF1ZXJ5LCBjaGF0X3R5cGVzOiBjaGF0X3R5cGVzIH0pO1xuICAgIH07XG4gICAgV2ViQXBwLm9wZW5MaW5rID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0EnKTtcbiAgICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgICBpZiAoYS5wcm90b2NvbCAhPSAnaHR0cDonICYmXG4gICAgICAgICAgICBhLnByb3RvY29sICE9ICdodHRwczonKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBVcmwgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZCcsIHVybCk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwVGdVcmxJbnZhbGlkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHVybCA9IGEuaHJlZjtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICAgIGlmICh2ZXJzaW9uQXRMZWFzdCgnNi4xJykpIHtcbiAgICAgICAgICAgIFdlYlZpZXcucG9zdEV2ZW50KCd3ZWJfYXBwX29wZW5fbGluaycsIGZhbHNlLCB7IHVybDogdXJsLCB0cnlfaW5zdGFudF92aWV3OiB2ZXJzaW9uQXRMZWFzdCgnNi40JykgJiYgISFvcHRpb25zLnRyeV9pbnN0YW50X3ZpZXcgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgV2ViQXBwLm9wZW5UZWxlZ3JhbUxpbmsgPSBmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnQScpO1xuICAgICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICAgIGlmIChhLnByb3RvY29sICE9ICdodHRwOicgJiZcbiAgICAgICAgICAgIGEucHJvdG9jb2wgIT0gJ2h0dHBzOicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIFVybCBwcm90b2NvbCBpcyBub3Qgc3VwcG9ydGVkJywgdXJsKTtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBUZ1VybEludmFsaWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5ob3N0bmFtZSAhPSAndC5tZScpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIFVybCBob3N0IGlzIG5vdCBzdXBwb3J0ZWQnLCB1cmwpO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1dlYkFwcFRnVXJsSW52YWxpZCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXRoX2Z1bGwgPSBhLnBhdGhuYW1lICsgYS5zZWFyY2g7XG4gICAgICAgIGlmIChpc0lmcmFtZSB8fCB2ZXJzaW9uQXRMZWFzdCgnNi4xJykpIHtcbiAgICAgICAgICAgIFdlYlZpZXcucG9zdEV2ZW50KCd3ZWJfYXBwX29wZW5fdGdfbGluaycsIGZhbHNlLCB7IHBhdGhfZnVsbDogcGF0aF9mdWxsIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9ICdodHRwczovL3QubWUnICsgcGF0aF9mdWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBXZWJBcHAub3Blbkludm9pY2UgPSBmdW5jdGlvbiAodXJsLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0EnKSwgbWF0Y2gsIHNsdWc7XG4gICAgICAgIGEuaHJlZiA9IHVybDtcbiAgICAgICAgaWYgKGEucHJvdG9jb2wgIT0gJ2h0dHA6JyAmJlxuICAgICAgICAgICAgYS5wcm90b2NvbCAhPSAnaHR0cHM6JyB8fFxuICAgICAgICAgICAgYS5ob3N0bmFtZSAhPSAndC5tZScgfHxcbiAgICAgICAgICAgICEobWF0Y2ggPSBhLnBhdGhuYW1lLm1hdGNoKC9eXFwvKFxcJHxpbnZvaWNlXFwvKShbQS1aYS16MC05XFwtXz1dKykkLykpIHx8XG4gICAgICAgICAgICAhKHNsdWcgPSBtYXRjaFsyXSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIEludm9pY2UgdXJsIGlzIGludmFsaWQnLCB1cmwpO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1dlYkFwcEludm9pY2VVcmxJbnZhbGlkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF2ZXJzaW9uQXRMZWFzdCgnNi4xJykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIE1ldGhvZCBvcGVuSW52b2ljZSBpcyBub3Qgc3VwcG9ydGVkIGluIHZlcnNpb24gJyArIHdlYkFwcFZlcnNpb24pO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1dlYkFwcE1ldGhvZFVuc3VwcG9ydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlYkFwcEludm9pY2VzW3NsdWddKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBJbnZvaWNlIGlzIGFscmVhZHkgb3BlbmVkJyk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwSW52b2ljZU9wZW5lZCcpO1xuICAgICAgICB9XG4gICAgICAgIHdlYkFwcEludm9pY2VzW3NsdWddID0ge1xuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICAgICAgfTtcbiAgICAgICAgV2ViVmlldy5wb3N0RXZlbnQoJ3dlYl9hcHBfb3Blbl9pbnZvaWNlJywgZmFsc2UsIHsgc2x1Zzogc2x1ZyB9KTtcbiAgICB9O1xuICAgIFdlYkFwcC5zaG93UG9wdXAgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoIXZlcnNpb25BdExlYXN0KCc2LjInKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVncmFtLldlYkFwcF0gTWV0aG9kIHNob3dQb3B1cCBpcyBub3Qgc3VwcG9ydGVkIGluIHZlcnNpb24gJyArIHdlYkFwcFZlcnNpb24pO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1dlYkFwcE1ldGhvZFVuc3VwcG9ydGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlYkFwcFBvcHVwT3BlbmVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBQb3B1cCBpcyBhbHJlYWR5IG9wZW5lZCcpO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1dlYkFwcFBvcHVwT3BlbmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRpdGxlID0gJyc7XG4gICAgICAgIHZhciBtZXNzYWdlID0gJyc7XG4gICAgICAgIHZhciBidXR0b25zID0gW107XG4gICAgICAgIHZhciBwb3B1cF9idXR0b25zID0ge307XG4gICAgICAgIHZhciBwb3B1cF9wYXJhbXMgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMudGl0bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aXRsZSA9IHN0clRyaW0ocGFyYW1zLnRpdGxlKTtcbiAgICAgICAgICAgIGlmICh0aXRsZS5sZW5ndGggPiA2NCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIFBvcHVwIHRpdGxlIGlzIHRvbyBsb25nJywgdGl0bGUpO1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBQb3B1cFBhcmFtSW52YWxpZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRpdGxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwb3B1cF9wYXJhbXMudGl0bGUgPSB0aXRsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhcmFtcy5tZXNzYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbWVzc2FnZSA9IHN0clRyaW0ocGFyYW1zLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIFBvcHVwIG1lc3NhZ2UgaXMgcmVxdWlyZWQnLCBwYXJhbXMubWVzc2FnZSk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwUG9wdXBQYXJhbUludmFsaWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZS5sZW5ndGggPiAyNTYpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIFBvcHVwIG1lc3NhZ2UgaXMgdG9vIGxvbmcnLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBQb3B1cFBhcmFtSW52YWxpZCcpO1xuICAgICAgICB9XG4gICAgICAgIHBvcHVwX3BhcmFtcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMuYnV0dG9ucyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwYXJhbXMuYnV0dG9ucykpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBQb3B1cCBidXR0b25zIHNob3VsZCBiZSBhbiBhcnJheScsIHBhcmFtcy5idXR0b25zKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwUG9wdXBQYXJhbUludmFsaWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmJ1dHRvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYnV0dG9uID0gcGFyYW1zLmJ1dHRvbnNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGJ0biA9IHt9O1xuICAgICAgICAgICAgICAgIHZhciBpZCA9ICcnO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYnV0dG9uLmlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBpZCA9IGJ1dHRvbi5pZC50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaWQubGVuZ3RoID4gNjQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIFBvcHVwIGJ1dHRvbiBpZCBpcyB0b28gbG9uZycsIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBQb3B1cFBhcmFtSW52YWxpZCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJ0bi5pZCA9IGlkO1xuICAgICAgICAgICAgICAgIHZhciBidXR0b25fdHlwZSA9IGJ1dHRvbi50eXBlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYnV0dG9uX3R5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbl90eXBlID0gJ2RlZmF1bHQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidG4udHlwZSA9IGJ1dHRvbl90eXBlO1xuICAgICAgICAgICAgICAgIGlmIChidXR0b25fdHlwZSA9PSAnb2snIHx8XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbl90eXBlID09ICdjbG9zZScgfHxcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uX3R5cGUgPT0gJ2NhbmNlbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm8gcGFyYW1zIG5lZWRlZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChidXR0b25fdHlwZSA9PSAnZGVmYXVsdCcgfHxcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uX3R5cGUgPT0gJ2Rlc3RydWN0aXZlJykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGJ1dHRvbi50ZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHN0clRyaW0oYnV0dG9uLnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIFBvcHVwIGJ1dHRvbiB0ZXh0IGlzIHJlcXVpcmVkIGZvciB0eXBlICcgKyBidXR0b25fdHlwZSwgYnV0dG9uLnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1dlYkFwcFBvcHVwUGFyYW1JbnZhbGlkJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQubGVuZ3RoID4gNjQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIFBvcHVwIGJ1dHRvbiB0ZXh0IGlzIHRvbyBsb25nJywgdGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwUG9wdXBQYXJhbUludmFsaWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBidG4udGV4dCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBQb3B1cCBidXR0b24gdHlwZSBpcyBpbnZhbGlkJywgYnV0dG9uX3R5cGUpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwUG9wdXBQYXJhbUludmFsaWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnV0dG9ucy5wdXNoKGJ0bik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidXR0b25zLnB1c2goeyBpZDogJycsIHR5cGU6ICdjbG9zZScgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1dHRvbnMubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVncmFtLldlYkFwcF0gUG9wdXAgc2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIGJ1dHRvbicpO1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1dlYkFwcFBvcHVwUGFyYW1JbnZhbGlkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1dHRvbnMubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVncmFtLldlYkFwcF0gUG9wdXAgc2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhhbiAzIGJ1dHRvbnMnKTtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBQb3B1cFBhcmFtSW52YWxpZCcpO1xuICAgICAgICB9XG4gICAgICAgIHBvcHVwX3BhcmFtcy5idXR0b25zID0gYnV0dG9ucztcbiAgICAgICAgd2ViQXBwUG9wdXBPcGVuZWQgPSB7XG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICAgICAgfTtcbiAgICAgICAgV2ViVmlldy5wb3N0RXZlbnQoJ3dlYl9hcHBfb3Blbl9wb3B1cCcsIGZhbHNlLCBwb3B1cF9wYXJhbXMpO1xuICAgIH07XG4gICAgV2ViQXBwLnNob3dBbGVydCA9IGZ1bmN0aW9uIChtZXNzYWdlLCBjYWxsYmFjaykge1xuICAgICAgICBXZWJBcHAuc2hvd1BvcHVwKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VcbiAgICAgICAgfSwgY2FsbGJhY2sgPyBmdW5jdGlvbiAoKSB7IGNhbGxiYWNrKCk7IH0gOiBudWxsKTtcbiAgICB9O1xuICAgIFdlYkFwcC5zaG93Q29uZmlybSA9IGZ1bmN0aW9uIChtZXNzYWdlLCBjYWxsYmFjaykge1xuICAgICAgICBXZWJBcHAuc2hvd1BvcHVwKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnb2snLCBpZDogJ29rJyB9LFxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2NhbmNlbCcgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9LCBjYWxsYmFjayA/IGZ1bmN0aW9uIChidXR0b25faWQpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGJ1dHRvbl9pZCA9PSAnb2snKTtcbiAgICAgICAgfSA6IG51bGwpO1xuICAgIH07XG4gICAgV2ViQXBwLnNob3dTY2FuUXJQb3B1cCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdmVyc2lvbkF0TGVhc3QoJzYuNCcpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBNZXRob2Qgc2hvd1NjYW5RclBvcHVwIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdmVyc2lvbiAnICsgd2ViQXBwVmVyc2lvbik7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwTWV0aG9kVW5zdXBwb3J0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2ViQXBwU2NhblFyUG9wdXBPcGVuZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIFBvcHVwIGlzIGFscmVhZHkgb3BlbmVkJyk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwU2NhblFyUG9wdXBPcGVuZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGV4dCA9ICcnO1xuICAgICAgICB2YXIgcG9wdXBfcGFyYW1zID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcGFyYW1zLnRleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0ZXh0ID0gc3RyVHJpbShwYXJhbXMudGV4dCk7XG4gICAgICAgICAgICBpZiAodGV4dC5sZW5ndGggPiA2NCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIFNjYW4gUVIgcG9wdXAgdGV4dCBpcyB0b28gbG9uZycsIHRleHQpO1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBTY2FuUXJQb3B1cFBhcmFtSW52YWxpZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHBvcHVwX3BhcmFtcy50ZXh0ID0gdGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3ZWJBcHBTY2FuUXJQb3B1cE9wZW5lZCA9IHtcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgICAgICB9O1xuICAgICAgICBXZWJWaWV3LnBvc3RFdmVudCgnd2ViX2FwcF9vcGVuX3NjYW5fcXJfcG9wdXAnLCBmYWxzZSwgcG9wdXBfcGFyYW1zKTtcbiAgICB9O1xuICAgIFdlYkFwcC5jbG9zZVNjYW5RclBvcHVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXZlcnNpb25BdExlYXN0KCc2LjQnKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVncmFtLldlYkFwcF0gTWV0aG9kIGNsb3NlU2NhblFyUG9wdXAgaXMgbm90IHN1cHBvcnRlZCBpbiB2ZXJzaW9uICcgKyB3ZWJBcHBWZXJzaW9uKTtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBNZXRob2RVbnN1cHBvcnRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIHdlYkFwcFNjYW5RclBvcHVwT3BlbmVkID0gZmFsc2U7XG4gICAgICAgIFdlYlZpZXcucG9zdEV2ZW50KCd3ZWJfYXBwX2Nsb3NlX3NjYW5fcXJfcG9wdXAnLCBmYWxzZSk7XG4gICAgfTtcbiAgICBXZWJBcHAucmVhZFRleHRGcm9tQ2xpcGJvYXJkID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdmVyc2lvbkF0TGVhc3QoJzYuNCcpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBNZXRob2QgcmVhZFRleHRGcm9tQ2xpcGJvYXJkIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdmVyc2lvbiAnICsgd2ViQXBwVmVyc2lvbik7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwTWV0aG9kVW5zdXBwb3J0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVxX2lkID0gZ2VuZXJhdGVDYWxsYmFja0lkKDE2KTtcbiAgICAgICAgdmFyIHJlcV9wYXJhbXMgPSB7IHJlcV9pZDogcmVxX2lkIH07XG4gICAgICAgIHdlYkFwcENhbGxiYWNrc1tyZXFfaWRdID0ge1xuICAgICAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrXG4gICAgICAgIH07XG4gICAgICAgIFdlYlZpZXcucG9zdEV2ZW50KCd3ZWJfYXBwX3JlYWRfdGV4dF9mcm9tX2NsaXBib2FyZCcsIGZhbHNlLCByZXFfcGFyYW1zKTtcbiAgICB9O1xuICAgIFdlYkFwcC5yZXF1ZXN0V3JpdGVBY2Nlc3MgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKCF2ZXJzaW9uQXRMZWFzdCgnNi45JykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUZWxlZ3JhbS5XZWJBcHBdIE1ldGhvZCByZXF1ZXN0V3JpdGVBY2Nlc3MgaXMgbm90IHN1cHBvcnRlZCBpbiB2ZXJzaW9uICcgKyB3ZWJBcHBWZXJzaW9uKTtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBNZXRob2RVbnN1cHBvcnRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChXZWJBcHBXcml0ZUFjY2Vzc1JlcXVlc3RlZCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1RlbGVncmFtLldlYkFwcF0gV3JpdGUgYWNjZXNzIGlzIGFscmVhZHkgcmVxdWVzdGVkJyk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwV3JpdGVBY2Nlc3NSZXF1ZXN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBXZWJBcHBXcml0ZUFjY2Vzc1JlcXVlc3RlZCA9IHtcbiAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgICAgICB9O1xuICAgICAgICBXZWJWaWV3LnBvc3RFdmVudCgnd2ViX2FwcF9yZXF1ZXN0X3dyaXRlX2FjY2VzcycpO1xuICAgIH07XG4gICAgV2ViQXBwLnJlcXVlc3RDb250YWN0ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICghdmVyc2lvbkF0TGVhc3QoJzYuOScpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBNZXRob2QgcmVxdWVzdENvbnRhY3QgaXMgbm90IHN1cHBvcnRlZCBpbiB2ZXJzaW9uICcgKyB3ZWJBcHBWZXJzaW9uKTtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdXZWJBcHBNZXRob2RVbnN1cHBvcnRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChXZWJBcHBDb250YWN0UmVxdWVzdGVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVGVsZWdyYW0uV2ViQXBwXSBDb250YWN0IGlzIGFscmVhZHkgcmVxdWVzdGVkJyk7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignV2ViQXBwQ29udGFjdFJlcXVlc3RlZCcpO1xuICAgICAgICB9XG4gICAgICAgIFdlYkFwcENvbnRhY3RSZXF1ZXN0ZWQgPSB7XG4gICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2tcbiAgICAgICAgfTtcbiAgICAgICAgV2ViVmlldy5wb3N0RXZlbnQoJ3dlYl9hcHBfcmVxdWVzdF9waG9uZScpO1xuICAgIH07XG4gICAgV2ViQXBwLmludm9rZUN1c3RvbU1ldGhvZCA9IGZ1bmN0aW9uIChtZXRob2QsIHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICAgICAgaW52b2tlQ3VzdG9tTWV0aG9kKG1ldGhvZCwgcGFyYW1zLCBjYWxsYmFjayk7XG4gICAgfTtcbiAgICBXZWJBcHAucmVhZHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFdlYlZpZXcucG9zdEV2ZW50KCd3ZWJfYXBwX3JlYWR5Jyk7XG4gICAgfTtcbiAgICBXZWJBcHAuZXhwYW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBXZWJWaWV3LnBvc3RFdmVudCgnd2ViX2FwcF9leHBhbmQnKTtcbiAgICB9O1xuICAgIFdlYkFwcC5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgV2ViVmlldy5wb3N0RXZlbnQoJ3dlYl9hcHBfY2xvc2UnKTtcbiAgICB9O1xuICAgIHdpbmRvdy5UZWxlZ3JhbS5XZWJBcHAgPSBXZWJBcHA7XG4gICAgdXBkYXRlSGVhZGVyQ29sb3IoKTtcbiAgICB1cGRhdGVCYWNrZ3JvdW5kQ29sb3IoKTtcbiAgICBzZXRWaWV3cG9ydEhlaWdodCgpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBvbldpbmRvd1Jlc2l6ZSk7XG4gICAgaWYgKGlzSWZyYW1lKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbGlua0hhbmRsZXIpO1xuICAgIH1cbiAgICBXZWJWaWV3Lm9uRXZlbnQoJ3RoZW1lX2NoYW5nZWQnLCBvblRoZW1lQ2hhbmdlZCk7XG4gICAgV2ViVmlldy5vbkV2ZW50KCd2aWV3cG9ydF9jaGFuZ2VkJywgb25WaWV3cG9ydENoYW5nZWQpO1xuICAgIFdlYlZpZXcub25FdmVudCgnaW52b2ljZV9jbG9zZWQnLCBvbkludm9pY2VDbG9zZWQpO1xuICAgIFdlYlZpZXcub25FdmVudCgncG9wdXBfY2xvc2VkJywgb25Qb3B1cENsb3NlZCk7XG4gICAgV2ViVmlldy5vbkV2ZW50KCdxcl90ZXh0X3JlY2VpdmVkJywgb25RclRleHRSZWNlaXZlZCk7XG4gICAgV2ViVmlldy5vbkV2ZW50KCdzY2FuX3FyX3BvcHVwX2Nsb3NlZCcsIG9uU2NhblFyUG9wdXBDbG9zZWQpO1xuICAgIFdlYlZpZXcub25FdmVudCgnY2xpcGJvYXJkX3RleHRfcmVjZWl2ZWQnLCBvbkNsaXBib2FyZFRleHRSZWNlaXZlZCk7XG4gICAgV2ViVmlldy5vbkV2ZW50KCd3cml0ZV9hY2Nlc3NfcmVxdWVzdGVkJywgb25Xcml0ZUFjY2Vzc1JlcXVlc3RlZCk7XG4gICAgV2ViVmlldy5vbkV2ZW50KCdwaG9uZV9yZXF1ZXN0ZWQnLCBvblBob25lUmVxdWVzdGVkKTtcbiAgICBXZWJWaWV3Lm9uRXZlbnQoJ2N1c3RvbV9tZXRob2RfaW52b2tlZCcsIG9uQ3VzdG9tTWV0aG9kSW52b2tlZCk7XG4gICAgV2ViVmlldy5wb3N0RXZlbnQoJ3dlYl9hcHBfcmVxdWVzdF90aGVtZScpO1xuICAgIFdlYlZpZXcucG9zdEV2ZW50KCd3ZWJfYXBwX3JlcXVlc3Rfdmlld3BvcnQnKTtcbn0pKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZWxlZ3JhbS13ZWItYXBwcy5qcy5tYXAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/@twa-dev/sdk/dist/telegram-web-apps.js\n"); /***/ }) }; ;